>>>>> "VST" == Vehbi Sinan Tunalioglu <[EMAIL PROTECTED]> writes:
>>>>> "ES" == Emre Sevinc <[EMAIL PROTECTED]> writes:
ES> VST bana "social network analysis" baglaminda basladigi
ES> programdan ve Common Lisp ile mailman arsivlerini analiz
ES> etmekten bahsediyordu, son konustugumuzda string'leri
ES> birlestirmek icin vector-push-extend yerine baska bir sey
ES> kullanilmasinin daha performansli olabilecegine dair bir
ES> seyler düsünmüstük. Son durum merak ettim (neden bu kadar
ES> merakliyim ben? :))
VST> Hemen aciklayayim.
VST> Amac : Pipermail ile text formatinda arsivlenmis eposta
VST> listelerinin islenebilir hale getirilmesini saglamak.
VST> Ornek : http://cs.bilgi.edu.tr/pipermail/cs-lisp/ adresindeki
VST> tum arsivlenmis mailleri bir assoc. list ya da sinif
VST> kullanarak teker teker bir listeye atmak ve bunlari thread
VST> haline sokmak.
VST> Kullanilan Araclar: Verilerin internetten alinmasini saglamak
VST> icin thttp (trivial-http) ve stringler uzerinde regex ile
VST> filtreleme yapmak icin cl-ppcre (regular exp. kutuphanesi)
VST> Sorun: Cok yavas calisiyor.
[..]
VST> Asagida kirli kodu gonderiyorum.
Optimizasyon ile ilgili BM bir seyler söylemis, ben de yazim
tarzi ile ilgili dikkatimi ceken bazi seyler söylemek istedim.
Gördügüm kadari ile Java ve Scheme etkisi hissediliyor kodda:
Misal:
(defun is-from-line? (line)
(ppcre:scan "^From [^ ]+ at [^ ]+" line))
Yani hem basinda "is" var, hem sonunda "?" var. Bildigim
kadari ile CL kültüründe bir seyi test ediyorsak o bir
"predicate" fonksiyondur, misal evenp, oddp, typep, ...
Ya da yapmak istedigimiz test alfa mi degil mi gibi bir
test ise alfa-p gibi. Yukaridaki görüntü de cok kötü
bir görüntü degil ama hem "is" hem de "?" olunca
pek "idiomatic" degil gibi ve de fazladan bir seyler
yaziyormusuz gibi.
En alttaki fonksiyonu SLIME ile biraz daha alisik
oldugum ve kolay okunabilir sekilde formatladim:
(defun one-shot-mail-extractor (url-list)
(let ((maillist nil)
(mail nil))
(loop for rfile in url-list do
(let ((content-stream (caddr (thttp:http-get rfile))))
(do ((line (read-line content-stream nil nil)
(read-line content-stream nil nil)))
((null line) maillist)
(cond
((is-from-line? line)
(progn
(setf maillist (cons mail maillist))
(setf mail nil)
(setf mail (cons (cons ':FROM line) mail))))
((is-date-line? line) (setf mail (cons (cons ':DATE line)
mail)))
((is-subject-line? line) (setf mail (cons (cons ':SUBJECT line)
mail)))
((is-msgid-line? line) (setf mail (cons (cons ':MESSAGE-ID
line) mail)))
((is-reply-to-line? line) (setf mail (cons (cons ':REPLY-TO-ID
line) mail)))))))
maillist))
BM'nin dedigi gibi satir satir okumak isi yavaslatiyor
olabilir diye düsünüyorum. Önerilen "arsiv dosyasini al
oradan kullan" fikrine ek olarak yani oradan yapilsa
bile satir satir yapmak yerine önce tüm dosya icerigi
okunsa hafizaya, bir degiskene, sonra onun üzerinden is
yapilsa daha hizli olmaz mi?
Hazir bir de böyle enteresan bir proje baslamisken, mesela DARCS
deposu acilsa (bir nevi CVS, olmadi CVS deposu acilsin Bilgi'de)
sonracima Emacslarimizla o CVS'e baglansak, kodun son halini ceksek,
kurcalasak, yollasak, vs.
Bir de SLIME ortaminda profiling nasil yapilir bir baksak
(tembelim ben, birileri anlatsa da dinlesem diyorum ;-)
Sonra ortaya yavas yavas CL-SNA projesi ciksa, cümle
alem "vay canina ne acayip social network analysis araci
gelistirmissiniz be birader!" dese... (Emre hayallere dalar...)
--
Emre Sevinc
eMBA Software Developer Actively engaged in:
http:www.bilgi.edu.tr http://ileriseviye.org
http://www.bilgi.edu.tr http://fazlamesai.net
Cognitive Science Student http://cazci.com
http://www.cogsci.boun.edu.tr
_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp