`(kakko ,man)

Find a guide into tomorrow by taking lessons from the past

Lisp Game Programming 再履修 <その7> アクセスログでララバイ

会社にある様々なシステムにアクセスすると、もれなくアクセス監査ログが数か月後についてくる。
それを確認するのがマネージャの仕事とは言え、年末でチョー忙しい(加えて町内会の役員業務もね)のにちょっとひどくね?
注)電○事件を受け、労務管理には皆ピリピリしている。36協定(サブロク協定)は知ってるよね?

でもPCに向かって仕事をしていると思っていたら、日々世界を股にかけて活躍している輩がいることもまた真実。

てなことで、前回のプログラムコードに更に手を入れ、悔し紛れにアクセスログを取るコードを組み込んでみよう。

こんな感じのプログラムコードが某所に転がっていた。

;; Step2 <Access Log>
;; -----------------------------------------------------------------------------------------------
(defparameter *log-file* "C:\\work\\Server-log.log")

(defun Log-event (strings &rest args)                       ; <-- attention! args to list 
  (multiple-value-bind (second minute hour date month year day daylight-p zone)
      (decode-universal-time (get-universal-time))          ; get time
    (declare (ignore day daylight-p zone))                  ; need not day,daylight-p,zone
    (let ((message (apply #'format nil strings args)))      ; message <-- format function
      (with-open-file (stream *log-file*                    ; open log-file 
                       :direction :output                   ; output
                       :if-does-not-exist :create           ; if not exist create
                       :if-exists :append)                  ; if exist append

        (format stream "~4,'0D-~2,'0D-~2,'0D ~2,'0D:~2,'0D:~2,'0D ~A ~%"
                year month date hour minute second          ; output Y M D H M S message
                message)))))

ここでの注意点は &rest の存在。× (defun Log-event (strings args) ⇒ ○ (defun Log-event (strings &rest args)

&rest の使い方の再履修
http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp06.html

format の使い方の再履修
http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp07.html

これがないと以下のような感じのエラーになる。
サーバー側
f:id:tomekame0126:20161211195049p:plain
クライアント側
f:id:tomekame0126:20161211195200p:plain
 
ではサーバー側のコード create-server.lisp

;;; Server Test
;;; Step1 <Define Packages> <Create Server>
;;; Step2 <Access Log>
;; -----------------------------------------------------------------------------------------------  

;; Step1 <Define Package>
;; -----------------------------------------------------------------------------------------------
(defpackage :server
  (:use :common-lisp :usocket)
  (:export #:create-server))
(in-package :server)

;; Step2 <Access Log>
;; -----------------------------------------------------------------------------------------------
(defparameter *log-file* "C:\\work\\Server-log.log")

(defun Log-event (strings &rest args)                       ; <-- attention! args to list 
  (multiple-value-bind (second minute hour date month year day daylight-p zone)
      (decode-universal-time (get-universal-time))          ; get time
    (declare (ignore day daylight-p zone))                  ; need not day,daylight-p,zone
    (let ((message (apply #'format nil strings args)))      ; message <-- format function
      (with-open-file (stream *log-file*                    ; open log-file 
                       :direction :output                   ; output
                       :if-does-not-exist :create           ; if not exist create
                       :if-exists :append)                  ; if exist append

        (format stream "~4,'0D-~2,'0D-~2,'0D ~2,'0D:~2,'0D:~2,'0D ~A ~%"
                year month date hour minute second          ; output Y M D H M S message
                message)))))

;; Step1 <Create Server>
;; -----------------------------------------------------------------------------------------------
(defun Create-server (&key (port 4000))
  (let* ((socket (usocket:socket-listen "localhost" port))
	 (connection (usocket:socket-accept socket :element-type 'character)))

    (Log-event "Connected to port ~A" port)

    (unwind-protect 
	 (progn
	   (format (usocket:socket-stream connection) "I am tomekame0126~%")
	   (force-output (usocket:socket-stream connection)))
      (progn
	(format t "Closing sockets~%")
	(usocket:socket-close connection)
	(usocket:socket-close socket)))))

(Create-server)

そうすると、こんな感じのログファイルが出来上がる。
f:id:tomekame0126:20161211200153p:plain

ささくれだった気持ちを抑えつつ、さっさと寝るか。
https://www.youtube.com/watch?v=WZN1Dq95wGo

あっ。若い時、ボーカルの彼に似ていると言われたことがあるのが自慢です。
職場でこのことを言ったら女性陣から大ブーイングでした。(爆)

今日の格言: 心に太陽を、唇に詩を。