blog

Zabbixを中心としたアプリケーション指向の自動監視システムを構築する

本稿では、Zabbix監視システムの二次開発と変換の実装を通じて、いくつかのアプリケーションシステムの可用性ステータスのリアルタイム監視を実現するために、企業のITインフラストラクチャを組み合わせ、具...

May 23, 2015 · 16 min. read
シェア

現在、オープンソースのネットワーク監視システムZabbixは多くの企業で適用されていますが、Zabbix自体の監視粒度と深さは企業の運用保守管理の深いニーズを満たすことが難しく、特にアプリケーションシステムの可用性監視には大きな欠陥があります。本稿では、Zabbix監視システムの二次開発と変換の実装を通じて、いくつかのアプリケーションシステムの可用性ステータスのリアルタイム監視を実現するために、企業のITインフラストラクチャを組み合わせます。本稿では、具体的な変換方法論とアイデアを詳細に説明し、動作結果の変換された自動監視システムを提供し、私は企業のITインフラストラクチャの監視の同僚を刺激することを願っています。

I.背景

Zabbixはエンタープライズクラスのオープンソースソリューションの分散システム監視とネットワーク監視機能を提供する、より成熟したWEBベースのインターフェースです。私は、Linuxとオープンソースの監視システムの運用保守管理者の理解は、Zabbixとオープンソースの機能の導入の柔軟性のため、Zabbixの知らない人はいないと信じて、多くの企業がZabbixを自社のITインフラストラクチャに導入し、運用状況のリアルタイム監視を行っています。会社のサーバとネットワーク機器のほとんどがZabbixの監視範囲に入ったことで、Zabbixは運用保守管理者に最も信頼されている障害監視ツールとなりました。

しかし、現状Zabbixで監視できるのはCPU使用率、ポート状況、トラフィック、プロセス使用率など従来の一部の項目のみで、アプリケーションやサービスの稼働状況をリアルタイムに監視することは難しく、最新バージョン2.2でもアプリケーション指向の監視に大きな改善は見られません。現在、様々なアプリケーションが複雑化するにつれて、アプリケーション障害の原因究明が難しくなっており、従来のようにサーバのCPUやメモリ、プロセスなどの定常的な項目だけを監視していたのでは、アプリケーションの異常がCPUやメモリなどの定常的な問題ではなく、システムに起因して発生するため、アプリケーションの異常を発見できないケースがあり、リアルタイムな監視ができません。アプリケーションの異常はCPUやメモリなどの定常的な問題ではなく、システムのバグや負荷制限などの隠れた理由によって発生することが多いため、Zabbixでは定常監視項目のステータスが正常であるにもかかわらず、実際にはアプリケーションが利用できないことがあり、自動監視の目的が達成されません。

アプリケーション監視におけるZabbixの欠点を補うため、本稿ではZabbix監視システムに焦点を当て、運用保守自動化のアイデアと組み合わせた綿密な調査を行い、一般的なアプリケーションをサポートする自動監視システム一式を開発しました。本システムは既存のZabbixシステムの二次開発をベースに形成されており、サーバやネットワーク機器の監視の有効性に影響を与えません。システムは既存のZabbixシステムの二次開発をベースに形成されており、サーバやネットワーク機器の監視の有効性に影響を与えません。このシステムは弊社で適用されており、現在、DHCP、Radius認証、Wins、SSLVPNシステムの可用性を自動的に監視することが可能です。

II.システム設計のアイデア

従来のZabbix監視プロジェクトでは、各種アプリケーションが正常かどうかを反映することが難しく、実際にシステムを利用して初めてアプリケーションシステムが利用可能かどうかを判断することができます。 しかし、リアルタイム監視を実現するためには、運用保守自動化関連技術を利用する必要があり、手動操作だけでは監視の適時性を保証することができません。本論文では、O&M自動化のコア技術であるスクリプトプログラミング技術を利用し、スクリプトを利用し、クライアントやユーザがアプリケーションシステムにアクセスするプロセスをシミュレートし、プロセスを自動化し、手続き的、Zabbix監視システムのインターフェイスを利用し、Zabbixにシステムステータスを渡すことで、システムのZabbixトリガー判定を通じて、アプリケーションシステムのステータスの可用性の変化をページ、メール、SMSの形でO&M管理者へ送信し、リアルタイム監視の目的を達成します。

