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

    +1

    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
    <?php include_once("routing" .DIRECTORY_SEPARATOR  . "Router.php");?>
    <?php include_once("task" . DIRECTORY_SEPARATOR . "Task.php");?>
    <?php include_once("db" . DIRECTORY_SEPARATOR . "DB.php");?>
    <?php include_once("model" . DIRECTORY_SEPARATOR . "Model.php");?>
    <?php 
    class App{
    	public static $webuser = null;
    	public static $config;
    	public static $routing;
    	public static $DB;
    	public static $document_root;
    	
    	public static function run($config){
    		//config
                    self::$config = $config;
                    
                    /**
                     * init database
                     */
                    
                    
                    $db = new DB();
                    $db->connect(self::$config['db']);
                    self::$DB = $db;
                    
                    
                    
                    /**
                     * Run task
                     */
    		$request      = Router::getRequest(self::$config['default_task']);
    		
    		$task_path    = self::$document_root . DIRECTORY_SEPARATOR . "tasks" . DIRECTORY_SEPARATOR . $request . ".php";
                    
                    
                    
    		if(file_exists($task_path )){
    			include_once($task_path);
    			
    			$task = new $request();
    			
    			$task->init();
    		
    		}else {
    			throw new Exception("File don't exists");
    		}
                    
    			
    	}
            
            public static function isGuest(){
                if(is_null(self::$webuser)){
                    return true;
                }
                return false;
            }
    }
    ?>

    http://govnokod.ru/27036#comment585451

    https://habr.com/ru/post/523828/https://habr.com/ru/post/523828/

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

    Запостил: pahhan, 04 Декабря 2020

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

    • «Такие статьи появляются несколько раз в год и являются результатом нежеления понимать, что происходит в мире PHP. Возможно автор раньше программировал на чем-то старом, теперь узнает о языке PHP, плохо владеет английским и вообще интернетом, и сидит по старинке, что-то выдумтывает сам. Последнее, в принципе, не так уж плохо, но такие поделки никому на хабре в статьях не могут быть интересны, ибо через это все уже прошли лет 10-15, а то и больше, назад. Достаточно позорно в 2020-ом году не знать про Composer (или хотябы просто про автозагрузку) и PSR, я уж не говорю про SOLID»

      ... написал матёрый пхпшник и пошел обновлять либу, потому что там имена доменных зон захардкожены.

      ... написал матёрый пхпшник и пошел дальше писать ОРМ на «РНР» для каждого сайта отдельно.
      Ответить
    • > DIRECTORY_SEPARATOR
      зачем в 2020 году поддерживать что-то кроме "/"? даже "Windows" поддерживает прямые слеши
      Ответить
      • > даже windows

        При запуске внешних программ не всегда прокатывает т.к. многие тулы парсят /опции и охуевают от / посреди путей. А в остальных местах -- да, и / сойдёт.
        Ответить
        • > /опции

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

          P.S. спасибо виндовсу и его апи говна с argv в одну строку
          Ответить
        • /vms ебучий потому что
          Ответить
      • Q: зачем в 2020 не иметь в высокоуровневом языке абстракции для понятия "путь"?
        A: пыхоперхоть должна страдать
        Ответить
        • абстракция для понятия "путь к алкоголизму и моральному разложению"
          Ответить
        • Кстати да. И это должна быть универсальная питуншя со следующими ворециями настроек:
          * URI
          * Filesystem
          * Windows
          * Linux
          * Флаг "ОДНОУРОВНЕВЫЙ" или levels=?.

          Чтобы можно было с помощью одной и той же абстракции написать сервер (Filesystem + URI, ОДНОУРОВНЕВЫЙ для предотвращения питунши вида static + '/../../../../../file'), утилиту и прочую питуншю (автопердолинг с пробелами), в том числе экспорт в другие платформы (флаги Win/Lin).
          Ответить
          • слишком ебанутая абсракция получится, протечет, у того же uri и файлопути в виндовс свойства совершенно разные
            Ответить
            • URI можно безхвостые - http://govnokod.ru/27149. Хвосты и протоколы можно добавлять в необязательное свойство base объекта. Ну или prefix+suffix для питушни, а внутри только путь. Такая питушня не протечёт.
              Ответить
          • Универсальная питушня со следующими ворециями настроек:

            * URI

            Всё остальное -- нинужное легаси. Пусть конвертится в нужных точках (при запуске бинарей и т.п.)
            Ответить
            • Всё равно понадобится импорт-экспорт для легушни.
              Ответить
              • Дык только импорт-экспорт, а не постоянная ёбля с сепаратистами, как в этом вашем PHP.
                Ответить
          • Это тебе придётся делать ебанутое ООП с наследованиями и полиморфизмами, чтобы адекватно представить всё это говно.

            Кстати, в ЙАЖЕ уже изобрели: https://docs.oracle.com/javase/8/docs/api/java/net/URI.html.
            Ответить
            • в яже изабрели https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html
              Ответить
          • Поэтому я за `Plan9'.
            Ответить
          • да нет, достаточно так:


            path = Path("/foo/bar/gi")

            и потом

            path.asOsSpecific

            всё
            Ответить
            • Может понадобиться урлушня для серверов (файл в статикопапке <-> урлушня на сайте), генереции скриптов для других ОС (из винды в луникс и наоборот).
              Ответить
              • path.asWindows
                path.asUnix
                path.asMacOsClassic

                Also, URI не обязан быть файлом и путем же
                Ответить
                • Не обязан, но в таких случаях можно просто вернуть ошибку, что требуется локальный путь.

                  З.Ы. URI (не путать с URL) вообще не обязан на что-то реальное указывать. Это абстрактная айдишка.
                  Ответить
                • можно добавить аргумент для мёрджа или просто делать относительный URL

                  URI userURL = pitux_from_http_request;
                  URI baseURL = 'https://pituz.com';
                  String file = (staticDir + (userURL - baseURL).asOsPitux;
                  String link = (file - staticDir).asURI(baseURL);


                  > З.Ы. URI (не путать с URL)
                  Мне для вебтушни чисто URI не нужны, поэтому меня интересует не абстрактушня, а конкретно URL и пути в ОС.
                  Ответить
                  • а у тебя + и - перегружены, я надеюсь?
                    Ответить
                    • Да. "+" - конкатенация. А "-" я в коде подразумевал правый, должен быть ещё и левый.
                      '/a/b/c/' >- '/a/b' === 'c'
                      '/a/b/c/' -< 'c' === '/a/b'
                      
                      '/a/b/c/' -< '/a/b' === error
                      '/a/b/c/' >- 'c' === error
                      Ответить
            • Но вообще слешик это слишком низкоуровневая питушня. Если я работаю на уровне "подключить модуль", то я ничего не хочу знать про слешики.

              Это как если бы меня заставили крутить головку привода или открывать странички в SSD прежде, чем подключить файл.

              start_hdd_drive();
              wait_for_drive_started();
              $chs = to_chs("petuh.txt", offset=22);
              scroll($chs->s);
              connect_head($chs->h);

              итд
              Ответить
              • Нет, слешик нужен. Слешик - это синтаксический сахар для обозначения иерархии, а не какая-то конкретная питушня из луникса или урлушни.
                А от иерархии в путях и урлах сложно избавиться, иначе библиотеки для урлов и путей не нужны.

                Path('a/b/c') преобразуется в Path(['a','b','c']) или в join(BasePath, join(Path('a'), join(Path('b'), Path('c')))) или в аналогичное, а потом питушится в конкретный путь с теми или иными слешами.
                Это гораздо удобнее, чем писать кучу жойнов или кучу ' + OLOLO_CEnAPATOP + '.
                Ответить
                • > Path('a/b/c') преобразуется в Path(['a','b','c'])
                  Или делает вид в интерпейсе. Может, эта питушня всё хранит в этом же луникс-формате и только в винде чуть тормозит на импорте/экспорте.
                  Ответить
                • > Нет, слешик нужен. Слешик - это синтаксический сахар для обозначения иерархии

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

                  Правда я такого уже очень давно не видел.
                  Ответить
                  • Да нету никаких проблем. Юзаешь везде один формат. Если на входе или в каком-то вызове нужен другой -- только там и конвертишь.

                    Собственно как и с кодировками.
                    Ответить
                    • бинго!

                      Юзаешь везде например джавий char, а конвертишь его перед выводом.
                      Юзаешь везде Path, и конвертишь перед выводом.


                      Но пыхосмегма не умеет в абстракции. Они из GET параметров удаляют DELETE чтобы SQL не сломать, какие уж тут абстракции
                      Ответить
                • Если он сахар, то он не должен зависеть от OS.

                  Это сёмантический слешик, виртуальный слешик, а не реальный.
                  Ответить
                  • А шо такого? Просто совершенно случайно выбранный символ "/". Он ни от чего не зависит. Можно в настройках Path выбрать другой.

                    path = Path("http://foo.bar.gi", sep='.', root='http://')
                    Ответить
        • То есть чтобы написать "hui/pizda/dzhigurda", нужно написать path.join("hui", "pizda", "dzhigurda") ?
          Ответить
          • Можно "hui" / "pizda" / "djigurda" как в бусте. Не надо уподобляться пхпшникам и клеить строки.
            Ответить
            • Я против буста.
              Ответить
            • Тогда уже path() / "hui" / "pizda" / "djigurda", потому что операции над строками, зависящие от ОС - это пиздец говно будет.
              Ответить
              • > path()

                Ну да. Но не поэтому, а просто потому что в крестах нельзя для джвух встроенных типов оператор перегрузить.
                Ответить
                • То есть если можно было, ты бы завёз “Path operator /(string, string)”?
                  Ответить
                  • Для string/string я его и так могу завести. И ничего плохого в этом нет. У строк же нет деления, значит это явно конкатенация компонентов пути.

                    Для литералов const char* вот нельзя, к сожалению. Но обычно путь один хер начинается с какой-то переменной. Так что это не сильно напрягает.
                    Ответить
                  • Надо завозить полиморфные литералы.
                    А потом и питушню Хиндли-Милнера, чтобы пердолинг с шаблонами был приятнее.
                    Ответить
              • А зависимость от ос должна быть только в toHost() и fromHost() имхо. Т.е. только на входе и выходе.

                Внутри там всегда может быть юниксовый путь. Или массив компонентов. Ты всё равно не узнаешь.
                Ответить
                • массив внутри должен быть, потому что если ты переносишь между операционными системами КУРОЧКА и ПЕТУШОК, то внутри файла могут быть слеши.

                  КУРОЧКА использует разделитель "ы", а ПЕТУШОК -- ":"

                  А на винды и юниксы тебе пофиг
                  Ответить
                  • Да почему массив? Можно и просто строку с экранами.
                    Ответить
                    • А если разделитель "//"?
                      Ответить
                      • Допустим во внутреннем представлении у меня один юниксовый /.

                        Тогда я при выводе для твоей оси конверчу его в //. А для винды в \.

                        А если в твоей оси / можно в именах, я могу заэкранировать его во внутреннем представлении. А при конвертации в юникс сказать что так низя, путь хуёвый.
                        Ответить
                      • не важно.

                        Смотри: Я хочу сохранить некую строку в хранилище Foo.

                        Так случилось, что в хранилище символ Ы -- служебный.

                        Потому я перед помещением в хранилище заменяю Ы на другой символ.
                        А перед извлечением заменяю обратно.
                        Ответить
                        • Если ты хочешь хранить путь в строке, то разделитель не должен содержаться ни в одном алфавите. ("hui" / "pЫzda").toWindows() == "hui/pЫzda", в то время как ("hui" / "pЫzda").toPithuOs() == "huiЫpЫzda".
                          Ответить
                          • Ну вот во время конвертации в специфичный формат и кинешь исключение.

                            А хранить можно любые символы. Экранировку никто не отменял.
                            Ответить
                            • Но нахуй надо. Это как 1023 выше предложил хранить массив как JSON. Лучше уж массив.
                              Ответить
                              • Х.з., так компактнее в целом, мало кто слеши юзает в именах.

                                Ну и для текущей оси можно zero copy сделать.
                                Ответить
                              • Я не предложил хранить массив как JSON. Я показал математическую систему (даже две, ещё про сишные строки сказал), которая не ломается, когда метушня и питушня имеют один и тот же алфавит.
                                Ответить
                          • Я могу хранить разделитель как байт "0x1"
                            Ответить
                      • Какая нафиг разница?

                        Допустим, существует JSON. И он ещё не сломался от того, что у каких-то питузов разделители массивов - запятые, кавычки, скобочки или набор букв "null". Вся эта питушня может вместиться в одну строку внутри JSON. А потом этот JSON можно серилизовать в другую строку с JSON.

                        Строку 6 раз попердолило и распердолило, а ничего не сломалось ни на каком шаге:
                        let perdole = x => JSON.stringify([x, x]);
                        let bagor = [1,2,3,4,5,6].reduce((x,_) => perdole(x), '[kakoy, b, a, g, o, r]');
                        
                        let razperdole = xs => JSON.parse(xs)[0];
                        let source = [1,2,3,4,5,6].reduce((x,_) => razperdole(x), bagor);


                        Сишка выдерживает символ '\\' или '\"' внутри строки, такую строку можно снова положить в строку.
                        Ответить
                        • 64 раза точно не вложишь.
                          Ответить
                          • Там в первой строке специальный смайлик для перланимешников ([x, x]), который сокращает все оценки в разах вдвое.
                            Ответить
                            • Да даже пустую строку.
                              Ответить
                              • А не надо было покупать китайскую машину Тьюринга, где выше 16ЭБ поставили гайку для веса.
                                Ответить
                                • К сожалению, в нашу солнечную систему более качественная машина тьюринга не влезла.
                                  Ответить
                                  • Пфф. Просто возьмите систему побольше.
                                    https://youtu.be/-Jh0EN1De4Q
                                    Ответить
                                • *долго смотрел в ковёр*

                                  Кстати, гайки добавляют для веса или для массы?

                                  У человека есть как минимум два варианта проверки солидности питушни:
                                  1. Положить на руку и прочувствовать, насколько сильно она притягивается к ближайшей большой массе. (P=GmM(r^-2), M меняется от планеты к планете вместе с весом)
                                  2. Помотать питушню рукой и проверить, как сильно нужно попердолиться, чтобы питушня металась туда-сюда. (m=F/a - F не зависит от M и не меняется от планете к планете - массовый критерий)
                                  Как мне кажется, привычнее весовой критерий. Но массовый критерий может применяться для мелкой питушни, которую не сильно притягивает текущая планета.

                                  Изменится ли оценка солидности питушни, когда люди заселят много разных планет и построят телепорт, позволяющий "превышать" скорость света сквозь дополнительное измерение? Метод "подержать на ладошке" будет неудобен при частой смене планеты.

                                  Будет ли создан генератор веса для стариков, которые привыкли взвешивать питушню на ладошке?
                                  Ответить
                        • Я против reduce. Постоянно забываю какой там порядок аргументов.
                          Ответить
                          • Надо запомнить, что это аналог foldl, а значит аккумулятор-пакман подкатывает к массиву слева и жрёт. А значит пакамулятор слева, а элемент - справа.
                            Ответить
                    • ну или так. Но массив проще
                      Ответить
          • нет, написать можно как угодно, потом распарсится
            Ответить
    • китайцы криптографию испортили
      https://www.bloomberg.com/news/articles/2020-12-04/chinese-scientists-claim-breakthrough-in-quantum-computing-race
      Ответить
      • Продублирую в этот тред, а то вдруг тот зашкваренный тред все заблеклистили.

        Хм, т.е. это больше девайс для неломаемой квантовой криптографии чем наоборот.

        Чуваки выбрали задачу о фотонах, которая с помощью этих самых фотонов легко решается за секунды. А для классического компа это NP и миллиарды лет.

        Т.е. классический комп в принципе не способен предсказать выхлоп этой хреновины.


        g: Gaussian boson sampling
        Ответить

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