Если я хочу загрузить картинку, то могу написать так:

request({url:url, encoding : null },function(err,res,body){ …

И получу в body Buffer

Если я  знаю что гружу html, то кодировку указывать не надо, в body будет string

Но если я не знаю что на том конце, и определяю тип содержимого уже после получения ответа в res.headers['content-type']? Нельзя ли как-то получить body в нужном формате уже после?

В принципе из буффера сделать строку проще чем из строки буффер…

Update: Посмотрел код request.js. Там сделано просто:

if (self.encoding !== null) {
  response.body = response.body.toString(self.encoding)
}

т.е. работает он с буфером, а потом, если задана кодировка – благополучно его затирает. Значит получить буфер когда реквест уже вернул строку нельзя. Нет его.

Вопрос снят.

Похоже я уронил Литрес. Но если это так, он должен падать даже от визита поискового робота. А уж любая програмка которая выкачивает сайт целиком, работая в 20 потоков должна его просто разрывать в мелкие клочья. Это неправильно, ребятам всерьез стоит задуматься о том что они сделали не так. Нагрузка которую создает мой парсер не идет ни в какое сравнение с настоящей DoS-атакой. Я тащу последовательно по одной страничке.

Так что претензий не принимаю. У меня банально канал не такой толстый чтобы уронить нормальный сервер.

P.S. Неа, не уронил. Это сработала какая-то умная защита, которая теперь персонально для меня делает вид что все ппц, а если я захожу через VPN то все работает как часы.

Придется притормозить. Надеюсь они не банят за такие штуки всю сеть, а то пользователи domru будут сильно недовольны.


https://bugs.chromium.org/p/v8/issues/detail?id=2869

Есть такой баг, решается примерно также как это сделал я, за 3 года не сподобились исправить. А почему? А потому что всем похуй, это опен-соурс, детка.

Попробовал воспроизвести ситуацию в которой у меня были утечки памяти. Воспроизвел в лучшем виде. Осталось разобраться что происходит.

Делаю снапшоты и сравниваю в браузере. А вот хуй. Браузер замечательно показывает что размер одного снапшота 654 метра, второго 10. Смотрим детали – видим фигу. В деталях нихера нет. Т.е. понятно что память теряется, но штатными средствами понять что происходит не получается.

Причем, если я генерирую файл сам, то ничего особенно ужасного не происходит. память если и течет, то совсем чуточку. А вот страничка взятая с LJ вызывает у ноды корчи и ее прет как на дрожжах. Но ровно до тех пор пока я не делаю “безопасное” сохранение полученных строк. Проблема в том, что если бы дело было именно в этом, то это должно точно также работать на моем собственном файле. Должна быть та же проблема и то же лекарство. Этого не происходит и значит дело в чем-то другом.

Я исключил вариант что для парсинга ЖЖ-страницы выделяется как-то особенно много памяти. Фактически происходит наоборот – для моей странички выделяется больше памяти, но и освобождается она большими кусками. Для ЖЖшной памяти надо меньше, но освобождается она неадекватно маленькими порциями и в результате объем растет.

И как я ни кручу эту строку – это самая обычная строка. Точно такая же как после преобразования +- пробел. И она не должна быть к чему-то привязана и удерживать это что-то от удаления.

Воспроизвел эффект на своём файле. Вытаскиваемые строки должны быть разные. Похоже что если они одинаковые – нода их как-то по-тихому оптимизирует, маскируя проблему с утечками.

Это хорошо.

В смысле – все конечно плохо, но когда проблема воспроизводится ее можно решить с помощью костылей, поскольку понятно когда их надо подставлять.

Догадался посмотреть что делает cheerio.text(), каким таким извращенным способом она формирует строку, что потом ее надо выковыривать из контекста отбойным молотком… Охуел от увиденного – самая обычная функция, формирует строку самым тривиальнейшим образом. Ровным счетом ничего подозрительного.

P.S. Может ли объект выглядеть как примитивная строка при любых способах получить его значение, но при этом строкой не являться? Я так и не нашел способа провернуть такой трюк. Так что я исключаю возможность что мне передается не примитивная строка, а что-то под видом строки. Ссылки на примитивные типы в JavaScript не поддерживаются. Значит это дефект самого движка V8, который проявляется в каких-то определенных обстоятельствах. Но я до конца не понимаю в каких.

Предположим, где-то в начале своего приложения для node я напишу что-то вроде:

String.prototype.copy = function() {
    return (this+' ').trim();
};

Что из этого выйдет? Простая вещь – поведение объекта String изменится во всех модулях подключаемых через require, включая написанные не мной. Прикол в том, что тоже самое можно сделать в любом модуле, в любое время.

В данном случае ничего ужасного скорей всего не произойдет, но потенциально такая возможность открывает просто непаханное поле для разнообразных, трудноуловимых глюков. Можно испортить какой-то глобальный объект, причем как случайно, так и намеренно, но в зависимоти от фазы луны. Найти причину конечно всегда воможно. Тупо просматривая исходники всех модулей, ага. Потому что ошибка будет проявляться случайным образом в самых разных местах.

P.S. Хочу немножко поэкспериментировать со сборщиком мусора. А то у меня волосы начинают вставать дыбом, когда я задумываюсь о потенциальных утечках памяти.

Комплект из express+passport+mongodb+socket.io зашевелился и можно наполнять его чем-то реально полезным (вредным). Больше всего геморроя было с некорректными примерами для всего перечисленного.

Разработчики так стимулируют обращения за платной поддержкой? Ведь это мое время стоит копейки, а нормальный разработчик который получает 50$ в час, вполне может отдать эти 50$ чтобы не ебаться целый день с ерундой.

В большинстве примеров для MongoDB, из разряда Getting started (это важный момент) дается конструкция типа такой:

db.users.insertOne({ username: username, salt: salt, password : md5(salt+password) },callback);

О чем не подумали составители этих руководств? Ведь скорей всего, работать этот пример не будет.

По одной простой причине –  у человека начинающего разбираться как тут вообще все устроено гарантированно еще нет ни одной коллекции в БД. Ему показали как подключится – окей, подключился. Теперь вот так вставляй – а оно не вставляется. В кринку, блядь, не лезет.

А вот так работать будет:

db.collection('users').insertOne({ username: username, salt: salt, password : md5(salt+password) },callback);

Такая конструкция создаст коллекцию users если ее еще нет и вставит ей все что надо и куда надо.

Для приложений которым нужно постоянное взаимодействие и быстрая реакция на действия пользователей, и в особенности для тех у которых действия пользователя запускают какие-то продолжительные задачи вебсокеты гораздо лучше AJAX и будут его теснить.

Я почему-то был уверен, что если упомянуть пользователя в посте или комментарии с помощью тэга <lj user=”username” />, то он получит об этом извещение. Но быстрая проверка с помощью тестового аккаунта показала что хрен. И о репосте уведомление тоже не пришло.

Сижу думаю – это так и должно быть, или

  • оно приходит не сразу?
  • оно приходит только если аккаунты зареганы на разные мэйлы? Зарегал другой мэйл, завел журнал и хуй
  • жжисты что-то поломали в своем движке и упоминания не работают, но как-нибудь потом их починят
  • эта возможность отключена для свежих журналов (или подозрительных)
  • все поменялось и оно больше не приходит совсем и приходить не будет.

А где бы еще завести почту без этих дурацких капч, чтобы можно было автоматизировать создание новых аккаунтов? Конечно есть вариант купить хостинг и завести там себе сколько хошь мэйлов, но это вариант на будущее.

Это самые подходящие слова чтобы охарактеризовать рынок финансовых услуг.

Нельзя просто взять и перевести деньги, например из вебмани в яндекс. Или skrill, или neteller. Отмывание блядь и поддержка терроризма. А еще, не дай бог, вы будете играть в азартные игры. Мы же вас, блядь защищаем, от вас же. Не забывая взять по 7-8 процентов за перевод.

Защел в обменник. Достаточно известный и популярный. При попытке сделать перевод выдает случанйым образом ошибку. То одно поле ему не нравится, то другое. После 5-6 попыток заебался и послал их нахуй. Как эти ребята деньги вообще умудряются зарабатывать? Ах да, 7% с каждого успешного перевода. Ну да, тут можно побольше денег в гугл-адсенс вложить, а софт отлаживать – да ну его нахуй. Кому сильно надо – справится.

Зарегался на нетеллере. Рускоязычный интерфейс, форму регистрации надо заполнять латинницей. Догадайся, сука, сам. Главное, 7% отдай. И счет пополни, а мы потом поебем тебе немножко мозги – нам нужен скан твоего паспорта и счета за газ на твое имя. Да, мы не в курсе что взрослые люди могут жить у родителей и никаких счетов за газ у них никогда не было. Так у нас в Европах не бывает, ага.

Завтра посмотрю на биткойны. Может с ними выйдет лучше. А на сегодня хватит.

Casperjs

Jan. 24th, 2017 01:40 pm

Пощупал. Отмечу пару моментов.

  • Гораздо корректнее обходится с памятью. Жрет потихоньку, но не в таких объемах как Zombie, и способен обработать гораздо большее число страниц.
  • Забудьте о ваших амбициях. Страницы посещаются последовательно, одна за другой. Нет возможности параллельно запустить загрузку по 10 штук.
  • Периодически крепко задумывается о чем-то своем, девичьем. Кажется все, умер… Однако смотришь, ожил и пошел дальше.
  • В общем, ленивое такое привидение, никуда не спешит.
  • Программа пишется на JavaScript, также как в обычной Node.js подключаются модули и т.п. Это создает опасную иллюзию, что работаешь в обычной ноде. Но это не так. Некоторые типовые модули имеют непривычный API, например fs, process  и пр. Некоторые модули загружаются и нормально (или почти нормально) работают, другие не работают принципиально.
  • Нужно следить за контекстом – например часть функций можно выполнять в контексте загружаемой страницы, соответственно они не имеют доступа даже к тем модулям, которые удалось подключить. Приходится забыть, например, про lodash, и вспоминать нативные методы работы с массивами и т.п.
  • Документирован лучше чем Zombie

В целом, для серьезного тестирования Casper.js подходит лучше чем Zombie. Для разных извращений он подходит не очень, но тоже лучше. Если можно обойтись без имитации браузера – лучше обойтись старым добрым request.

Есть специальные грабли, на которые обязан наступить каждый начинающий разработчик node.js.

Итак, вы решили поиграться с каким-то самодостаточным модулем. Таким, который не нужно подключать в уже существующий проект, а можно сделать отдельную папочку под него и там попробовать его так и сяк. Пусть это будет evernote – модуль для работы с одноименным сервисом.

Вы делаете папочку evernote, npm init, оставляете все значения по умолчанию, поскольку вам все равно как будет называться это тестовое приложение, npm i evernote… И получаете облом

npm ERR! Refusing to install evernote as a dependency of itself

Что случилось? А случилось то, что вы назвали свое приложение также как пакет который собираетесь тестировать. И теперь хотите от npm странного – добавить в модуль evernote модуль evernote.

Лечится просто – редактированием package.json, где нужно придумать своему приложению новое и оригинальное имя, заведомо не пересекающееся с названиями всех пакетов, которые  вы будете использовать – включая и зависимости этих пакетов тоже.

Хм…

Jan. 23rd, 2017 06:55 am

Не существует способа гарантированно найти все поддомены сайта типа ЖЖ или dreamwidth.org

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

Удивлен и разочарован

В принципе, в DreamWidth можно открыть случайный журнал. А поскольку аккаунтов всего чуть больше 100 тысч, то можно найти большую часть из них методом Монте-Карло. Думаю 1 млн запросов случайной страницы обеспечит покрытие 99%, что для практических целей вполне достаточно. И трафик должен быть небольшой. Если это сделано по уму, то обращение к этой странице должно вернуть только заголовок для редиректа.

Второй способ – мониторить страницу с последними записями. Если человек хоть изредка проявляет активность, он попадет в поле зрения наших радаров.

Вне всяких сомнений – Zombie жрет память. И мой мозг.

Я отключил из программы все кроме самого зомби, который открывает по очереди кучу страниц. Каждая страница отъедает приличный кусок и не возвращает его обратно.

Нашел у него метод destroy() который вроде как освобождает все ресурсы. Хуй он чего освобождает. Попробовал сделать глобальный объект zombie и удалять его после загрузки каждой страницы через delete. Не помогает. Утечка где-то в самом модуле

Распарсить не то что весь интернет, а даже сотню страничек из ЖЖ не выйдет. А без него тоже нельзя – как я уже писал, часть блогов на ЖЖ загружают комменты динамически. Так что простым request’ом не обойтись.

Возможно каспер ведет себя лучше?

Kill Bill

Jan. 22nd, 2017 03:27 pm

Сегодня утром, ничто, как говорится, не предвешало… Я попробовал поставить casper.js. Он попросил Microsoft Visual Studio. Студия попросила IE не ниже 10. Меломягкие предложили поставить 11. Ну а мне то что, не жалко…

Все браузеры как браузеры, ставятся и работают. Но этому ж нужно под кожу залезть, он хочет непременно перезагрузку и поставить обновления.

Обновления с первой попытки эксплорер поставить не сумел. И со второй не сумел. После 3ей перезагрузки отрапортовал что все ништяк, наслажайтесь новой жизнью с наилучшим в мире браузером.

Я бы и рад, только перестало запускать вообще всё. Включая, но к сожалению не ограничиваясь самолучшим в мире браузером. Любая программа, запущенная хоть с ярлыка на панели, хоть из командной строки немедленно вываливала ошибку и склеивала ласты.

После непродолжительных мучений решил переставить систему. Но задача оказалась нетривиальной.

Из подручных средств имелась установочная флешка с Windows 7 и второй комп с Ubuntu. Но проблема в том что мой комп не оборудован DVD. Совсем. Он когда-то был, но издох от безделья. А достать его из второго и переставить в первый не представляется возможным.

Поэтому хотя я довольно быстро поднял винду, на этом процесс застопорился ввиду отсутствия драйверов для оной. Они как бы есть, но на диске, который некуда вставлять. А без драйверов не работает даже сетевая карта и соответственно подключение к инету.

Сейчас, задним числом подумалось, что можно было попробовать считать его на втором компе, перенести на флешку и вставить в первый… Но я был уже малость на взводе и не искал простых решений. Важные данные к этому моменту были перенесены на внешний USB-HDD (как обычно – про кое-что я начисто забыл и оно благополучно пропало). Поэтому я сделал загрузочную флешку убунты и поставил себе убунту. А в нее уже VirtualBox и винду. Потому что например Open Live Writer, в котором я набиваю эти строки из wine работать отказался. А покерный софт я даже и проверять не стал, он и на винде-то работает через попу, умножать число глюков мне без надобности.

Опущу подробности, как убунтовый загрузчик выдал мне непонятную хуйню и пришлось искать со второго компа что это и почему вылезло. И как WMware тупо не стал ставиться по неизвестным причинам. Хотя казалось бы серьезная контора могла бы сделать хотя бы типовой deb-пакет и не ебать потенциальным клиентам мозг проблемами на ровном месте. Потому – VirtualBox, хотя субъективно он похуже.

Вот так занимаясь ненужной ёблей я провел весь выходной. Спасибо Билли, за твой замечательный софт

Update: И я таки поставил casperjs

Хоть и не с первой попытки. Сначала я установил нужный ему phantomjs через ubuntu. Casper встал, но выдал несколько ошибок при самотестировании. Затем я добавил фантом через npm install –g phantomjs. Он потребовал прав администратора, но через sudo не стал запускаться npm – х.з. почему. Тогда я через sudo запустил bash, а уже из него npm. После чего наступило счастье и каспер оттестировался без ошибок. Фуух… как же, блядь, все непросто.

Попробуйте с помощью async исполнить параллельно 5000 задач. Можно даже не пробовать – получится плохо.

Зал подсказывает: надо использовать parallelLimit. А вот хуй. Все равно подавится. Потому что из каждой задачи будет вызываться callback, а из него следующая задача, и снова коллбэк… У вас получится 100500 вложенных вызовов и нода умрет где-то в районе 1300ого. Проверено экспериментально.

Но есть одна штука с винтом. Надо вызов коллбэка обернуть вот так:

process.nextTick (function () { callback(null); }); Тогда коллбэк будет вызван действительно асинхронно, в следующем цикле обработчика событий

Вытянул 100.000 пользователей ЖЖ  из общего рейтинга и плотоядно облизнулся.

Update 1: ан нет, не вытянул. Таки подавился на где-то на середине. Память кончилась. Надо разбираться как нода управляется с памятью

Update 2: я нашел эту подлую тварь, которая жрала память как не в себя. Я охуел когда выяснил причину. И охуел еще раз, от того как ее удалось решить

Было:      users.push($(item).text());

Стало:     users.push(($(item).text()+' ').trim());

метод text() в cheerio.js должен возвращать строку. А он возвращает ссылку на то место где эта строка лежит. И таким образом ссылается на весь DOM. И естественно, что сборщик мусора не удаляет весь этот ненужный кусок говна пока в users будет ссылка на это говно, а она будет до самого конца, пока не распарсятся все 5000 страниц. И DOM для всех этих страниц будет храниться до конца, хотя оттуда нужно лишь 20 коротких строчек на страницу.

Попробовал явно преобразовать это говно в отдельную строку. Через new String(говно), _.clone(говно), говно.substr(0) и даже говно+’’. Не помогло. В последних 2ух случаях слишком умный движок V8 решил, что он лучше знает что я хочу и, блядь, соптимизировал. Оставил говно говном. Ну типа ж ничего не изменилось, верно? Со ссылкой на всю навозную кучу.

Я в полном ахуе. Но я таки вытянул 100.000 пользователей ЖЖ из общего рейтинга ;)

P.S О таком не пишут в мануалах и на показывают на модных курсах.

В теории, zombie может открывать несколько “вкладок” как в настоящем браузере и грузить страницы параллельно.

На практике эта фича не работает. Я не нашел в сети ни одного примера как это делается. Вообще ни одного. Похоже zombie используют исключительно для простых последовательных тестов. Открыл, заполнил пару полей, нажал на кнопочку, получил ответ и доволен.

Ну и хуй с ним. Я не то чтобы сильно спешу, скрипт может и последовательно отработать. Всяко лучше чем ручками, даже если и не сильно быстрее.

Update 1: процесс выпал в осадок на 15ом “друге”. Почесал репу и убрал обработку ошибок. Если что-то не так – я это просто игнорирую. Ну не добавился очередной товарищ по причине какого-то глюка на сервере. Ну и ладно, значит судьба у него такая, добавится в другой раз.

Тем временем, во втором подходе к снаряду количество добавленных уверенно перевалило за 15. Значит это не заложенное разработчиками ограрничение, а просто пятна на солнце, или таракан замкнул дорожку на материнской плате сервера. Можно не париться и продолжать. Если меня забанят за массовый френдинг – я об этом скоро узнаю.

Update 2: Вылезла еще одна ошибка. Почему-то на странице не оказалось кнопки добавить. Причем стабильно для этого пользователя. Либо я таки пытаюсь добавить его второй раз (почему-то он не попал в список уже добавленных) либо это какой-то другой косяк. Во всяком случае эту ошибку я теперь тоже благополучно игнорирую, а на досуге посмотрю, чем же он таким отличился.

Обнаружил на странице добавления форму с помощью которой можно добавлять людей по 10 за раз. Но мне уже лень переделывать скрипт, он и так работает. Пока это не такая большая проблема

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

Update 3: это были удаленные журналы. От них остались только комменты (можно удалить журнал оставив комментарии). Тем временем покая немножко гулял, скрипт добавил около 250 друзей. От так, мартышкиным трудом должны заниматься мартышки.

Update 4: Ошибка добавления друга/друзей: Вы пытаетесь добавить слишком много друзей за слишком короткий промежуток времени :(

Ладно, 3 сотни за 2 дня тоже неплохо.

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

Это конечно покерные форумы. Но их владельцы очень не любят когда кто-то куда-то уводит их посетителей. Так что этот источник весьма ограниченный.

Ну ладно, еще есть твиттер, в котором достаточно просто отфильтровать человеков по интересам. Причем конкретно в отношении покера есть прекрасный способ отфильтровать именно живых человеков, боты мне нафиг не усрались. Одна маленькая проблема. Нет, две. Да их дохера… Но суть одна: твиттер тоже много чего не любит. Подписался на 80+ человек за 80 секунд? Ой, ты наверно бот какой-то, давай-ка мы тебя забаним.  Отправил подряд 15 похожих сообщений разным пользователям? Отдохни, сходи покурить… мы любим своих пользователей и не позволяем делать массовые рассылки.

Что ж… на любую хитрую жопу есть хуй с винтом. Но оставлю я вас пока на закуску. А потренируюсь на кошках ЖЖ. Да, стыд мне и позор, я снова завел блог на ЖЖ. Сермяжная правда жизни – там есть огромная аудитория. Здесь – 3 калеки.

Естественно, никакой политики там у меня не будет. И личных данных не будет. А также матов, оскорбления нежных религиозных чувств и прочего попрания УК РФ. 

Будет голая, беспринципная коммерция. А потому я намерен пуститься во все тяжкие, надрачивать топ, СК, плодить ботов и участвовать во френдомарафонах, в общем борьба без правил. Сегодня добавил во френды 100 шт таких же беспринципных, кто френдит все что шевелится… и чой-то приуныл. Вот делать больше нечего, кроме как тыкать в кнопочки самому. Тут и обезьяна справится. Или зомби…

Вот с zombie и начнем. Задача относительно простая

  1. пройти аутенфикацию
  2. зайти в список друзей и вытянуть его (несколько страниц)
  3. пройтись по списку ссылок на френдомарафоны, вытянуть имена всех комментаторов (опять же – может быть несколько страниц)
  4. сформировать итоговый список, чтобы не пытаться добавить человека дважды
  5. добавить всех

Сейчас я где-то в середине второго пункта. Вытащил список друзей, но только одну страницу. Zombie прекрасен своими возможностями, но документация ужасна. Ее практически нет.

Update 1: п.2 пройден. Мне немного попортили кровь какие-то левые френды обнаруженные скриптом в моем списке, но уточнение селектора для выборки решило эту проблему. 131 штука detected

Update 2: Явно видно что движок ЖЖ делала куча народу. Один код генерит относительные ссылки, другой абсолютные. Куча ошибок которые никто не правит. Потому что тронь – рассыплется.

Update 3: п.3 пройден наполовину. Вытаскиваю комментаторов к одному посту

Update 4: сюрприз. В ЖЖ по меньшей мере 2  принципиально разных дизайна блога. Я имею ввиду, конечно, не шрифты и цветовую гамму. В одном комментарии грузятся сразу . А в другом подгружаются динамически и формируются скриптом прямо на странице.  И похоже 2 это не конечная цифра, есть еще какие-то отличия. Я сейчас одним глазом смотрю на вывод моего скрипта – на некоторых страницах он комментарии не видит :(

Ну хотя бы с п.4 проблем не ожидается.

Update 5: Оккей… на 6 блогов 3 разных способа оформления комментариев и их пагинатора. Это блядь феерический пиздец, за это нужно отрывать людям руки. По самую жопу, из которой они растут.

P.S. Блядь пиздец, сколько же у них ошибок…

P.P.S. Ну по крайней мере я освоил необходимый минимум зомбоводства. Не то чтобы полностью разобрался что и как, но сваять скрипт, который куда-то полезет и что-то не запредельно сложное и динамическое распарсит – я могу. При этом он будет логиниться, ходить по ссылкам и жать на кнопочки – ну совсем как живой, только что мышкой шевелить не будет. Так что продвинутые средства мониторинга действий пользователя его засекут.

P.P.P.S. Может для полного счастья с async разобраться, чтобы процесс шел параллельно? А то большую часть времени скрипт ждет пока очередная страничка загрузится

Траханые побочные банки… По большому счету, игрока волнует только окончательная сумма прописью, которую он сгребает со стола. Точнее разница между этой суммой, и той которую он туда затолкал.  Как эта сумма структурируется, его в общем и целом не ебёт. В суровой же реальности, вся эта куча фишек разделена на несколько банков. Основной + один или более побочных. А “лишние” фишки, те которые не получили встречной ставки ввиду отсутствия у оппонента достаточного количества средств, в некоторых случаях молча возвращаются в стек. В других клиент радостно рапортует, что игрок их “collected”.

Я немножко подзаебался разделять эти ситуации. Итоговая сумма в стеке в результате выходит правильная, но в том какую часть из нее считать выигрышем, а какую провести как “return uncalled bet” моя прога  часто не сходится во мнениях с покерным клиентом.

  • Можно насрать и забыть. Но так я лишаюсь возможности сверить результаты.
  • Можно разгрести эту кучу говна, но для этого придется реализовать всю эту гребаную механику с побочными банками, а это то еще мозгоёбство. При этом нет никакой уверенности в том, что покерный клиент другой сети считает все точно также как 888, с которым я возюкаюсь сейчас.

Ммм… насрать и забыть. Мой софт – самый правильный софт, пока не доказано обратное. Конечный результат записанный в логах покерных клиентов игнорируем, подводим итог сами.

А теперь реализую то, ради чего это все и затевалось. Добавлю к Джону и Джастину Боба, и посажу этих 3ех гавриков играть друг с другом в Spin&Go.

Вот что это за хрень? В середине турнира случилось затмение на солнце, или Марс вошел в созвездие Весов… И покерный клиент выдал вот такое фуфло:

#Game No : 591463494
***** 888poker Hand History for Game 591463494 *****
$5,000/$10,000 Blinds No Limit Holdem - *** 03 01 2017 17:42:27
Tournament #93696152 Free - Table #558 9 Max (Real Money)
Seat 1 is the button
Total number of players : 7
Seat 1:  ( $31,496 )
Seat 3:  ( $26,030 )
Seat 5:  ( $15,164 )
Seat 6:  ( $34,156 )
Seat 7:  ( $72,634 )
Seat 9:  ( $5,999 )
Seat 10:  ( $42,243 )
posts ante [$2,000]
posts ante [$2,000]
posts ante [$2,000]
posts ante [$2,000]
posts ante [$2,000]
posts ante [$1,940]
posts ante [$2,000]
posts big blind [$10,000]
** Dealing down cards **
folds
folds
raises [$43,205]
folds
folds
folds
** Dealing flop ** [ Ks, Qs, 8c ]
** Dealing turn ** [ 7h ]
** Dealing river ** [ Kc ]
** Summary **
shows [ Qd, Jc ]
shows [ 6h, 6s ]
collected [ $13,580 ]
collected [ $20,360 ]

Здесь все почти как обычно, за исключением маленькой детали: напрочь отсутствуют ники игроков. И что теперь с этим делать?

P.S. За исключением этой маленькой неприятности, дела идут весьма неплохо. Моя голова скоро взорвется от регулярных выражений, но по крайней мере логи восьмерок я сегодня втяну. А логи старзов на них весьма похожи, отличаясь небольшими деталями. Логи нетбета вообще идут в виде XML, с ними проблем быть не должно

P.P.S. Зачем Dreamwidth добавил в тег blockquote кучу br и почему именно столько - мне решительно непонятно. Предполагаю что это попытка закрыть имеющиеся там br – ненужная вообще и к тому же ошибочная в своей реализации.

Profile

pokerfrog

February 2017

S M T W T F S
    1 2 34
567891011
12131415161718
19202122232425
262728    

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 28th, 2026 11:24 pm
Powered by Dreamwidth Studios