1. PHP / Говнокод #26063

    −2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    В России почти 10 лет легально работает сервис по псевдоремонту компьютеров. Его главные жертвы — пенсионеры
    За переустановку Windows «мастера» сдирают до 200 тысяч рублей
    
    
    
    https://dailystorm.ru/obschestvo/v-rossii-pochti-10-let-legalno-rabotaet-servis-po-psevdoremontu-kompyuterov-ego-glavnye-zhertvy-pensionery?utm_source=lentach&utm_medium=ctr&utm_campaign=lentach

    Запостил: ru66oH4uk, 02 Декабря 2019

    Комментарии (154) RSS

    • дебилы
      Ответить
      • качество
        https://avatars.mds.yandex.net/get-zen_doc/225409/pub_5b1842e6eb269500a877d063_5b1846d79b4 03cf2839a8770/scale_1200
        Ответить
    • Да ты глаза всем открыл! У меня почтовый ящик ломится от этих "компьютерный мастер, живу в вашем доме сделаю быстро выезд бесплатно". Л0х не мамонт - л0х не вымрет.
      Ответить
    • > 200к
      За 200к я новый комп со свежей виндой куплю... нахуй мне мастер.
      Ответить
    • свиньи. евреи и американцы даже на такого не делают, сука чтобу БЕДНЫХ СТАРИКОВ БЛЯДЬ!!!
      Ответить
    • хотя ты пиздабол знатный. у российских пенсионеров таких денег не бывает, только если они нажили бизнес в молодости
      Ответить
      • Им счёт на оплату выставляют, когда сам компьютер находится у них в сервисе. Заранее бы просили - шли бы на три буквы отовсюду
        Ответить
        • p.s. ненавижу этих свиней
          Ответить
        • Интересно, а со старыми компами потом что делают? Или пенсионеров еще припугивают, чтобы заплатили, а потом великодушно дают скидку? Мне просто тоже надо винду переставить, вот не знаю, к кому обращаться.
          Ответить
        • показать все, что скрытоvanished
          Ответить
          • Оспаривать счёт можно только тех организаций, которым есть хоть какое-то дело до клиентов и своей репутации. Эти же пидорасы, очевидно, целиком и полностью мошенническая компания, и бумажками недовольных клиентов они будут только подтираться.

            Или ты имеешь в виду идти в Роспотребнадзор/суд? Так да, так делать нужно (хотя и далеко не факт, что что-то даст).
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • Кто они и кого их? Мошенники обманутых клиентов? Если комп в «сервисе» — просто скажут, что не отдадут, пока счёт не заплатят. Если ремонт на дому, то психологическим давлением (будут давить на совесть, грозить полицией, коллекторами, судами — и далеко не факт, что действительно не наймут каких-нибудь уебанов-коллекторов). Разумеется, грамотный и психологически устойчивый человек легко пошлёт их нахуй, но такие обычно услугами сомнительных ремонт-конторок не пользуются.
                Ответить
                • > не отдадут
                  Да и хуй с ним, если новый комп дешевле этого "ремонта"...
                  Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • > И у них его никак не вернуть?
                    Ну, очевидно, надо накатать заяву в полицию. Только, во-первых, ебли с этим будет просто овердохуя (вспоминается «Тамина утомила»: детективная история о том, как тня сдала макбук в ремонт плешивой конторке, а потом три года бегала по судам в попытках вернуть, естественно, не починенный ноут и/или деньги), а во-вторых, как я уже написал, это рассчитано на слабые слои населения, подверженные психологическому давлению.

                    > Ебать у вас там сомали.
                    Вообще, это раньше коллекторы борзые были и насрать под дверь могли. Сейчас они уже не те, в основном просто 24/7 хуярят по телефону и методично жертву обрабатывают словесно.
                    Ответить
      • показать все, что скрытоvanished
        Ответить
    • Кстати, нам листовки прикольные приносят - будто бы от руки написанные. С именем, мобильным телефоном и "Не фирма!". Даже мне, близорукому, с трудом удается полиграфию разглядеть (разве что две листовки сравнить, что они идентичны, курьеры тоже не лохи и сразу по две суют).
      Оно, конечно, понятно, по науке маркетинговой - частному мастеру доверия больше, ну и типа ручная работа, индивидуальный подход. Но тут эффективные менеджеры перемудрили - ребят, что за компьютерный мастер, у которого самого принтера нет? Хотя, может, для ЦА оно и вправду работает.
      А еще видел - подобную рукопись аж на биллборд растянули. Это уже какая-то метаирония.
      Ответить
    • Ещё ебово, когда такие ребята фотку добавляют к рекламе. Не знаю, встречаются ли там реальные фотки мастеров, но видел кого-то из it-шной тусовки (Цукерберга?) и почему-то Камбербетча
      Ответить
    • Товарищи, у меня к вам вопрос, вы когда-нибудь вызывали мастера на дом?
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • В любом говне с динамической тупизацией.
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • def foo(me):
                if type(me) == str:
                    print("I am string ", me)
                elif type(me) == int:
                    print("Me int", me)
                else:
                    print("Me catch the ship, across the see")
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • Посмотрел, что можно выжать из «Фрипаскаля». У нас есть:
                1. Перегрузка функций, как в крестах.
                2. Type helpers (в других ЯП они называются экстеншон-методами), чтобы можно было писа́ть 42.foo. Хелперы можно использовать вместо перегрузки.
                3. Тип Variant (та самая запись с вариантным полем, с поддержкой проверки варианта в рантайме и с сахаром в компилтайме).

                Вроде всё есть, но когда скрещиваем Variant с перегрузкой или Variant с хелперами, ничего не получается. «Фрипаскаль» изо всех перегрузок выбирает одну (например, ту, которая для целого питуха), и остальные значения варианта пытается кастить в этот тип (и тогда он обламывается, когда нужно скастить строку). То есть диспетчеризация перегрузки работает только в компилтайме, а в рантайме не работает.

                В итоге приходится писа́ть точно такой же код, как у Антифриза отработанного:
                uses Variants;
                procedure foo(me: Variant);
                begin
                  case VarType(me) of
                    varDouble: WriteLn('I am floating cockerel ', me);
                    varShortInt: WriteLn('Je suis integer ', me);
                    varString: WriteLn('Soy string ', me);
                  else
                    Writeln('Kakoi bagor )))')
                  end
                end;
                 
                function Kukareku(what: Integer): Variant;
                begin
                    case what of
                    0: Kukareku := 42;
                    1: Kukareku := 3.14;
                    2: Kukareku := 'stroka';
                    end;
                end;
                 
                 
                begin
                    foo(Kukareku(0));
                    foo(Kukareku(1));
                    foo(Kukareku(2));
                 
                    foo(42);
                    foo(3.14);
                    foo('stroka')
                end.


                https://ideone.com/fGpTWM
                Ответить
              • Теперь кресты:
                #include <iostream>
                
                void foo(double me) {
                    std::cout << "I am floating cockerel " << me << std::endl;
                }
                
                void foo(int me) {
                    std::cout << "Je suis integer " << me << std::endl;
                }
                
                void foo(const char * me) {
                    std::cout << "Soy string " << me << std::endl;
                }
                
                template<int what> auto kukareku();
                
                template<> auto kukareku<0>() {return 42;}
                template<> auto kukareku<1>() {return 3.14;}
                template<> auto kukareku<2>() {return "stroka";}
                
                int main() {
                    foo(kukareku<0>());
                    foo(kukareku<1>());
                    foo(kukareku<2>());
                
                    foo(42);
                    foo(3.14);
                    foo("stroka");
                
                    return 0;
                }


                https://ideone.com/njyIVn

                Код работает только с константами. При попытке посчитать kukareku<x>() от переменной не компилируется.

                При попытке же написать одну функцию auto kukareku() со свитч-кейсом внутри обламывается, потому что все ветви свитч-кейса должны вернуть значение одного типа (auto выводится в конкретный тип один раз).
                Ответить
                • Попробовал std::variant:
                  typedef std::variant<int, double, const char *> myvariant;
                  
                  myvariant kukareku(int what) {
                      switch(what) {
                          case 0: return 42;
                          case 1: return 3.14;
                          case 2: return "stroka";
                      }
                  }


                  Красиво. Но не могу вызвать foo(kukareku(0)). Компилятор не хочет кастить std::variant в int, нужно вручную:
                  foo(std::get<int>(kukareku(0)));
                  foo(std::get<double>(kukareku(1)));
                  foo(std::get<const char *>(kukareku(2)));

                  То есть опять же принимать решение на этапе компиляции, а не в рантайме.
                  Ответить
                  • Можно с помощью метушни и какой-то матери сгенерить хуйню которая в рантайме зовёт функцию с нужным типом. Как std::visit, только без явного перечисления всех веток.
                    Ответить
                    • Спасибо за std::visit:
                      #include <iostream>
                      #include <variant>
                      
                      void foo(double me) {
                          std::cout << "I am floating cockerel " << me << std::endl;
                      }
                      
                      void foo(int me) {
                          std::cout << "Je suis integer " << me << std::endl;
                      }
                      
                      void foo(const char * me) {
                          std::cout << "Soy string " << me << std::endl;
                      }
                      
                      template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
                      template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
                      
                      using myvariant = std::variant<int, double, const char *>;
                      
                      int main() {
                          auto kukareku = [](int what) -> myvariant {
                            switch(what) {
                              case 0: return 42;
                              case 1: return 3.14;
                              case 2: return "stroka";
                            }
                          };
                      
                          auto cocock = overloaded {
                                  [](double me) { return foo(me); },
                                  [](int me) { return foo(me); },
                                  [](const char * me) { return foo(me); },
                          };
                      
                          int x = 0;
                          std::visit(cocock, kukareku(x));
                          x = 1;
                          std::visit(cocock, kukareku(x));
                          x = 2;
                          std::visit(cocock, kukareku(x));
                      
                          return 0;
                      }


                      Шаблон overloaded подсмотрел тут: https://en.cppreference.com/w/cpp/utility/variant/visit (требует C++17).

                      Всё работает с проверкой в рантайме, но мне не понравилась тавтология:
                      auto cocock = overloaded {
                                  [](double me) { return foo(me); },
                                  [](int me) { return foo(me); },
                                  [](const char * me) { return foo(me); },
                          };


                      А с помощью «метушни и какой-то матери» как будет выглядеть?
                      Ответить
                      • Фу, то ли дело "Цэ":
                        #include <stdio.h>
                        #include <stdlib.h>
                        
                        typedef enum {
                        	INT,
                        	STR,
                        } type;
                        
                        typedef struct {
                        	type type;
                        	union {
                        		char *s;
                        		int i;
                        	};
                        } variant_t;
                        
                        #define VARIANT(x) _Generic((x), \
                        	int: ((variant_t){.type = INT, .i = x}), \
                        	char*: ((variant_t){.type = STR, .s = x}) \
                        )
                        
                        void foo_int(int i)
                        {
                        	printf("Integer %d\n", i);
                        }
                        
                        void foo_str(char *s)
                        {
                        	printf("String \"%s\"\n", s);
                        }
                        
                        #define foo(x) (_Generic((x), \
                        	int: foo_int, \
                        	char*: foo_str \
                        )(x))
                        
                        void dynamic_foo(variant_t pitux)
                        {
                        	switch (pitux.type) {
                        		case INT: foo(pitux.i); break;
                        		case STR: foo(pitux.s); break;
                        		default: error("Error!"); break;
                        	}
                        }
                        
                        int main(void)
                        {
                        	for (int i = 0; i < 10; ++i) {
                        		dynamic_foo(rand() & 1 ? VARIANT(42): VARIANT("forty two"));
                        	}
                        	return 0;
                        }
                        https://ideone.com/fuFg1H
                        Ответить
                      • Да хуй знает... Первое что в голову приходит - взять список типов из варианта и раскрыть шаблон с оператором скобки, который зовёт нужную функцию, для каждого из них. Ну и породить от этих классов что-то одно и скормить в std::visit, как у тебя в примере с overload.
                        Ответить
              • Я за «Python».
                from functools import wraps
                from typing import get_type_hints
                from collections import defaultdict
                
                _funcs_table = defaultdict(dict)
                def overload(func):
                    arg_type = tuple(get_type_hints(func).values())[0]
                    _funcs_table[func.__name__][arg_type] = func
                    @wraps(func)
                    def wrapper(arg):
                        return _funcs_table[func.__name__][type(arg)](arg)
                    return wrapper
                
                @overload
                def f(x: int):
                    print(f'f(int): {x}')
                
                @overload
                def f(x: str):
                    print(f'f(str): {x}!')
                    
                @overload
                def f2(y: int):
                    print(f'f2(int): {y}')
                
                @overload
                def f2(y: float):
                    print(f'f2(float): {y}')
                
                f(42)
                f('Hello')
                f2(43)
                f2(43.0003)
                # f(int): 42
                # f(str): Hello!
                # f2(int): 43
                # f2(float): 43.0003

                https://ideone.com/1j7zi6

                Надо только расширить это говно на «*args, **kwargs» и резольвить по кортежу типов всех аргументов.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • В общем-то так может любой язык с динамической типизацией, функциями первого порядка и интроспекцией. Но в Груви это весьма удобно сделано, да.
                    Ответить
                  • Раз это можно сделать в C++, то скорее всего это можно сделать и в D, но проверять у нас некому.

                    Вопрос в том: зачем, Холмс?! Если оставлять проверку чисто в рантайме, то это error-prone; если включать указанный @CompileStatic, то почему просто не заюзать генерики или interface/protocol oriented development?
                    Ответить
                  • И, кстати, в Obj C ты можешь сделать с точностью до наоборот: отправлять сообщения с конкретным именем всяким разным инстансам и надеяться, что не вылетит Unrecognized selector (или проверять на respondsToSelector). Но это ООП-way, так шо твоё условие сразу не соблюдено
                    Ответить
                • Нарыл забавную фичу из стандартной либы:
                  # https://docs.python.org/3/library/functools.html#functools.singledispatch
                  >>> from functools import singledispatch
                  >>> @singledispatch
                  ... def fun(arg, verbose=False):
                  ...     if verbose:
                  ...         print("Let me just say,", end=" ")
                  ...     print(arg)
                  >>> @fun.register
                  ... def _(arg: int, verbose=False):
                  ...     if verbose:
                  ...         print("Strength in numbers, eh?", end=" ")
                  ...     print(arg)
                  ...
                  >>> @fun.register
                  ... def _(arg: list, verbose=False):
                  ...     if verbose:
                  ...         print("Enumerate this:")
                  ...     for i, elem in enumerate(arg):
                  ...         print(i, elem)

                  Какой скилл )))
                  Ответить
              • Один хуй результать тот же.
                Ответить
      • Мультиметоды здорового человека?

        А что будет, если передать значение типа, для которого нет сигнатуры? Ошибка в рантайме или при копуляции или шо там в жабомире?
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • Если с ошибкой в рантайме, то в том же Шарпе можно через dynamic: сделать одну публичную функцию, которая принимает динамик, и n приватных функций, которые принимают параметры нужных типов. Внутрь публичной поместить вызов приватных (он будет один благодаря перегрузке), работать должно точно так же
            Ответить
    • В рашке пеньсии подняли, так что могут себе позволить. Не понимаю хайпа.
      Ответить
    • :)
      Ответить
    • Звучит как наебалово
      Ответить
      • Да, наебалова там годные
        https://sun9-74.userapi.com/c631431/v631431595/2ed94/xtY_CgLij1s.jpg
        Ответить
    • Кстати, «utm_»-говно из ссылок следовало бы вырезать прямо нативно в браузере. Заебали ненужную хуйню на ссылки намазывать.
      Ответить
      • постишь ты такой ссылку, а у тебя там
        ?utm_source=portnhub
        Ответить
        • Вот правда, Referer разве не для этого придуман?
          Ответить
          • Referer в ссылке не отражается, а так ты опубоиковал ссылку, и они знают, откуда ты её взял
            Ответить
            • Кто знает? Рекламная ссылка находится на сайте, можно понять с какого сайта по ней перешли по Referer. Правда я не знаю, наверное она находится в отдельном фрейме, и в Referer будет адрес рекламной платформы, но тогда и в этот адрес можно зашить адрес реального сайта.
              Ответить
              • Дык они хотят знать не с какого сайта перешли, а на каком сайте ты изначально нашёл эту ссылку. Это могут быть 2 разных места если ты её зарепостил. Ну или если ты её в чатике скинул и чел вообще не с сайта перешёл.
                Ответить
                • Типа гиббончик запостил ссылку на говнокоде, и плюс в карму будет не говнокоду, а лентачу? Тогда логично, согласен.
                  Ответить
                  • Да, именно так.

                    Никогда не спрашивали "откуда вы о нас узнали"?
                    Ответить
                • Именно поэтому я за то, чтобы автоматически заменять эти параметры на utm_source=whooye&utm_medium=peaceda&utm _campaign=g-goorda.
                  Ответить
                  • Да лучше вообще стирать нахер. И без них ссылки длинные.

                    З.Ы. На самом деле я думаю такой плагин уже есть.
                    Ответить
                    • Ещё есть расширения, чтобы у поисковых систем стирать лишние параметры, оставлять только поисковый запрос (?q= или ?text=).
                      Ответить
                      • А я за https://chrome.google.com/webstore/detail/google-search-link-fix/cekfddagaicikmgoheekchngpadahmlf: стирает говно (по которому поисковики определяют, куда я ушёл) из ссылок в результатах поиска.
                        Ответить
                        • Да, поисковики вместо реальной ссылки сейчас в результатах поиска вставляют ссылку на себя же, а ссылка на найденный сайт появляется по событию onclick, чтобы можно было определить, по какому из результатов поиска ты кликнул. А эти расширения пытаются вернуть, как было: без перехватчиков события перехода.
                          Ответить
                          • Зацени: https://www.w3schools.com/tags/att_a_ping.asp.
                            Ну не уебаны ли там в w3c сидят?..
                            Ответить
                            • Ух, ты. Не знал. В «Фуррифоксе» по умолчанию выключено:
                              https://caniuse.com/#feat=ping
                              Ответить
                            • Х.з., этот ping выглядит как меньшее зло по сравнению с тем говном, которое сейчас творится - utm параша в ссылках, обработчки кликов в рекламных скриптах. Так что если всё это говно выпилят и заменят на ping (который можно отключить) - я только за.
                              Ответить
                              • ЧТО???

                                Блять, POST запросы по клику?

                                POST-сука-шлюха-мразь-запросы по клику на ёбанный a href. Пизде-е-е-ец.

                                Прозреваю такую гору уязвимостей, когда из-под чужой сессии будут редиректить POST на какую-то хуйню.

                                > It will also include headers “Ping-From”, “Ping-To” and a “text/ping” content type.

                                Если POST нихуя не знает про эти новые заголовки, и в принципе игнорит Content-Type. Допустим

                                POST some/link?action=DELETE&id=42
                                Ответить
                                • The ping attribute, if present, gives the URLs of the resources that are interested in being notified if the user follows the hyperlink. The value must be a set of space-separated tokens, each of which must be a valid non-empty URL whose scheme is an HTTP(S) scheme. The value is used by the user agent for hyperlink auditing.

                                  Отсюда: https://html.spec.whatwg.org/multipage/links.html#ping

                                  И тут ограничения не описаны: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-ping

                                  В «XMLHttpRequest» хотя бы запрещены кроссдоменные запросы. А тут, вероятно, можно с твоими куками заставить тебя голосовать на каком-нибудь сайте. Из-за этих мудаков приходится изобретать защиту от CSRF.

                                  Авторы видимо считают, что раз чужой сайт не получит ответ, то отправлять запрос безопасно. Это типа как вставить элемент <script>, у которого в src указать ссылку на REST API: ответ ты прочитать не сможешь, но запрос отправится.
                                  Ответить
                                • >> It will also include headers “Ping-From”, “Ping-To” and a “text/ping” content type.

                                  Значит, на своём сайте придётся игнорировать всех, кто указывает Content-Type: text/ping. А на чужом сайте ничего не сделаешь: атрибут ping, оказывается, поддерживается веб-браузерами давно, но популярные CMS и фреймворки о нём не знают.
                                  Ответить
                                  • И неужели ни одному олуху из комитета не пришла в голову мысль сделать новый метод «PING».

                                    Но нет, хуйнём POST в вёбе ведь так мало разных дыр.

                                    Уроды.
                                    Ответить
                                    • вообще он есть и называется HEAD. но в мире персональных домашних страниц, как мы знаем, есть только гет и пост.
                                      Ответить
                                      • HEAD аналогичен GETy, но без тела.

                                        А они придумали отправлять запрос с телом.

                                        >ping URL, method is `POST`, body is `PING`
                                        Ответить
                                        • блядь, там еще и тело

                                          пиздец
                                          Ответить
                                        • Напомнило костыль «Твиттора»: у них в REST API для удаления твита использовался метод DELETE, но поскольку в первых веб-браузерах с поддержкой AJAX можно было использовать только GET и POST, у них этот метод дублировался методом POST с параметром method=DELETE (или как-то так).
                                          Ответить
                                  • >но популярные CMS и фреймворки о нём не знают.

                                    Да о чём говорить.
                                    Многие в 2к20 только-только научились писать код, отличающий GET от POST.

                                    А ведь ещё осталась куча phpшного ($_REQUEST), jspшного ( request.getParameter), aspшного и прочего легаси, которое зачастую вообще игнорит метод.
                                    Ответить
                                    • Во фреймворках сделали для дураков, чтобы можно было не думать о методах и течь, чтобы контроллер откликался хоть на GET, хоть на POST, а в результате эти фреймворки оказались уязвимы к CSRF.
                                      Ответить
                                • Дык блин. Сейчас говноскрипты для аналитики, которые на каждом втором сайте висят, точно так же делают пост на какую-то хуйню при клике по ссылкам. И в них всяко больше простора для уязвимостей чем в этой декларативной хуйне.
                                  Ответить
                                  • Эти скрипты ещё вызывают тормоза, потому что отслеживают события передвижения мыши, чтобы построить «тепловую карту кликов».
                                    Ответить
                            • >Ну не уебаны ли там в w3c сидят?

                              Именно поэтому я за «Internet Explorer».
                              Ответить
                          • ddg вроде прямые ссылки отображает
                            Ответить
                          • ddg такой хуйнёй пока не занимаются.

                            А хуяндекс и 1e100 — пидарасы.
                            Ответить
                      • Есть ещё для лисички, типа когда ссылка хочет пройти через сервис редиректа (vk.com/away?url=http://govnokod.ru и проч.) слать в пизду и сразу идти по ссылке
                        Ответить
              • Да нет же.

                Я продал тебе рекламное место. Ты разместил у меня ссылку
                http://pethu.ru?source=MAKAKA
                Я потом разместил ее у себя в твиттере и мои друзья ее репостят.

                С моего твиттера (и твиттера моих друзей) к тебе идет траффик, но ты всё равно знаешь, что он идет через меня.
                Твои SMMщики потом читают гугл анал-итикс, и знают, откуда траффик идет, и ты понимаешь, что мне стоит платить за размещение ссылок
                Ответить
              • > можно понять с какого сайта по ней перешли по Referer
                Именно поэтому я за «uMatrix».
                Ответить
            • ?utm_source=original_poster_is_pethu
              Ответить
    • - Я так раньше никогда не делала. Мне понравилось. А тебее? - сказала она после того, как я влил в неё свой заряд и, уставший, уселся прямо на ковролин на полу кабинета.
      Ответить

    Добавить комментарий