ASVShade

Блог Вавилова Александра

  • Home
  • Posts RSS
  • Comments RSS
  • Edit

Архив блога

  • ▼  2011 (3)
    • ▼  сентября (1)
      • Обновление цен с SSG
    • ►  марта (1)
    • ►  января (1)
  • ►  2010 (4)
    • ►  ноября (1)
    • ►  августа (1)
    • ►  февраля (1)
    • ►  января (1)
  • ►  2009 (10)
    • ►  ноября (1)
    • ►  октября (2)
    • ►  июля (2)
    • ►  июня (2)
    • ►  мая (1)
    • ►  апреля (1)
    • ►  февраля (1)
  • ►  2008 (7)
    • ►  сентября (2)
    • ►  августа (2)
    • ►  июля (3)

Обо мне

ASVShade
Просмотреть профиль

Обновление цен с SSG

by ASVShade

Всем добрый день!

Меня несколько раз спрашивали как работает программа по обновлению цен на карты с сайта http://www.starcitygames.com.

Вот решил немного рассказать об этом и выложить исходники.

Разработка всего этого заняла всего пару выходных, за то польза на долгое-долгое время)

Хочу отметить что вначале все это было реализовано когда то давно на Delphi 2009 – Delphi 2010 и хранение результатов в текстовых файлах, но чуть позже переписано на Java + MySQL.

Сегодня как раз и рассмотрим как это все работает именно на Java.

Алгоритм будет у нас следующий:

  1. Формируем массив состоящий из названий необходимых карт
  2. С цикле запрашиваем по HTTP страницы с картами (обычный метод “Get”)
  3. Обрабатываем полученные страницы как строки, избавляя их от HTML мусора
  4. Далее обрабатываем эти уже очищенные страницы как XML
  5. Сохраняем полученные результаты

Для начала немного о типах

Массив для карт:

public class CardsSSGPrice {
    public ArrayList<CardSSGPrice> Cards = new ArrayList<CardSSGPrice>();
}

Сама карта:

public class CardSSGPrice {
    public String fName;
    public String fSet;
    public String fCondition;
    public String fStock;
    public String fPrice;
    public CardSSGPrice(
            String Name,
            String Set,
            String Condition,
            String Stock,
            String Price) {
        this.fName=Name.replaceAll(" ","+");
        this.fSet=Set;
        this.fCondition=Condition;
        this.fStock=Stock;
        this.fPrice=Price;
    }

Метод который запрашивает страницу:

