1. Куча / Говнокод #25999

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    https://habr.com/ru/post/472970/
    
    Критика протокола и оргподходов Telegram. Часть 1, техническая: опыт написания клиента с нуля
    
    в Full самая наркомания, с точки зрения сетевика: длина,
    sequence number, причем НЕ ТОТ, что в основном MTProto,
    тело, CRC32. Да, всё это поверх TCP. Который предоставляет
    нам надежный транспорт в виде последовательного потока байт,
    никакие последовательности не нужны, тем более контрольные
    суммы. Окей, мне сейчас возразят, что в TCP 16-битная
    контрольная сумма, так что искажение данных случается.
    Отлично, только у нас вообще-то криптографический протокол
    с хэшами длиннее 16 байт, все эти ошибки — и даже
    более — будут отловлены на несовпадении SHA уровнем выше.
    Никакого смысла в CRC32 поверх этого — НЕТ.

    Ебать дебилы

    Запостил: j123123, 27 Октября 2019

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

    • > тут Серьезная Математика в основе, придумывали явно Крутые Люди (два математика-призера ACM), а не кто попало. Цель — пустить пыль в глаза — достигнута.

      > Больше всего жопа раскаляется от того, что они навертели кучу абстракций, а потом забили на них болт, и обложили кодогегератор костылями
      > В результате, сначала от доки лётчик.jpg
      > Потом от кода джекичан.webp

      Вообще, охуительная статья! Отлично видно к чему приводит оверинжениринг и задействование всяких говноолимпиадников
      Ответить
    • Что не так?
      Ответить
      • Не так в чем? В том что контрольную сумму дополнительно считают внутри TCP внутри криптографического протокола?
        Ответить
        • Так я не понял, кто дебил? Телеграмовцы или автор комента? А вообще бывает и хуже, например, баг в пине wps.
          Ответить
        • Ну и что? На компакт-дисках, например, три слоя кода Рида-Соломона (это на дисках с файловой системой; на аудио-CD на один слой меньше).
          Ответить
          • Ты о чём? В «CIRC» два независимых кода Рида-Соломона. Но, внезапно, там они нужны, и используются для обеспечения возможности коррекции как ошибок в единичных битах (пылинки, ошибки считывателя), так и похеренные куски дорожки в несколько тысяч бит (царапины). А в телеге эта дополнительная контрольная сумма нахуй не нужна, и добавлена она исключительно потому, что какой-то малолетний дебил-олимпиадник решил, что «CRC32» звучит круто и неплохо бы его куда-нибудь всунуть.
            Ответить
    • Ебать, пиздец. Очередной пример «продукта» (говна), написанного «олимпиадниками» (программистами, специализирующимися на написании write-only говна).
      Ответить
      • Ёб твою мать…
        boolean fixCaption = !TextUtils.isEmpty(message) &&
            (media instanceof TLRPC.TL_messageMediaPhoto_old ||
             media instanceof TLRPC.TL_messageMediaPhoto_layer68 ||
             media instanceof TLRPC.TL_messageMediaPhoto_layer74 ||
             media instanceof TLRPC.TL_messageMediaDocument_old ||
             media instanceof TLRPC.TL_messageMediaDocument_layer68 ||
             media instanceof TLRPC.TL_messageMediaDocument_layer74)
            && message.startsWith("-1");
        Ответить
        • https://github.com/vk-com/kphp-kdb/blob/ce6dead5b3345f4b38487cc9e45d55ced3dd7139/bayes/bayes-data.c#L654
          Ответить
          • Какая сишка сложная! Именно поэтому я за «PHP».
            Ответить
            • if (j == i + 7 + add) {
                        continue;
                      }

              мокака любит такой код
              Ответить
          • «is_domain_symbol» реализован не макросом, а анскилушной функцией. Говно неоптимальное!
            Ответить
            • наверняка там боттлнек
              Ответить
              • Тогда это говно:
                if (pv[i] == 'h' && pv[i + 1] == 't' && pv[i + 2] == 't' && pv[i + 3] == 'p') {

                Тут же четыре сравнения вместо одного!

                Смотрите, как надо:
                if (*(uint32_t *)&(pv[i]) == 0x70747468) {


                https://ideone.com/UzyM7j
                Ответить
                • хахаха, охуенно
                  Ответить
                  • Code golf: вместо &(pv[i]) можно написа́ть (pv+i).
                    Ответить
                    • 0x70747468 можно собрать сдвигом на 8 и орированием с нужным символом
                      будет читаемнее
                      Ответить
                      • Что-то типа схемы Горнера для многочленов?
                        'h' | (('t' | (('t' | ('p' << 8)) << 8)) << 8)
                        Ответить
                • мне тут подсказывают из зала, что можно объебаться с алайнментом (не горя уж про байтордер)
                  Ответить
                  • Да, на x86 будет пенальти каждый раз, когда i не кратно четырём, а на ARM может вообще не работать. Но Царь считает, что архитектуры, на которых не работает, не нужны.
                    Ответить
                    • На самом деле не каждый раз, а чуть реже.

                      Если представить, что кеша нет, то пенальти будет при выходе за каждые 64 бита (бо ширина такая у контрорллера памяти)

                      А если с кешем, то наверное при выходе за границу кеш линии, это уже как карта ляжет.

                      Просто Интел гарантирует тебе наиболее мявные условия при выравнивании структуры по ее размеру, чтобы в эти считалки не играть


                      Кстати, арм починили

                      теперь можно говнокодить
                      http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html
                      Ответить
                      • Кстати, про байтордер: а на каких выживших платформах в 2019 году используется big endian или смешанный порядок?

                        «ARM» позволяет переключать байтордер, но в «Андроиде» выбрали little endian.

                        «Windows NT» тоже на всех платформах использовала little endian, даже на «MIPS», «PPC», «Alpha», «Itanium», «ARM», где можно было выбирать порядок байтов.

                        Сходу гуглится big endian в «Линуксе» и в «Солярисе» на «PPC». Где ещё? «Линукс», «Солярис», «AIX» на «SPARC», «IBM z», «Power ISA», «AVR32»?
                        Ответить
                        • Пожалуй что спарки только. PPC вроде уже мало кому интересен.

                          А какой байтордер у человека?
                          Арабские цифры используют big endian
                          В русском языке тоже сначала идут мост сайнификант.

                          Есть где-то наборот?

                          Кто-то запишет наш год как "девятнадцать две тысячи"?
                          Ответить
                          • Ты в курсе, что арабы пишут числа в том же порядке, что и мы, хотя слова мы пишем слева направо, а арабы — справа налево? Выходит, что для арабов числа записаны в порядке little endian.

                            У немцев little endian для двухзначных чисел: двадцать пять они произносят как fünf und zwanzig (пять и двадцать). Для более длинных чисел у них PDP-endian middle endian: две тысячи сто двадцать пять будет звучать примерно как две тысячи сто пять и двадцать.
                            Ответить
                            • тогда арабам легче

                              у меня-то постоянно подгорает от того, что на бумажечке у меня
                              "жопа", а если представить ее в виде инта в x86, то она "пажо"
                              Ответить
                              • Не «пажо», а «апож», как в «Хороших шутках».

                                Кстати, представь себе, какой багор на «Эльбрусах»: на том, что на архитектуре «SPARC», порядок big endian, а на том, что VLIW, порядок little endian.
                                Ответить
                                • я мыслил в терминах ворда. один ворд -- один слог.

                                  Эльбрусы же просто одинаково называются, по сути они разные совершенно

                                  https://ru.wikipedia.org/wiki/Багрино
                                  Ответить
                                  • показать все, что скрытоОни эльбурс потому что пидорашки вынимают из архивов старое провальное говно и выдают за собственную разработку. Важно понимать, что оставшиеся пидорашки настолько деградировали, что тупость и квадратно-гнездовой мосг не позволяет даже придумать тему для попила. Некоторым из них везет и их подогревают чертежами SPARC и VLVL80, некоторым - нет и их дилдоподобная ракета с говнореактором падает в холодную воду и тонет. Казалось бы продолжать не требуется, но национальная тупость русни не знает пределов и они этот реактор из холодной воды вытаскивают. КАБУМ!
                                    Ответить
                      • >> Кстати, арм починили

                        Круто! Уже на ARMv6 можно говнокодить (на нём собирали смартфоны ещё со вторым «Андроидом»). А вот на ARMv5 (который до сих пор используется в простых звонилках) говнокодить нельзя. Какой багор )))
                        Ответить
                    • Кстаи, в 8088 не было никакого пинальти
                      Именно потому я за IBM PC 5150
                      Ответить
                      • Только простые люди эту машину никогда не называли «5150». Даже в книжках Питера Нортона она называется «PC1» (чтобы отличать от «XT», от «PCjr» и от клонов).
                        Ответить
    • https://github.com/ton-blockchain/ton/issues/31
      > Николай Дуров - дважды доктор математических наук, а так же дважды олимпиадник мира. И у него много друзей олимпиадников, работающих в Телеграмме. Так что это не код убогий, а просто ТЫ СЛИШКОМ ТУПОЙ, чтобы понять гениев программирования

      > Ты завидуешь Николаю и его команде. Николай дважды ДОКТОР математических наук и в его команде тоже много крутых олимпиадников. Сделай свою бинарную схему и я посмотрю на неё, представь свой криптографический протокол. Ты сможешь написать С НУЛЯ систему баз данных. которые будут держать один из самых высоконагруженых сайтов в Рунете? У тебя могут быть аргументы: 1) Зачем делать бинарную схему. если есть Google Protobuf или Apache Thrift? 2) Зачем делать протокол если есть Signal? 3)Зачем делать транслятор из PHP в С++. если есть HHVM? 4) Зачем писать движки баз данных если есть много разных NoSQL - решений? А я тебе отвечу так: ты знаешь Игоря Сысоева? Он создал лучший веб сервер NGINX, хотя в его время уже был Apache Web Server, но он сделал велосипед и смог его улучшить и теперь самые крупные международные IT компании используют его решение. Недавно он продал свою компанию и заработал кучу долларов. А если тебе не хватает математических знаний, то это ещё один плюс признания таланта Брата Павла Дурова - Николая Дурова и его команды: Лопатина, Смирнова, Левина, Вальтмана.

      Бгггг XDDD
      Ответить
      • https://github.com/ton-blockchain/ton/blob/master/blockchain-explorer/blockchain-explorer.cpp#L301-L357
        .
            if (command == "status") {
              HttpQueryRunner g{[&](td::Promise<MHD_Response*> promise) {
                td::actor::create_actor<HttpQueryStatus>("blockinfo", opts, prefix, std::move(promise)).release();
              }};
              response = g.wait();
            } else if (command == "block") {
              HttpQueryRunner g{[&](td::Promise<MHD_Response*> promise) {
                td::actor::create_actor<HttpQueryBlockInfo>("blockinfo", opts, prefix, std::move(promise)).release();
              }};
              response = g.wait();
            } else if (command == "search") {
              if (opts.count("roothash") + opts.count("filehash") > 0) {
                HttpQueryRunner g{[&](td::Promise<MHD_Response*> promise) {
                  td::actor::create_actor<HttpQueryBlockInfo>("blockinfo", opts, prefix, std::move(promise)).release();
                }};
                response = g.wait();
              } else {
                HttpQueryRunner g{[&](td::Promise<MHD_Response*> promise) {
                  td::actor::create_actor<HttpQueryBlockSearch>("blocksearch", opts, prefix, std::move(promise)).release();
                }};
                response = g.wait();
              }
            } else if (command == "last") {
              HttpQueryRunner g{[&](td::Promise<MHD_Response*> promise) {
                td::actor::create_actor<HttpQueryViewLastBlock>("", opts, prefix, std::move(promise)).release();
              }};
              response = g.wait();
            } else if (command == "download") {
              HttpQueryRunner g{[&](td::Promise<MHD_Response*> promise) {
                td::actor::create_actor<HttpQueryBlockData>("downloadblock", opts, prefix, std::move(promise)).release();
              }};
              response = g.wait();
            } else if (command == "viewblock") {
              HttpQueryRunner g{[&](td::Promise<MHD_Response*> promise) {
                td::actor::create_actor<HttpQueryBlockView>("viewblock", opts, prefix, std::move(promise)).release();
              }};
              response = g.wait();

        промис-хуемис блядь
        Ответить
        • Так, блядь, минуточку.

          class HttpQueryRunner {
           public:
            HttpQueryRunner(std::function<void(td::Promise<MHD_Response*>)> func) {
              auto P = td::PromiseCreator::lambda([Self = this](td::Result<MHD_Response*> R) {
                if (R.is_ok()) {
                  Self->finish(R.move_as_ok());
                } else {
                  Self->finish(nullptr);
                }
              });
              mutex_.lock();  // <===========================
              scheduler_ptr->run_in_context_external([&]() { func(std::move(P)); });
            }
            void finish(MHD_Response* response) {
              response_ = response;
              mutex_.unlock();
            }
            MHD_Response* wait() {
              mutex_.lock();  // <===========================
              mutex_.unlock();
              return response_;
            }
          
           private:
            std::function<void(td::Promise<MHD_Response*>)> func_;
            MHD_Response* response_;
            std::mutex mutex_;
          };
          // ...
          response = g.wait();


          То есть они два раза из одного треда вызывают std::mutex::lock()? Охуенные там ДОКТОРА НАУК код пишут.
          Ответить
          • он не рееентерабельный в плюсах?
            Ответить
            • Ну да, это то ли UB, то ли дедлок.
              The expression m.lock() shall be well-formed and have
              the following semantics:
              Requires: If m is of type mutex, timed_mutex, shared_mutex, or
              shared_timed_mutex, the calling thread does not own the mutex.

              (§ 33.4.3.2/6,7)

              [ Note: A program may deadlock if the thread that owns
              a mutex object calls lock() on that object. If the implementation
              can detect the deadlock, a resource_deadlock_would_occur error
              condition may be observed. —end note ]

              (§ 33.4.3.2.1/4)

              Но, очевидно, дуровским олимпиадникам на такие мелочи поебать, они же ДОКТОРА НАУК.
              Ответить
              • В жабе просто например syncrhonized реентерабльный
                https://ideone.com/LYBEDM
                потому мну и спросил

                ггг
                Ответить
                • В крестах есть «std::recursive_mutex»: можно N раз из одного потока входить, а чтобы разлочить — надо ровно N раз выйти. Но чаще всего необходимость его применения — признак говнорахитектуры.
                  Ответить
        • Человек-макрос писал
          Ответить
      • --зачем CRC поверз TCP?
        --да ктго ты такой, чтоб спрашивать?
        Ответить
        • показать все, что скрытоКогда говорят, что русня не может в сети, это подразумевает, что русня не может в слои OSI.
          Зато может сплотиться вокруг нацианального пидера, затянуть пояса и экономить на чексуммах.
          Ответить
        • --Винни, зачем ты ешь дерьмо?
          --А кто ты такой? А что ты понимаешь? Это делали Гениальные Олимпиадники, Доктора Наук. Ты завидуешь Николаю и его команде. Николай дважды ДОКТОР математических наук и в его команде тоже много крутых олимпиадников. Николай Дуров - дважды доктор математических наук, а так же дважды олимпиадник мира. И у него много друзей олимпиадников, работающих в Телеграмме. Так что это не код убогий, а просто ТЫ СЛИШКОМ ТУПОЙ, чтобы понять гениев программирования
          Ответить
          • Кстати, для VK они выбрали "PHP". Это значит, что "PHP" -- выбор профессионалов!
            Ответить
      • >ДОКТОР
        Это как Стертор?
        Ответить
    • На одном проекте тоже сталкивался с типа математиком. Чувак посидел несколько месяцев, выкатил едва рабочий код на С++, который пришлось ещё править, чтобы заработало на всех платформах. При любых попытках узнать, как что-то работает или почему что-то не работает, посылал всех в пдф собственного авторства, состоявший на 90% из километровых write-only формул.

      Зато энтропия повышена
      Ответить
      • Ну а что, математик еще должен програмирование в деталях изучать? Его дело - формулы вывести и алгоритм написать, а адаптировать для разных систем, ui прикручивать и прочее - это уже действительно дело прикладников.

        А по теме - ну да, поверх TCP. То есть сейчас все это избыточно, а завтра? Может, там UDP добавят или вообще упакованы в HTTP-запросы, запрещенные протоколы обходить это вам не порты на роутере пробрасывать.
        Ответить
        • показать все, что скрытоНе фатк, что избыточно даже сейчас. Как я понимаю без изучения проктокола, эта CRC, про которую русята визжат, на сессионном уровне, т.е. контролирует целостность сегментов в том числе на рилеях.
          Ответить
        • > Отлично, только у нас вообще-то криптографический протокол с хэшами длиннее 16 байт, все эти ошибки — и даже более — будут отловлены на несовпадении SHA уровнем выше. Никакого смысла в CRC32 поверх этого — НЕТ.
          Ладно если б они туда вхуярили какого-нибудь Рида-Соломона, чтобы ошибки транспорта исправлять
          Ответить
          • Оффтоп: кто знает VPN с избыточным кодированием, который может компенсировать потери пакетов?
            Ответить
            • чем плох vpn по tcp?
              Ответить
              • Он может компенсировать потери пакетов?
                Ответить
                • Кусочек может, там же есть чексума
                  Целый пакет наверное нужно пересылать заново, но чем это хуже избыточности?
                  Ответить
                  • Тем что это не может компенсировать потерю пакета, очевидно. Какой еще кусочек? Битый пакет тебе не дойдет из-за ошибки контрольной суммы на L2.
                    Ответить
                    • Чем компенсация пакета посредством посылки избыточной информации лучше, чем пересылка ее по требованию?

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

                      TCP имеет свою чексумму, правда исправить конечно она ничего не может, но может понять, что сегмент испорчен, и переслать его.

                      L2 тут irrelevant, в одном TCP может быть много разных L2, в том числе и без чексуммы (в теории)
                      Ответить
                      • При потере пакета TCP резко сбрасывает скорость. Короче, ответь на вопрос.
                        Ответить
                        • TCP пересылает весь сегмент, потому и скорость проседает.
                          Чтобы эту проблему решить, можно уменьшить окно. Впринципе, современные ОС сами умеют это окно уменьшать, но пользователям MS-DOS и Windows XP приходится страдать.
                          https://blogs.technet.microsoft.com/netgeeks/2018/05/21/a-word-about-autotuninglevel-tcp-receive-auto-tuning-level-explained/


                          К счастью, таких пользователей давно уже нет.


                          Отвечаю:
                          Мне не известны такие VPN. Интуитивно кажется, что пересылка потерянного сегмента более выгодна, чем избыточность.

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

                          Но возможно я просто не шарю
                          Ответить
                          • Мне вообще-то для планшета надо. А ты, пидор, похоже всё знаешь, да?

                            >Мне не известны такие VPN.
                            Вот так правильнее. Ты тупой хуй и нихуя не знаешь.

                            >Интуитивно кажется, что пересылка потерянного сегмента более выгодна, чем избыточность.
                            Я тебе пидору уже сказал, что TCP резко сбрасывает скорость при потере пакета.
                            Ответить
                            • Ты очень аргументировано и развернуто объяснил мне преимущество избыточности перед пересылкой сегмента и доказал, что эта проблема не решается с помощью изменения размеров окна.

                              Всегда приятно поговорить с экспертом

                              >Мне вообще-то для планшета надо.
                              Под управлением Джелли Бин?
                              Ответить
                              • а еще бывает
                                https://whitequark.org/blog/2011/09/12/tweaking-linux-tcp-stack-for-lossy-wireless-networks/
                                cp_frto (integer; default: 0; since Linux 2.4.21/2.6)
                                              Enable  F-RTO,  an enhanced recovery algorithm for TCP retrans‐
                                              mission timeouts (RTOs).   It  is  particularly  beneficial  in
                                              wireless  environments  where  packet  loss is typically due to
                                              random radio interference rather than intermediate router  con‐
                                              gestion.  See RFC 4138 for more details.
                                
                                              This file can have one of the following values:
                                
                                              0  Disabled.
                                
                                              1  The basic version F-RTO algorithm is enabled.
                                
                                              2  Enable  SACK-enhanced  F-RTO  if  flow uses SACK.  The basic
                                                 version can be used also when SACK is in use though in  that
                                                 case scenario(s) exists where F-RTO interacts badly with the
                                                 packet counting of the SACK-enabled TCP flow.
                                Ответить
            • Это чтобы новый роутер не покупать?
              Ответить
              • Как починить LED-лампочку самостоятельно: пошаговая инструкция

                Опять перегорела светодиодная лампочка? Не торопитесь ее выкидывать. CHIP расскажет, как самостоятельно в домашних условиях починить ее с помощью обычных подручных средств.
                Если у вас перегорела LED-лампочка, за которую вы отдали приличные 90-150 рублей, есть шанс, что вы сможете вернуть ее к жизни, причем сделать это совсем не сложно. CHIP расскажет, что для этого понадобится и как выполнить ремонт самостоятельно благодаря нашей пошаговой инструкции.
                Светодиодные или LED-лампочки в последнее время получили очень широкое распространение благодаря существенному падению на них цены. Но это не означает, что производители сумели найти более дешевую технологию изготовления ламп при той же надежности и долговечности. Как правило, в недорогих устройствах используются упрощенные схемы питания и более дешевые комплектующие. Именно поэтому срок службы таких светодиодных светильников может быть очень короток.
                Но, заплатив, к примеру, 90 рублей за LED-лампочку, все же мы рассчитываем, что она прослужит как минимум год. Тем обиднее видеть, как спустя 2-3 месяца после покупки лампа перестает подавать «признаки жизни». Виной тому, как многие уже догадались, бюджетное оснащение в компонентной части лампочки, в результате чего на светодиоды подается гораздо большее напряжение, чем необходимо и, как следствие, перегорание одного из 8 светодиодов. Т.к. эти элементы установлены по последовательной схеме, то выход из строя хотя бы одного приводит к выключению и всех остальных.
                В отличие от ламп с нитью накаливания и газовой экономной лампы, LED-лампочку можно починить, причем самостоятельно в домашних условиях. CHIP расскажет, как это сделать, не обращаясь к специалистам.
                Ответить
                • Если у вас есть вопросы по качеству и долговечности светодиодных ламп, вы можете задать их представителю компании-производителя в комментариях нашего специального анонса:
                  Все, что вы хотели знать о светодиодных лампах: эксперт отвечает на вопросы
                  Что потребуется для починки светодиодной лампочки
                  Ничего сверхъестественного из инструментов приобретать не придется. В каждой семье обычно есть паяльник, желательно, чтобы он был с тонким жалом. Вместе с ним обычно имеется припой и канифоль (либо флюс, содержащий припой), либо кислота для пайки. Также будут нужны и пинцеты — без них никуда.
                  Кроме этого, для комфортного проведения работ, желательно иметь держатель (третья рука), либо помощника, который придержит плату со светодиодами. Для быстрого разогрева платы со светодиодами мы рекомендуем использовать компактную газовую горелку. Она позволит быстро отпаять перегоревший светодиод и мгновенно припаять на его место старый. Купить газовую горелку можно в любом магазине табака и стоимость составляет около 350 рублей. Но, если вы не намерены сильно тратиться, подойдет и турбозажигалка.
                  Как починить LED-лампочку самостоятельно: пошаговая инструкцияНо главным компонентом нашего ремонтного набора является еще одна вышедшая из строя светодиодная лампа, желательно такого же типа. Именно она послужит донором запчастей для ремонтируемой лампочки. Т.к. обычно перегорает лишь 1 светодиод, то 7 других пригодятся вам для ремонта выходящих из строя устройств.
                  И да, после того, как вы почините лампочку, потребуется приклеить на прежнее место ее плафон, а значит нужно запастиcь и супер-клеем (или аналогичным прозрачным клеем для пластика).
                  Ответить
                  • Ремонт LED-лампочки: пошаговое руководство
                    Прежде, чем заняться разбором осветительного прибора отметим, что в большинстве случаев его основание и плафон выполнены из пластика, причем довольно вязкого, что обеспечит вам определенную безопасность при разборке — ничто не разобьется и не треснет. Но осторожность в работе нужно проявлять.
                    Итак, у вас имеется две вышедшие из строя LED-лампочки одного типа. Обе придется осторожно разобрать.
                    Снятие плафона с лампочки

                    Начать следует с отделения плафона от корпуса. Для этого возьмите короткий нож желательно не очень острый, чтобы не сделать лишних надрезов на пластике. Прилагая небольшие усилия, вставьте кончик в щель между плафоном и корпусом с наклоном к плафону. Пройдитесь так по периметру соединения несколько раз, постепенно углубляясь. Чтобы не пораниться, можете делать это в х/б перчатках с резиновыми вкраплениями.
                    Как починить LED-лампочку самостоятельно: пошаговая инструкцияКак только лезвие ножа войдет в щель достаточно глубоко, отделите плафон от основания. Теперь перед вами алюминиевая платформа со светодиодами и двумя подпаянными к ней проводами.
                    Как починить LED-лампочку самостоятельно: пошаговая инструкция На плате они обычно помечены плюсом и минусом. А один из проводов — плюсовой, имеет красную маркировку. Это необходимо запомнить, чтобы потом правильно подпаять все на прежние места.
                    Отсоединение контактов от платы со светодиодами

                    Для того, чтобы было удобней отсоединять провода от платы, ее желательно закрепить в держателе или попросить напарника. У вас в руках будет с одной стороны пинцет, в другой — паяльник.
                    Ответить
                    • Как починить LED-лампочку самостоятельно: пошаговая инструкцияЗаранее подцепите отпаиваемый провод пинцетом и коснитесь контакта жалом паяльника, предварительно смочив его канифолью. Отделив один провод, проделайте такую же операцию со вторым. Аккуратно выпрямите их и снимите плату со светодиодами с алюминиевого основания.
                      Извлечение сгоревшего светодиода

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

                      Теперь повторите все предыдущие шаги, но с другой лампочкой-донором, чтобы снять нее рабочий светодиод.
                      Установка нового светодиода на плату

                      Еще раз закрепите пластину со светодиодами ремонтируемой лампочки в держателе (или привлеките напарника), так, чтобы было достаточно места для подхода жала паяльника или газовой горелки. Желательно, чтобы плата располагалась горизонтально.
                      Ответить
                      • Разместите на контактах платы, где будет установлен новый светодиод капельки флюса с припоем или просто аккуратно намажьте, например, зубочисткой контакты кислотой для пайки. После этого, разместите новый светодиод контактами, расположенными снизу, к соответствующим подготовленным местам на плате.
                        Важно! При размещении светодиода на плате необходимо учитывать его полярность. Большая площадка контакта — это минус.
                        Поднесите к тыльной стороне платы пламя горелки на 3-4 с, чуть прижмите светодиод сверху, чтобы он, при расплавлении припоя, надежно припаялся к плате.
                        Как починить LED-лампочку самостоятельно: пошаговая инструкцияПротрите ваткой со спиртом места контактов у нового светодиода, чтобы и избежать дальнейшего окисления и коррозии контактов платы.
                        Возвращение светодиодной платы на основание и ее подключение

                        Чтобы вернуть теплопроводный слой на тыльной стороне платы в исходное состояние, аккуратно размажьте пасту с соседних зон пластины. Установите плату на алюминиевое основание, продев в отверстие провода и слегка придавите пластину для плотного контакта.
                        Как починить LED-лампочку самостоятельно: пошаговая инструкция Как починить LED-лампочку самостоятельно: пошаговая инструкция
                        Припаяйте провода к контактам светодиодной платы соблюдая полярность, для удобства, закрепив предварительно в держателе или, если его нет, попросите подержать ее напарника, например, плоскогубцами.
                        Как починить LED-лампочку самостоятельно: пошаговая инструкцияТеперь самое время проверить работу обновленной лампы. Вкрутите ее в плафон, например, настольного светильника. Если все заработало, то можно приклеивать плафон.
                        Ответить
                        • Если лампочка не зажглась, значит есть проблемы с другим светодиодом, или с дросселем, расположенным в основании. Прозвонить светодиоды можно не отпаивая от базы, подав на соседнюю пару около 8 вольт (например, через маломощный блок питания с таким же постоянным напряжением или с помощью батарейки Крона с напряжением 9 вольт). Потребляемая мощность каждого светодиода составляет, как правило, 1 Вт.
                          Если все светодиоды в порядке, то возможно вышел из строя драйвер — своего рода блок питания для светодиодов, установленный под алюминиевой крышкой ближе к цоколю. Его можно также попробовать взять от лампочки донора.
                          Приклейка плафона

                          После испытаний и подтверждения работоспособности отремонтированной лампочки можно смело приклеивать на место ее плафон. Для этого аккуратно намажьте внутреннюю поверхность торца основания и плотно прижмите сферический плафон, подержите так пару минут и затем отложите собранную LED-лампочку в укромное место, чтобы дать клею затвердеть. Некоторые рекомендуют использовать силиконовый клей, чтобы было легче вскрывать лампочку для повторного ремонта.
                          Как починить LED-лампочку самостоятельно: пошаговая инструкцияИтак, вы смогли починить светодиодную лампочку своими руками, и у вас остались в запасе еще 6 светодиодов, с помощью которых есть возможность починить и другие устройства в будущем.
                          Ответить
                          • В игнор захотел?
                            Ответить
                          • ДМИТРИЙ СЕРЕНКОВ
                            месяц назад
                            В автомобиле «Аурус» из отечественного только кожа Рязанского кожевенного завода, в самолёте SSJ--100 отечественных компонентов чуточку больше, отечественный автопром без иностранцев буксует. Чтобы мы не делали у нас получается танк или ракета. Очередные клоуны нас учат здесь переделывать работу очередных отечественных рукожопов.Одни делают брак, другие учат как это брак переделывать, попутно повышая спрос на китайские сведодиоды. ЛОХОТРОН !!!!!
                            Ответить
        • > Может, там UDP добавят
          Может и добавят, а данные все равно хешем подаиывают же, он же обосреца, нет разве?

          если на то пошло, то надо тогда пилить два уровня своих протоколов

          * а-ля транспорт поверх udp
          * а-ля прикладной

          хуль все в каучу то
          Ответить
        • Формулы, которые он вывел, тоже особо не работали. Так что у чувака флеш-рояль.

          Кстати, проект, на котором всё это происходило, намедни окончательно накрылся, так что не чокаясь.
          Ответить
          • так может быть он был в первую очередь мудак, а уже потом математик?
            Ответить
            • Не буду излишне наговаривать, но в целом такой вариант я тоже исключать бы не стал
              Ответить
          • >намедни окончательно накрылся
            Как говорится, лишь бы не из-за меняне только из-за меня.
            Ответить
            • Накрылся он не из-за него и даже, как ни странно, не из-за меня, а из-за того, что пейсатые стартаперы ожидаемо откусили больше мацы, чем смогли проглотить.
              Ответить
          • Что накрылось?
            Ответить
    • Я так понял, русьня, копротивлявшаяся за математику, сама у себя и отсосала?
      Ответить
      • Дуров написал говнокод => математика не нужна

        Сема
        Ответить
        • Математики пишут говнокод по определению, т.к. не программисты.
          Ответить
          • Я знаю многих программистов, которые пишут говнокод
            Ответить
            • Откуда?
              Ответить
              • По работе сталкивались, например.
                Я сам лет до двадцати пяти тоже любил писнуть говнеца
                Ответить
            • А есть математики, которые не программисты и не пишут говнокода?
              Ответить
              • https://sun3-12.userapi.com/c854532/v854532675/13c1f2/NcQcPOk2pQ4.jpg
                Ответить
                • на 119 строчке очень круто!
                  Ответить
                • Красота.
                  Единственное - глобальная область видимости засирается этими константами, но, возможно, просто язык по-другому не умеет.
                  Ответить
                  • А может быть, константы имеют самостоятельное значение и используются за пределами функции, как, например, число «пи»?
                    Ответить
                    • Тогда непонятно, зачем их объявлять перед функцией, в которой используются, да еще и после комментария, относящегося к функции.
                      Хотя, конечно, не зная, сказать сложно: вот там k от g зависит и все такое. Так что, наверное, действительно не зря.
                      Ответить
                • Оптимизировал:
                  float rayleigh_phase_func(float mu)
                  {
                  	return
                  		(1. + mu*mu)
                  	/ //-------------------
                  		(5.33333333333333333333333333333 * PI);
                  }


                  И вообще, тут говно в том что в функции считается говно с дабл числами, а сама функция принимает и возвращает float. На всяких контроллерах бывает так, что аппаратно реализованы операции с плавучкой для float но не для double так что надо это говно еще пофиксить

                  float rayleigh_phase_func(float mu)
                  {
                  	return
                  		(1.f + mu*mu)
                  	/ //-------------------
                  		(float)(5.33333333333333333333333333333 * PI);
                  }

                  ибо нехуй

                  https://godbolt.org/z/wZHufW
                  Ответить
                  • Компилятор c -funsafe-math-optimizations может еще всякой хуитени понаделать сделав умножение вместо деления https://godbolt.org/z/kpbap5 но в любом случае переделывание хуйни из дабла в флоат имеет смысл, пушо нет этих инструкций cvtss2sd cvtsd2ss которые "Convert one single-precision floating-point value in xmm2/m32 to one double-precision floating-point value in xmm1" и "Convert one double-precision floating-point value in xmm2/m64 to one single-precision floating-point value in xmm1."
                    Ответить
                    • Если добавить ключик -mno-sse2, то вместо cvtss2sd/cvtsd2ss будут обычные инструкции fld.
                      Ответить
                    • А, понял, речь не об избавлении о cvtss2sd/cvtsd2ss, а о том, что генерируется длинный код.

                      А как тебе такой вариант?
                      #define FLOAT_PI (float)(M_PI)
                      float rayleigh_phase_func(float mu)
                      {
                      	return 
                      		(1.f + mu*mu) * 3.f
                      	/ //-------------------
                      		(16 * FLOAT_PI);
                      }
                      Ответить
                      • Ну вообще норм, компилятор с опцией -funsafe-math-optimizations должен соптимизировать.
                        По поводу "(16 * FLOAT_PI)" - FLOAT_PI умножать на 16 норм т.к. 16 это степень двойки, и умножение на степень двойки для флоатов означает лишь изменение экспоненты, но вообще для более общего случая лучше умножать double константу на некоторую хрень, а уже потом кастовать в float, чтоб точность не проебывалась из-за этой хуйни
                        Ответить
                        • Лучше вообще всё считать в дабле или даже в лонг дабле, а только в самом конце обрезать до флоата.
                          Ответить
                          • Если в компилтайме, то да. А если в рантайме, то почему б тогда не принимать-возвращать дабл? Ну и считаться оно будет дольше
                            Ответить
              • Есть.
                Например учительница математики начальных классов
                * математик
                * не программист
                * не пишет говнокода
                Ответить
                • > которые не программисты, пишут код и не пишут говнокода?
                  Ответить
    • показать все, что скрытоЕсли этот ваш инстаграм такое говно, то почему из-за него сдохло 20 пидорашек в ленинграде, а русня с этим ничего поделать не может несмотря на все духовные скрепы?
      Ответить

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