Не верь, не бойся, не проси - [entries|archive|friends|userinfo]
phantom

[ website | My Website ]
[ userinfo | ljr userinfo ]
[ archive | journal archive ]

[Apr. 2nd, 2009|02:11 am]
Previous Entry Add to Memories Tell A Friend Next Entry
ЛЖР веб-спайдер на Scheme, ч.1 *

Подумал давеча, что надо составить ПСС гражданина [info]lqp - в основном, он пишет о копирайте. Может, профильтрую копирайтные темы, а может классифицирую его постинги (всего их чуть более тысячи).

Налабал под это дело прожку на Scheme (диалект Лиспа), в имплементации PLT. Пока умеет только скачать и сохранить всю писанину конкретного блоггера в отдельную директорию. Теперь надо будет привести контент к викифицированному виду и думать над автоматизацией работы по классификации. Хочу напридумывать себе специализированных инструментов для работы с текстами.

Исходный текст спайдера; если никто не заинтересуется, в дальнейшем обновления публиковать не буду. Кому надо кого-то скачать для себя, можете попробовать запустить или попросить меня. Под виндой, однако подглюкивает (функция get-pure-port), ну и ладно.

#lang scheme

(require (lib "url.ss" "net")
         (lib "string.ss" "srfi" "13")
         (planet ashinn/html-parser/html-parser))

