<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/wiki7_benjamin/">
    <title>benjamin @Wiki</title>
    <link>http://w.atwiki.jp/wiki7_benjamin/</link>
    <atom:link href="https://w.atwiki.jp/wiki7_benjamin/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>benjamin @Wiki</description>

    <dc:language>ja</dc:language>
    <dc:date>2006-06-03T23:31:52+09:00</dc:date>
    <utime>1149345112</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/31.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/30.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/4.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/26.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/28.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/17.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/29.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wiki7_benjamin/pages/14.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/31.html">
    <title>note</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/31.html</link>
    <description>
      搞不清楚我在幹嘛

每隻股票都有配當
以及eps
看配當及eps
或許可以確認現在買的股票是不是好的




有點混亂
今天我很特別的
什麼都沒有做
不停的娛樂
不過
真的很空虛

我知道我有很多事要做
不過我還是拿不定主義

該從那一件事情下手

我決定先錄音
錄了之後下週聽

這種「倒推回來」的方法
附合七個習慣裡的第二種
以始為終

我打算在投資這件事上可下功夫
這一波的捐失讓我的資產回到了去年12月時的水準
也就是我損失了六個月的努力
有點不太好

研究企業並且找尋更好的解答
讓事情變得簡單

今天和朋友去美式餐聽聊了一個下午
實在是無所意義
只是醫治自已的無聊病
下了一天的雨
大概梅雨季到了。



去留學一年吧！
去試試看其他的可能性吧！

確實的在心裡反覆思考這七個習慣

像旅遊一樣的心情
學習去計劃每一天
然後回顧以過這一週來的進度。

我今天這麼做了，發現我完成了不少的工作
這是時間所累積出來的成果。

我今天也去租了dvd。為什麼，因為今天的人很少，排隊在我前面的，竟然只有一個人。
而在週五的晚上，或是週來週日，至少要有20多個人等在你的面前。
現在租的dvd，可以看到下週二。由這個小小的事例，讓我們發現，原來把一些事情做好規畫，可以有這麼好的結果。

我今天也去品川的書店看了一下，至少有一個月沒有去日本的書店的，發現了很多的新書，這是很多很多的人努力工作之後的產出。光看了標題，每本書都令我的思考refresh




















面式要點：

第一：不要在電話中談錢
第二：談談這工作的遠景，及這工作將來的可能性
第三：談談該公司的組成，及裡面的構成成員
第四：談談這工作可以給我的交接時間


我選擇的重點：
第一：天空的大小
第二：不在一個人生活時所多出來的需要，包括房屋的大小與經濟的負擔。
第三：創業這條大路線是否偏離。

待解決的問題：

至少需要一個月的交接期
房屋，在日本需要擁有一個住所


加油～別急，一步一步的慢慢來    </description>
    <dc:date>2006-06-03T23:31:52+09:00</dc:date>
    <utime>1149345112</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/2.html</link>
    <description>
      メニュー
-[[トップページ]]
-[[メニュー]]
-[[メニュー2]]
-[[00001]]

-[[note]]    </description>
    <dc:date>2006-05-20T12:54:03+09:00</dc:date>
    <utime>1148097243</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/30.html">
    <title>第３節	進階選項的調適</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/30.html</link>
    <description>
      *EVENT BROKER OPTIONS
# Controls what (if any) data gets sent to the event broker.
# Values:  0      = Broker nothing
#         -1      = Broker everything
#         &lt;other&gt; = See documentation

event_broker_options=-1



*EVENT BROKER MODULE(S)
# This directive is used to specify an event broker module that should
# by loaded by Nagios at startup.  Use multiple directives if you want
# to load more than one module.  Arguments that should be passed to
# the module at startup are seperated from the module path by a space.
#
# Example:
#
#   nebmodule=&lt;modulepath&gt; [moduleargs]

#broker_module=/somewhere/module1.o
#broker_module=/somewhere/module2.o arg1 arg2=3 debug=0




*LOG ROTATION METHOD
# This is the log rotation method that Nagios should use to rotate
# the main log file. Values are as follows..
#	n	= None - don&#039;t rotate the log
#	h	= Hourly rotation (top of the hour)
#	d	= Daily rotation (midnight every day)
#	w	= Weekly rotation (midnight on Saturday evening)
#	m	= Monthly rotation (midnight last day of month)

log_rotation_method=d



*LOG ARCHIVE PATH
# This is the directory where archived (rotated) log files should be 
# placed (assuming you&#039;ve chosen to do log rotation).

log_archive_path=/usr/local/nagios/var/archives



*LOGGING OPTIONS
# If you want messages logged to the syslog facility, as well as the
# NetAlarm log file set this option to 1.  If not, set it to 0.

use_syslog=1



*NOTIFICATION LOGGING OPTION
# If you don&#039;t want notifications to be logged, set this value to 0.
# If notifications should be logged, set the value to 1.

log_notifications=1



*SERVICE RETRY LOGGING OPTION
# If you don&#039;t want service check retries to be logged, set this value
# to 0.  If retries should be logged, set the value to 1.

log_service_retries=1



* HOST RETRY LOGGING OPTION
# If you don&#039;t want host check retries to be logged, set this value to
# 0.  If retries should be logged, set the value to 1.

log_host_retries=1



*EVENT HANDLER LOGGING OPTION
# If you don&#039;t want host and service event handlers to be logged, set
# this value to 0.  If event handlers should be logged, set the value
# to 1.

log_event_handlers=1



*INITIAL STATES LOGGING OPTION
# If you want Nagios to log all initial host and service states to
# the main log file (the first time the service or host is checked)
# you can enable this option by setting this value to 1.  If you
# are not using an external application that does long term state
# statistics reporting, you do not need to enable this option.  In
# this case, set the value to 0.

log_initial_states=0



*EXTERNAL COMMANDS LOGGING OPTION
# If you don&#039;t want Nagios to log external commands, set this value
# to 0.  If external commands should be logged, set this value to 1.
# Note: This option does not include logging of passive service
# checks - see the option below for controlling whether or not
# passive checks are logged.

log_external_commands=1



* PASSIVE CHECKS LOGGING OPTION
# If you don&#039;t want Nagios to log passive host and service checks, set
# this value to 0.  If passive service checks should be logged, set
# this value to 1.

log_passive_checks=1



* GLOBAL HOST AND SERVICE EVENT HANDLERS
# These options allow you to specify a host and service event handler
# command that is to be run for every host or service state change.
# The global event handler is executed immediately prior to the event
# handler that you have optionally specified in each host or
# service definition. The command argument is the short name of a
# command definition that you define in your host configuration file.
# Read the HTML docs for more information.

#global_host_event_handler=somecommand
#global_service_event_handler=somecommand



* SERVICE INTER-CHECK DELAY METHOD
# This is the method that Nagios should use when initially
# &quot;spreading out&quot; service checks when it starts monitoring.  The
# default is to use smart delay calculation, which will try to
# space all service checks out evenly to minimize CPU load.
# Using the dumb setting will cause all checks to be scheduled
# at the same time (with no delay between them)!  This is not a
# good thing for production, but is useful when testing the
# parallelization functionality.
#	n	= None - don&#039;t use any delay between checks
#	d	= Use a &quot;dumb&quot; delay of 1 second between checks
#	s	= Use &quot;smart&quot; inter-check delay calculation
#       x.xx    = Use an inter-check delay of x.xx seconds

service_inter_check_delay_method=s



* MAXIMUM SERVICE CHECK SPREAD
# This variable determines the timeframe (in minutes) from the
# program start time that an initial check of all services should
# be completed.  Default is 30 minutes.

max_service_check_spread=30



*SERVICE CHECK INTERLEAVE FACTOR
# This variable determines how service checks are interleaved.
# Interleaving the service checks allows for a more even
# distribution of service checks and reduced load on remote
# hosts.  Setting this value to 1 is equivalent to how versions
# of Nagios previous to 0.0.5 did service checks.  Set this
# value to s (smart) for automatic calculation of the interleave
# factor unless you have a specific reason to change it.
#       s       = Use &quot;smart&quot; interleave factor calculation
#       x       = Use an interleave factor of x, where x is a
#                 number greater than or equal to 1.

service_interleave_factor=s



* HOST INTER-CHECK DELAY METHOD
# This is the method that Nagios should use when initially
# &quot;spreading out&quot; host checks when it starts monitoring.  The
# default is to use smart delay calculation, which will try to
# space all host checks out evenly to minimize CPU load.
# Using the dumb setting will cause all checks to be scheduled
# at the same time (with no delay between them)!
#	n	= None - don&#039;t use any delay between checks
#	d	= Use a &quot;dumb&quot; delay of 1 second between checks
#	s	= Use &quot;smart&quot; inter-check delay calculation
#       x.xx    = Use an inter-check delay of x.xx seconds

host_inter_check_delay_method=s



* MAXIMUM HOST CHECK SPREAD
# This variable determines the timeframe (in minutes) from the
# program start time that an initial check of all hosts should
# be completed.  Default is 30 minutes.

max_host_check_spread=30



*MAXIMUM CONCURRENT SERVICE CHECKS
# This option allows you to specify the maximum number of 
# service checks that can be run in parallel at any given time.
# Specifying a value of 1 for this variable essentially prevents
# any service checks from being parallelized.  A value of 0
# will not restrict the number of concurrent checks that are
# being executed.

max_concurrent_checks=0



*SERVICE CHECK REAPER FREQUENCY
# This is the frequency (in seconds!) that Nagios will process
# the results of services that have been checked.

service_reaper_frequency=10




*AUTO-RESCHEDULING OPTION
# This option determines whether or not Nagios will attempt to
# automatically reschedule active host and service checks to
# &quot;smooth&quot; them out over time.  This can help balance the load on
# the monitoring server.  
# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE
# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY

auto_reschedule_checks=0



*AUTO-RESCHEDULING INTERVAL
# This option determines how often (in seconds) Nagios will
# attempt to automatically reschedule checks.  This option only
# has an effect if the auto_reschedule_checks option is enabled.
# Default is 30 seconds.
# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE
# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY

auto_rescheduling_interval=30




* AUTO-RESCHEDULING WINDOW
# This option determines the &quot;window&quot; of time (in seconds) that
# Nagios will look at when automatically rescheduling checks.
# Only host and service checks that occur in the next X seconds
# (determined by this variable) will be rescheduled. This option
# only has an effect if the auto_reschedule_checks option is
# enabled.  Default is 180 seconds (3 minutes).
# WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE
# PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY

auto_rescheduling_window=180



*SLEEP TIME
# This is the number of seconds to sleep between checking for system
# events and service checks that need to be run.

sleep_time=0.25



* TIMEOUT VALUES
# These options control how much time Nagios will allow various
# types of commands to execute before killing them off.  Options
# are available for controlling maximum time allotted for
# service checks, host checks, event handlers, notifications, the
# ocsp command, and performance data commands.  All values are in
# seconds.

