пятница, 23 ноября 2012 г.

AutoIt: тянем комиксы "девушка-гений"

Вот этот код был написан два года назад, чтоб в фоновом режиме скачать с сайта весь Girl Genius и почитать его потом

#include <IE.au3>

Func SaveAllPicFrom(ByRef $ie) ; функция сохраняет на диск все картинки с не-"плохими" именами со страницы
   Local $imgs = _IEImgGetCollection ($ie)
   For $img In $imgs
      If StringInStr($img.nameProp, "ggmain") > 0 Then
      InetGet($img.src, $img.nameProp)
      EndIf
   Next
EndFunc
 
$oIE = _IECreate ("http://www.girlgeniusonline.com/comic.php?date=20021104", 0, 0, 1, 0)
SaveAllPicFrom($oIE)
While _IEImgClick($oIE, "http://www.girlgeniusonline.com/!.images.page/navbuttons/nextday.jpg") == -1 ; эмулируем клик по картинке-кнопке <Next Day>
   SaveAllPicFrom($oIE)
WEnd
 
_IEQuit($IE) 

За два года код не потерял работоспособности - ни сайт GG, ни autoit не поменялись. Мелочь, а приятно.
ps: Два года назад я забыл вызов _IEQuit и теперь я с удовольствием исправляю эту ошибку.

понедельник, 19 ноября 2012 г.

Racket и eval-string

Это интересно. Пусть у нас есть Racket, где мы определим метод eval-string и запросим библиотеку для работы со множествами

1
2
3
4
(define ns (make-base-namespace))
(define (eval-string str)
 (eval (call-with-input-string str read) ns))
(eval-string "(require racket/set)")

По-eval'им немного, а дальше столкнемся со странным

1
2
> (set? (eval-string "(set 1 2)"))
#f

Надо заметить, что

1
2
> (list? (eval-string "(list 1 2)"))
#t

Это конечно связано с тем, что list (в отличие от set) входит в racket/base; make-base-namespace как бы намекает нам.
Документация подсказывает правильное решение

1
2
3
4
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(define (eval-string str)
 (eval (call-with-input-string str read) ns))

И все же, какой тип имеет (eval-string "(set 1 2)")?