    private String GetHTMLFile(URL u) {
        String s = "";
        InputStream is = null;
        try {
            is = u.openStream();
            BufferedReader BR = new BufferedReader(new InputStreamReader(is));
            String Temp = BR.readLine();
            while (Temp != null) {
                s = s + Temp + "\n";
                Temp = BR.readLine();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                assert is != null;
                is.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
        return s;
    }

Метод проводящий очистку страницы от HTML мусора

private String ParsStr(String str) {
    int posB;
    int posE;
    //удаляем шапку
    posB = str.indexOf("<tr class=\"deckdbbody\">", 0);
    str = "<table>\n" + str.substring(posB, str.length());
    //удаляем хвост
    posE = str.indexOf("<tr><td colspan=\"10\" align=\"center\">", 0);
    str = str.substring(0, posE) + "</table>";
    //удаляем мелочь
    str = str.replaceAll("<br>", "");
    str = str.replaceAll("&nbsp", "");
    str = str.replaceAll("&", "");
    str = str.replaceAll("\\]", "");
    str = str.replaceAll("\\[", "");
    str = str.replaceAll("<div style='text-align: center;'>", "");
    str = str.replaceAll("</div>", "");
    str = str.replaceAll("<b>", "");
    str = str.replaceAll("</b>", "");
    str = str.replaceAll("<tr height=\"4\"><td colspan=\"11\" class=\"deckdbheader\"></td></tr>", "");
    str = str.replaceAll("<img src=\"
http://static.starcitygames.com/sales//images/plus_white.png\" alt=\"\\+1 Qty\\\" width=\\\"16\\\" height=\\\"16\\\">", "");
    //Удаляем все блоки input
    posB = str.indexOf("<input ");
    while (posB != -1) {
        posE = str.indexOf(">", posB);
        str = str.replaceAll(str.substring(posB, posE + 1), "");
        posB = str.indexOf("<input ");
    }
    //Удаляем все блоки img
    posB = str.indexOf("<img ");
    while (posB != -1) {
        posE = str.indexOf(">", posB);
        str = str.replaceFirst(str.substring(posB, posE + 1), "");
        posB = str.indexOf("<img ");
    }
  return str;
}

Ну и самый главный метод

    public ssg(WorkDB MyDB) {
        //заполнение массива карт (здесь уже сами решайте как это удобнее реализовать, я например запрашиваю с БД)
        CardsSSGPrice MyCard = MyDB.GetCardsForPriceSSG();
        //Перебор карт
        for (int i_MyCard = 0; i_MyCard < MyCard.Cards.size(); i_MyCard++) {
            System.out.println((i_MyCard + 1) + " (" + MyCard.Cards.size() + ") [" + MyCard.Cards.get(i_MyCard).fName + "]");
            try {
                boolean PageGo = true;
                int PageNum = 0;
                //Если есть страница для обработки
                while (PageGo) {
                    //Формирование строки запроса и сам запрос
                    String str = GetHTMLFile(new URL(
                            "
http://sales.starcitygames.com//search.php" +
                                    "?substring=" + MyCard.Cards.get(i_MyCard).fName +
                                    "&start=" + Integer.toString(PageNum)));
                    //смотрим есть ли результаты
                    if (str.indexOf("We're sorry!  There are no results with the name ") == -1) {
                        //Посылаем страницу на строковую обработку
                        str = ParsStr(str);
                        //Начинаем работать с XML
                        SAXBuilder builder = new SAXBuilder();
                        Document MyDoc = builder.build(new ByteArrayInputStream(str.getBytes("UTF-8")));
                        List Children = MyDoc.getRootElement().getChildren();
                        //Эти 2 переменные нужны что бы хранить прошлое название, так как если по строкам названия одинаковые, то они не пишутся
                        String Name_Old = "";
                        String Set_Old = "";
                        for (int i = 0; i < Children.size(); i++) {
                            Element Child = (Element) Children.get(i);
                            String Name = "";
                            String Set = "";
                            String Condition = "";
                            String Stock = "";
                            String Price = "";
                            //Название новое
                            if (Child.getChildren().size() == 10) {
                                Name = ((Element) Child.getChildren().get(0)).getValue().trim();
                                Set = ((Element) Child.getChildren().get(1)).getValue().trim();
                                Condition = ((Element) Child.getChildren().get(6)).getValue().trim();
                                Stock = ((Element) Child.getChildren().get(7)).getValue().replaceAll("Out of Stock", "0");
                                Price = ((Element) Child.getChildren().get(8)).getValue().replaceAll("
\\$", "");
                                Name_Old = Name;
                                Set_Old = Set;
                            }
                            //Название не изменилось
                            if (Child.getChildren().size() == 9) {
                                Name = Name_Old;
                                Set = Set_Old;
                                Condition = ((Element) Child.getChildren().get(5)).getValue().trim();
                                Stock = ((Element) Child.getChildren().get(6)).getValue().replaceAll("Out of Stock", "0");
                                Price = ((Element) Child.getChildren().get(7)).getValue().replaceAll("
\\$", "");
                            }
                            //Сохранение результатов (здесь уже сами решайте как это удобнее реализовать, я например сохраняю в БД)
                            MyDB.PriceToDB(Name, Set, Condition, Stock, Price);
                        }
                        if (Children.size() == 50) {
                            PageGo = true;
                            PageNum = PageNum + 50;
                            System.out.println("=========Next Page==========");
                        } else {
                            PageGo = false;
                            PageNum = 0;
                        }
                    } else {
                        PageGo = false;
                        PageNum = 0;
                        System.out.println("=========No Results==========");
                    }

                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (JDOMException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Как видите кода не так уж и много, разобраться думаю не составит особого труда.

Всем удачи!

0 коммент.

А кто такой заяц?

by ASVShade






Посмотрел я итоги выбора талисмана Сочи-2014. Это просто какой-то абзац товарищи!
В целом видно что конечную обработку идей проводил один и тот же рукожопый дизайнер. Может кому то и нравится стиль, в котором выполнены сие монстры, но по моему они реально убогие.
Представлены же они были в прямом эфире Первого канала Иваном Ургантом. Вообще-то из того что я там увидел я бы проголосовал за самого Ивана. Тот стиль, что он выбрал при демонстрации: эдакий веселый небритый звереныш – вылитый Талисман!

Теперь разберем каждого:





Дельфин: По мне так сам дельфин – доброе животное, которого любят все люди и дети, и который является символом Сочи, и должен был стать Талисманом, но… Об этом ниже. Выполнен же он слишком навязчиво. Видимо американская ехидная улыбка начинающего ганстера – гопаря убила все желание народа голосовать за него.






Матрешки: Матрешки символ России это факт. НО ПЛЯ не в таком же виде. Кегли от игры в боулинг немного перевыпили и на несвежу голову предстали перед зрителями. Вы всмотритесь в них – это же просто ахтунг какой то товарищи. Над адекватностью этих ммм… «матрешек» стоит вообще задуматься.






Снегирь: «Ой, щас кто-то испортит воздух» - первое что пришло мне в голову когда я увидел этот экземпляр. Вообще у меня снегири с красными грудками и острыми взглядами являются любимыми птицами, но этому синему снегирю явно плохо – весь образ говорит об этом… - нееее такого нельзя в талисманы.






Снежинка: Ну конечно: Вам нужен талисман-инвалид – ТАААДАААА заворачивайте! Меланхоличная дама, скорее всего с выпавшими волосами) с неудавшимся костюмом бетмена готова.






Огненный мальчик: Ну и в пару к Снежинке, парень в полной релаксации, видимо под полным кайфом с придурковатой улыбкой и шапке индейца.






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






Зайка: Ну что зайка, как зайка такой нейтральный незапоминающийся персонаж. О нем тоже ниже…






Белый медведь: Вот тут конечно произошла полная херня. Образ Белого медведя тупо скопирован с образа Мишки 80. О чем написано на ленте. Медведь стал более толстый и белый. Копирайт в минус – обидно, очень обидно что такое происходит.






Леопард: Самый проработанный в деталях персонаж. Неплохая динамика в образе в общем из того что здесь представлено это безусловно лучший вариант… Интересно почему?






Бурый медведь: А вот и тот, кто Солнышку кирпичом заехал. Авторы будто лукаво намекают: товарищи, это же и есть наш истинный талисман – коричневое тело с тупым, сфокусировавшимся на одном месте взглядом. Дополняет образ неприлизанный хохолок и видимо атрофированная после дикой попойки правая рука – Блеск!






Дед Мороз: Конечно не особо понятно отношение Деда Мороза к олимпиаде, НО именно его поддерживало большинство народа. В итоге деда мороза исключили со списка с первого места. По исполнению же как обычно твердая двойка. Ни радости, ни спорта. Поставить перед собой и с горя выпить.

Теперь перейдем итогам выбора:
Снежинка + Огненный мальчик как и следовало ожидать нашли своих места для инвалидов.
Бурый медведь с попойки – 3%
Матрешки-непоняшки - 5%
Солнышко-дурашка - 8%
Снегирь - ща пёрну -10%
Дельфин - 12%
Остальные (Леопард, Белый медведь и Зайка) - 62 % и стали победителями.
Главный вопрос: а почему 2+3?
Ну 2 понятно, парочка снежинка и лучик друг без друга не могут, а вот почему +3?
Неужели все такие охрененные символы, что просто не выбрать? Вот сколько я не читал на форумах, сколько не спрашивал у знакомых, никто не поддерживает идею целых 5 символов. Так почему 2+3?
В интернете полно шуток на эту тему, долго и искать не нужно.
Действительно видимо Леопард крутой съест всех. Медведь безобидный, в принципе, но если кто дорогу перейдет, мало не покажется. А зайцам - сидеть боятся!





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

Кстати еще задолго до официального голосования в Сочи народу представили всего 4 претендента: Дед Мороз, белый медведь, снежинка на лыжах и дельфин.
Народ единогласно проголосовал за дельфина – он действительно там милый… Но пришло всероссийское голосование, с зайцев собрали по 1.44 руб. на смску и выбрали то, что выбрали, с чем я Вас всех и поздравлю!

P/S/ Для поднятия настроения советую все же порыться в интернете и почитать темы с обсуждением этих монстров. Например тут

2 коммент.

Sorry, I don`t Russian

by ASVShade

Уже наверное как года я использую очень действенный способ отвязаться от всяких прилипал в городе.
Идешь бывает по городу никого не трогаешь и тут бац пристает какой нибудь мужик:
- А Вы не поможет 10 рублей на проезд не хватает.
Ну или вручая какую нибудь ненужную мне книгу типа почитайте и может купите. На крайняк бывает что липнут с помочь найти куда то дорогу.
В общем выход это смотря в глаза человеку очень четко произнести:
- Sorry, I don`t Russian.
Эта фраза помогает в 100% случаев (почти). Первые секунд 10 обратившийся тупо втыкает что произошло (ведь в его планах не было такого разворота событий), а потом я уже успеваю отойди на безопасное расстояние. И вроде как человеку не отказал, и вроде как и не помог.
Но что произошло сегодня, стоит рассказать отдельно.
Иду значит примерно в 23:30 по Невскому домой. Тут ко мне подбегает вполне нормальная девушка и выдает:
- Ой, вы не могли бы мне помочь, мне нужно немного денег на…
Дослушивать эту печальную историю у меня не было желания, и я выдал свое коронное:
- Sorry A don`t Russian. – и зашагал дальше.
Девушка задумалась буквально на 2 секунды, после чего себе под нос пробурчала:
- Ах, блять так – и после этого догоняя меня начала говорить милым голоском – Sorry, can you help me, I`am need a money…
Ржач на меня напал неимоверный, девушка сразу же от меня отстала, а я от смеха еле доперся до метро.

P/S/ Хорошо что она не добавила что нибудь тиба Факкинг Американ пипл))) Хотя кто знает)

0 коммент.

Неоконченный рассказ

by ASVShade

    Этот рассказ не имеет сюжета, не имеет окончания. Да и рассказом то его сложно назвать. Написал я его еще полтора года назад, в дни когда умер папа.

    Позже все думал допишу но он и остался недописанным.

    Одна хорошая знакомая (единственная кому я дал его прочитать) сказала что пусть так и останется… Действительно пусть останется так.

***

Мы молча стоял на краю пропасти и смотрел на плавно размахивающие крылья птиц на фоне огромного красного шара солнца.
- Они снова улетели? - спросил я у своей тени.
- Да. - без лишних слов ответила мне тень.
Стояла поздняя холодная осень.
Наступал вечер и ветер пронизывал насквозь, несмотря на толстую одежду.
По телу пробежала дрожь, но это не от холода а от мысли: "что будет дальше?".
- Почему? - тихо и безадресно  прошептал я.
- Не знаю - чуть погромче но тоже видимо не для меня сказала тень. - Хотя летом они всегда улетают в теплые страны и ... - тень на мгновенье задумалась -  почему то не возвращаются.
Птицы уже превратились в маленькие раздваивающиеся черные точки. На глазах у меня появились слезы. Я посмотрел в долину. Сейчас она казалась особенно зловещей. Черные лабиринты захватывали мой взгляд и вселяли как то ужас…

2009г.

2 коммент.

Прочь зовет лететь Сердце прочь…

by ASVShade

Прочь зовет лететь Сердце прочь,
Оставаться здесь что себе погибель.
Ночь на дворе твердит Разум ночь,
Лишь уйдешь словно вступишь в тигель.

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

Тишь, колыбельная вечная тишь,
Лишь в начале кажется раем.
Спишь, гниешь, и на месте стоишь,
И только шёпот звенит в голове лаем.

02.08.2010

0 коммент.

Билеты в разные страны.

by ASVShade

Новый 2006 Год меня с девушкой пригласили очень хорошие друзья встречать в замечательном городе Киеве. Конечно я был рад, мало того что друзей давно не видел, так еще и посмотреть на город, внести в жизнь такое разнообразие. В общем, решение было принято.
Билеты нужно было покупать заранее, так как по Новый Год довольно много желающих попасть в другой город. В конце ноября, как билеты появились в кассах, я же готов был их купить. Но девушка была против ранней покупки. Она говорила что у нее экзамены, что вплоть до Нового Года будет сдача, что возможно сдать не успеет и придется оставаться в начале января... Если бы я ехал один, то купил билеты число на 25 декабря, что бы без Новогодней суеты спокойно посмотреть город. Я терпеливо ждал. Тем временем билеты заканчивались с геометрической прогрессией.
Примерно в середине декабря я услышал ее разговор с мамой по телефону (разговаривала в соседей комнате). Полного разговора я естественно не помню, да и не слышал, но отрывки были просто ошеломляющие: "Визу пока не дают, но рассматривают...", "Да, билет уже купила..." Я еще подумал: "какая к черту виза?, на Украину не нужно никакой визы! и что еще за билет, а как же экзамены?"... Далее были фразы, что ее там родственники ждут, и что со временем у нее все в порядке" Блеск думаю.
В общем, получилась так, что она на самом деле хотела поехать к родственникам в Вильнюс, но потому как были проблемы с визой, билеты она не покупала...
После разговора я спросил у нее что это за канитель такая получается. Они засуетилась, сначала говорила что я не так все понял, потом, что мама хочет что бы она поехала в Вильнюс, но сама она не хочет, что ее там хотят увидеть родственники и она так от Мамы типа отмазалась. Естественно это было не так.
В тот же день я пошел на вокзал а купил себе билет до Киева. Она мне позвонила, спросила где я, я сказал что на вокзале купил себе билет. Она чуть ли не расплакалась как же она без меня останется...
Через несколько часов приезжает счастливая девушка с билетом на руках, что она купила билет на тот же поезд, и мы будем Новый Год встречать вместе.
-------
Новый год мы встретили раздельно, так как визу ей все же оформили. Мое день рождение (5 января) я встретил с друзьями 7 числа уже в Питере, хотя она 8 приезжала с Вильнюса. Она просила подождать отмечать, но я не хотел с ней отмечать. Потом мы помирились, и вроде все стало как прежде...
В феврале мы расстались...

Посвящается моего другу Виктору.

0 коммент.

Loft_Зазеркалье - 66

by ASVShade

  Побывал вчера на выставке Лофт Проект Этажи - "Loft_Зазеркалье" на Лиговском.
В общем выставка понравилась всего 100 рублей за массу впечатлений. Штук 50 устройств и механизмов работающих довольно странно и интересно подчиняясь порой неведомым мне законам физики.

  В конце выставки можно было пройти небольшой тест и получить сертификат.

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

  Ответил на вопросы, пошел распечатывать результаты... я был разочарован.

  Разочарован не столько своими знаниями а с тем что результаты нелогичные.  Всего было 19 вопросов. Довольно странное кол-во вопросов, ну да ладно. Самое интересное, что получил я 66 баллов.

  Вопрос как я умудрился в 19 вопросах получить 66 баллов?

  Итак рассуждаем:
1 правильный вопрос дает: 100 / 19 = ~5,26 баллов.
Делим мои баллы на это число: 66 / ~5,26 = 12,54 вопросов!
Вау, да я крут! на целых 12 вопросов с хвостиком ответил.
Может быть подумал я округление неправильно работает:
смотрим что будет ответив на 12 и 13 вопросов соответственно: 12 * ~5,26 = 63,12 и 13 * ~5,26 = 68,4 баллов. Ну никак до 66 не округлить.
Черт. Может 1 вопрос пропал куда то или лишний появился?
Выполняем те же математические действия для 18 и 20 вопросов соответственно.
Для 18:
100 / 18 = 5.5(5)
66 / 5.5(5) = 11,88
11 * 5,5(5) = 61,1(1)
12 * 5,5(5) = 66,6(6) Ближе к истине, но при округлении функцией Round должно получиться 67... неужели использовали Trunc?)
Для 20:
100 / 20 = 5
66 / 5 = 13,2
13 * 5 = 65
14 * 5 = 70
Получается облом.
Еще догадки:
- всего на самом деле не 100 баллов - тоже абсурд. 
- вопросы имеют разные баллы (с)DarkenLord.  Глупость конечно при проверке знаний в тестировании, но все же… и еще это не честно.

  А теперь к чему я это тут развел:
На сертификате есть надпись:
сертифика дает право на:
  - получение приза (95-100) баллов;
  - бесплатное посещение выставки на 3-х человек (90-94 балла);
  - бесплатное посещение выставки на 1 человека (85-89 балла);

  Так как 1 ответ мы уже считали дает нам ~5,26 баллов. то попасть в диапазон 95-100 можно только ответив на все 19 вопросов. Ответив даже на 18 набираем всего: 18 * ~5,26 = ~94.7.
  Ах да, они же могут округлить в большую сторону тогда попадем, но особо надеяться на это не будем.
  Попасть во второй диапазон, с условием что 18 ответов попадают в первый, мы физически не может так как 17 вопросов нам дают: 17 * ~5,26 = ~89,4. Опять же надеяться на совсем уж магическое округление...
  Ну и та же ситуация с третьим диапазоном 16 ответов нам дают 16 * ~5,26 = ~84,2...
В общем не получается во все диапазоны нормально попасть. Хотя с их вычислениями возможно по ходу все.

  Физику то конечно эти парни знают я не спорю, но вот с математикой лажа вышла(.
Вышел с выставки с чувством какого то кидалова *(.

P/S/ Несмотря на это сама выставка очень понравилась и всем советую ее посетить).

0 коммент.
Предыдущие Главная страница

2010 Designed by Wordpress Theme Designer Wordpress Theme Designer Blogger Templates by Blogger Template Place | Blogger Tutorial