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
これがないと以下のような感じのエラーになる。
サーバー側
クライアント側
ではサーバー側のコード 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)
そうすると、こんな感じのログファイルが出来上がる。
ささくれだった気持ちを抑えつつ、さっさと寝るか。
https://www.youtube.com/watch?v=WZN1Dq95wGo
あっ。若い時、ボーカルの彼に似ていると言われたことがあるのが自慢です。
職場でこのことを言ったら女性陣から大ブーイングでした。(爆)
今日の格言: 心に太陽を、唇に詩を。