service_check_timeout=60
host_check_timeout=30
event_handler_timeout=30
notification_timeout=30
ocsp_timeout=5
perfdata_timeout=5



* RETAIN STATE INFORMATION
# This setting determines whether or not Nagios will save state
# information for services and hosts before it shuts down.  Upon
# startup Nagios will reload all saved service and host state
# information before starting to monitor.  This is useful for 
# maintaining long-term data on state statistics, etc, but will
# slow Nagios down a bit when it (re)starts.  Since its only
# a one-time penalty, I think its well worth the additional
# startup delay.

* retain_state_information=1



* STATE RETENTION FILE
# This is the file that Nagios should use to store host and
# service state information before it shuts down.  The state 
# information in this file is also read immediately prior to
# starting to monitor the network when Nagios is restarted.
# This file is used only if the preserve_state_information
# variable is set to 1.

state_retention_file=/usr/local/nagios/var/retention.dat



* RETENTION DATA UPDATE INTERVAL
# This setting determines how often (in minutes) that Nagios
# will automatically save retention data during normal operation.
# If you set this value to 0, Nagios will not save retention
# data at regular interval, but it will still save retention
# data before shutting down or restarting.  If you have disabled
# state retention, this option has no effect.

retention_update_interval=60



* USE RETAINED PROGRAM STATE
# This setting determines whether or not Nagios will set 
# program status variables based on the values saved in the
# retention file.  If you want to use retained program status
# information, set this value to 1.  If not, set this value
# to 0.

use_retained_program_state=1



* USE RETAINED SCHEDULING INFO
# This setting determines whether or not Nagios will retain
# the scheduling info (next check time) for hosts and services
# based on the values saved in the retention file.  If you
# If you want to use retained scheduling info, set this
# value to 1.  If not, set this value to 0.

use_retained_scheduling_info=0



* INTERVAL LENGTH
# This is the seconds per unit interval as used in the
# host/contact/service configuration files.  Setting this to 60 means
# that each interval is one minute long (60 seconds).  Other settings
# have not been tested much, so your mileage is likely to vary...

interval_length=60



* AGGRESSIVE HOST CHECKING OPTION
# If you don&#039;t want to turn on aggressive host checking features, set
# this value to 0 (the default).  Otherwise set this value to 1 to
# enable the aggressive check option.  Read the docs for more info
# on what aggressive host check is or check out the source code in
# base/checks.c

use_aggressive_host_checking=0



* SERVICE CHECK EXECUTION OPTION
# This determines whether or not Nagios will actively execute
# service checks when it initially starts.  If this option is 
# disabled, checks are not actively made, but Nagios can still
# receive and process passive check results that come in.  Unless
# you&#039;re implementing redundant hosts or have a special need for
# disabling the execution of service checks, leave this enabled!
# Values: 1 = enable checks, 0 = disable checks

execute_service_checks=1



* PASSIVE SERVICE CHECK ACCEPTANCE OPTION
# This determines whether or not Nagios will accept passive
# service checks results when it initially (re)starts.
# Values: 1 = accept passive checks, 0 = reject passive checks

accept_passive_service_checks=1



* HOST CHECK EXECUTION OPTION
# This determines whether or not Nagios will actively execute
# host checks when it initially starts.  If this option is 
# disabled, checks are not actively made, but Nagios can still
# receive and process passive check results that come in.  Unless
# you&#039;re implementing redundant hosts or have a special need for
# disabling the execution of host checks, leave this enabled!
# Values: 1 = enable checks, 0 = disable checks

execute_host_checks=1



*PASSIVE HOST CHECK ACCEPTANCE OPTION
# This determines whether or not Nagios will accept passive
# host checks results when it initially (re)starts.
# Values: 1 = accept passive checks, 0 = reject passive checks

accept_passive_host_checks=1



* NOTIFICATIONS OPTION
# This determines whether or not Nagios will sent out any host or
# service notifications when it is initially (re)started.
# Values: 1 = enable notifications, 0 = disable notifications

enable_notifications=1



* EVENT HANDLER USE OPTION
# This determines whether or not Nagios will run any host or
# service event handlers when it is initially (re)started.  Unless
# you&#039;re implementing redundant hosts, leave this option enabled.
# Values: 1 = enable event handlers, 0 = disable event handlers

enable_event_handlers=1



* PROCESS PERFORMANCE DATA OPTION
# This determines whether or not Nagios will process performance
# data returned from service and host checks.  If this option is
# enabled, host performance data will be processed using the
# host_perfdata_command (defined below) and service performance
# data will be processed using the service_perfdata_command (also
# defined below).  Read the HTML docs for more information on
# performance data.
# Values: 1 = process performance data, 0 = do not process performance data

process_performance_data=0


* HOST AND SERVICE PERFORMANCE DATA PROCESSING COMMANDS
# These commands are run after every host and service check is
# performed.  These commands are executed only if the
# enable_performance_data option (above) is set to 1.  The command
# argument is the short name of a command definition that you 
# define in your host configuration file.  Read the HTML docs for
# more information on performance data.

#host_perfdata_command=process-host-perfdata
#service_perfdata_command=process-service-perfdata



* HOST AND SERVICE PERFORMANCE DATA FILES
# These files are used to store host and service performance data.
# Performance data is only written to these files if the
# enable_performance_data option (above) is set to 1.

#host_perfdata_file=/tmp/host-perfdata
#service_perfdata_file=/tmp/service-perfdata



* HOST AND SERVICE PERFORMANCE DATA FILE TEMPLATES
# These options determine what data is written (and how) to the
# performance data files.  The templates may contain macros, special
# characters (\t for tab, \r for carriage return, \n for newline)
# and plain text.  A newline is automatically added after each write
# to the performance data file.  Some examples of what you can do are
# shown below.

#host_perfdata_file_template=[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$
#service_perfdata_file_template=[SERVICEPERFDATA]\t$TIMET$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$




* HOST AND SERVICE PERFORMANCE DATA FILE MODES
# This option determines whether or not the host and service
# performance data files are opened in write (&quot;w&quot;) or append (&quot;a&quot;)
# mode.  Unless you are the files are named pipes, you will probably
# want to use the default mode of append (&quot;a&quot;).

#host_perfdata_file_mode=a
#service_perfdata_file_mode=a



* HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING INTERVAL
# These options determine how often (in seconds) the host and service
# performance data files are processed using the commands defined
# below.  A value of 0 indicates the files should not be periodically
# processed.

#host_perfdata_file_processing_interval=0
#service_perfdata_file_processing_interval=0



*HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING COMMANDS
# These commands are used to periodically process the host and
# service performance data files.  The interval at which the
# processing occurs is determined by the options above.

#host_perfdata_file_processing_command=process-host-perfdata-file
#service_perfdata_file_processing_command=process-service-perfdata-file



* OBSESS OVER SERVICE CHECKS OPTION
# This determines whether or not Nagios will obsess over service
# checks and run the ocsp_command defined below.  Unless you&#039;re
# planning on implementing distributed monitoring, do not enable
# this option.  Read the HTML docs for more information on
# implementing distributed monitoring.
# Values: 1 = obsess over services, 0 = do not obsess (default)

obsess_over_services=0



*OBSESSIVE COMPULSIVE SERVICE PROCESSOR COMMAND
# This is the command that is run for every service check that is
# processed by Nagios.  This command is executed only if the
# obsess_over_service option (above) is set to 1.  The command 
# argument is the short name of a command definition that you
# define in your host configuration file. Read the HTML docs for
# more information on implementing distributed monitoring.

#ocsp_command=somecommand



* ORPHANED SERVICE CHECK OPTION
# This determines whether or not Nagios will periodically 
# check for orphaned services.  Since service checks are not
# rescheduled until the results of their previous execution 
# instance are processed, there exists a possibility that some
# checks may never get rescheduled.  This seems to be a rare
# problem and should not happen under normal circumstances.
# If you have problems with service checks never getting
# rescheduled, you might want to try enabling this option.
# Values: 1 = enable checks, 0 = disable checks

check_for_orphaned_services=0



* SERVICE FRESHNESS CHECK OPTION
# This option determines whether or not Nagios will periodically
# check the &quot;freshness&quot; of service results.  Enabling this option
# is useful for ensuring passive checks are received in a timely
# manner.
# Values: 1 = enabled freshness checking, 0 = disable freshness checking

check_service_freshness=1



* SERVICE FRESHNESS CHECK INTERVAL
# This setting determines how often (in seconds) Nagios will
# check the &quot;freshness&quot; of service check results.  If you have
# disabled service freshness checking, this option has no effect.

service_freshness_check_interval=60



* HOST FRESHNESS CHECK OPTION
# This option determines whether or not Nagios will periodically
# check the &quot;freshness&quot; of host results.  Enabling this option
# is useful for ensuring passive checks are received in a timely
# manner.
# Values: 1 = enabled freshness checking, 0 = disable freshness checking

check_host_freshness=0



*HOST FRESHNESS CHECK INTERVAL
# This setting determines how often (in seconds) Nagios will
# check the &quot;freshness&quot; of host check results.  If you have
# disabled host freshness checking, this option has no effect.

host_freshness_check_interval=60



*AGGREGATED STATUS UPDATES
# This option determines whether or not Nagios will 
# aggregate updates of host, service, and program status
# data.  Normally, status data is updated immediately when
# a change occurs.  This can result in high CPU loads if
# you are monitoring a lot of services.  If you want Nagios
# to only refresh status data every few seconds, disable
# this option.
# Values: 1 = enable aggregate updates, 0 = disable aggregate updates

aggregate_status_updates=1



* AGGREGATED STATUS UPDATE INTERVAL
# Combined with the aggregate_status_updates option,
# this option determines the frequency (in seconds!) that
# Nagios will periodically dump program, host, and 
# service status data.  If you are not using aggregated
# status data updates, this option has no effect.

status_update_interval=15



* FLAP DETECTION OPTION
# This option determines whether or not Nagios will try
# and detect hosts and services that are &quot;flapping&quot;.  
# Flapping occurs when a host or service changes between
# states too frequently.  When Nagios detects that a 
# host or service is flapping, it will temporarily supress
# notifications for that host/service until it stops
# flapping.  Flap detection is very experimental, so read
# the HTML documentation before enabling this feature!
# Values: 1 = enable flap detection
#         0 = disable flap detection (default)

enable_flap_detection=0



*FLAP DETECTION THRESHOLDS FOR HOSTS AND SERVICES
# Read the HTML documentation on flap detection for
# an explanation of what this option does.  This option
# has no effect if flap detection is disabled.

low_service_flap_threshold=5.0
high_service_flap_threshold=20.0
low_host_flap_threshold=5.0
high_host_flap_threshold=20.0



