1. JavaScript / Говнокод #26510

    0

    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
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    <script>
    			if (!window.BX && top.BX)
    				window.BX = top.BX;
    
    			<?CMedialib::AppendLangMessages();?>
    			window.<?= $arConfig['event']?> = function(bLoadJS)
    			{
    				if (window.oBXMedialib && window.oBXMedialib.bOpened)
    					return false;
    
    				<?if(!CMedialib::CanDoOperation('medialib_view_collection', 0)):?>
    					return alert(ML_MESS.AccessDenied);
    				<?else:?>
    
    				if (!window.BXMediaLib)
    				{
    					if (bLoadJS !== false)
    					{
    						// Append CSS
    						BX.loadCSS("/bitrix/js/fileman/medialib/medialib.css");
    
    						var arJS = [];
    						if (!window.jsAjaxUtil)
    							arJS.push("/bitrix/js/main/ajax.js?v=<?= filemtime($_SERVER["DOCUMENT_ROOT"].'/bitrix/js/main/ajax.js')?>");
    						if (!window.jsUtils)
    							arJS.push("/bitrix/js/main/utils.js?v=<?= filemtime($_SERVER["DOCUMENT_ROOT"].'/bitrix/js/main/utils.js')?>");
    						if (!window.CHttpRequest)
    							arJS.push("/bitrix/js/main/admin_tools.js?v=<?= filemtime($_SERVER["DOCUMENT_ROOT"].'/bitrix/js/main/admin_tools.js')?>");
    
    						arJS.push("/bitrix/js/fileman/medialib/common.js?v=<?= filemtime($_SERVER["DOCUMENT_ROOT"].'/bitrix/js/fileman/medialib/common.js')?>");
    						arJS.push("/bitrix/js/fileman/medialib/core.js?v=<?= filemtime($_SERVER["DOCUMENT_ROOT"].'/bitrix/js/fileman/medialib/core.js')?>");
    						BX.loadScript(arJS);
    					}
    					return setTimeout(function(){<?=$arConfig['event']?>(false)}, 50);
    				}
    
    				<?CMedialib::ShowJS()?>
    				<?
    					$arSet = explode(',' , CUserOptions::GetOption("fileman", "medialib_user_set", '600,450,0'));
    					$width = $arSet[0] ? intVal($arSet[0]) : 600;
    					$height = $arSet[1] ? intVal($arSet[1]) : 450;
    					$coll_id = $arSet[2] ? intVal($arSet[2]) : 0;
    				?>
    				window._mlUserSettings = window._mlUserSettings || {width: <?=$width?>, height: <?=$height?>, coll_id: <?=$coll_id?>}
    
    				var oConfig =
    				{
    					sessid: "<?=bitrix_sessid()?>",
    					thumbWidth : <?= COption::GetOptionInt('fileman', "ml_thumb_width", 140)?>,
    					thumbHeight : <?= COption::GetOptionInt('fileman', "ml_thumb_height", 105) ?>,
    					userSettings : window._mlUserSettings,
    					resType: "<?= $resultDest?>",
    					Types : <?= CUtil::PhpToJSObject(CMedialib::GetTypes($arConfig['types']))?>,
    					arResultDest : <?= CUtil::PhpToJSObject($arConfig['arResultDest'])?>,
    					rootAccess: {
    						new_col: '<?= CMedialib::CanDoOperation('medialib_new_collection', 0)?>',
    						edit: '<?= CMedialib::CanDoOperation('medialib_edit_collection', 0)?>',
    						del: '<?= CMedialib::CanDoOperation('medialib_del_collection', 0)?>',
    						new_item: '<?= CMedialib::CanDoOperation('medialib_new_item', 0)?>',
    						edit_item: '<?= CMedialib::CanDoOperation('medialib_edit_item', 0)?>',
    						del_item: '<?= CMedialib::CanDoOperation('medialib_del_item', 0)?>',
    						access: '<?= CMedialib::CanDoOperation('medialib_access', 0)?>'
    					},
    					bCanUpload: <?= $USER->CanDoOperation('fileman_upload_files') ? 'true' : 'false'?>,
    					bCanViewStructure: <?= $USER->CanDoOperation('fileman_view_file_structure') ? 'true' : 'false'?>,
    					strExt : "<?= CUtil::JSEscape(CMedialib::GetMediaExtentions())?>",
    					lang : "<?= $arConfig['lang']?>",
    					description_id : '<?= CUtil::JSEscape($arConfig['description_id'])?>'
    				};
    
    				window.oBXMedialib = new BXMediaLib(oConfig);
    				oBXMedialib.Open();
    				<?endif;?>
    			};
    			</script>

    Запостил: phpBidlokoder2, 20 Марта 2020

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

    • А что, мне нравится. Взяли язык и лаконично дополнили его препроцессором. Прямо как в сишке. Но только вместо ублюдочных сишных мокросов, в которых даже цикл без пердолинга не сделаешь, тут используется годный шаблонизатор.
      Ответить
    • > bLoadJS

      звучит так, как будто кого-то вырвало
      Ответить
      • И эта софтина успешно продается от 6к до 400к+ в месяц
        Ответить
        • Продать можно всё, что угодно:
          https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%80%D1%8C%D0%BC%D0%BE_%D1%85%D1%83%D0%B4%D0%BE%D0%B6%D0%BD%D0%B8%D0%BA%D0%B0


          Зато наверное очень весело поддерживать код на JS, который шаблонизируется пыхапой. Представляю, сколько там XSSа, даблискейпа итд
          Ответить
          • Там еще и самописная реализация jquery (BX)
            Ответить
          • > буржуазным свиньям нравится только дерьмо» — сказал художник
            > в баночках на самом деле содержится обычный гипс
            Типичный левачок, которому повезло и его не потянули в левацкий суд за объёб потребителя.
            Ответить
    • Я за C++, поэтому спрашиваю: что в этой питушне значат теги типа <?CMedialib::ShowJS()?>, <?else:?>, <?if(!CMedialib::CanDoOperation('mediali b_view_collection', 0)):?>...
      Ответить
      • Это PHP.
        Ответить
        • Это получается, что PHP интегрируется в JS. А это законно?
          Ответить
          • пхп работает на сервере, и выдает аутпут из которого строиться JS.
            Представь себе что php это шаблоны или препроцессор.
            Законно ли генерить сишный код препроцессором?
            Законно, но вообще-то такой код будет пахнуть


            В лоу левеле это еще допустимо (хотя и не желательно), в вебе это вообще плохо
            Ответить
            • Типо PHP срет в stdout, который потом отправляет сервер клиенту. Отосланный stdout это сгенериванная web-страница с html, css, js. И тип клиент работает с этим js.
              Ответить
          • > PHP интегрируется в JS
            <button onclick='<?php handle_click(); ?>'>Сделать заебись</button>
            Ответить
            • Причем аутпут надо заэкранировать И от ХТМЛ И от JS.
              Какой багор ))
              Ответить
              • function real_handle_click() {
                   // ...
                }
                
                function handle_click() {
                  return htmlspecialchars(addslashes("$.get('/eval/real_handle_click()'"));
                }
                Ответить
                • $.get(\'/eval/real_handle_click()\'

                  удобно дебажить потом.

                  зы: а теперь представь такой JS как будет
                  [code]
                  $.get(".foo > .bar").count() > 0 && foo();
                  [/cpde]
                  Ответить
            • Полная версия:
              <?php
              // код фреймворка
              function call($func) {
                  return htmlspecialchars(addslashes("$.get('/index.php?eval=$func()')"));
              }
              
              if ($_GET["eval"])
                  eval($_GET["eval"]);
              
              // код контроллера
              function handle_click() {
                  // делаем заебись
              }
              ?>
              
              <!-- код вьюхи -->
              <button onclick='<?php call(handle_click); ?>'>Сделать заебись</button>
              Ответить
    • > arrSet
      > intVal
      > width

      Почему не intWidth?
      Ответить
      • К этому моменту венгерка уже вышла из моды.

        Кстати, венгерка не нужна. Если ты не можешь из названия переменной угадать её тип -- значит всё плохо. Другое дело -- венгерка семантическая, какой её видел Спольски:

        // ue -- Unescaped
        eName = escape(ueName)

        но то такое
        Ответить
        • Сейчас венгерка не в моде, и я сам перестал ее юзать, но я постоянно не могу из названия переменной угадать её тип.
          Вот возьмем C#. Width у нас чем будет? Интом или доублём?
          Ответить
          • В c# довольно жесткий кодстайл, и венгерки там нету:)


            Тип Width зависит от контекста. в 99% случаев ты читаешь код в IDE или веб-туле для ревью, которая понимает типы. Ты наводишь мыш, и читаешь тип.

            Замусоривать код "bIsAuthorizedToContact" и "strLastName" смысла нету, если конечно у вас нe 1994-й код на дворе, и IDE не умеет в типы:)
            Ответить
            • lpctstrName
              Ответить
              • Да, и это не хорошо. Но это -- тяжелое наследие. Люди 30 лет так пишут, сразу и не переучишь. Особенно лулзит l. l значит long, и это дополнение не имеет смысла с тех пор, как винды стали 32х битными
                Ответить
                • lParam... long, проверяй.
                  Ответить
                  • ох ебать зоопарк
                    https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types?redirectedfrom=MSDN

                    ну-ка, куда указывает
                    PLONGLONG
                    а куда
                    PLONG64
                    ?
                    Ответить
                    • PLONGLONG это ближний указатель (P) на LONGLONG, PLONG64 это ближний указатель (P) на LONG64. Но сейчас ближние указатели не отличимы от дальних, и сейчас мы их не различаем, так что ближний указатель = указатель. Осталось разобраться, что такое LONGLONG и LONG64. LONGLONG это синоним походу long long, а LONG64 это синоним походу __int64.
                      Ответить
                      • typedef __int64 LONG64;
                        
                        /*
                        *_M_IX86 Defined as the integer literal value 600 for compilations that target x86 
                        * processors. This macro isn't defined for x64 or ARM compilation targets.
                        */
                        #if !defined(_M_IX86)
                         typedef __int64 LONGLONG; 
                        #else
                         typedef double LONGLONG;
                        #endif


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

                        И зачем __int64 если есть int64_t? Тоже легаси?
                        Ответить
                        • Там ещё DWORD32, DWORD64 и DWORDLONG есть.
                          Ответить
                          • блядь, как DWORD быть быть 64 если WORD это 16 (что само по себе смешно в 32 и 64 режимах)?

                            Как всё сложно
                            Ответить
                        • __int64 -- так сложилось исторически, это юзается под Windows вместо long long.
                          Походу тут намек на старину - целое в формате вещественного.
                          Ответить
                          • хм) Я правильно понимаю, что в какой-то момент самым длинным типом данных был double?

                            Всё равно какой-то костыль, конечно
                            Ответить
                            • Да. Во времена 16-бит не было нормальных 64-битных чисел (как и во времена 32-бит не было нормальных нормальных 128-битных чисел). Поэтому в те далекие времена нам на помощь приходили математические сопроцессоры с доублами и целыми в формате вещественного. А если хотели без них? А тогда делали так:
                              typedef struct tagint64 { long low, high; } int64;
                              /* при 16-битной архитектуре int был 16-битным (как short сейчас), а long 32-битным */
                              Такое легаси до сих пор есть в WinAPI, например LARGE_INTEGER
                              Ответить
                              • Это не легацы, а поддержка легацы, почитай Rе:маркс где предостерегают от простого каста к QWORD
                                Ответить
                                • Represents a 64-bit signed integer value.
                                  The LARGE_INTEGER structure is actually a union. If your compiler has built-in support for 64-bit integers, use the QuadPart member to store the 64-bit integer. Otherwise, use the LowPart and HighPart members to store the 64-bit integer.
                                  Никакого предостережения такого не увидел.
                                  LARGE_INTEGER la;
                                  //...
                                  __int64 ll = *((__int64*)&la);
                                  Ответить
                                  • Или нота про __ште64 - остаток от него или я сконфузил с ремаркой про FILETIME

                                    It is not recommended that you add and subtract values from the FILETIME structure to obtain relative times. Instead, you should copy the low- and high-order parts of the file time to a ULARGE_INTEGER structure, perform 64-bit arithmetic on the QuadPart member, and copy the LowPart and HighPart members into the FILETIME structure.
                                    Ответить
                                    • Вот там действительно предостережение есть: Do not cast a pointer to a FILETIME structure to either a ULARGE_INTEGER* or __int64* value because it can cause alignment faults on 64-bit Windows.
                                      В статье про эти alignment faults: On x64 and ARM64 systems, any alignment faults are handled by a combination of hardware and software. For best performance, all access to memory should be properly aligned. In addition, unaligned interlocked variable access should be avoided on ARM64, as these operations are not atomic-safe.

                                      Но, alignment faults, это то, чего надо избегать на ARM, и то, можно забить - ведь операционная система сама обработает эту хню, ценой некоторого времени. Вот что на x64 это может сделать. Чуть-чуть подзамедлить программу?
                                      Ответить
                                      • Тут деструктивно что оно не атомно-безопасно.
                                        А насчет пирфоманса интересно было бы погонять бенчи, может действительно дешевле скопировать по частям, посчитать и скопировать обратно.
                                        Ответить
                                        • Я не обучен мыслить а тем более действовать конструктивно, зато деструктивно - дай бог.
                                          Апчхии!
                                          Ответить
                  • Пасквилянт детектед. LPARAM же!
                    Ответить
                    • Я вообще про название переменной lParam писал, которая имеет тип LPARAM.
                      Да, и я в себе уже убил этот пацкаль, от которого только хочется рыгать.
                      Ответить
            • Ну я вот так и понимаю это дело, по сути. Контекст (тип в WPF Width это double, в WinForms или P/Invoke это int) + IDE саппортит.
              Ответить
              • А в чем Width в WPF, если оно double? Я думал, оно в DIP, не?
                Ответить
                • Можно задать единицы измерения. Если единицы измерения не заданы явно, то используются по умолчанию пиксели, но не обычные, а 'логические', которые независят от устройства. Один 'логический' пиксель = 1/96 дюйма.
                  Ответить
                  • Да, это те самые DIP, про которые я и говорил:) Просто я не знал, что они double.
                    Я помню что была проблема: они попадали на границу пикселей, и всё блюрилось.
                    Ответить
                    • WPF считает, что у вас идеальное беспиксельное устройство. Чтобы спустить его на землю, используйте SnapsToDevicePixels="True"
                      Ответить
                      • >идеальное беспиксельное устройство.
                        Ламповый телевизор?:P)
                        Ответить
                        • К ним наиболее близки принтеры.
                          Хотя существование идеальных беспиксельных устройств противоречит физике, ведь длина волны света конечна, и имеет определенное значение (для определенного цвета).
                          Ответить
                          • У принтера все равно есть минимальный размер точки, которую он может напечатать. Просто она очень мала.
                            Ответить
                        • У телевизора изображение не разбито на пиксели по горизонтали, тем не менее, оно по вертикали разбито на заранее известное количество строк.

                          Идеальное беспиксельное — это векторный дисплей. Недавно обсуждали.
                          Ответить
                          • Разбито, однако блюрится оно так сильно, что особых проблем ты не увидишь. Впрочем, это еще зависит от того, есть там апертурная решетка или теневая маска итд, кажется что и это мы обсуждали.
                            Ответить
                            • На чёрно-белом нет никакой «апертурной решётки или теневой маски». Именно поэтому я за «чёрно-белый кинескоп».
                              Ответить
                            • Неряшливые корейские девушки оставляют в тринитронах волосы, которые потом электрическое поле растягивает поперек экрана.
                              Ответить
                        • Схуяли? Строка развертки тебе уже не пикчи элемент?
                          Ответить
          • Именно поэтому я за Type Script
            Ответить

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