モニタリングシステムは、シミュレートされたユーザー行動モジュールとアプリケーション状態認識モジュールの2つのモジュールに分けることができます。これらの2つのモジュールは互いに関連し、連携しています。シミュレーションされたユーザーの行動モジュールは、ループ内でアプリケーションの状態を継続的に取得し、アプリケーションの状態を認識するモジュールに状態を渡します。以下、2つのモジュールを紹介します。

1.ユーザー行動モデリングモジュール

このモジュールは、抽出されたユーザー操作の流れに従って、プログラムを使用してアプリケーションシステムを使用する一連のユーザー操作を自動的に実行し、プログラムの操作結果を記録して、後続のアプリケーション状態認識モジュールに提供して判断します:

図1 ユーザー行動シミュレーション・モジュールのフローチャート

2.アプリケーション状態認識モジュール

このモジュールはシミュレートされたユーザ行動モジュールから渡されたアプリケーションシステムの状態に関する情報を受け取り、状態情報を分析し、運用保守管理担当者に情報を表示します。本モジュールの機能はZabbix監視システム自身が引き受けます。以下の図2はアプリケーション状態認識モジュールの詳細フローチャートです:

図2 アプリケーション状態認識モジュールのフローチャート

III.システムの具体的な実装

このシステムは現在、同社のDHCP、Radius認証、Winsサービス、SSLVPNアプリケーションの可用性をリアルタイムで監視することを実現しています。

1.DHCPアプリケーションの状態監視

私たちの会社で使われているDHCPサービスはWindowsサーバー2003によって提供されています。DHCPサービスの自動リアルタイム監視の鍵は、プログラムがDHCPサーバーを使ってユーザーがIPアドレスを取得するプロセスをシミュレートし続ける必要があることです。このプロセスは、2つのBATコマンド "ipconfig /release "と "ipconfig /renew"、つまりIPの解放と再取得によって表すことができます。DHCPアプリケーションに失敗すると、ホストは上記の2つのコマンドでIPアドレスを取得できなくなり、同じネットワークセグメント内の他のホストはそのホストを通してpingを打つことができなくなります。Windowsサーバー2003ホストをテストホストとして使用し、BATスクリプトを使用してユーザーの動作をシミュレートするスクリプトプログラムを実行します:

@echo off 
:des 
ipconfig /release 
ipconfig /renew 
echo "プログラムは実行中である。!" 
choice /c yn /n /t 10 /d y 
goto des 

上記のコードは10秒ごとにipconfig /releaseとipconfig /renewを繰り返し、DHCPサーバからIPアドレスを再取得するため、テストホストが正しいIPアドレスを取得できるかどうかはDHCPアプリケーションが利用可能かどうかを表します。Zabbix監視システム

以下の手順はZabbix監視システムで行います:

DHCPサーバを監視に含めるには、Zabbixエージェントをインストールし、DHCPサーバの項目に監視項目を追加し、以下の属性を設定します: Nameを "DHCP service test"、Keyを "icmpping[test host's IP,3]"、Intervalを10秒に設定します。監視項目とは、10秒ごとにZabbixサーバがテストホストに3つのicmppingパケットを送信し、ホストが通信可能かどうかを確認することを意味します。DHCPアプリケーションの状態をリアルタイムで監視します。

DHCPアプリケーションのステータスが変更されたかどうかを判断するトリガーを設定し、変更された場合、ページにアラームメッセージを表示します。トリガー属性の設定は以下のとおりです。式は「{DHCPSVR:icmpping[テストホストのIP,3].last(0)}=0&{DHCPSVR:icmpping[テストホストのIP,3].prev(0)}=0」であり、プログラムがDHCPアプリケーションを2回連続して検出し、アプリケーションが利用できない場合は、DHCPアプリケーションがダウンしていると判断でき、2回の検出結果と演算結果を組み合わせることで、誤報の確率を効果的に下げることができます。

アクションの主なプロパティは以下のように設定します: Nameは "DHCPサービス監視"、Trigger Conditionsは先ほど設定したものを設定します。Trigger「DHCPSVR: DHCPSVR 上の DHCP サービスがダウン」、Operations「ユーザへメッ セージを送信: 管理者」、Delay「即時」。Action は、対応する Trigger がトリガーされると、即座に管理者にアラームメッセージを送信することを意味し、メッ セージの内容は自分でカスタマイズできますので、ここでは詳細は割愛します。