* DATE FORMAT OPTION
# This option determines how short dates are displayed. Valid options
# include:
#	us		(MM-DD-YYYY HH:MM:SS)
#	euro    	(DD-MM-YYYY HH:MM:SS)
#	iso8601		(YYYY-MM-DD HH:MM:SS)
#	strict-iso8601	(YYYY-MM-DDTHH:MM:SS)
#

date_format=us



* P1.PL FILE LOCATION
# This value determines where the p1.pl perl script (used by the
# embedded Perl interpreter) is located.  If you didn&#039;t compile
# Nagios with embedded Perl support, this option has no effect.

p1_file=/usr/local/nagios/bin/p1.pl



* ILLEGAL OBJECT NAME CHARACTERS
# This option allows you to specify illegal characters that cannot
# be used in host names, service descriptions, or names of other
# object types.

illegal_object_name_chars=`~!$%^&amp;*|&#039;&quot;&lt;&gt;?,()=



*ILLEGAL MACRO OUTPUT CHARACTERS
# This option allows you to specify illegal characters that are
# stripped from macros before being used in notifications, event
# handlers, etc.  This DOES NOT affect macros used in service or
# host check commands.
# The following macros are stripped of the characters you specify:
#	$HOSTOUTPUT$
#	$HOSTPERFDATA$
#	$HOSTACKAUTHOR$
#	$HOSTACKCOMMENT$
#	$SERVICEOUTPUT$
#	$SERVICEPERFDATA$
#	$SERVICEACKAUTHOR$
#	$SERVICEACKCOMMENT$

illegal_macro_output_chars=`~$&amp;|&#039;&quot;&lt;&gt;



* REGULAR EXPRESSION MATCHING
# This option controls whether or not regular expression matching
# takes place in the object config files.  Regular expression
# matching is used to match host, hostgroup, service, and service
# group names/descriptions in some fields of various object types.
# Values: 1 = enable regexp matching, 0 = disable regexp matching

use_regexp_matching=0



* &quot;TRUE&quot; REGULAR EXPRESSION MATCHING
# This option controls whether or not &quot;true&quot; regular expression 
# matching takes place in the object config files.  This option
# only has an effect if regular expression matching is enabled
# (see above).  If this option is DISABLED, regular expression
# matching only occurs if a string contains wildcard characters
# (* and ?).  If the option is ENABLED, regexp matching occurs
# all the time (which can be annoying).
# Values: 1 = enable true matching, 0 = disable true matching

use_true_regexp_matching=0




* ADMINISTRATOR EMAIL ADDRESS
# The email address of the administrator of *this* machine (the one
# doing the monitoring).  Nagios never uses this value itself, but
# you can access this value by using the $ADMINEMAIL$ macro in your
# notification commands.

admin_email=nagios



* ADMINISTRATOR PAGER NUMBER/ADDRESS
# The pager number/address for the administrator of *this* machine.
# Nagios never uses this value itself, but you can access this
# value by using the $ADMINPAGER$ macro in your notification
# commands.

admin_pager=pagenagios



* DAEMON CORE DUMP OPTION
# This option determines whether or not Nagios is allowed to create
# a core dump when it runs as a daemon.  Note that it is generally
# considered bad form to allow this, but it may be useful for
# debugging purposes.
# Values: 1 - Allow core dumps
#         0 - Do not allow core dumps (default)

daemon_dumps_core=0



# EOF (End of file)    </description>
    <dc:date>2006-03-04T11:46:24+09:00</dc:date>
    <utime>1141440384</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/4.html">
    <title>00001</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/4.html</link>
    <description>
      -[[第１章	概觀NAGIOS]]
-[[第１節	熱身運動]]	
-[[第２節	NAGIOS的功能]]	
-[[第３節	關於linux平台與apache伺服器的必備知識]]
-[[第４節	系統需求]]
-[[windows環境之下的對應方法]]	
-[[第５節	下載與安裝]]	
-[[第６節	尋找第一個監視對像]]	

----
第２章	開始設定你的NAGIOS	4
第１節	NAGIOS的監視模型	4
第１項	USECASE圖	4
第２項	群體-以一個來代表全部	4
第３項	狀態(STATE)	4
--[[狀態的種類]]
第４項	時間帶(Time Period)	4

----
-[[第２節	設定服務]]
-[[開始設定service ]]
第３節	設定主機	4
第４節	設定聯絡人	4
--[[第５節	設定時間細節]]
--[[通知的種類]]
第６節	活用-實際案例探討	4
第７節	快速完成設定的技巧	4

----
第３章	NAGIOS平台的徹底了解	4
-[[第１節	NAGIOS是如何運作的]]
-[[第２節	基本選項的調適	]]
-[[第３節	進階選項的調適]]
第４節	NAGIOS所提供各個cgi說明	4
第５節	安全課題：強化NAGIOS的安全性	4
--[[第６節	外部命令]]
第７節	監視履歷與報告	4

----
第４章	各種情況下的監視command	4
第１節	各種常用服務的監視	4

-[[第２節	巨集的使用]]
第３節	服務與主機之間依存性的設定	4
第４節	遠端主機的監視	4
第５節	防火強之內主機的監視	4
第６節	主機或服務在被進行維護之時的休眠設定

-[[第7節 事件處理]]	
-[[第8節 主動監視與被動監視]]	
-[[第9節 主動監視與被動監視(2)]]	

----
-[[第５章	hack NAGIOS-監視command的開發]]	
-[[第１節	第一個NAGIOS 插件]] 
-[[第２節	開發者守則]]
-[[第３節	使用java語言來開發NAGIOS股價監視插件]]
-[[第４節	使用Perl語言來開發插件]]
第５節	使用shell script來開發插件	4
第６節	使用c語言來開發插件	4
第７節	NAGIOS所提供的公用含式	4
第６章	其他專案所提供的支援	4
第１節	設定支援：使用Perl及web介面輕鬆完成設定的專案	5
第２節	設定支援：使用php及web介面輕鬆完成設定的專案	5
第３節	mrtg：cpu使用率及load的圖形化監視	5
第７章	後記	5
第１節	專題討論：Escalations與Dependencies	5
第２節	作文：我與nagios的交往過程	5
第３節	後記：耶誕節快樂！	5    </description>
    <dc:date>2006-03-04T11:41:06+09:00</dc:date>
    <utime>1141440066</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/26.html">
    <title>第２節	基本選項的調適</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/26.html</link>
    <description>
      *前言
本章開始要進入nagios的核心設定檔。這一個設定檔的內容，掌握了nagios的主要動作，「可以」設定的選項非常的多，但是大多可以不用理它。用預設值就可以了，但是如果你想要多了解一下這一個工具，那或許可以好好讀讀這一章，我會努力將它用簡單的方式，呈現給大家。

這一個設定檔，nagios的主程式，以及cgi程式，都會去讀，所以簡單的說，就是這個設定檔裡規範了nagios的動作之外，也規範了cgi的動作，有的選項是用來調適cgi的，而有的選項是用來調適nagios的。

在安裝的時後，當我們執行config的命令之時，make就會幫我們生成一個最原始的file。我們就以這個隨手可得的設定檔原型當作範例，來作說明。

我們在執行設定config的時後，如果執行：
 ./configure -h 
之時，會出現很多的選項，其實在這個選項裡所指定的內容，都會在這個設定檔裡被反應。所以換句話說，在設定之時，也不用設定的太複雜，在安裝好之後，在進行設定就可以了。

我們只要仔細作個判斷，nagios本體的程式，也就是核心的部份，主要負責的部份，以及cgi所擔當的任務，可以作出下列的歸類：

 

*記錄檔的設定：
這一個選項是用來指定設定當的吐出位置。所有的程式，只要是比較建全設計，都會吐出記錄檔。
這個記錄檔裡將記錄很多細節的動作，以及按照時間，記錄每一個動作。我們如果要查看nagios在那個時間出現了什麼事，只要看一下這一個紀綠檔，都可以得到確切的資料。
 

 log_file=/usr/local/nagios/var/nagios.log
*物件設定檔案

接下來的設定，是對於被監視的對像進行設定的設定檔的位置。這個位置可以是在一個檔案裡，也可以作分類在不同的檔案裡，全看實際的情況來作調整。語法也相當的簡單：

 cfg_file=檔案的路徑及檔案的名字。
 
這其實是一個include的觀念，這裡的設定檔在啟動時會被讀進來。
把所有的物件定義全部寫在一個檔案裡時，當你的系統很小，這是一個最簡單的方式(所謂的簡單，應該是說在設定時，只要編輯一個檔案就好了，不需要不時的切換到別的檔案)可以用以下的方式：
 cfg_file=/usr/local/nagios/etc/minimal.cfg

這個minimal.cfg檔案，是安裝時會自動被生成的，可以作為設定時參考之用，相對於這個minimal.cfg，還有一個叫bigger.cfg的，由字面上的意思來看，就是比較大的設定檔，裡面的範例更多，可以作為參考。

不過在實際運用時通當會設定成多個檔案，這樣子一來在維護時比較方便。
 cfg_file=/usr/local/nagios/etc/contactgroups.cfg
 cfg_file=/usr/local/nagios/etc/contacts.cfg
 cfg_file=/usr/local/nagios/etc/hostgroups.cfg
 cfg_file=/usr/local/nagios/etc/hosts.cfg
 cfg_file=/usr/local/nagios/etc/services.cfg
 cfg_file=/usr/local/nagios/etc/timeperiods.cfg

由於nagios的本體之外，還有另外一個專案，提供了很多檢查用 的plugin。這些檢查用的plugin由於不定時的會有版本更新，所以在進行命令檔的定義時，應該採用該專案所提供的命令定義檔，而不是nagios的。
命令檔為了管理方便，運用上還是採分開的定義。以下的這一行裡所定義的檔案，裡頭就全部都是定義了專門用來檢查用的命令群。
 
 cfg_file=/usr/local/nagios/etc/checkcommands.cfg
而下列這一行，所記載的檔案，裡頭則定義了用來通知，以及用來對事件作出對應用的命令群。
 
 cfg_file=/usr/local/nagios/etc/misccommands.cfg
而一些擴張的主機或是服務的資訊，則定義在以下兩個物件定義檔中。
 
 cfg_file=/usr/local/nagios/etc/hostextinfo.cfg
 cfg_file=/usr/local/nagios/etc/serviceextinfo.cfg

 


如果覺得一個一個的設定太麻煩的話，也可以指定dir的方式，在這個dir之下的所有cfg檔案，都會被讀進來。
 cfg_dir=/usr/local/nagios/etc/servers
 cfg_dir=/usr/local/nagios/etc/printers
 cfg_dir=/usr/local/nagios/etc/switches
 cfg_dir=/usr/local/nagios/etc/routers


*物件快取檔案
nagios在啟動的時後，會讀取設定檔，然後將讀取的內容，保留在一個檔案裡面。這一個檔案裡的內容，將會是nagios運行的這一段過程之間，主要參照的地方。這一個檔案裡並沒有使用特別的編碼或演算法，只是單純的文字檔。
會這樣子作的理由，是因為，如果直接以各個設定檔作參考的依據，那如果程式執行過程中，設定檔被修改，就有可能會有發生錯誤的機會，因為無法保証設定檔的設定永遠是正確的。

換句話說，也因為有這樣子的設計，我們設定完這些設定檔之後，需要重新啟動nagios，讓nagios的主程式，幫我們將這些設定的內容更新到快取檔案裡，如此一來設定才會生效。
 
 object_cache_file=/usr/local/nagios/var/objects.cache

*資源檔
這是一個可以自由設定的選項。如果說你有一些東西，像是登入主機用的id，甚至是密碼，等等一些敏感性的資料，為了安全的理由，你想把他獨立出來，不想直接寫到命令的定義檔，或是其他的檔案裡頭，就可以使用這一個檔案。
這個檔案的寫法，是以$USERx$為主要的格式，在這些檔案所定義的巨集，在其他的檔案裡就可以引用。
cgi並不會存取這一個檔案，再加上你可以將這個檔案的權限設為600，就可以防止其他人讀取。

如果你不想把所有的定義值，寫在一個檔案裡，也可以將他們分開，只要在這裡作好定義，讓nagios能認識就可以了。


 resource_file=/usr/local/nagios/etc/resource_server1.cfg
 resource_file=/usr/local/nagios/etc/resource_server2.cfg

**資源檔設定範例



*狀態檔案
這些檔案是nagios對於服務或是主機監視的結果。也就是所有的主機與服務目前的狀態。這個監視的結果會被cgi的程式們所讀取，然後在畫面上以比較容易被了解的圖形來表示。
這些狀態檔，在每一次nagios被啟動的時後，都會被清空歸零，也就是刪除掉。
 
 status_file=/usr/local/nagios/var/status.dat


*程式的執行者
在linux下面使用者的觀念是非常的明確的。這一個選項可以讓我們決定nagios要使用那一個身份來執行。可以使用使用者帳號或者是uid。當然，這裡所被指定的使用者需要是系統裡存在的帳號，不能無中生有。不然程式會無法啟動。
 nagios_user=Administrator



*程式所屬的群組
這一個選項與上個選項相對應，用來決定運行的程式，適用於那一個群組的權限與設定。十
 nagios_group=Administrators

*是否要檢查有來自外部的命令

這個選項告訴nagios是否有檢查來自外部的命令。感覺很抽象，不過只要了解nagios的運作方式就可以了解。

所謂來自外部的命令是指來自nagios本體程式的外部所設定的命令。通常命令都是寫在設定物件檔裡，在nagios啟動時就載入，然後按照規範來運行。而外部的命令是指在nagios運行的狀態之下，從web介面，通過cgi所加入的命令。

這個選項就是要設定nagios的主體程式，是否需要去檢查有來自外部的命令。0的話是不去作檢查，1的話則是要作檢查。

而該隔久，以及該去那裡作檢查，則在接下來的二個選項作設定。當然，理所當然的，這一個選項要設為一，接下來相關選項的設定，才會具有意義。

 check_external_commands=0


*外部命令檢查時間間隔

這一個選項讓我們設定檢查的時間間隔。基本的單位是分。
 command_check_interval=1
此時的檢查時間間隔就是1分。


# EXTERNAL COMMAND CHECK INTERVAL
# This is the interval at which Nagios should check for external commands.
# This value works of the interval_length you specify later.  If you leave
# that at its default value of 60 (seconds), a value of 1 here will cause
# Nagios to check for external commands every minute.  If you specify a
# number followed by an &quot;s&quot; (i.e. 15s), this will be interpreted to mean
# actual seconds rather than a multiple of the interval_length variable.
# Note: In addition to reading the external command file at regularly 
# scheduled intervals, Nagios will also check for external commands after
# event handlers are executed.
# NOTE: Setting this value to -1 causes Nagios to check the external
# command file as often as possible.

#
#command_check_interval=15s
command_check_interval=-1


*外部命令檔案
這個檔案是nagios的主體程式會定期的作檢查是否有外部的外令的檔案。
所以，這個檔案也是cgi程式保存使用者所設定外部命令的地方。所以這個檔案的權限，是必需要讓nagios讀取，也需要讓cgi寫入的。

通常cgi的執行者是apache的執行者。如果apache是使用nobody執行的，那這一個檔案需要能夠被nobody寫入才行。

這個檔案每次在使用過一次後都會被刪掉。所以權限的設定應該是設定在rw這一個目錄，而不是檔案本身。

這一個檔案，其實是一個大小為0k的具名管道。(named pipe)，所以他的檔案型態(用 ls -al)的話，是以p開頭的。這是一個編寫程式時的小技巧。因為我們這裡是二個行程之間的通信，也就是nagios主程式與apache所執行的cgi這兩個行程，所以使用具名管道是一個方便的方法。一方等待讀取，直到另外一方進行寫入。當這個寫入完成之後，這個管道就消失。

當然有些os不支援這種具名管道。(比方說一些不允許檔案的size為0的os)，此時就必需改用其他的方式。


 command_file=/usr/local/nagios/var/rw/nagios.cmd



# COMMENT FILE
# This is the file that Nagios will use for storing host and service
# comments.

comment_file=/usr/local/nagios/var/comments.dat



# DOWNTIME FILE
# This is the file that Nagios will use for storing host and service
# downtime data.

downtime_file=/usr/local/nagios/var/downtime.dat



# LOCK FILE
# This is the lockfile that Nagios will use to store its PID number
# in when it is running in daemon mode.

lock_file=/usr/local/nagios/var/nagios.lock



# TEMP FILE
# This is a temporary file that is used as scratch space when Nagios
# updates the status log, cleans the comment file, etc.  This file
# is created, used, and deleted throughout the time that Nagios is
# running.

temp_file=/usr/local/nagios/var/nagios.tmp    </description>
    <dc:date>2006-03-04T11:39:51+09:00</dc:date>
    <utime>1141439991</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/28.html">
    <title>第２節	巨集的使用</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/28.html</link>
    <description>
      在nagios裡頭，有很多事先定義好的變數名稱，我們利用這些變數名稱，來與nagios作溝通。

這些變數的最主要目的，就是用來作溝通。比方說我們寫程式的時後，寫了十隻程式，第一隻程式執行的結果，要來第二隻程式知道，有很多方法可以達成，最簡單的方式，就是生成一個檔案，這個檔案可以讓第二隻程式來讀取。

這個巨集的運用，也是類似這樣子的觀念。為了要使資訊能夠傳遞，nagios的本體裡定義了很多的巨集。這些巨集都是以2個$記號給包了起來。舉例來說：

 $SERVICESTATETYPE$ 

這一個巨集，就是用來傳遞該服務，或是該主機目前所處在的狀態，是soft狀態，或是hard狀態。


當nagios的核心，對一個服務進行檢查，確認了該服務的狀態之後，這個狀態的資訊，只有nagios才知道。如果其他的元件，想要知道該服務是處於什麼狀態，以變針對該狀態作出對應時，nagios會針對它們的需要，將這些資訊傳給它們。而巨集就是用來代表這些資訊。

有點抽像，舉個例子來說：
我們在checkcommand的檔案裡定義了一個命令，這個命令，需要我們傳入主機的位置，主機目前的狀態。


此時我們可以這麼寫：

define check_XXX{
 $HOST$
}

接下來，我們列出一些我們經常會使用的巨集。

*為什麼是巨集

因為在nagios裡，監視是分成很多個服務或主機的。所以每個主機或是服務裡，都有同樣的變數。nagios使用巨集，以便適用於各個定義項目。

*利用巨集來與nagios溝通：

同樣地，我們要與每個設定好的服務作溝通之時，也要透過巨集。
比方說，我們要將設定值，透過cgi介面傳給nagios，希望nagios能夠為我們動態的改變該服務或是主機的設定值。此時，也需要利用該巨集。




我們在定義命令

需要將這一個資訊傳達給它們。    </description>
    <dc:date>2006-02-28T23:55:44+09:00</dc:date>
    <utime>1141138544</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/17.html">
    <title>第8節 主動監視與被動監視</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/17.html</link>
    <description>
      
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;主動監視與被動監視&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;除了主動的去監視主機與服務之外，還可以接受從主機及服務過來的「安全回報」，就好象在遠方的遊子常常要打電話回家報平安一樣。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;簡單的來說，被動監視就是&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;不主動去監視主機或服務的狀況，而改成主機或服務向&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;回報自已的狀況，然後&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;在依照服務或主機所回報的狀況，進行通知聯絡人或是事件處理的動作。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;這一個概念可以在很多領域裡被運用。比方說，你開發了一個每天半夜&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;3&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;點寄送當天的銷售統計的程式，這個程式所作的事情，就是在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;3&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;點的時候將資料庫裡的各產品的銷售資料與客戶資料提取出來，產生統計報表後，把報表作為郵件的內容寄送到銷售經理的信箱。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;我們想要讓&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;來監視這個服務，但是確有幾個要克服的問題，第一個，這個程式稱不上是什麼主機或服務，一天只執行一次。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;第二個，開始的時間雖然是固定的，但是程式終了的時間確完全不固定。可能當天的銷售情況很好，資料量很多，所以處理到四點才完成。也有可能當天正逢連休，大家都出遠門去玩了，所以業蹟也很寂寞，只有幾件銷售。這種情況當天的銷售報表產生可能只要花&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;5&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;分鐘，也就是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;3&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;點&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;5&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;分就完成了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;由於這麼多特別的情況，如果要讓&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;定期來查看的話，那可能在&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;3&lt;/font&gt;&lt;/span&gt; &lt;span style=
&quot;font-family: PMingLiU;&quot; lang=&quot;ZH-TW&quot;&gt;點到&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;4&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=&quot;ZH-TW&quot;&gt;點之間，&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;要定期的來訪問，看看程式是否還在執行，或是執行完了，作是作的到，但是很不方便。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;但是有了被動監視之後，事情就改觀了，只要在報表記送完成，或是遇到什麼例外&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;(exceptiom)&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;或是錯誤時，給&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;一個回報就好了，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;就會開始它的工作了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;介紹到這裡，我們來看一個簡單的例子：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;話題進行到這裡，有一個問題不知道大家是否想到，那就是，如果程式徹底的掛點了，比方說，執行程式的主機突然受到駭客攻擊，或是糟遇了什麼不測，那&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;不就一直收不到程式送來的回報，而一直吃吃的等了？&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;為了解決這個問題，有一個概念將在下一節對大家說明：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;新鮮度檢查&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;在被動檢查裡，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;一直都處於等待的狀態。所以無法主動的去得知主機或是服務的情況。但是等待的時間如果太久，那很有可能主機或服務發生了什麼麻煩了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;這個「等待的時間是否太久」的設定，就是這個新鮮度檢查的概念。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;我們買了一瓶鮮奶，我們一定會看他的製造日期，保存期限，和現在的日期作比較之後，才決定要不要購買。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;Nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;也是一樣。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nsgios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;裡，針對每一個被動監視，都可以設定保存期限。當&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;接到該監視的一個回報時，會以檔案的型式將它保存下來。每次這個監視有新的回報進來，就更新這一個檔案。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;比方說在上方的例子，因為銷售的郵件每天都會寄。所以寄完郵件後到下一次寄郵件的時間間隔，也大概會是一天左右。比方說前一天在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;3&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;點&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;40&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;分寄完的，今天是在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;3&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;點&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;5&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;分寄完。昨天寄完郵件的時間與今天寄完郵件的時間的間隔，是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;23&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;小時又&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;25&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;分。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;又比如昨天是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;4&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;點才寄完，今天因為資料更多，所以到&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;5&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;才寄完，這兩者之間隔了&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;25&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;個小時。間隔的時間在那個範圍以內才合理，這要看現場的狀況才能估計，為了簡單說明，我們假設如果間隔的時間超過&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;30&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;個小時以上，就有問題。也就是說，前一天是凌晨&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;4&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;點寄完的，但是今天的郵件到了早上的十點確還沒有寄完，那就可能寄信或是報表產生的過程中，發生了什麼障礙了。或許是真的資料量多到不行了，但是還是通知專人去檢查一下，比較能夠安心。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;接著，這個「間隔多長的時間」要如何利用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;來作監視呢？也就是剛剛所說的，&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;在接到郵件寄完時的通知時，會將它保存起來，然後在隔天在次收到郵件寄完時的通知時，會更新這一個通知的時間。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;然後藉由在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;裡設定這個保存期限。比方說我們設定為&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;30&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;小時。在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;30&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;個小時之內，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;裡所保存的這一個通知，如果沒有被更新的話，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;就會判定這個通知不新鮮，過期了。此時，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;就可以對聯絡人發出警訊，然後在由工程師去檢查一下是否真的發生問題。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
簡單的以下列的圖來說明，nagios是如何實現被動檢視：&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;    </description>
    <dc:date>2006-02-28T23:11:25+09:00</dc:date>
    <utime>1141135885</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/29.html">
    <title>第9節 主動監視與被動監視(2)</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/29.html</link>
    <description>
      *被動監視