(define (string->file s f) (let ([s (open-input-string s)]) (call-with-output-file f (lambda (f) (copy-port s f)))))
(define (file->string f) (let ([s (open-output-string)]) (call-with-input-file f (lambda (f) (copy-port f s))) (get-output-string s)))
(define (check-directory file) (make-directory* (call-with-values (lambda () (split-path file)) (lambda (a b c) a))))
(define (download url file) ;(sleep 3) ; HACK
  (display "Saving ") (display url) (display " to ") (display file) (newline)
  (when (string-index file #\/) (check-directory file))
  (when (file-exists? file) (delete-file file))
  (call-with-output-file file (lambda (file) (copy-port (get-pure-port (string->url url)) file))))
(define (download-if-not-yet url file)
  (if (file-exists? file) (begin (display "Skipping ") (display file) (newline)) (download url file)))
(define (archive-user server user)
  (define head-url (string-append server "users/" user "/"))
  (define next-link-regexp (string-append "<a href=\"(" head-url "\\?skip=[0-9]+)\">Previous ([0-9]+) Entries"))
  (define posting-link-regexp (string-append "<a href=\"(" head-url "([0-9]+\\.html))\\?mode=reply\">"))
  (define (form-file-name url)
    (let* ([skip (string-contains-ci url "/?skip=")]
           [number (if skip (substring url (+ skip 7)) "0")])
      (string-append user "/head-" number ".html")))
  (define (form-file-name-posting url)
    (let* ([skip (string-contains-ci url "/?skip=")]
           [number (if skip (substring url (+ skip 7)) "0")])
      (string-append user "/head-" number ".html")))
  (define (download-or-load url)
    (let ([file (form-file-name url)])
      (download-if-not-yet url file) (file->string file)))
  (define (find-next-link s)
    (let ([rxp (regexp-match next-link-regexp s)])
      (if rxp (cadr rxp) '())))
  (define (look-for-postings s)
    (let ([rxp (regexp-match* posting-link-regexp s)]) rxp))
  (define (explode-posting-url url)
    (let ([rxp (regexp-match posting-link-regexp url)]) (cons (cadr rxp) (caddr rxp))))
  (define (posting-url url) (car (explode-posting-url url)))
  (define (posting-file url) (string-append user "/" (cdr (explode-posting-url url))))
  (define (process-posting s) (display "..."))
  (define (download-loop url)
    (let* ([s (download-or-load url)]
           [next (find-next-link s)])
      (for-each
       (lambda (url) (process-posting (download-if-not-yet (posting-url url) (posting-file url))))
       (look-for-postings s))
      (unless (null? next) (download-loop next))))
  (download-loop head-url))

(archive-user "http://lj.rossia.org/" "lqp")


Давеча я думал, что хорошо бы для лабания на Лиспе иметь усовершенствованную клавиатуру с двумя огромными кнопками по бокам - левой скобкой и правой скобкой. А теперь вот думаю, что ещё прикольней будет взять педали с драм-установки. Присоединить к ним соответствующие контакты, чтобы педали соответствовали скобкам. Но от барабанов их не отключать!

Так с левой скобкой будет срабатывать тарелка, а с правой - бочка. Так и представляю себе эту музыку в процессе написания программ. Да чего там, можно налабать программку, которая будет "проигрывать" перкуссией исходный текст, надо будет сделать на досуге.
LinkLeave a comment

Comments:
[User Picture]
From:[info]lankar
Date:April 2nd, 2009 - 02:57 am
(Link)
Если кнопок сделать больше (на каждую команду), то музыку можно будет переводить обратно в код.
Я тут подумал, наверное, можно писать программы в виде миди-файлов. :)
[User Picture]
From:[info]beshenov
Date:April 2nd, 2009 - 12:21 pm
(Link)
Это так надо символы APL кодировать.
From:[info]phantom
Date:April 2nd, 2009 - 07:28 pm
(Link)
Если все символы кодировать, получится какофония, прикольно, по-моему, когда время от времени вдруг - "бух! тыц! бух!" :)
From:[info]phantom
Date:April 2nd, 2009 - 07:27 pm
(Link)
Миди-файлы - это и есть программы, команды соответствующим устройствам включаться на определённые промежутки времени в определённом порядке - domain specific language, как это называют в программировании.

А зачем музыку обратно в код переводить? По-моему, это неприкольно.
[User Picture]
From:[info]lankar
Date:April 3rd, 2009 - 03:19 am
(Link)
/А зачем музыку обратно в код переводить? По-моему, это неприкольно./

Это прикольность иного рода - прикольность вполне реальной религиозной практики.
Вот код. Вот он звучит как музыка (управляя синтезатором). Вот он же существует в виде вспышек света (через контроллер зажигает лампочки)
А вот компьютер оснащённый адио и (или) оптическими сенсорами.
И на нём код, воспринятый как звуки или световые импульсы, снова становится программой и пишет "хелло ворд".
Ну или превращается в какой-то иной сигнал, например в модулированные радиосигналы вайфая.
Или распечатывается на бумаге как листинг.
Однако это всё тот же код и он всё так же сохраняет способность управлять компьютером.
Бессмертие, короче говоря. Платформеннонезависимое.

Зы
Я не силён в технической части, так что сорри за косяки и ляпы.
Но в качестве широковещательной проповеди, вполне может работать :)
[User Picture]
From:[info]lankar
Date:April 3rd, 2009 - 03:20 am
(Link)
А, забыл сказать - спасибо за идею.
From:[info]phantom
Date:April 3rd, 2009 - 11:31 am
(Link)
Ну, вот слышал, как обычный модем коннектится? Потом звук выключается, но если б не выключался, можно было бы слышать, как данные передаются по телефонной линии - в виде звука (это было бы слышно как шум, который в конце коннекта частично слышен). Это и есть ведь передача информации (если программы передавать, то программ) в виде звука; на оптоволокне в виде света и т.д.
[User Picture]
From:[info]lankar
Date:April 3rd, 2009 - 01:59 pm
(Link)
Прежде, когда были модемы, я всегда ставил им АТМ2, чтобы звук не отрубался. Мне нравилось слушать этот шип - типа, звучание интернета :)
From:[info]phantom
Date:April 3rd, 2009 - 02:13 pm
(Link)
Ну вот, я нечто подобное только что сделал. Прослушай бинарник, однако. И посмотри последний постинг beshenov, он тоже таким занимался, только у него не полностью синтетический нойз.
[User Picture]
From:[info]do_
Date:April 2nd, 2009 - 05:33 am
(Link)
хм, а чем ljsm не устроил?
From:[info]phantom
Date:April 2nd, 2009 - 07:30 pm
(Link)
Ну, к примеру, мне хочется новости с сайта elementy.ru обработать, это я так, разогрелся немного.
[User Picture]
From:[info]aspirantus
Date:April 2nd, 2009 - 01:01 pm
(Link)
Lqp большой молодец, я его дневник прочесывал в прошлое выбирал посты на тему анти\копирайта и стаскивал в вики. добрался я кажется вот до сюда http://lj.rossia.org/users/lqp/?skip=700
From:[info]phantom
Date:April 2nd, 2009 - 07:31 pm
(Link)
Так это почти 2/3 примерно. Я, когда продвижения будут, напишу. И тогда, возможно, это как-то для антикопирайт.ру можно будет использовать.