воскресенье, 13 февраля 2011 г.

Го и быдлокодство

В прошлом посте быдлокодства я писал про го. Но вот не задача, я создавал задания в виде №_(сила игрока текстом).sgf (если мне не изменяет память), а вот не понравилось мне. Надо конечно было "сила игрока цифрей(номер задача).sgf" Причем с конвертом цифер 0-9 в 00[0-9], ну и далее в том же духе. Но второй раз лазить за 7k задач на сервер, меня не прельстило и решил поменять, что уже спи...посмотрел на сайте.
Будет у нас 1 dan(12345).sgf. Это будет гораздо удобнее. Т.к. у нас больше 7k задач, то облегчим себе жизнь nodejs'ом
А вот и код

var fs = require('fs'),
sys = require('sys');
// Где лежат файлы
var sgf_dir = '/home/icegreg/sgf/goproblems/';
// Прочитаем директорию, список файлов в массиве files
fs.readdir(sgf_dir, function(err, files){
// Как он выглядит
var re = /(\d+)\_\((.*)\)/;
for (i=0;i<files.length;i++) {
var mt = files[i].match(re);
// Переименуем
fs.rename(sgf_dir+files[i], sgf_dir+mt[2]+'_'+mt[1]+'.sgf');
}
});

Вроде простенько и со вкусом(ну не ручками, и за 10 минут, с чайком), а польза для меня есть.
P.S.: Да, и если кому интересно го, могу помочь с освоением.

Teleport pro and linux

Для тех, кто глубоко засел в танк, могу сказать, что есть такая бякость в линухах различных сортов и полов, как wget. И телепорт про тут в ель не впился.
Для грабежа инфы с сайта, я обычно использую

wget -m -k -nv -np ya.ru

-m зеркалирование всего и вся
-k сконвертировать ссылки на локальные файлы
-nv немного отключить срач
-np не ходить по другим ссылкам выше основного родителя ya.ru/vasja не будет качать ya.ru, ну и не будет ходить на google.com если таковой найдется. В противном случае -m будет качать до конца интернета :)

В общем спасибо пользователю sledopit, который в комментарии на хабре дал вот что:

wget -m -k -nv -np -p --user-agent=«Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)» bbc.co.uk

Всё тоже самое, только вот user-agent другой (от имени кого будет запрос). Будем гуглоботом :)

P.S.: вполне давно и с хорошим успехом так граблю инфу.
P.P.S.: и да, не поленитесь читать man wget

пятница, 4 февраля 2011 г.

По быдлокодим

Собственно попался в руки nodejs.
Прикольно. Была давнишняя идея сграбить с сайта goproblems.com задачки. Собственно кто не знает, что такое Го, тому сюда
Ну а раз знакомство, то почему бы и нет. Есть два интереса с двух сторон, пожалуй можно за пару часов и разобраться. С js я немного знаком, так что проще.
Как собирать nodejs и npm, я может чуть позже расскажу. Пока всё же вещь ещё во многом сырая, на свой страх и риск, за кружечкой чего-нибудь.


var httpAgent = require('http-agent'),
jsdom = require('jsdom'),
sys = require('sys');
fs = require('fs');
// Создаем массив относительных путей
var urls = Array()
for (i=1;i<14528;i++) {urls.push('?id='+i);} // 14528 - кол-во известных номеров задач

// Алгоритм можно улучшить, а именно ходя по ссылкам "вперед" и "назад" в задачах.
// Но пусть будет в лоб, да не обидятся на меня ребята с сайта.

// Вторым параметром передаём массив относительных путей
var agent = httpAgent.create('goproblems.com/prob.php3/', urls);

agent.addListener('next', function (e, agent_res) {
// Создаём DOM-дерево из текста страницы
// Если тут ругается, то смотреть на установку libxmljs
var window = jsdom.jsdom(agent_res.body).createWindow();
// Здесь мы подключаем файл jQuery. У меня он лежит в тут же.
jsdom.jQueryify(window, './jquery-1.5.min.js', function (window, jQuery) {
// jQuery загружен, дальше ищем по телу документа
// Собственно each не нужен, но кусок был нагло выдран из контекста
jQuery('body').each(function () {
var sgf = jQuery(this).find('param[name|="sgf"]').val();
if (sgf) {
var id = jQuery(this).find('param[name|="id"]').val();
var difficult = jQuery(this).find("td.prob:contains('Difficulty:')").next().text();
// дальше обработчик строки с данными о сложности
var re = /(\w+)\s(\w+)/;
// Пишем в файл и срём в консоль
fs.writeFile(id+'_('+difficult.match(re)[0]+').sgf', sgf,function(err){
if (err) throw err;
console.log(id+'_('+difficult.match(re)[0]+').sgf saved!');
});
}
});

agent.next();

});

});

agent.addListener('stop', function (agent) {
sys.puts('the agent has stopped');
});

// Запускаем
agent.start()

Часть кода было нагло содрано и немного адаптированно, архитектура хромает. Но дело делает. С задачей справляется. Тем более, что для себя.