----

談到這個主題，令人想到我們已前學英文時，常常提到的主動詞與被動詞。但是一點關系也沒有就是了。
為了實現被動的監視，nagios必須要有一個管道來接收，從外頭進來的回報，用來確定該服務是正常的被執行的。這個管道就是我們之前所提到過的nagioscmd。
這個流程圖如下所示

外部來的監視回報-&gt;nagios的監視介面-&gt;nagios的狀態檔案裡記錄 

然後這個狀態檔就會被web的cgi的程式所讀取，然後在畫面上被表示出來。

這個時候會出現的問題點，就是如果從外面送進來的資料，如果nagios不認識的話，也沒有意義，所以要先定義好一定的格式，讓彼此都可以認識，所以外頭來的監視回報，不管是監視什麼的回報，都需要符合下列的類型。

然後nagios收到回報之後，才能夠判斷那一個服務，或是那一台主機現在是ok的。所以，在nagios裡面，事先對這一個服務或是主機，進行定義，是有必要的。

*新鮮度檢查
----
即然是nagios被動的等待資訊的進來，nagios也不甘於只是等待，nagios所要採取的行動，就是主動的去檢查，是否進來的資訊，是最新的，即時的。

如果資訊太舊，那就代表已經很久的時間沒有新的回報進來了，這個時候，nagios就可以很合理的對於該監視項目的安危提出合理的懷疑。而對於相關人士發出警告。

為了實現這一個邏輯，在nagios裡有一個設定的選項，叫做…… 這個項目用來設定資訊過期的時間。也就是說超過這一個時間，資訊如果沒有被更新，那nagios就應該要產生合理的懷疑，將狀態報知相關人員。

*分散式架構

被動模式是一個在nagios本體程式裡提供的模組，使用的方法很廣泛，可以使用的情況就交給各位讀者的想像力去發揮，
在多台主機同時監視之時，也可以使用這個工能，此時擔任主控的機器，需要將各地來的資料，收集起來在一個畫面上顯示，不需要真正的去監視各台server，這一台機器如果要實現這一個「資訊的集散中心」的腳色，就必須要利用這一個功能。
比方說在名居屋的公司裡有1000台機器，在北海道裡也有1000台機器，在東京的總部，要如何確認這2000台機器的狀況，這個時候比較合理的作法，就是在名古屋的機房裡，分別設置幾台監視用的機器，而名古屋的相關人員，可以利用這幾台機器來監視其他的主機與服務，北海道也是一樣的作法。而東京的總部，則只要設置一台nagios，這一台nagios定期的接受從外地來的監視回報即可。

在職務上，東京的人員即使發現了名古屋的機器有問題了，到頭來還是要聯絡名古屋的人解決。

*addon
為了解決網路的阻隔，已便能順利的將監視的結果回傳回去，nagios提供了…這一個addon。

*設定上的調整

首先，在nagios的主要設定檔裡，存在了2個accept_passive_service_checks的選項，我們必須要先將它設為1，這樣一來，其他的設定才會生效。

Format: accept_passive_service_checks=&lt;0/1&gt;
Example: accept_passive_service_checks=1

Format: accept_passive_host_checks=&lt;0/1&gt;
Example: accept_passive_host_checks=1



基本上，所有的nagios的服務，都是可以進行主動的檢查以及進行被動的被告知的。這兩者原則上是使用先進先出的方式。

所謂的先進先出，就是指當nagios的主動檢查，得到一個ok的結果，但是過沒多久，從外頭進來了一個回報，說是該服務不ok。此時nagios沒有像人類一樣複雜的思考，不會想去判斷：到底那一個是對的？nagios所採取的方式很簡單，就是接納最新的消息，不管這消息是自已採訪來的，或是被別人告知的。

這些選項都是可以在設定時被調整。我們可以將服務設定為只接受主動，或只接受被動。換句話說，我們可以將任何一個接受端關起來，不接受任何外頭來的訊息。

在服務及主機裡，主要有兩個選項，來調整主被動。
分別是：

-passive_checks_enabled  [0/1]

以及

-active_checks_enabled  [0/1]

對於每個選項，1與0是可以被指定的，1代表開啟。0則代表關閉。




我們來看一下一個範例：


|一個服務的設定範例|
|設定檔案|

*cgi畫面上的調整


我們在設定選項中的調整，需要重新啟動nagios才會生效。這樣子一來有時候會不太方便，所以，在cgi的介面上，也提供我們可以透過該介面，來進行設定的工能。