2.Radius認証アプリケーションの状態監視

Radius認証サービスは、多くの企業でアプリケーションシステムのAAA認証やデバイスのログイン認証に広く利用されており、当社でもネットワークデバイスのログイン認証にRadiusサービスの重要なアプリケーションの一つとなっています。Radius認証アプリケーションの状態をリアルタイムで自動監視するための重要なポイントは、やはりRadiusアプリケーションを利用するユーザのプロセスを抽出し、スクリプトプログラムで実装し、検出結果をZabbixに渡すことです。本稿では、SecureCRTプラットフォームをベースとしたVBScript言語を採用し、ユーザがCiscoスイッチにログインする動作をシミュレートするスクリプトプログラムを記述し、ログイン後、ユーザはユーザ名とパスワードを連続して入力します。ログインした後、ユーザー名とパスワードのプロンプトを入力するために連続して表示され、正当なユーザー名とパスワードを入力する手続き制御の使用は、その後、Radiusアプリケーションが正常であれば、それは、スイッチの設定ページを入力しますRadiusアプリケーションの障害が発生した場合、それは時間の "タイムアウト "プロンプトの期間の後に表示されます。まだテストマシンとして上記のWindows Server 2003のホストを使用して、特定のVBScriptスクリプトプログラムを以下に示します:

# $language = "VBScript" 
# $interface = "1.0" 
'このスクリプトは会社のRadiusサービスのステータスを検知するために使用される。 
Sub Main 
Dim fso,f1 
Set fso=CreateObject("Scripting.FileSystemObject") 
Do While (1) 
 crt.Screen.Synchronous=True 
 crt.Session.Connect("/telnet .248") 
 crt.Screen.WaitForString "Username:" 
 crt.Screen.Send "ishare" & vbcr 
 crt.Screen.WaitForString "Password:" 
 crt.Screen.Send "123456" & vbcr 
 crt.Screen.WaitForString ">",2 
 judgeString=crt.Screen.Get(12,1,12,20) 
 Set f1=fso.OpenTextFile("C:\Radius監視スクリプト\cosbulk\judge.txt",2,True) 
 f1.writeline(judgeString) 
 f1.Close() 
 'crt.sleep 500 
 crt.Screen.Synchronous=False 
 crt.Session.Disconnect 
 crt.Sleep 5000 
Loop 
End Sub 

上記の手順において、172.19.39.248はテストスイッチの管理IP、ishareと123456はそれぞれテスト用のユーザー名とパスワードです。スクリプトプログラムは5秒ごとにテストスイッチにtelnetするように制御します。ユーザー名とパスワードを入力した後、スイッチの設定インターフェースに正常に入ることができれば、Radiusアプリケーションが利用可能で、スイッチ名をjudge.txtファイルに書き込むことを意味します。そうでなければ、Radiusアプリケーションに障害があり、「タイムアウト」の情報をjudge.txtファイルに書き込むことを意味します。ユーザー名とパスワードを入力した後、スイッチの設定インターフェースに正常に入ることができれば、Radiusアプリケーションは使用可能で、表示されたスイッチ名がjudge.txtファイルに書き込まれます。ファイルの異なる内容は Radius アプリケーションのステータスを表します。次のステップは、このステータス情報をZabbix監視システムに渡すことです。

Zabbix監視システムで以下の作業を行う必要があります:

名前は「Radius Service status」、キーは「vfs.file.regmatch[judge.txt,テストスイッチ名]」、間隔は10秒、その他の時間属性は必要に応じて設定してください。監視項目とは、10秒ごとにjudge.txtの内容をチェックし、テストスイッチの名前であれば1を返し、そうでなければ0を返すというもので、Radiusアプリケーションが利用可能かどうかを判断し、利用可能かどうかのリアルタイム監視を実現します。

