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

    +147

    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
    Файл с настройками
    
    $category_set = array (
    'allow_num_news' => '1', //Показывать количество новостей
    'allow_null_cat' => '0', //Показывать разделы в которых нет новостей
    'el_1' => '<div class="mydiv">', //Основной блок. Стандартно - <ul> Свои - <div class="mydiv>"
    'c_el_1' => '</div>', //Закрывающий тэг основной блок. Стандартно - </ul> Свои - </div>
    'el_2' => '<h3>', //Элемент подменю. Стандартно - <li> Свои - <h3>
    'c_el_2' => '</h3>', //Закрывающий тэг элемент подменю. Стандартно - </li> Свои - </h3>
    'el_3' => '', //Дополнительно. Стандартно - '' Свои - ''
    'c_el_3' => '', //Закрывающий тэг дополнительно.  Стандартно - '' Свои - ''
    'p_el_1' => '', //Элемент основного блока если есть подкатегории. Стандартно - '' Свои - ''
    'p_c_el_1' => '', //Закрывающий тэг  основного блока если есть подкатегории. Стандартно - '' Свои - '' 
    'p_el_2' => '', //Элемент подменю если есть подкатегории. Стандартно - <ul> Свои - ''
    'p_c_el_2' => '', //Закрывающий тэг  подменю если есть подкатегории. Стандартно - </ul> Свои - ''
    'p_el_3' => '<p>', //Элемент дополнительно если есть подкатегории. Стандартно - <li> Свои - <p>
    'p_c_el_3' => '</p>', //Закрывающий тэг  дополнительно если есть подкатегории. Стандартно - </li> Свои - </p>
    'el_add' => '<span style="font-size:10px;"> - ', //Тэг для количества новостей
    'c_el_add' => '</span>', //Закрывающий тэг для количества новостей
    );
    
    include "Файл с настройками"
    
    function categoryTree($cat_arr,$parent_id){
       global $category_set, $DOMAIN,$link_set;
    	$elAdd = $category_set['el_add'];  
    	$celAdd = $category_set['c_el_add'];
          if(is_array($cat_arr) and  isset($cat_arr[$parent_id])){
             foreach($cat_arr[$parent_id] as $cat){
    		   $el1 = $category_set['el_1'];  
    		   $cel1 = $category_set['c_el_1']; 
    		   $el2 = $category_set['el_2'];  
    		   $cel2 = $category_set['c_el_2'];
    		   $el3 = $category_set['el_3'];  
    		   $cel3 = $category_set['c_el_3'];
    		   if ($cat['id_parent'] >0){
    			    $el1 = $category_set['p_el_1'];  
    		        $cel1 = $category_set['p_c_el_1'];  
    		        $el2 = $category_set['p_el_2'];   
    		        $cel2 = $category_set['p_c_el_2']; 
    		        $el3 = $category_set['p_el_3'];  
    		        $cel3 = $category_set['p_c_el_3'];
    				$sub = $link_set['sub_for_tree'];
               }
    		   $numNews = $cat['num_news'];
    		   if($category_set['allow_num_news'] != 1){
                  $elAdd = ''; 
    	          $celAdd = '';  
    			  $numNews = '';
               } 
    		   if($cat['num_news'] != 0){
    	           $catTree .= $el1; 
                   $catTree .= $el2.$el3."<a href='".$DOMAIN."/".$sub."".$link_set['category_for_tree']."/".$cat['id_category']."/'>".$cat['name']."</a>".$elAdd."".$numNews.$celAdd.$cel3.$cel2;
                   $catTree .=  categoryTree($cat_arr,$cat['id_category']);
                   $catTree .= $cel1; 
    		   }    
    		   else{
    		       if($category_set['allow_null_cat'] == 1){
    			       $catTree .= $el1; 
                       $catTree .= $el2.$el3."<a href='".$DOMAIN."/".$sub."".$link_set['category_for_tree']."/".$cat['id_category']."/'>".$cat['name']."</a>".$elAdd."".$numNews.$celAdd.$cel3.$cel2;
                       $catTree .=  categoryTree($cat_arr,$cat['id_category']);
                       $catTree .= $cel1;    
    			   }
    		   }		       
             }
          } 
          else return null;  
    return $catTree;        
    }

    Цель.
    Полный, наиполнейший, высший контроль над деревом категорий с подкатегориями. Хорошо, что комментарии написал.
    Кто бы, что не говорил, а это изумительно работает. Единственная недоработка, тэг <а> Тоже должен быь в массиве с настройками :-) я так думаю.
    з.ы Переделывать лень.

    Запостил: straga_coda, 30 Марта 2013

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

    • Терпеть не могу, когда смешивают пробелы с табами.
      Ответить
      • сколько и чего по фенг-шуй надо юзать?
        Ответить
        • Во многих языках есть стандарты и рекомендации по форматированию. В PHP есть PSR-1 и PSR-2, но даже если выбран другой стандарт кодирования (пусть даже не задокументированный), то нужно хотя бы его соблюдать в рамках всего проекта. Если стандарта нет - скорее всего, проект представляет собой кучу мусора. Потому что, если нет порядка в голове, то нет его и в коде (обратное чаще всего тоже верно).
          Ответить
          • ну я в основном соблюдаю psr-1 вроде, но вот { с новой строки и пробелы типа if ( .... ) меня бесят
            Ответить
            • Стандарт - это всегда компромисс. А компромисс - это всегда жертвы, приносимые всеми сторонами ради достижения полезного для всех сторон результата. -- Ваш К.О.
              Ответить
      • Пробелы с табами имеют право на жизнь только в одном случае - indent with tabs, align with spaces. Здесь явно не этот случай ;)
        Ответить
        • Согласен, что это допустимо, но считаю такой стиль излишне сложным, с учетом того, что многие редакторы умеют в автоматическое выравнивание.
          Ответить
      • >>> Терпеть не могу, когда смешивают пробелы с табами
        Я с этим борюсь так:

        nmap <F3> :retab<cr>:1,$s/[ ]*$//<cr><C-o>
        vmap <F3> <esc>:retab<cr>:1,$s/[ ]*$//<cr><C-o>i
        imap <F3> <esc>:retab<cr>:1,$s/[ ]*$//<cr><C-o>i
        Ответить
        • M-x untabify
          Ответить
          • Не совсем. В примере выше "untabify" (который remap) маппится на F3 во всех режимах, а также автоматически удаляются trailing spaces во всех строках. В емаксе, конечно, это тоже тривиально делается, но букв прилично получается.
            Ответить
            • C-x ( C-n C-e M-\ C-x )
              и зажать C-x e до победного конца.
              Ответить
              • Лол. Отличный подход к автоматизации.
                Ответить
                • По времени быстрее, чем набрать M-x rep<TAB>reg<TAB> \s-+$ :)

                  Даже не столько по времени, сколько - меньше думать нужно. Время уходит на то, чтобы подумать "а как же регулярку составить?", А так - просто повторил все те же команды, которые и так делаешь - и все.
                  Ответить
                  • >>> По времени быстрее, чем набрать M-x rep<TAB>reg<TAB> \s-+$

                    Вы еще до сих пор откываете вкладки по :newtab ? Тогда мы идем к вам.

                    Такие нужные вещи должны быть в .vimrc описаны, как и обозначенные выше три строки.
                    Нажал F3 и все, это гораздо быстрее чем набирать C-x ( C-n C-e M-\ C-x )
                    Ответить
                    • У @wvxvw просто странное восприятие действительности. Я бы сделал это примерно вот так:
                      (defun prettify (begin end)
                        "Converts all tabs in region with spaces and removes trailing
                      spaces withing selection."
                        (interactive "r")
                        (untabify begin end)
                        (save-excursion
                          (save-restriction
                            (goto-char begin)
                            (while (re-search-forward "\s+$" end t)
                      	(replace-match "")))))
                      
                      (global-set-key [f3] 'prettify)
                      Ответить
                      • Не нужно так делать. Есть whitespace.el. Но если интересно, откуда такие идеи, прошу пожалуйста:
                        http://en.wikipedia.org/wiki/Situated_cognition
                        , еще можно почитать Андерсона, что он пишет про ACTR, в частности про процесс обучения. Основная идея заключается в том, что человеку будет проще запомнить относительно небольшой набор базовых операций и применять его не используя полный цикл "обдумывания" действия: точно так же, как печатая вслепую, удобнее, если в слове сделана ошибка, вернуться на все слово назад и напечатать его еще раз - т.как искать ошибку - это анализ, который заставит сделать "обдумывание", а напаечатать еще раз - это менахическая задача, во время которой можно продолжать решать проблему, суб-проблемой которой является печатание.
                        Ответить
                        • Про whitespace знаю и иногда использую. Но с подходом "записать макрос и евалить его руками стопицот раз для тривиально реализуемой операции" не согласен, какими бы учёными умами оно не оправдывалось.
                          Ответить
                          • Ну, вот, например у меня все функциональные клавиши чем-то уже знаяты. В часности, F2 и F3 у меня сворачиают / разворачивают выделенный блок текста. Более того, когда открыт ECB и в нем SLIME - то придумать не занятую комбинацию клавиш становится проблематично :) Кроме того есть куча minor-modes с которыми не хочется пересекаться. Ситуации когда мне нужно заменить табуляцию пробелами возникают редко (пару раз в месяц), вероятность того, что я вообще запомню корд / имя функции которая это делает... ну совсем не высокая. Макрсоы, с другой стороны, я использую каждый день по многу раз в день, и делаю это почти подсознательно (еще год тренировок, и наверное будет подсознательно :))
                            Ответить
                            • > В часности, F2 и F3 у меня сворачиают / разворачивают выделенный блок текста.
                              Но зачем на эту фишку 2 кнопки? Можно ведь одной кнопкой свернутый текст разворачивать, а не свернутый - сворачивать.
                              Ответить
                              • зачем это вообще делать с выделенным блоком, когда это надо делать с логическим блоком - телом операторных скобок, комментом, блоком #if 0 .. #else/endif, и т.д., в т.ч. свернуть вообще всё или в определения
                                кстати посидел в qt creator свежайшем, я хз может надо какие плагины ставить, но этот урод не умеет из коробки всего того, что я выше написал
                                Ответить
                                • Комменты и блоки умеет, препроцессор, к сожалению, не умеет.
                                  Ответить
                                  • как функцию то свернуть?
                                    а то у меня только на половине функций в .cpp файле эти стрелочки для сворачивания
                                    Ответить
                                    • > как функцию то свернуть?
                                      ctrl - <

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

                                      P.S. И за каким-то хреном оставляет список инициализации несвернутым... Хех, не врубается он в цплюсплюс, не врубается.
                                      Ответить
                                      • да не работает "ctrl <" - собсно раз рядом с функцией нет стрелочки, то и эта хрень работать не будет

                                        тупо посреди не самого большого .cpp файла у него ломается эта функциональность, причем даже нет ничего подозрительного в коде выше - ни препроцессорных #if-скобок, обычный такой же метод такого же класса

                                        притом, что в верхнем списке (<Select symbol>) все методы, в т.ч. бажные, на месте
                                        и эти люди мне будут доказывать, что qt creator в 2013 году переплюнул по удобству редактор VS пятилетней давности?..
                                        Ответить
                                • Для блоков - есть отдельные, но практика показала, что не удобно. Очень часто нужно свернуть несколько блоков вместе, или свернуть часть комментария / часть таблицы в Латексе / часть определения длинного массива и т.п. Особенно спасает в ХТМЛ шаблонах, где неинтересные куски бывают совсем произвольной формы.
                                  Ответить
                              • Можно, но не удобно, т.как случайно иногда попадаю на уже свернутый участок и происходит не то, что нужно. При том как часто обе функции используются - мне не жалко две кнопки потратить.
                                Аналогично как на музыкальных системах есть кнопки "играть" и "не играть" :) Об этом еще писал Джеф Раскин - что когда есть возможность сэкономить одну кнопку на перемене состояния - лучше так не делать - человеку так удобнее.

                                Да, кроме того, в Эмаксе выделить блок кода - это одна команда M-C-F, так что получается бессмысленно совсем, мне что нажать M-C-F (которой я пользуюсь очень часто, и делаю это совершенно машинально), а потом F2, что просто F2 - ровно одно и то же.
                                Ответить
                                • > Раскин
                                  Я видел общество, в котором за одно упоминание сразу бы истекали иадом.
                                  Не такой уж и гений, дабы на него ссылаться, право.
                                  Ответить
                                  • Если будут истекать - может быстрее вымрут?
                                    Ответить
                                • > на музыкальных системах есть кнопки "играть" и "не играть"
                                  Это редуцированный маразм, который волочётся ещё со времён магнитофонов, ибо там процесс запуска воспроизведения и его остановки радикально различаются и устроены механически (на многих магнитофонах остановка воспроизведения и открытие кассетника были одной кнопкой). Кстати говоря, некоторые развитые проигрыватели виниловых дисков умели в опускание и подъём головки на одной кнопке. Разделение подобных функций никогда не было и не будет удобным, это бред. Существует ровно ноль ситуаций, когда вам может потребоваться нажатие подобных парных кнопок _не_ поочерёдно. А значит - объединить их в одну (как на современных mp3-плеерах, у которых кнопка ►|| ) - есть очевидный и верный путь.
                                  (Данные аргументы не имеют никакого отношения к теме треда про скрытие и показ блоков кода, естественно)
                                  Ответить
                                  • Бред? - Расскажите об этом по-подробнее на какой-нибудь лекции по HCI в универе. Ваше мнение будет очень интересно послушать.
                                    Ответить
                                    • > на какой-нибудь лекции по HCI
                                      Я свои аргументы выложил, парируйте контраргументами. Какая-нибудь лекция по HCI для меня не столь компетентный конкурент против здравого смысла.
                                      Ответить
                                      • Я уже описал выше почему так работает: человеку проще запомнить соответствие между кнопкой и результатом, чем каждый раз проделывать мысленное усилие на то, чтобы вычислить, какое именно действие произойдет врезультате. Это подтверждается теоретическими рассчетами, тестами на добровольцах и т.п.
                                        Ваши аргументы сводятся недословно к следующему: "я никогда не пробовал, да и вообще не задумывлася никогда об этом вопросе, но я авторитетно заявляю, что оппонент неправ!".
                                        Ответить
                                        • > я никогда не пробовал
                                          Что значит не пробовал? Я привёл примеры реальных устройств, которые делали не идиоты, по большей части. А вы так говорите, будто миллион мартышек не могут ошибаться. (Это я про тесты на добровольцах.)
                                          И самое главное, чего я упорно не понимаю: что это за идиоты, и где вы их отыскиваете, которые запоминают соответствие между кнопкой и результатом до такой степени, что им каждый раз приходится проделывать мысленное усилие, что бы понять, что в их ушах уже играет песня, и нажатие на кнопку её остановит, а не начнёт воспроизводить?
                                          Чёрт побери, я вообще не понимаю о чём вы со мной спорите, у одиночной кнопки масса преимуществ. Например, в неё можно попасть не глядя, не заботясь об ориентации плеера в кармане, чего не скажешь о паре кнопок.
                                          Ответить
                                          • wvxvw
                                            > на какой-нибудь лекции по HCI в универе
                                            Не хочу огорчать, но большей частью современный дизайн и представление об UI - лженаука. При этом, динамически развивающаяся.

                                            vistefan
                                            > у одиночной кнопки масса преимуществ
                                            Если кнопки две и они с фиксацией, можно различать положение на ощупь. :) Вот и всё.
                                            Ответить
                                            • > Вот и всё.
                                              Именно, вот и всё. Вот вы и доказали сами, что для воссоздания удобств, предоставляемых объединением двух кнопок в одну (что явно упрощает техпроцесс), придётся ещё и городить дополнительную механику для фиксации кнопок. Браво.

                                              > лженаука
                                              Которую вы и форсируете сейчас, в противовес, опять же, здравому смыслу, которым я стараюсь руководствоваться.
                                              Ответить
                                              • Опять выделение текста слетело, каюсь.
                                                Я попытался только рационализировать возможность наличия именно джвух кнопок.
                                                P.S. Двухпозиционные переключатели существуют как данность, их изобретать заново не надо.
                                                Ответить
                                                • > двухпозиционные переключатели
                                                  Но согласитесь, применение их в качестве play/pause - "это какой-то позор", как говаривал Швондер.

                                                  P.S. Я как-то упустил момент, когда в полемику вступили вы @eth0, так что, кажется, обругал вас не в тему, соболез извиняюсь.
                                                  Ответить
                                                  • Ниндзя стайл!

                                                    > в качестве play/pause
                                                    Ну, с освещением у них пока получается нормально.
                                                    Ответить
                              • Кстати, вот вариант из той же оперы: undo / redo - в Эмаксе, по умолчанию, это одна и та же команда. Не просто не удобно, а в ярость приводит. Всегда самым первым делом после свежей установки это меняю, иначе можно разрыв всего заработать и умереть молодым.
                                Ответить
                                • Ну undo и redo одной командой это пиздец какой-то. Чем-то напомнило о notepad, у которого тоже только один уровень отмены, и повторное нажатие отменяет отмену...
                                  Ответить
                                  • Отмена последней операции. Логично.
                                    Ответить
                                  • Странно, что вам напомнило notepad. Уж скорее vi.
                                    Ответить
                                    • > Уж скорее vi.
                                      Ну у меня vim, не vi. А у него с отменой все хорошо. А вот с ноутпадом в свое время намучился.
                                      Ответить
                                      • vim в режиме совместимости с vi (де факто при отсутствии файла .vimrc, но можно и включить set'ом) тоже умеет только в единичную глубину истории изменений, и вешает это на одну клавишу u.

                                        Стесняюсь спросить, что это вы делали с ноутпадом? Учитывая вашу репутацию мостака, я скорее поверю, что вы сделали себе свой редактор с блекджеком, чем, что мудохались с этим говном. Лично у меня под виндой текстовый редактор - это Notapad++, но гораздо чаще и редактор и вьюер встроенные в FARmanager (прокачанные плагином colorer для хайлайта, что очевидно).
                                        Ответить
                                        • что может быть лучше, чем свежим утром за хрустящим круассаном и чашечкой латте с помощью AltGr набить машинный код очередной программы в Notepad
                                          Ответить
                    • Это не вкадки, это не про Вим вообще. Ну да не суть.
                      Ответить
    • Т.е. получается кроме табов и пробелов всё остальное здесь отлично?
      Ответить
      • Х.з. код, в котором прыгают отступы, читать влом, ибо подсчет скобок дико напрягает мозг ;)

        Ну а вообще - странная система. Почему бы не сделать шаблон на каком-нибудь шаблонизаторе? Или хотя бы поюзать <?php ?> в качестве шаблона? Здесь просто логики 2-3 строчки, остальное - ёбля с выводом. Да и править и поддерживать шаблон намного проще, чем подобные конфиги.

        P.S. 52-55 и 59-62 бессмысленный и беспощадный копипаст... логическое "или" сейчас у пыхеров не в моде?
        Ответить
      • Нет. Про остальное я ничего не говорил.
        Ответить
    • Ненавижу стандарты. Даже кушать не могу. Они убивают творческий порыв, заставляют принимать форму сосуда в который наливают.
      Ответить
      • Здравствуй, Дедушка Мороз. Пишет тебе мальчик Витя. Пожалуйста, дочитай моё письмо до конца. Это не спам, это реальный способ заработать...
        Ответить
      • >Даже кушать не могу.
        Патология на лицо.
        Ответить
      • Минураста минусуют. Теперь я окончательно осознал, почему меня жестоко не любила одна преподавательница экономической теории. За вот это вот несоблюдение стандартов. Зря я выпендривался и предлагал лучшие другие алгоритмы для решения её задачек. А мне ставили неуд потому что решение не как у всех.
        Ну что ж, уж какой есть.
        Ответить
    • Кстати, все стандарты на шифрование нужны, так как содержут дырку для легкой расшифровки данных спецслужбами. Во у них батхерт, когда нужно расшифровать, а автор программы с шифрованием не угорал по стандартам и сам не допустил ошибок в алгоритме шифрования и его реквизитов.
      Ответить
      • Примеры дырок в студию, пожалуйста.
        Ответить
      • >а автор программы с шифрованием не угорал по стандартам
        для этого надо уметь в матан, что отметает 95% неугорающих по стандартам
        Ответить
      • что за ерунда?
        все стандарты шифрования открыты
        и атаки на каждый изучаются вполне себе третьими лицами
        думаешь, если бы у нашего, например, гост 28147-89 был настолько явный изъян, потенциальный противник не преминул бы его обосрать? равно как и любой другой ныне считающийся надежным алгоритм
        Ответить
        • >потенциальный противник
          у ZOG нету противников
          Ответить
        • >настолько явный изъян, потенциальный противник не преминул бы его обосрать?

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

          Такие уязвимости вводятся математически на уровне создания алгоритма, а подругому их найти сложно.
          Ответить
          • > Такие уязвимости вводятся математически на уровне создания алгоритма
            Если правительствам (а кто еще может владеть этими изъянами?) ты будешь представлять интерес, то они воспользуются терморектальным криптоанализом... И тогда тебе никакие алгоритмы не помогут ;) А от всех остальных эти методы достаточно стойки.
            Ответить
            • >они воспользуются терморектальным криптоанализом...
              Да пофиг на меня. Во время войны это представляет интерес. А в это время ТРКА не работает. В военное время даже ПИ равно трем.
              Ответить
              • > Во время войны это представляет интерес.
                Во время войны пользуются заранее розданными одноразовыми блокнотами и кодовыми книгами.

                Терабайтного винта с мусором и его копии у другой стороны вполне хватит чтобы годами шифровать даже видеосвязь ;)
                Ответить
                • > Терабайтного винта с мусором
                  Где ты столько мусора то наберёшь, милок?
                  Ответить
              • >В военное время даже ПИ равно трем.
                Неправда.

                >так как содержут дырку для легкой расшифровки данных спецслужбами
                И в этом треде ты снова умудрился обосраться.
                Эксперт по криптографии, ёпта.

                Реально это бывает так:
                > автор программы с шифрованием не угорал по стандартам
                Автор программы не читал книжек и решил писать свой велосипед.
                > сам не допустил ошибок в алгоритме шифрования
                И наговнячил на самом элементарном.
                Ответить
          • включи голову
            по твоему все вокруг только маразматики, которые слепо используют троянские бинарные библиотеки?
            не может быть такого, что о бекдоре знает только один человек из спецслужбы, что знает двое - знает и свинья

            криптография используется повсюду, любые денежные движения, любые корпоративные секреты перемещаются по сети только благодяря тому, что есть существенная надежда, что они достоверны
            представь себе, что ты получил потайную информацию о том, как взломать гост-89/2001 на кофемолке - ты же так накроешь пиздой всю отечественную банковскую сферу
            я взломав rsa/aes - всю мировую

            не стоит думать, что это никому не нужно и кто нибудь не готов купить такой секрет за миллиард, чтобы заработать триллион
            Ответить
            • Я бы не стал продавать, но выпустил в общественное достояние. Скажем, тот же AES или RSA. Только заранее попкорна бы взял.
              Ответить
      • Ямщик не гони...

        Вот как раз в самопальном алгоритме вполне можно допустить изъян. А в силу его закрытости этот изъян найдет именно злоумышленник, а не коллега-ученый...

        P.S. 99% самодельных "алгоритмов" "шифрования" и "хеширования", которые я видел, представляли собой полное говно, которое ломалось дизасмом калькулятором и бумажкой за полчасика.
        Ответить
        • Да, и в "Applied Cryptography" тоже самое написано. Офигенская книжка.
          Ответить
          • А там написано как их ломать с бумажкой? Думается мне, что автор просто чего-то не того съел.
            Ответить
            • Там написано, что security by obscurity это плохой подход, и что нужно юзать публичные, исследованные толпой ученых алгоритмы.
              Ответить

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