這一個cgi的名稱是：    </description>
    <dc:date>2006-02-28T23:07:13+09:00</dc:date>
    <utime>1141135633</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/15.html">
    <title>第３節	使用java語言來開發NAGIOS股價監視插件</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/15.html</link>
    <description>
      
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;在體驗完這個簡單的插件之後，接下來要登場的就是難度比較高一點的插件了。插件可以被任何語言所寫成，只要它是能被執行，並且反回特定格式的訊息，它的內容是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;c&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=&quot;FONT-FAMILY: PMingLiU&quot;&gt;也好，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;java&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;也好，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;perl&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;也好，都是被允許的。用什麼語言來實作並不是一件重要的事，只要能夠達成我們想要的目的，就算及格，所以對java不熟的讀者，看到這一章也不用灰心，因為只要你懂了觀念，你可以用你所會的語言，來將這一個插件，進行改寫。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;hr&gt;&lt;/div&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;●需求定義與設計&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;
所有的插件的產生，都是來自於需求。&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;假設，有一天，在上班的時後，專案經理對小明提出了一個要求，希望小明能夠利用nagios完美的性能，開發出一個定期監視台積電的股價的插件，並且在股價發生變動時，發一封信通知專案經理進場護盤。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;接到這一個要求的小明馬上就列出了下面這一個規格書，並且請經理作確認：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;table style=&quot;WIDTH: 505px; HEIGHT: 38px&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;輸入：股票代碼目標價 停損價&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;輸出：當股票現值超過目標價，則輸出警告，低於停損價，則發出危急&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
雖然經理只對台積電的股價有興趣，但是身為工程師的小明，總是想到軟體工程的一大守則，原件的重用性，所以，小明決定不要把程式碼寫死，留下空間讓專案經理來自行設定。&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;在這個簡單的介面定義書裡，我們也提供了高值與低值的設定選項，因為我們不曉得專案經理對於股價的企圖心在那裡，所以我們把這個設定值空出來讓經裡自行設定。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;與專案經理進行確認之後，就開始要準備進行開發的工作。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;●開發&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;小明評估了需求，以及時間，決定爭取時效，使用有很多方便的程式庫的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;java語言，來作為開發的工具。&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font face=&quot;Century&quot; size=&quot;3&quot;&gt;&lt;span lang=
&quot;EN-US&quot;&gt;第一步：取得即時的股價：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font face=&quot;Century&quot; size=&quot;3&quot;&gt;&lt;span lang=
&quot;EN-US&quot;&gt;為了要知道股票目前最近的股價，唯一的來源就是一些入口網站提供的服務了。所以小明決定到yahoo財經，來取得即時的股價。比方說，台積電的股價，只要訪問下列這一個網站，就可以得到所需的資料了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font face=&quot;Century&quot; size=&quot;3&quot;&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;a href=
&quot;http://tw.stock.yahoo.com/q/q?s=2330&quot;&gt;http://tw.stock.yahoo.com/q/q?s=2330&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font face=&quot;Century&quot; size=&quot;3&quot;&gt;&lt;span lang=
&quot;EN-US&quot;&gt;為了要能夠及時的去把這一個網頁的資料抓回來，小明決定使用由JakartaCommons所提供的HttpClient程式庫。這一個專案的網頁位在&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font face=&quot;Century&quot; size=&quot;3&quot;&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;a href=
&quot;http://jakarta.apache.org/commons/httpclient/&quot;&gt;http://jakarta.apache.org/commons/httpclient/&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font face=&quot;Century&quot; size=&quot;3&quot;&gt;&lt;span lang=
&quot;EN-US&quot;&gt;在下載回來之後，小明使用了這個程式庫，寫了一段抓取網頁的程式碼：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;br&gt;
&lt;p&gt;程式碼：&lt;/p&gt;
&lt;font face=&quot;Courier New&quot;&gt;String url=&quot;&lt;a href=
&quot;http://tw.stock.yahoo.com/q/q?s=2330&quot;&gt;&lt;font color=
&quot;#2A00FF&quot;&gt;http://tw.stock.yahoo.com/q/q?s=2330&lt;/font&gt;&lt;/a&gt;&quot;;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//生成一個httpclient的物件&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;HttpClient client=&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; HttpClient();&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//生成一個get方法的物件&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;GetMethod method = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; GetMethod(url);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;statusCode = client.executeMethod(method);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(statusCode != HttpStatus.SC_OK) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//如果訪問失敗時的處理;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt; &lt;font color=
&quot;#3F7F5F&quot;&gt;System.out.println(&quot;失敗:&quot;+method.getStatusLine());&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=
&quot;#3F7F5F&quot;&gt;//網頁連線成功，開始取得網頁的資料　　&lt;/font&gt;&lt;/font&gt;
&lt;p&gt;&lt;font face=&quot;Courier New&quot;&gt;&lt;font color=
&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;InputStream　responseBody=method.getResponseBodyAsStream();&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//使用中文的編碼，準備將網頁讀進來&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;BufferedReader br=&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; BufferedReader(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; InputStreamReader(responseBody, &lt;font color=
&quot;#2A00FF&quot;&gt;&quot;Big5&quot;&lt;/font&gt;) );&lt;/font&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;
網頁讀取進來之後，一大段的文字並沒有什麼實用的價值，小明必須要想辦法在這一大段的文字裡，找到一個專案經裡所關心的資訊，也就是當時的股價。此時考慮到時效性，小明決定不採用由另外一個專案所提供的html解析套件，改採暴力破解法。&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;
小明使用了文字編輯器，將取得的html原始碼一行一行的往下數下來時，發現當前的股價所記載的位置，正好是在第164行的位置。於是，小明寫了一個回圈，來將取得的大段文章裡，找到164行的內容。正可謂是，股海淘淘，只取一飄呀！&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;程式碼：&lt;/p&gt;
&lt;font face=&quot;Courier New&quot;&gt;&lt;font color=
&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;BufferedReaderbr=&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt;BufferedReader(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt;InputStreamReader(responseBody, &lt;font color=
&quot;#2A00FF&quot;&gt;&quot;Big5&quot;&lt;/font&gt;) );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;String line=&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;line_no=&lt;font color=&quot;#990000&quot;&gt;0&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;((line = br.readLine())!= &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt; ){&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;line_no++;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(line_no ==&lt;font color=&quot;#990000&quot;&gt;164&lt;/font&gt;){&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;/font&gt;&lt;br&gt;
&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
取回來的這一飄，長的像這個樣子：&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&amp;lt;tdalign=&quot;center&quot;bgcolor=&quot;#FFFfff&quot;nowrap&amp;gt;&amp;lt;b&amp;gt;&lt;strong&gt;54.00&lt;/strong&gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
在重重包圍之下的那個54.00,就是我們最終想要得到的結果了。&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
此時只好在對這一行文字進行第二次的加工，將不需要的部分去除，只留下我們想要的。&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;程式碼 3&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
進行到這裡，小明已經將取得股價的原件給制作完成了，把他整合成一個method，程式碼如下方所示：&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;程式碼 4：用來取得即時股價的方法&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
小明程式寫到這裡，覺得松了一口氣，因為核心的部份已經完成了一大部份了。他決定到樓下的starbuck買杯咖啡，順便上個廁所，在回來寫下面的一段。&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;hr&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;第二部：比較股價，產生輸出&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
回到位子上之後，小明開始進行第二階段的開發，也就是將剛剛所得到的即時價格，來與設定的高值，低值，作一個比較，如果高值大於現在值，則反回警告，如果現在值小於低值，則發出危險訊號，通知專案經理作停損。&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;代碼如下所示：&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;程式碼：價何比較的方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font face=&quot;Courier New&quot;&gt;&lt;strong&gt;&lt;font color=
&quot;#7F0055&quot;&gt;privatestatic&lt;/font&gt;&lt;/strong&gt; String compareValues(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;code , &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;current, &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;target_price , &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; low_price ) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;status =-&lt;font color=&quot;#990000&quot;&gt;1&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;String result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;UNKNOWN&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;String message=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;[&quot;&lt;/font&gt;+code +&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;]current:&quot;&lt;/font&gt;+current+&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;,targetis&quot;&lt;/font&gt;+target_price+&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;,lowis&quot;&lt;/font&gt;+low_price;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(current &amp;gt; target_price ) status =&lt;font color=
&quot;#990000&quot;&gt;0&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;elseif&lt;/b&gt;&lt;/font&gt;(current &amp;gt; low_price ) status =&lt;font color=
&quot;#990000&quot;&gt;1&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;elseif&lt;/b&gt;&lt;/font&gt;(current &amp;lt; low_price ) status =&lt;font color=
&quot;#990000&quot;&gt;2&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;switch&lt;/b&gt;&lt;/font&gt;(status) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;0&lt;/font&gt;:&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;WARNING;&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;1&lt;/font&gt;:&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;OK;&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;2&lt;/font&gt;:&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;CRITICAL;&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt;-&lt;font color=&quot;#990000&quot;&gt;1&lt;/font&gt;:&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;UNKNOWN;&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;result+message;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;}&lt;/font&gt;&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;/div&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;在以上的方法裡我們作了二件事情，一件事是價格比較，另一件事將結果以nagios所規定的格式與以反回，並且報知目前的價格，以便讓使用者可以在cgi的畫面上得到更多的資訊。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;?&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;?&lt;/p&gt;
&lt;hr&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;三、選項的讀取&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;
在前面的二個步驟之後，接下來所剩下的，就是讀取外部的選項了。在之前的介面定義書裡，我們知道這個程式需要接受三個選項，而且我們也決定要遵守開發的原則，在使用者輸入了錯誤的選項之時，能夠回送出適當的提示訊息，所以我們決定，使用由&lt;font face=&quot;Century&quot;&gt;由JakartaCommons所提供的&lt;a name=&quot;CLI : Command Line Interface&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;CLI:Command
LineInterface&lt;/font&gt;&lt;/a&gt;程式庫。這一個專案的網頁位在&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;a href=
&quot;http://jakarta.apache.org/commons/cli/&quot;&gt;http://jakarta.apache.org/commons/cli/&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;
在參照了文件的說明之後，小明依照需求，寫出了如下的程式碼：&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;?&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;?&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;程式碼：&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font face=&quot;Courier New&quot;&gt;&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;Options options
=&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Options();&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=&quot;#3F7F5F&quot;&gt;//option 1&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;Option target_price_opt = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Option(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;tp&quot;&lt;/font&gt;, true,&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　　&lt;/font&gt;&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;TargetPrice,forexample -tp=58.5 &quot;&lt;/font&gt;);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;target_price_opt.setRequired(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt; );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//　　option2&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;options.addOption(target_price_opt);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;Option low_price_opt = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Option(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;lp&quot;&lt;/font&gt;, true,&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　　&lt;/font&gt;&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;LowPrice,forexample -lp=58.5 &quot;&lt;/font&gt;);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;low_price_opt.setRequired(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt; );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//　　option3&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;options.addOption(low_price_opt);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;Option code_opt = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Option(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;c&quot;&lt;/font&gt;,true,&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;code,forexample-c=2330&quot;&lt;/font&gt;);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;code_opt.setRequired(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt; );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;options.addOption(code_opt);&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//3.然後parseinput&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;CommandLineParser parser = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; BasicParser();&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;CommandLine cmd;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;{&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;cmd = parser.parse(options, args);&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt;(ParseException pe) {&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//4.發生錯誤就用usage() method給使用這提示&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;usage(options);&lt;/font&gt;&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上面我們預先設定了code，top
price，lowprice的三個選項，當使用者有輸入三個值的時後，才讓程式運行，沒有輸入或是輸入不正確，少了那些項目之時，則列印出錯誤的訊息，來提醒使用者。這一個程式庫有一個好處是，我們定義好選項之後，其他的事情我們都不用多寫程式碼，比方說我們要印出輔助訊息的method，程式碼只有下面這幾行：&lt;/p&gt;
&lt;br&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;程式碼：&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font face=&quot;Courier New&quot;&gt;&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;&lt;b&gt;&lt;font color=
&quot;#7F0055&quot;&gt;private static&lt;/font&gt;&lt;/b&gt;&lt;/font&gt; &lt;font face=
&quot;Courier New&quot;&gt;&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;usage(Optionsoptions){&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;HelpFormatter formatter = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; HelpFormatter();&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;formatter.printHelp(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;CommandLineUI&quot;&lt;/font&gt;, options);&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;}&lt;/font&gt;&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;是不是相當的簡單呢？&lt;/p&gt;
&lt;p&gt;
接下來，我們要把在使用者所輸入的這三個值，一一的傳給之前所開發的程式，傳遞的方法，分別是：&lt;/p&gt;
&lt;p&gt;將code 傳給 網頁取得method&lt;/p&gt;
&lt;p&gt;將tp，lp傳給價格比較method&lt;/p&gt;
&lt;p&gt;程式碼如下所示：&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;程式碼：&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;font face=&quot;Courier New&quot;&gt;&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;b&gt;&lt;font color=
&quot;#7F0055&quot;&gt;if&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;&lt;font face=
&quot;Courier New&quot;&gt;(cmd.hasOption(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;tp&quot;&lt;/font&gt;)){&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;target_price=Float.parseFloat(cmd.getOptionValue(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;tp&quot;&lt;/font&gt;));&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(cmd.hasOption(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;lp&quot;&lt;/font&gt;)){&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;low_price=Float.parseFloat(cmd.getOptionValue(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;lp&quot;&lt;/font&gt;));&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(cmd.hasOption(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;c&quot;&lt;/font&gt;)){&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;code=Integer.parseInt(cmd.getOptionValue(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;c&quot;&lt;/font&gt;));&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//System.out.println(&quot;code = &quot;+code);&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;{&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;current=　getCurrentValue(code);&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;System.out.println(compareValues(code,current,target_price,low_price));&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;} &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt;(Exception e) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;System.out.println(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;Critical;&quot;&lt;/font&gt;+e.getMessage() );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;/font&gt;&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
在這個式裡我們將比較的結果利用system.out來作輸出，這結果會直接被傳送到stdout上，然後由nagios所接受。&lt;/p&gt;
&lt;p&gt;
到此，小明已經完成了核心程式的工作，在此我們先將完整的程式碼給列出來：&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;股價監視程式完整程式列表：&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
接下來我們要進行編譯的動作，由於這個程式我們用到了&lt;/p&gt;
&lt;p&gt;1 httpclient&lt;/p&gt;
&lt;p&gt;2 cli&lt;/p&gt;
&lt;p&gt;
這兩個程式庫，所以我們在編譯時，必須要將這兩個含式庫加到路徑裡面：&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;javac -cp XXXX.jar:XXXXX.jar :./ App.java&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
完成之後，我們試著執行所產生的class檔，注意，因為我們程式碼裡有引用這兩個程式庫，所以執行之時，也一樣要在路徑裡作宣告。&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;java -cp XXXX.jar:XXXXX.jar :./ App&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
此時，因為我們什麼都沒有輸入，所以依照所排演的，應該要吐出一些訊息：&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;還有也作出了下列的元件部屬圖&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;#元件部屬圖&lt;/th&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;元件部屬圖&lt;/th&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;td&gt;
由以上的圖可以看出，在黑盒子的部份是主要開發的原件，這個原件，而由於在server上要運行java的程式，需要設定一些路徑，所以為了簡單起見，小明寫了一個shell語言，來將執行時的複雜部份包裝起來。&lt;/td&gt;
&lt;td&gt;#&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;我們將可以進行設定的部份以&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;java&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;語言來實作，將會是如以下的部份：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;因為需要接受語多的命令，所以採用了&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;common&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=&quot;FONT-FAMILY: PMingLiU&quot;&gt;之下的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;getopt&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;這一個方便精巧的功具：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;程式碼如下所示：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;這個工具可以幫助我們產生一些命令行，提示使用者該如何使用命令，以及讀取使用者的命令，非常的方便。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;還有，我們也知道股價的變動是一天不會超過或低於百分之七的，所以如果經裡的設定值，與現在的股價比起來，如果低於這個範圍，那我們就可以使得這一個插件休兵一天，不用一直去查詢網站。而相反的，如果說這一天的股價，很有可能到達這一個設定值，則我們就要希望能夠增加我們訪問這個股價的數量。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;將這一個邏輯以&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;java&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;語言來作表示的話，將會是如下的範例：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;接下來是這個程式核心的邏輯部份，也就是我們要從網站上得到股價：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;這個時候我們使用的是&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;commons&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;程式庫的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;httpclient&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;我們始我下面這一段程式碼來存取網站：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;程式碼將如下所示：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;這個程式碼送出一個&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;get&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;要求，從&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;yahoo&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;網站上得到了台積電網頁。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;這一個網頁，裡的第一行是股價，所以我們試著取得網頁上的第一行。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;程式碼如下所示：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;然後這一個股價的位置位於這一行的第三個&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;TDTAG&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;之間，所以我們利用一個簡單的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;regexp&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;，來取得這一個股價的位置。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;到目前為止，我們已經完成了這一個插件的大半部份，接下來就是將它們組合起來，成為一個完整的程式：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;將這個程式放到&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;server&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;上，接著，進行編譯及測式：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;&lt;font size=&quot;3&quot;&gt;javacxxxx&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;執行這個程式：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;&lt;font size=&quot;3&quot;&gt;java–cpxxxxxxxxx&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;結果我們發現這一個結果：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;依照這一個命令所是示的，我們假設我們的股價是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;100&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=&quot;FONT-FAMILY: PMingLiU&quot;&gt;元，作出以下的設定：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;結果&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;反回了這一個結果：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;因為現在台積電的股價還低於設定值，所以&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;ok&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=&quot;FONT-FAMILY: PMingLiU&quot;&gt;。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;接著我們假設我們的目標股價是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;50&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=&quot;FONT-FAMILY: PMingLiU&quot;&gt;元&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;出現了下列這一個訊息：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;&lt;font size=&quot;3&quot;&gt;critical&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;果然台積電的股價以經有點危險了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;看來沒什麼問題了。接下來我們將這個&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;plugin&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=&quot;FONT-FAMILY: PMingLiU&quot;&gt;安裝到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;上。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;然後，如果這個股價超過了這一個臨界值之後，通當會超過之後就一直超過，或是超過之後又低回來，當股價超過之後，如果一直不停的發送信息也不是辦法。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;所以我們要對這個細節，來對&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=&quot;FONT-FAMILY: PMingLiU&quot;&gt;作出設定：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;設定檔如下所示：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;一切就緒之後，接下來我們打開畫面，出現了以下的場景：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;接下來的問題，如果要將這個&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;plug&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;擴充成不只讓台責電能夠使用，該怎麼作好？&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;我想很多程式高手們早就發覺該怎麼做了，不過我還是雞婆一下把這個程式碼給出來，看了這個程式完成之後，我們就可以將我們所想要注意的股票一隻一隻的登入上去：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;設定檔如下所示：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;畫面如下所示：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;不過，這一個程式還有一個問題，那就是程式股價如果到了設定值了，就會一直呈現緊急的狀態，當然，此時我們可以從新的設定我們的目標，或者是經由&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;cgi&lt;/font&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-TW&quot;
style=&quot;FONT-FAMILY: PMingLiU&quot;&gt;來關閉股價的通知。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;或者，你也可以提供一個到達目標之後，自動再設定目標的超強大機能，不過這一個內容，就交由讀者來自行發揮了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;ZH-TW&quot; style=
&quot;FONT-FAMILY: PMingLiU&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;&lt;br&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class=&quot;java&quot; align=&quot;left&quot;&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; bgcolor=&quot;#FFFFFF&quot; border=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;!-- start source code --&gt;
&lt;td valign=&quot;top&quot; align=&quot;left&quot;&gt;&lt;code&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;package&lt;/b&gt;&lt;/font&gt;com.kbmj.someproject;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt; java.io.BufferedReader;&lt;br&gt;
&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt; java.io.IOException;&lt;br&gt;
&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt; java.io.InputStream;&lt;br&gt;
&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt; java.io.InputStreamReader;&lt;br&gt;
&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.cli.BasicParser;&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.cli.CommandLine;&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.cli.CommandLineParser;&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.cli.HelpFormatter;&lt;br&gt;
&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt; org.apache.commons.cli.Option;&lt;br&gt;
&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt; org.apache.commons.cli.Options;&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.cli.ParseException;&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.httpclient.HttpClient;&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.httpclient.HttpException;&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.httpclient.HttpStatus;&lt;br&gt;
&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;import&lt;/b&gt;&lt;/font&gt;org.apache.commons.httpclient.methods.GetMethod;&lt;br&gt;

&lt;br&gt;
&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;public class&lt;/b&gt;&lt;/font&gt; App {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;publicstatic&lt;/b&gt;&lt;/font&gt; &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;main(String args[]){&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;target_price = &lt;font color=&quot;#990000&quot;&gt;0&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;low_price = &lt;font color=&quot;#990000&quot;&gt;0&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;code=&lt;font color=&quot;#990000&quot;&gt;2330&lt;/font&gt;;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;Options options = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Options();&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=&quot;#3F7F5F&quot;&gt;//option 1&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;Option target_price_opt = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Option(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;tp&quot;&lt;/font&gt;, true,&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　　&lt;/font&gt;&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;TargetPrice,forexample -tp=58.5 &quot;&lt;/font&gt;);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;target_price_opt.setRequired(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt; );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//　　option2&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;options.addOption(target_price_opt);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;Option low_price_opt = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Option(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;lp&quot;&lt;/font&gt;, true,&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　　&lt;/font&gt;&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;LowPrice,forexample -lp=58.5 &quot;&lt;/font&gt;);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;low_price_opt.setRequired(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt; );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//　　option3&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;options.addOption(low_price_opt);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;Option code_opt = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; Option(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;c&quot;&lt;/font&gt;,true,&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;code,forexample-c=2330&quot;&lt;/font&gt;);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;code_opt.setRequired(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;true&lt;/b&gt;&lt;/font&gt; );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;options.addOption(code_opt);&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//3.然後parseinput&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;CommandLineParser parser = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; BasicParser();&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;CommandLine cmd;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;{&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;cmd = parser.parse(options, args);&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt;(ParseException pe) {&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//4.發生錯誤就用usage() method給使用這提示&lt;/font&gt;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;usage(options);&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=&quot;#3F7F5F&quot;&gt;//&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(cmd.hasOption(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;tp&quot;&lt;/font&gt;)){&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;target_price=Float.parseFloat(cmd.getOptionValue(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;tp&quot;&lt;/font&gt;));&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(cmd.hasOption(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;lp&quot;&lt;/font&gt;)){&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;low_price=Float.parseFloat(cmd.getOptionValue(&lt;font color=&quot;#2A00FF&quot;&gt;&quot;lp&quot;&lt;/font&gt;));&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(cmd.hasOption(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;c&quot;&lt;/font&gt;)){&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;code=Integer.parseInt(cmd.getOptionValue(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;c&quot;&lt;/font&gt;));&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//System.out.println(&quot;code = &quot;+code);&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=&quot;#7F0055&quot;&gt;&lt;b&gt;try&lt;/b&gt;&lt;/font&gt;{&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;current=　getCurrentValue(code);&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;System.out.println(compareValues(code,current,target_price,low_price));&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;} &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/font&gt;(Exception e) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;System.out.println(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;Critical;&quot;&lt;/font&gt;+e.getMessage() );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;}&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;privatestatic&lt;/b&gt;&lt;/font&gt; String compareValues(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;code , &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;current, &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;target_price , &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt; low_price ) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;status =-&lt;font color=&quot;#990000&quot;&gt;1&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;String result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;UNKNOWN&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;String message=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;[&quot;&lt;/font&gt;+code +&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;]current:&quot;&lt;/font&gt;+current+&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;,targetis&quot;&lt;/font&gt;+target_price+&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;,lowis&quot;&lt;/font&gt;+low_price;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(current &amp;gt; target_price ) status =&lt;font color=
&quot;#990000&quot;&gt;0&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;elseif&lt;/b&gt;&lt;/font&gt;(current &amp;gt; low_price ) status =&lt;font color=
&quot;#990000&quot;&gt;1&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;elseif&lt;/b&gt;&lt;/font&gt;(current &amp;lt; low_price ) status =&lt;font color=
&quot;#990000&quot;&gt;2&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;switch&lt;/b&gt;&lt;/font&gt;(status) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;0&lt;/font&gt;:&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;WARNING;&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;1&lt;/font&gt;:&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;OK;&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;2&lt;/font&gt;:&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;CRITICAL;&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt;-&lt;font color=&quot;#990000&quot;&gt;1&lt;/font&gt;:&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;result=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;UNKNOWN;&quot;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;result+message;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;}&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;privatestatic&lt;/b&gt;&lt;/font&gt; &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;usage(Optionsoptions) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;HelpFormatter formatter = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; HelpFormatter();&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;formatter.printHelp(&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;CommandLineUI&quot;&lt;/font&gt;, options);&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;privatestatic&lt;/b&gt;&lt;/font&gt; &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;getCurrentValue(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; code) &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;throws&lt;/b&gt;&lt;/font&gt;HttpException, IOException{&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/font&gt;p=-&lt;font color=&quot;#990000&quot;&gt;1&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;String url=&lt;font color=
&quot;#2A00FF&quot;&gt;&quot;http://tw.stock.yahoo.com/q/q?s=&quot;&lt;/font&gt;+code;&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//HttpClientの生成&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;HttpClient client=&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; HttpClient();&lt;br&gt;
&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//methodインスタンスの生成&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;GetMethod method = &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; GetMethod(url);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;statusCode = client.executeMethod(method);&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(statusCode != HttpStatus.SC_OK) {&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=&quot;#3F7F5F&quot;&gt;//notok;&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; p;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//System.out.println(&quot;失敗:&quot;+method.getStatusLine());&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#3F7F5F&quot;&gt;//　　HTMLソースを取得&lt;/font&gt;&lt;br&gt;
&lt;font color=
&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;InputStream　responseBody=method.getResponseBodyAsStream();&lt;br&gt;

&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#3F7F5F&quot;&gt;//getdatainnoXXX&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;BufferedReader br=&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; BufferedReader(&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt; InputStreamReader(responseBody, &lt;font color=
&quot;#2A00FF&quot;&gt;&quot;Big5&quot;&lt;/font&gt;) );&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;String line=&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;line_no=&lt;font color=&quot;#990000&quot;&gt;0&lt;/font&gt;;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;((line = br.readLine())!= &lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;null&lt;/b&gt;&lt;/font&gt; ){&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;line_no++;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(line_no ==&lt;font color=&quot;#990000&quot;&gt;164&lt;/font&gt;){&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　　&lt;/font&gt;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;}&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　　&lt;/font&gt;&lt;font color=
&quot;#7F0055&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;p;&lt;br&gt;
&lt;font color=&quot;#FFFFFF&quot;&gt;　&lt;/font&gt;}&lt;br&gt;
}&lt;/code&gt;&lt;/td&gt;
&lt;!-- end source code --&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;!-- =       END of automatically generated HTML code       = --&gt;
&lt;!-- ======================================================== --&gt;    </description>
    <dc:date>2006-02-23T23:25:56+09:00</dc:date>
    <utime>1140704756</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wiki7_benjamin/pages/14.html">
    <title>第５章	hack NAGIOS-監視command的開發</title>
    <link>https://w.atwiki.jp/wiki7_benjamin/pages/14.html</link>
    <description>
      
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;Nagiosplugin&lt;/font&gt;&lt;/span&gt; &lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;的開發&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;這一章我們要來看如何開發一個&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;plagin&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=&quot;ZH-TW&quot;&gt;。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;在開放原始碼的世界裡，大家都可以寫軟體，大家都可以把自已的作品公開給大家使用。因此，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;這個功能特強大的軟體，也已經有非常多的人為它寫了很多好用的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;plugin&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;，放在網路上讓大家下載使用。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;這些讓大家下載來使用的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;plugin&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;如果寫的太爛，可能不用多久就會受到一些使用者的修改與補強，於是這個軟體就在眾人的努力之下愈變愈好。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;但是即使是如此，有的時候我們還是無法在網路上找到適合我們需求的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;piugin&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;，此時我們就必須要自已開發了。依照&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=&quot;ZH-TW&quot;&gt;所列出的&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;plung&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;開發守則，一個成功且優良的&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;plugin&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;是具有以下的條件的：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;而這個優良的插件的軟體在寫作之時，是必須要遵守以下的條件的：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;寫出這個插件的使用方法&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;這個插件的反回值需要遵守即定的格式&lt;/span&gt;&lt;/font&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;考慮nagios執行的效能&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;遵守命名規則&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;這些條件所規範的，是希望開發出來的插件是個容易被使用，並且不會造成nagios主機太大的負擔。因為nagios主機要負責運行很多的監視，也就是說要執行相當多的插件，當其中的某個插件具有不好的性能時，很容易對其他的服務造成影嚮。一個老鼠壞了一鍋州，就是在說這個意思。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;如果說這個插件是個plain-text，那麼使用者可以直接從原始碼來獲得資訊，如果不是的話，那麼這個插件就有提供這方面資訊的義務了。所以通常nagios插件，都會有help的選項，幫助使用者掌握使用方式。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;筆者當初在從事這個插件的開發之時，也是一直將這規範記在心裡。但是有的時候遇到專案經理的緊急要求，需要在短時間之內開發一個奇特服務的監視插件時，常常就把這些規範給制之於腦後了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;br&gt;
&lt;hr size=&quot;2&quot; width=&quot;100%&quot;&gt;
● 開始動手吧！&lt;br&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=&quot;ZH-TW&quot;&gt;&lt;br&gt;
當然解決任何問題最好的方法，就是找現有的答案。雖然我沒有仔細的調查過，但是我可以百分之一百的確定，所有常用服務的監視插件，都已經存在在這世界上的某一個角落了，所以你只要打開電腦，到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;google&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;輸入一些關鍵字，一定可以找的到這些常用服務的監視插件，雖然它不一定是免費的。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;但是一些非常的客制化的服務，比方說你想要為你的客戶開發一個定期監視鳥龍裡的飼料是否以經被鳥吃完了這個特別的服務，可以就必需要自已寫了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;自已寫插件並不是一件困難的事情，在講這這麼多前言之後，我們就先來展示一個全世界最簡單的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;helloworld!&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;級插件：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;table style=&quot;width: 495px; height: 49px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;#!/bin/sh&lt;br&gt;
echo OK- Hello World!&lt;br&gt;
&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;夠簡單吧，這是一個&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;shell&lt;/font&gt;&lt;/span&gt; &lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;指令，它只反回一個&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;ok&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;，還有一個訊息&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;hello world&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;，它給我們一個觀念，就是只要有反回值，而且&lt;b&gt;反回值是能夠讓nagios所認識的&lt;/b&gt;，都可以被當作是插件來使用。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;我們先將這一個shell的指令集存成 &lt;b&gt;helloworldplugin.sh&lt;/b&gt;
.
保存在/usr/local/nagios/libexec裡面，此時，plugin的開發工作已經大功告成了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;接下來我們將它安裝到我們的&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;上，安裝的步驟不管插件是簡單還是複雜，手續都是一樣的。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;首先我們先定義一個服務，我們可以以下面的方式來進行定義：為了簡化說明，我使用了定義檔的繼承方式(&lt;/span&gt;&lt;/font&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=&quot;ZH-TW&quot;&gt;usegeneric-service&lt;/span&gt;&lt;/font&gt; &lt;font size=&quot;3&quot;&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;)，很多東西都延用共通的設定，只列出我們要修改的部份：(各個文字列中間的空格，是一個半型的space)&lt;br&gt;
&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot; height=&quot;183&quot; width=&quot;543&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;services.cfg&lt;br&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;define service {&lt;br&gt;
use generic-service&lt;br&gt;
&lt;b&gt;host_namemycomputer----------------------------1&lt;br&gt;&lt;/b&gt;&lt;b&gt;service_descriptionhello_world_test------------2&lt;/b&gt;&lt;br&gt;

&lt;b&gt;check_command check_helloworld--------------3&lt;/b&gt;&lt;br&gt;
&lt;b&gt;contact_groups me---------------------------------4&lt;/b&gt;&lt;br&gt;
}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;說明：&lt;br&gt;
&lt;br&gt;
&lt;ol&gt;
&lt;li&gt;
主機名稱，因為服務必須要存在於主機，所以我們要定義這個項目，這裡的mycomputer，是在hosts.cfg的檔案裡必須要先定義好的。&lt;/li&gt;
&lt;li&gt;
服務描述：關於這一項service的描述。儘量取可容易一目了然的名字，最好用英文，用中文的話會出現亂碼。&lt;/li&gt;
&lt;li&gt;
用來監視的命令名：這也是在checkcommand裡必須要先定義好的。&lt;/li&gt;
&lt;li&gt;
連絡群組：當服務發生問題時要聯絡誰，這也是必須要在contact.cfg裡事先定義好的。&lt;/li&gt;
&lt;/ol&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;在完成了以上的設定細節，使用&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot; height=&quot;29&quot; width=&quot;485&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;nagios -v /usr/local/nagios/etc/nagios.cfg&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;測式一下設定檔，如果沒有問題，就可以執行&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot; height=&quot;29&quot; width=&quot;489&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;/etc/init.d/nagios restart&lt;/b&gt;&lt;br&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;來重新啟動&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;，過了不久只後，我們就會看到我們的&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;出現了如下圖的訊息了。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;當然，這個插件是絕對無法派上任何用場的，不過它就好像單細胞生物一樣至少它是個插件。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;hr size=&quot;2&quot; width=&quot;100%&quot;&gt;
&lt;br&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;java&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;的語言雖然強大，在進行一些小型的開發時，我們有時可能還是會選擇一些簡單的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;scriopt&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;式語言，因為這些語言很方便，而且很容易修改，不需要重新編譯。這一節裡面，我們希望利用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;perl&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;這一個語言，來開發出股價監視配件：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;定義要求就如上一章所示，在這裡不在多加列出。只針對程式的部份來作說明。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;要得到網路上的網頁，我們可以利用&lt;/span&gt;&lt;span lang=
&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;perl&lt;/font&gt;&lt;/span&gt;&lt;span style=
&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;所提供的…含式庫。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;perl&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;也提供了一個像是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;getopt&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;這樣子的程式庫。這個程式庫的名字是：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;同樣的，我們利用同樣的方法，在我們執行用的電腦上，安裝以上我們所需的含式庫。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;接下來我們使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;perl&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;來實現同樣的邏輯。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;接下來我們使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;shell script&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;及&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;linux&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;command&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;來實現同樣的邏輯。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;接下來我們使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;c&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;語言，及&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=
&quot;Century&quot;&gt;nagios&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;所提供的功用含式庫，來實現相同的邏輯。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;後記：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;如以上所示，我們展示了四種語言的開發範例，我在寫這一章的時候，一直覺得我該用四種語言，四種範例好，還是四種語言，一種範例。很明顯的，四種語言一種範列是我最後所選擇的，因為比較容易比較，同樣的事情可以用各種語言來實現，可以針對需要來選一個你認為最合適的語言。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=
&quot;ZH-TW&quot;&gt;另外，我們也可以從以上的範例學到一些基本上寫作&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;plugin&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;所需要的共用技巧，除了核心的部份需要針對情況來改造之後，其他像是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Century&quot;&gt;command&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: PMingLiU;&quot;
lang=
&quot;ZH-TW&quot;&gt;的讀取，文字列的操作等等，都可以說是共通的。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: PMingLiU;&quot; lang=&quot;ZH-TW&quot;&gt;&lt;font size=
&quot;3&quot;&gt;本章所談到的範例都可以在本書所附的光碟上找的到。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
    </description>
    <dc:date>2006-02-23T18:37:54+09:00</dc:date>
    <utime>1140687474</utime>
  </item>
  </rdf:RDF>