Radiusアプリケーションの状態が変更されたかどうかを判断するトリガーを作成し、状態が変更された場合はページにアラームメッセージを表示します。file.regmatch[judge.txt,テストスイッチ名].last(0)}=0&{vfs.file.regmatch[judge.txt,テストスイッチ名].prev(0)=0"、つまり、プログラムが2回連続してRadiusアプリケーションを検出し、アプリケーションが利用できない場合、Radiusアプリケーションに障害が発生したと判断することができ、2回の検出結果の操作により、誤報の確率を効果的に減らすことができます。誤報の確率を効果的に低減することができます。

3.Wins アプリケーションステータスの監視

同社は、Winsのサービスは、Windows Server 2003で提供されて使用すると、"nblookup "このBATコマンドは、Winsのアプリケーションが利用可能かどうかをテストすることができます、Winsのアプリケーションが正常であれば、ホスト名は、通常のIPアドレスに解決することができます。本論文では、nblookupコマンドの最初の使用は、Zabbixスクリプトライブラリに埋め込まれたスクリプトプログラムのホスト名を解決するために、バックの呼び出しを容易にするために、具体的な方法は次のとおりです:テストホストでZabbixエージェントの設定ファイル "zabbix_agentd.conf "を開き、最後のファイルに"UnsafeUserParameters=1 "と "UserParameter= service.wins,C:˶WINDOWSsystem32˶nblookup /s Wins server IP netsqlsvr | find "host netsqlsvr's IP""を追加することで、対応するスクリプトがテストホストに埋め込まれます。これにより、対応するスクリプトが "service.wins "としてZabbixシステムに埋め込まれます。Zabbixで必要な設定は以下の通りです:

テストホストの項目に対応する監視項目を追加し、監視項目のプロパティは次のとおりです:名前は "Service Wins status"、キーは "service.wins"、間隔は15秒、および他の時間のプロパティは、独自のニーズに応じて設定することができます。この監視項目の意味は、nblookupコマンドを使用して、15秒ごとにWinsのアプリケーションステータスをテストし、Winsのアプリケーションステータスが正常であれば、netsqlsvrのホストの正しいIPアドレスを返します。

Winsアプリケーションのステータスが変更されたかどうかを判断するためのトリガーを作成し、ステータスが変更された場合、対応するアラーム情報がページに表示されます。式は「{service.wins.strlen(0)}=0」です。これは、プログラムが正しい解決IPを取得しない場合、Radiusアプリケーションがダウンしていると判断することを意味します。

4.SSLVPNシステムの状態監視

弊社で使用しているSSLVPN機器はJuniper SA 6500で、エクストラネットの利用者にイントラネットオフィスへのリモートアクセスを提供しており、弊社にとって非常に重要なゲートウェイ機器です。Zabbixを利用することで、デバイスの定常的なパラメータを監視することはできますが、システムの実際の稼働状況を把握することはできません。以下では、弊社で適用し、良好な結果を得ているSSLVPNアプリケーションシステムのリアルタイム稼働監視方法を紹介します。なお、SSLVPN システムへのユーザアクセスをスクリプトでシミュレートした場合のアクセスプロセスは、以下の図 3 のとおりです:

図3 SSLVPNシステムへのユーザアクセスのフローチャート

上記の処理を実現するために、本稿ではVBScriptスクリプト言語を使用し、具体的なプログラムコードを以下に示します:

Set WshShell=WScript.CreateObject("WScript.Shell")    '仮想キーボードを実装できるオブジェクトを作成する 
Set fso=CreateObject("Scripting.FileSystemObject")  'ファイルオブジェクトの作成 
Set objWMIService = GetObject ("winmgmts:\\.
oot\cimv2") 
Sub Close_Process(ProcessName) '強制終了機能 
Dim objShell 
Set objShell = wscript.CreateObject("wscript.shell") 
objShell.Run "ntsd -c q -pn " & ProcessName, 0, True 
End Sub 
On Error Resume Next 
Do while(1) 
Set ie=WScript.CreateObject("InternetExplorer.Application")    'オブジェクトを作成し、IEを開く 
ie.visible=true    'IE前へ 
ie.navigate "http://...1"    'ページを開く 
Wscript.Sleep 4000   
if ie.busy=false And ie.readystate = 4 then'ページが正常に読み込まれれば、次のステップに進むことができる。, 
'表示されない場合は問題があることを意味する 
Wscript.Sleep 1000 
WshShell.appactivate"Junos Pulse Secure Access Service" 
Wscript.Sleep 2000 
if instr(1,ie.document.body.innerText,"username",1)>0 Then 'このタグが存在する場合、ログインページが正常に表示されたことを示す。 
ie.document.getElementById("Username").value="ishare"   'アカウントとパスワードを入力する 
ie.document.getElementById("Password").value="%rdx5tgB" 
Wscript.Sleep 3000    '3秒待ってから入力し、仮想トリガーをかける。 
WshShell.SendKeys "{ENTER}" 
Wscript.Sleep 20000 
'ログインが成功したかどうかを判断するために、ウェブページ内のイントラネットホームページキーワードの存在を検索する。 
if ie.busy=false And ie.readystate = 4 then 'ページコンテンツが読み込まれる 
WshShell.appactivate"Junos Pulse Secure Access Service - ホーム " 
Wscript.Sleep 2000 
strContent=ie.document.body.innerText 'ウェブページの内容を読む   
if instr(1,strContent,"イントラネットホーム ",1)>0 Then 'このタグが存在する場合、ログインに成功したことを示す。 
'1をファイルに書き込む 
Set f1=fso.OpenTextFile("C:\SSLVPN監視スクリプト\cosbulk\judge.txt",2,True) 
f1.writeline(1) 
f1.Close() 
Wscript.Sleep 2000 
WshShell.appactivate"Junos Pulse Secure Access Service - ホーム "   
Wscript.Sleep 2000 
WshShell.SendKeys "{TAB 9}" 
Wscript.Sleep 2000 
WshShell.SendKeys "{ENTER}" 
elseif instr(1,strContent,"既に他のユーザセッションが進行中である:",1)>0 Then 
WshShell.SendKeys "{TAB 2}" 
Wscript.Sleep 2000 
WshShell.SendKeys "{ENTER}" 'クリックして実行を続ける 
Wscript.Sleep 20000 
if ie.busy=false And ie.readystate = 4 then 'ページコンテンツが読み込まれる 
WshShell.appactivate"Junos Pulse Secure Access Service - ホーム " 
Wscript.Sleep 2000 
strContent=ie.document.body.innerText 'ウェブページの内容を読む    
if instr(1,strContent,"イントラネットホーム ",1)>0 Then 'このタグが存在する場合、ログインに成功したことを示す。 
Set f1=fso.OpenTextFile("C:\SSLVPN監視スクリプト\cosbulk\judge.txt",2,True) 
f1.writeline(1) 
f1.Close() 
Wscript.Sleep 2000 
WshShell.appactivate"Junos Pulse Secure Access Service - ホーム "   
Wscript.Sleep 2000 
WshShell.SendKeys "{TAB 9}" 
Wscript.Sleep 2000 
WshShell.SendKeys "{ENTER}" 
else 
'ファイルに0を書き込む 
Set f1=fso.OpenTextFile("C:\SSLVPN監視スクリプト\cosbulk\judge.txt",2,True) 
f1.writeline(0) 
f1.Close() 
end if 
else 
Set f1=fso.OpenTextFile("C:\SSLVPN監視スクリプト\cosbulk\judge.txt",2,True) 
f1.writeline(0) 
f1.Close() 
end if 
else 
'ファイルに0を書き込む 
Set f1=fso.OpenTextFile("C:\SSLVPN監視スクリプト\cosbulk\judge.txt",2,True) 
f1.writeline(0) 
f1.Close() 
end if 
else   
Set f1=fso.OpenTextFile("C:\SSLVPN監視スクリプト\cosbulk\judge.txt",2,True) 
f1.writeline(0) 
f1.Close() 
end if 
else   
Set f1=fso.OpenTextFile("C:\SSLVPN監視スクリプト\cosbulk\judge.txt",2,True) 
f1.writeline(0) 
f1.Close() 
end if 
else   
Set f1=fso.OpenTextFile("C:\SSLVPN監視スクリプト\cosbulk\judge.txt",2,True) 
f1.writeline(0) 
f1.Close() 
end if 
ie.quit 
Set ie=nothing 
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name='dsNcService.exe'")   
For Each objProcess In colProcessList   
Set list = GetObject("winmgmts:").execquery("Select * from Win32_Process where Name='dsNcService.exe'")   
if list.count > 0 then                             'プロセスの存在を検知する   
Close_Process "dsNcService.exe" 
end if   
Next 
Wscript.Sleep 5000 
Loop 

上記のスクリプトプログラムは、SSLVPNシステムの可用性の各検出の結果をjudge.txtに書き込みます。1はシステムが正常であることを意味し、0はシステムが故障していることを意味し、以下はこのステータス情報をZabbixに送信する必要があり、Zabbixは判断して表示します:

テストホストの項目に、対応する監視項目を追加します。監視項目のプロパティは以下の通りです:名前は "SSLVPNの可用性"、キーは "vfs.file.regmatch[judge.txt,1]"、間隔は30秒、その他の時間プロパティは必要に応じて設定できます。監視項目とは、30秒ごとにjudge.txtの内容を検出し、ファイルの内容が1であれば1を返し、そうでなければ0を返すというもので、SSLVPNシステムが利用可能かどうかを判断し、利用可能かどうかをリアルタイムで自動監視することができます。

SSLVPNアプリケーションのステータスが変更されたかどうかを判断するトリガーを作成し、変更された場合、ページにアラームメッセージを表示します。トリガーの属性は次のように設定します: Nameは "SSLVPN Service is unavailable"、Expressionは"{vfs.file.regmatch[judge.txt,1].last(0)}=0&{vfs.file.regmatch[judge.txt,1].prev(0)=0";このトリガーは、プログラムがSSLVPNシステムが2回連続で利用できないことを検出すると、SSLVPNアプリケーションが故障していると判断することを意味します。

IV.結果発表

以下では、DHCP、Radius認証、Wins、SSLVPNアプリケーションシステムに対する本システムの自動監視効果をご紹介します:

DHCPアプリケーションの自動モニタリングテスト

テスト目的で、本記事では非稼働時間帯にDHCPアプリケーションを一時停止することを選択し、約20秒後にZabbix監視ページに以下の図4に示すアラームメッセージが表示されます:

図4 DHCPアプリケーション障害のアラームメッセージ

同時に携帯電話にもアラームSMSが届きますが、携帯電話でスクリーンショットを撮るのは不便なのでここでは省略します。その後、DHCPアプリケーションをリストアすると、約20秒後にZabbix監視ページのアラームメッセージが消え、同時に携帯電話にもDHCPアプリケーションがリストアされた旨のSMSが届きます。

Radius認証アプリケーションの自動モニタリングテスト

Radius認証アプリケーションの監視テストでは、本記事と同じ方法でRadiusアプリケーションをしばらく一時停止し、約15秒後にZabbix監視ページに以下の図5のようなアラームメッセージが表示されます:

図5 Radiusアプリケーション障害のアラームメッセージ

同時に、携帯電話にもRadiusアプリが故障しているというアラームメッセージが表示されます。約15秒間Radiusアプリを復旧させると、Zabbix監視ページのアラームメッセージが消え、携帯電話にもRadiusアプリが正常に戻ったというテキストメッセージが届きます。

Winsアプリケーションの自動モニタリングテスト

Wins アプリケーションの監視テストでは、Wins アプリケーションを約 15 秒間一時停止した後、Zabbix 監視ページには以下の図 6 に示すアラームメッセージが表示されます:

図 6 Wins アプリケーション障害のアラームメッセージ

同時に、携帯電話は Wins アプリが誤動作している旨のアラームテキストメッセージを受信します。約 15 秒間 Wins アプリが復旧すると、Zabbix 監視ページのアラームメッセージは消え、携帯電話にも Wins アプリが正常に戻った旨のテキストメッセージが表示されます。

SSLVPNアプリケーションの自動モニタリングテスト

SSLVPNシステムが利用できない原因は、ネットワーク障害、デバイスのハードウェアやソフトウェアの障害、Radius認証サービスの例外など様々です。このテストでは、Radius認証サービスの例外をシミュレートし、システムの監視効果を検証します。Radius認証サービスを約30秒間一時停止すると、Zabbix監視ページに以下の図7のアラームメッセージが表示されます:

図 7 Radius アプリケーション障害および SSLVPN アプリケーションシステム障害のアラームメッセージ

同時に、携帯電話にはRadiusアプリとSSLVPNアプリがダウンしている旨のアラームメッセージが表示されます。Radiusアプリケーションが約30秒間回復すると、Zabbix監視ページのアラームメッセージは消え、携帯電話にもRadiusアプリケーションとSSLVPNアプリケーションが正常に戻ったというSMSが届きます。

V.まとめと展望

Read next

開発者が避けるべきJavaの6つの機能

長年のJava開発経験から、長い目で見れば、開発者が****使用しない方がよいJava SE機能/APIは、以下のものだと私は学びました。\n\nバイトコード\n\n\n

May 23, 2015 · 4 min read