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

    +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
    interface PostRepository
    {
        public function save(Post $model);
    }
    
    class Post
    {
        protected $id;
        protected $title;
        protected $content;
    
        public function setId(int $id)
        {
            $this->id = $id;
        }
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function setTitle(string $title)
        {
            $this->title = $title;
        }
    
        public function getTitle(): string
        {
            return $this->title ?: '';
        }
    
        public function setContent(string $content)
        {
            $this->content = $content;
        }
    
        public function getContent(): string
        {
            return $this->content ?: '';
        }
    }

    Блядь, до чего ж отвратительный код. Говёность «PHP», тщательно и с извращённой любовью смешанная с ЙАЖАвским бойлерплейтом. Омерзительно.

    https://habr.com/ru/post/505400/
    >>> Как должны выглядеть модели?

    Запостил: gost, 08 Июня 2020

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

    • Фу, бля, фу, нахуй.
      Ответить
      • Мудификаторы стоило запретить нахуй.

        >protected
        >public

        Бочку варенья тому кто пропихнёт новый Йазык без вот такой дристни.
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • Это скриптуха. А я говорю за статически типизированный.
            Никакие мудификаторы кроме var кмк не нужны.
            Даже от стасика пользы нет особой, больше проблемы.
            Ответить
            • Попробуй Коко, серьезно.

              Там всё по умолчанию
              * финальное
              * закрытое

              Нужен только модификатор val
              Ответить
              • Попробуй муа-муа,
                Попробуй коко-коко.
                Ответить
      • Автор, кстати, коллекционирует хуи в панамку.

        Вот тут он рассказал, как запустить apache+nginx. Зачем? Зачем?
        https://habr.com/ru/post/346086/

        >Если честно, я не понимаю откуда столько негатива.
        ахахахах
        Ответить
        • Ну видимо с апачем ему привычнее. В нгинксе то только через fastcgi можно привернуть php?
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Ну у него там на картинке нарисовано ".htaccess тоже бывает нужен". Т.е. видимо какое-то жуткое легаси запускает, поэтому и апач. А нгинкс для статики и кода посвежее.
              Ответить
              • так зачем nginx тогда ему?
                у него типа локально apache Тормозит для статики? серьезно?
                Ответить
                • Да х.з., я ж не спец в пхп. Но мне кажется, просто чтобы обе модели были доступны. Чтобы не пердолиться с портированием с апача на нгинкс/фпм и обратно. А просто запускать и течь.

                  Выглядит вполне разумно, тем более как ты говоришь, это для локального запуска.
                  Ответить
                  • Что портировать?

                    Если ты запускаешь все через apache + mod_php, то зачем поверх apache еще nginx?

                    Про локальный запуск он сам говорит
                    Ответить
                    • Ну вот есть у меня старое говнецо, которое было заточено под мод пхп. И новое говнецо, которое было заточено под нгинкс+фпм.

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

                            Docker production

                            По данному вопросу к сожалению я ничего сказать не могу, зато может сказать официальная документация.
                            Если у вас есть опыт использования docker на боевых проектах, то просьба поделиться своим опытом в комментариях: стоит ли, какие трудности и подводные камни у вас возникли и др. полезную информацию для молодых и неопытных.
                            Ответить
                            • А ну ок, я статью не читал, чисто картинки да заголовки посмотрел.
                              Ответить
                              • ну вот его nginx конфиг
                                worker_processes  1;
                                
                                events {
                                    worker_connections  1024;
                                }
                                
                                http {
                                    include       mime.types;
                                    default_type  application/octet-stream;
                                    sendfile        on;
                                    keepalive_timeout  65;
                                
                                    server {
                                        listen       80;
                                        server_name  localhost;
                                
                                        location ~ \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
                                            root /var/www/html;
                                        }
                                
                                        location ~ /\.ht {
                                            deny  all;
                                        }
                                
                                        location / {
                                            proxy_pass http://apache;
                                            proxy_set_header Host $host;
                                            proxy_set_header X-Real-IP $remote_addr;
                                            proxy_set_header X-Forwarded-For $remote_addr;
                                            proxy_connect_timeout 120;
                                            proxy_send_timeout 120;
                                            proxy_read_timeout 180;
                                        }
                                    }
                                }


                                как видишь, он просто отдает им статику (причем весьма уныло, даже не настраивая кеш) а всё остальное тупо форвардит на apache.
                                Ответить
                                • > .ht deny all

                                  Какой хтакцесс )))
                                  Ответить
                                • > location ~ \.(jpg|jpeg|gif|png|ico|css|
                                  Блядь, а это вообще нормальный способ отдавать статику? Не первый раз вижу такую волшебную строчку, но терзают меня смутные сомнения…
                                  Ответить
                                  • ну кажется что в целом да
                                    https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/

                                    Хотя я бы конечно сделал через content type, но я хз -- можно ли так в nginx
                                    Ответить
                                  • Ну видимо он там запускает традиционный код на пхп где всё в кучу. Поэтому тупо раздать всю папку нельзя, надо пердолиться с фильтрами.
                                    Ответить
                                    • показать все, что скрытоvanished
                                      Ответить
                                      • Да и на пыхе в общем-то никто не мешает так делать...

                                        З.Ы. Хотя если пыхомакаку не заставить срать в отдельный угол, то она и в еду себе насрёт.
                                        Ответить
                                        • В джа это просто из коробки. А в пыхе надо делать самому.

                                          Но пыхеры, как видишь, умеют только копировать готовые куски конфига даже не задумываясь "зачем?". Куда уж им до такой хуйни додуматься
                                          Ответить
                                          • В нормальных фреймворках статика в одном кусте директорий, php-файлы — в другом. Посмотри документацию по любому популярному фреймворку, там обязательно упоминаются htdocs и application, library и т. п.

                                            Может быть, у него код, как у «Конардо», где всё в кучу.
                                            Ответить
                                            • приведи реальный пример

                                              внутри htdocs может лежать двадцать php файлов и картинки рядом и .htaccess
                                              Ответить
                                              • Реальный пример фреймворка или «конардовского» сайта?
                                                Ответить
                                                • показать все, что скрытоvanished
                                                  Ответить
                                                  • Компании «Zend», которая выпускает «php», подойдёт?

                                                    В директории htdocs лежит единственный php-файл, а именно index.php, в котором ничего критического нет, только вызов bootstrap.php, который лежит вне htdocs.

                                                    Вот реальный пример из документации по первой версии фреймворка (специально выбрал самую старую), тут htdocs названа public:
                                                    https://framework.zend.com/manual/1.12/en/learning.quickstart.create-project.html
                                                    Ответить
                                                    • показать все, что скрытоvanished
                                                      Ответить
                                                      • «Zend Framework» требует перенаправления всех запросов к генерируемым страницам на index.php. Любой запрос, кроме статики, должен в итоге запускать index.php.
                                                        Ответить
                                                        • показать все, что скрытоvanished
                                                          Ответить
                                                          • Обычно так.

                                                            Интересно, для чего так делают. Чтобы в $_SERVER['DOCUMENT_ROOT'], $_SERVER['SCRIPT_NAME'], $_SERVER['PHP_SELF'] были определённые значения?
                                                            Ответить
                                                          • Сейчас глянул «Laminas» — наследник «Zend Framework 3»:
                                                            /**
                                                                 * Auto-detect the base path from the request environment
                                                                 *
                                                                 * Uses a variety of criteria in order to detect the base URL of the request
                                                                 * (i.e., anything additional to the document root).
                                                                 *
                                                                 * @return string
                                                                 */
                                                                protected function detectBaseUrl()
                                                                {
                                                                    $filename       = $this->getServer()->get('SCRIPT_FILENAME', '');
                                                                    $scriptName     = $this->getServer()->get('SCRIPT_NAME');
                                                                    $phpSelf        = $this->getServer()->get('PHP_SELF');
                                                                    $origScriptName = $this->getServer()->get('ORIG_SCRIPT_NAME');
                                                            
                                                                    if ($scriptName !== null && basename($scriptName) === $filename) {
                                                                        $baseUrl = $scriptName;
                                                                    } elseif ($phpSelf !== null && basename($phpSelf) === $filename) {
                                                                        $baseUrl = $phpSelf;
                                                                    } elseif ($origScriptName !== null && basename($origScriptName) === $filename) {
                                                                        // 1and1 shared hosting compatibility.
                                                                        $baseUrl = $origScriptName;
                                                                    } else {
                                                                        // Backtrack up the SCRIPT_FILENAME to find the portion
                                                                        // matching PHP_SELF.
                                                            
                                                                        // Only for CLI requests argv[0] contains script filename
                                                                        // @see https://www.php.net/manual/en/reserved.variables.server.php
                                                                        if (PHP_SAPI === 'cli') {
                                                                            $argv = $this->getServer()->get('argv', []);
                                                                            if (isset($argv[0]) && is_string($argv[0]) && $argv[0] !== '' && strpos($filename, $argv[0]) === 0) {
                                                                                $filename = substr($filename, strlen($argv[0]));
                                                                            }
                                                                        }
                                                            // дальше не влезает в комментарий

                                                            Ему не пофигу, где лежит index.php. Какой багор )))
                                                            Ответить
                                                            • > 1and1 shared hosting compatibility
                                                              Ебать… Слов нет.
                                                              Ответить
                                                              • 2020-й год. Они до сих пор шлифуют совместимость с шаред-хостингами...

                                                                Именно поэтому я за «PHP».
                                                                Ответить
                                                          • Всё, допёрло. Ты будешь ржать, когда узнаешь, как это всё работает и зачем класть index.php в htdocs.

                                                            В ZF есть свойство $this->basePath, через которое можно узнать путь к статике. Иногда этот путь требуется (например, когда нужно упаковать css- и js-файлы или что-то сделать с картинками). Так вот фреймворк определяет путь к статике по положению скрипта index.php. Как в первой версии ZF какой-то дурак предложил, так оно осталось и в ZF2, и в ZF3, и в Laminas.

                                                            Какой анскилл )))
                                                            Ответить
                                                            • Зачем? Зачем? Почему упаковкой жс занимается фреймворк, а не отдельная тула? Ещё поди и делает это время юзерских запросов?
                                                              Ответить
                                                              • Фреймворк упаковкой жс не занимается. Он тупой для этого. А вот сторонние библиотеки могут:
                                                                https://github.com/hobodave/bundle-phu
                                                                Ответить
                                        • показать все, что скрытоvanished
                                          Ответить
                                  • Выглядит как говно.
                                    Ответить
                      • >> Ну вот есть у меня старое говнецо, которое было заточено под мод пхп. И новое говнецо, которое было заточено под нгинкс+фпм.

                        В пыхе не так много функций, которые зависят от типа интерпретатора.

                        Специально для FastCGI всего одна функция:
                        https://www.php.net/manual/ru/function.fastcgi-finish-request

                        Она отдаёт страницу пользователю, но не убивает контекст, а позволяет доделать фоновую задачу.

                        Для запуска из-под «mod_php» есть пачка функций:
                        https://www.php.net/manual/ru/book.apache.php

                        Но они не особо нужны. Разве что если сайт использует и другие модули «Apache», например, для конвертации документов или ещё какой-нибудь питушни.

                        Есть ещё пачка функций для «IIS» и для какого-то «Netscape» (вообще не представляю, что это за сервер).

                        Всё, больше ничего серверозависимого нет. Разве что конфиг самого сервера (например, могут быть дурацкие файлы .htaccess, которые требуют «Apache»).
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • «пдіпх» поверх «Арасне» иногда имеет смысл: если у тебя дохрена статических файлов. Прямо так, что с одной страницы загружаются 100500 мелких файлов. Поскольку «пдіпх» более отзывчивый, чем «Арасне», он эти 100500 мелких файлов отдаст быстрее.

                            Зачем же тогда вообще нужен «Арасне»? Он нужен, только если проект использует какие-то нативные модули «Арасне», аналогов которых нет у «пдіпх», или файлы .htaccess, которые анскильная обезьяна не может перевести в конфиг «пдіпх». Всё, больше низачем.
                            Ответить
                            • ЕМНИП, в .htaccess можно было ещё напидорасить параметры из рнр.іиі, что делало миграцию ещё более весёлой...
                              Ответить
                              • Точно. Параметры рнр.іпі, отмеченные в документации флагом PHP_INI_PERDIR, можно переопределять через локальные файлы .htaccess.

                                Если у проекта куча точек входа, и каждая точка входа требует свои параметры рнр.іпі, то портировать его с «Арасне» на что-то другое нелегко. Придётся либо переносить настройку в рнр-файл (функция ini_set; в документации по параметру должен быть флаг PHP_INI_USER или PHP_INI_ALL), либо запускать несколько FastCGI-серверов, каждый со своими параметрами.
                                Ответить
                            • показать все, что скрытоvanished
                              Ответить
                          • > Это вообще бессмысленно
                            Это чтобы не шкварить прекрасный «Nginx» дерьмом вроде «PHP». А «Апач» можно, «Апач» и сам, скажем так, не самый качественный продукт.
                            Ответить
                        • Есть более веселая функция getallheaders(). В частности в шаблонизаторе верси 5.4 в "Apache" она не херила регистр хидеров, а в "FastCGI" - наоборот, при чем по-клоунски приводила к верхнему регистру первоый символ каждого слова. Т. е., например, хидер Kukarek-KoKo в первом случае возвращался как есть, а во втором - превращался в Kukarek-Koko, что доставляло много веселья обезьяне, которая забыла или не знала, что хидеры должны быть регистронезависимы.
                          Ответить
                          • Какой багор )))
                            Ответить
                            • Длинная, воронёная палка с крюком, коею работник костопального завода бойко шурует в горне, ворочая отработанные тела мною убиенных.
                              Ответить
              • Смотрите, что нашёл:
                https://www.php.net/manual/ru/book.htscanner.php

                Расширение заброшено в 2012-м году, поддерживает только PHP 5.3-5.6.
                Ответить
            • >> https://www.php.net/manual/en/install.fpm.php
              >> fpm

              FPM — это FastCGI process manager. FastCGI можно использовать с ним и без него. В первом случае детей рождает и убивает FPM, во втором случае детей рождает и убивает сервер («nginx», «lighttpd» и т. п.).
              Ответить
    • Блядь, как всё сложно. Именно поэтому «Конардо» против «ООП».
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • Есть реальные примеры языков для других извращенцев?
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • Да даже в джаве можно не лепить акцессоры, если ты не либу для других пишешь... Ну в чём проблема потом зарефакторить все точки, где поле используется? Да и часто ты реально писал какой-то код в геттерах?
            Ответить
            • В том, что скомпилированный с тобой код потом придется перекомпилировать.
              У Kotlin и C# таких проблем нет: там методы генерятся сами.
              Ответить
              • > перекомпилировать

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

                  Кстати
                  https://projectlombok.org/features/Data

                  В груви кстати тоже геттеры генерятся емнип.
                  class Vehicle {
                      String name 
                      String make
                      String model
                  }
                  Ответить
            • interface PostRepository
              {
                  public function save(Post $model);

              Не все знают, но в Йаже на методах интерфейса бублик можно не писать.
              Автовывод.
              Ответить
              • а как ты тогда в интерфейсе приватный метод объявишь?!
                Ответить
                • > в интерфейсе приватный метод
                  Звучит как форма онанизма у ООПушков.
                  Ответить
                • > в интерфейсе приватный метод
                  Оксюморон, да.

                  Но к этому я и подвожу.
                  Мудификаторы нахуй не нужны, если в языке уже есть интерфейсы.

                  Экспортировать из модуля методы через интерфейс (публичное).
                  Всё остальное делать видимым внутри мудуля (приватное).
                  Ответить
                  • Хотя вот подумал и понял что моя идея не такая и новая.
                    По сути выходят улучшенные .h-файлы с примесью ООП.
                    Опять всё лучшее придумано ещё в Сишке.
                    Ответить
                • >а как ты тогда в интерфейсе приватный метод объявишь?!

                  в жобе можно
                  Ответить
          • В пыхе есть проперти. Да, вместо $o->getTitle() можно сделать $o->title через геттер, если неохота давать прямой доступ к пельменной title.

            Примерно так:
            <?php
            class Post
            {
                protected $_id;
                protected $_title;
                protected $_content;
            
                public function __set($name, $value)
                {
                    switch($name) {
                        case 'id': $this->_id = $value; break;
                        case 'title': $this->_title = $value; break;
                        case 'content': $this->_content = $value; break;
                    }
                }
            
                public function __get($name)
                {
                    switch($name) {
                        case 'id': return $this->_id;
                        case 'title': return $this->_title ?: '';
                        case 'content': return $this->_content ?: '';
                    }
                }
            }


            Вообще мне ?:'' не нравится. Вместо этой питушни можно было установить дефолтные значения полей.

            Кстати, зачем в этой задаче геттеры и сеттеры? Почему нельзя поля сделать public, а не protected?
            Ответить
            • > Почему нельзя поля сделать public, а не protected?

              Потому что автор подсмотрел, что в джаве так делают, и тоже сделал. Мозга-то нету. Пыхер-с.

              Но даже в жобе есть Ломбок

              Ответить
            • Объектно-ориентированное вранье.
              https://www.youtube.com/watch?v=lfdAwl3-X_c
              Ответить
            • >Кстати, зачем в этой задаче геттеры и сеттеры? Почему нельзя поля сделать public, а не protected?

              Технически, так делают для защиты этих полей (данные можно проверять при их поступлении), тут это избыточно, говнокод.
              Ответить
      • Подтверждаю.
        >>> Post = namedtuple('Post', ['id', 'title', 'content'])
        >>> post = Post(42, 'PHPGOVNO', '«PHP» — govno')
        >>> post2 = Post(id=43, title='Hello', content='World')
        >>> post
        Post(id=42, title='PHPGOVNO', content='«PHP» — govno')
        >>> post2
        Post(id=43, title='Hello', content='World')
        Ответить
        • в пипи плохо то, что есть датакласс, а есть неймдтупл, и буй знает, что когда использовать.

          У джанги это вообще через атрибуты решено:
          class Petuh(django.Model):
              foo = models.CharField(..)
          
          Petuh().foo

          с помощью магии))
          Ответить
          • «namedtuple» — это именно named tuple, т.е. именованный иммутабельный (!) кортеж. Он максимально прост и туп, сложную логику в него не впихнуть.
            «dataclass» — более мощный, универсальный и новый (>=3.7, ЕМНИП) инструмент для создания, собственно, датаклассов с (опционально) сложной логикой.
            Ответить
            • а дикт с типизированым ключом?
              https://www.python.org/dev/peps/pep-0589/
              Ответить
              • Это для типизации, в рантайме такой дикт будет просто мутабельным dict-ом. В частности, его нельзя использовать в качестве ключа в другом дикте:
                >>> {'hello': 'world'}
                {'hello': 'world'}
                
                >>> {('hello', 1): 'world'}
                {('hello', 1): 'world'}
                
                >>> {['hello', 1]: 'world'}
                Traceback (most recent call last):
                  File "<stdin>", line 1, in <module>
                TypeError: unhashable type: 'list'
                
                >>> {{'hello': 1}: 'world'}
                Traceback (most recent call last):
                  File "<stdin>", line 1, in <module>
                TypeError: unhashable type: 'dict'
                
                >>> {Post(1, '2', '3'): 'world'}
                {Post(id=1, title='2', content='3'): 'world'}
                Ответить
                • > unhashable type

                  ёбаные анскилябры
                  Ответить
                • Эээ, а свою хеш-функцию никак нельзя напилить?
                  Ответить
                  • Можно, конечно (плюс надо __cmp__ или __eq__), но мутабельные ключи приведут к суровым баграм.
                    >>> class X:
                    ...     def __init__(self, x):
                    ...             self.x = x
                    ...     def __hash__(self):
                    ...             return self.x
                    ...     def __eq__(self, other):
                    ...             return isinstance(other, X) and other.x == self.x
                    ...
                    >>> x1 = X(1), x2 = X(2)
                    >>> d = {x1: 1, x2: 2}
                    >>> d[X(1)], d[X(2)]
                    (1, 2)
                    >>> d
                    {<__main__.X object at 0x000001DEE0EFB5B0>: 1, <__main__.X object at 0x000001DEE0F20E50>: 2}
                    >>> x1.x = 42
                    >>> d[x1]
                    Traceback (most recent call last):
                      File "<stdin>", line 1, in <module>
                    KeyError: <__main__.X object at 0x000001DEE0EFB5B0>
                    >>> d[X(1)]
                    Traceback (most recent call last):
                      File "<stdin>", line 1, in <module>
                    KeyError: <__main__.X object at 0x000001DEE0EFB640>
                    >>> d[X(2)]
                    2
                    >>> d[X(42)]
                    Traceback (most recent call last):
                      File "<stdin>", line 1, in <module>
                    KeyError: <__main__.X object at 0x000001DEE0F16100>

                    — ключ x1 испарился.

                    UPD:
                    >>> for key in d:
                    ...     print(d[key])
                    ...
                    Traceback (most recent call last):
                      File "<stdin>", line 2, in <module>
                    KeyError: <__main__.X object at 0x000001DEE0EFB5B0>
                    Ответить
                    • >но мутабельные ключи приведут к суровым баграм

                      Да. Не учёл.
                      Ну это общая проблема, инвариантная языку.

                      >>> x1.x = 42
                      Разве нельзя запретить его мутировать?
                      А коли нельзя, то человек сам виноват.

                      Кстати именно поэтому я за умолчательную немутабельность и модификатор var.
                      Ответить
                      • Странно, что питонобоги не дошли до того, что ключи словаря неплохо было бы копировать.
                        Ответить
                        • Это в крестах такие умные.

                          Жавашки к примеру так же обосрались, чему посвящена отдельная глава у Блоха.
                          Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • Кого-то парит расход памяти в скриптушне?
                            Великий kill приди, память освободи!
                            Ответить
                            • Ну кстати в php именно так и решали проблему циклических ссылок. Запрос закончится и всё уйдёт.

                              А в последней версии за каким-то хером прикрутили gc.
                              Ответить
                          • Это ж какого размера надо иметь словарь, чтобы копированием ключей засрать память.

                            Если ты про время жизни, то освободился словарь, вместе с ним грохнули и ключи.
                            Ответить
                        • В «Python» нет механизмов для копирования произвольных объектов, поскольку вся рахитектура построена на ссылках.
                          Ответить
                          • А модуль deepcopy?
                            Ответить
                            • This module does not copy types like module,
                              method, stack trace, stack frame, file, socket,
                              window, array, or any similar types.
                              Ответить
                          • В ObjC тоже всё построено на ссылках (кроме primitive types, естественно), но механизмы для копирования произвольных объектов есть.
                            Ответить
                            • Это при помощи «NSKeyedArchiver»? Выглядит не очень.
                              Ответить
                              • Да нет, NSKeyedArchiver это про сериализацию.

                                Копирование это NSCopying и @property(copy).
                                Ответить
                                • a copied NSArray doesn't copy its objects, so you might end up
                                  thinking that a @property(copy) NSArray<MyClass *> *myProperty
                                  is safe, however while the array itself is safe from being modified,
                                  the objects held by the array share the same reference. Same
                                  is true for any collection class (NSDictionary, NSSet, etc)

                                  Понятно.
                                  Ответить
                                  • Если ты хочешь deep copy, то её надо делать руками. Но всё для этого у тебя есть ¯\_(ツ)_/¯
                                    Ответить
                                    • Ну так и в «Python» можно всё руками копировать. Изначально-то речь шла про копирование ключей словаря, для которого нужна именно глубокая копия искаропки.
                                      Ответить
                                      • Я запутался.

                                        Ты сначала пишешь, что в Питоне нет механизмов копирования произвольных объектов, а теперь, что можно руками всё копировать. Это как?

                                        В ObjC тип, который ты хочешь использовать в качестве ключа в словаре, должен быть Equatable, Hashable и NSCopying. Все механизмы на столе. В питоне как?
                                        Ответить
                                        • > В питоне как?
                                          Питоновскому дикту нужны __hash__() и __eq__() (N.B.: про cmp в начале ветки напиздел). Ещё ключи нельзя менять, иначе будет багор — т.е. либо они должны быть иммутабельными, либо их никто не должен трогать.

                                          > Ты сначала пишешь, что в Питоне нет механизмов копирования произвольных объектов, а теперь, что можно руками всё копировать. Это как?
                                          Я про встроенные механизмы, вроде копирующего конструктора из крестов. Но да, тут я не совсем прав: для этого есть магические методы __copy__() и __deepcopy__(). Тем не менее, некоторые объекты (вроде перечисленных выше сокетов и файлов) глубоко скопировать нельзя.

                                          > В ObjC тип, который ты хочешь использовать в качестве ключа в словаре, должен быть Equatable, Hashable и NSCopying.
                                          А NSCopying зачем?
                                          Ответить
                                          • NSCopying это же как раз про метод copy(with: NSZone?), в котором ты собственно и реализуешь механику копирования.

                                            В обжективе ещё есть NSHashTable и NSMapTable. Там своя атмосфера:

                                            The hash table is modeled after NSSet with the following differences:

                                            - It can hold weak references to its members.

                                            - Its members may be copied on input or may use pointer identity for equality and hashing.

                                            - It can contain arbitrary pointers (its members are not constrained to being objects).
                                            Ответить
                                            • То есть в «ObjC» ключи в словаре копируются, но только поверхностно?
                                              Ответить
                                              • Зависит от твоей реализации метода copy. Если в нём ты все проперти тоже скопируешь, то будет deep. Если просто пробросишь в копию ссылки, то будет shallow.
                                                Ответить
                                                • Вообще звучит как просто лишний оверхед. Реальный пример (извини, синтаксиса «ObjC» не знаю):
                                                  x1, x2, x3 = ...  // Какие-то мутабельные объекты
                                                  list = [x1, x2, x3] 
                                                  dict = NSDict({list: "value"})

                                                  Теперь, если мы изменим x1-x3, то внутри словаря изменится и ключ со всеми полагающимися баграми.
                                                  Вот если бы словарь мог узнавать, когда его ключи меняются, тогда было бы интереснее.
                                                  Ответить
                                                  • Да, если мы говорим именно про коллекции в качестве ключей, то придётся попердолиться, потому что ты и сам привёл доку, что реализация копирования не deep.

                                                    С произвольным объектом всё немного проще.

                                                    > Вот если бы словарь мог узнавать, когда его ключи меняются, тогда было бы интереснее.
                                                    - я давно не ковырялся в ObjC, не могу сказать про такие тонкости. Чисто технически это возможно при помощи KVO/KVC, но вызовет ещё больший оверхед.
                                                    Ответить
                                                    • Именно поэтому я 1024-- за «иммутабельность». Копировать ничего не надо, сохранил ссылку — и до конца работы она у тебя не изменится.
                                                      Ответить
                                                      • Ну вот в Свифте есть разделение на struct/class и var/let. При этом требования к ключам по поводу соответствия NSCopying в нём нет.

                                                        Надо будет как-то поиграться с разными кейсами, как словарь будет эрогировать на такое.
                                                        Ответить
                                                        • Короче, в Свифте изменение объекта reference type, который является ключом в словаре, в большинстве случаев внезапно является UB.

                                                          Бриджинг между Dictionary и NSDictionary естественным образом накладывает некоторые ограничения на типы ключей.

                                                          Реализация протокола NSCopying не даёт ровным счётом ничего до того момента, пока класс не помечен как @objc. Если его пометить таким образом, то происходит копирование ключа в словарь и изменение изначального объекта не приводит к UB.

                                                          Нахуевертили, в общем.
                                                          Ответить
                                          • >Тем не менее, некоторые объекты (вроде перечисленных выше сокетов и файлов) глубоко скопировать нельзя

                                            Честно говоря трудно представить себе долбоёбов, которые ложат в качестве ключа открытые объекты сокетов или файлов.
                                            Ответить
                                            • > открытые объекты сокетов

                                              Ну удобно же. Можно быстро найти контекст по сокету, с которого пришёл пакет. Я на сишке так делал.

                                              Просто сравнивать надо ссылки на эти сокеты, а не их "содержимое". В джаве вроде так и делается по-умолчанию если ничего не перегружать?
                                              Ответить
                                              • >В джаве вроде так и делается по-умолчанию если ничего не перегружать?
                                                Да.

                                                >Просто сравнивать надо ссылки на эти сокеты, а не их "содержимое".
                                                Так зачем тогда «глубина»? Я же говорю сами объекты, а не ссылки.
                                                Ответить
                                  • показать все, что скрытоvanished
                                    Ответить
                                    • У тебя в сиське может быть массив указателей. Хочешь сказать, что и shallow copy, и deep copy одновременно здесь невозможны?
                                      Ответить
                                      • показать все, что скрытоvanished
                                        Ответить
                                        • Это не так только в тех языках, где программист вообще не касается проблемы value/reference. Питон такой язык, да
                                          Ответить
                                          • > вообще не касается проблемы value/reference
                                            > Питон такой язык
                                            Не-а. Проблемы value/reference не касаться можно только в полностью иммутабельном языке (1024-- приде, ссылочную прозрачность наведе!). А в «Python» ссылки на мутабельные объекты приводят к регулярным баграм. Классические питоньи ссылочные багры:
                                            >>> a = [3] * 3
                                            >>> a
                                            [3, 3, 3]
                                            
                                            >>> b = [[3, 3, 3]] * 3
                                            >>> b
                                            [[3, 3, 3], [3, 3, 3], [3, 3, 3]]
                                            
                                            >>> b[0][0] = 0
                                            >>> b
                                            [[0, 3, 3], [0, 3, 3], [0, 3, 3]]
                                            
                                            
                                            >>> def add_to_list(value, lst=[]):
                                            ...     lst.append(value)
                                            ...     return lst
                                            ...
                                            >>> a = [1, 2, 3]
                                            >>> add_to_list(4, a)
                                            [1, 2, 3, 4]
                                            >>> add_to_list(5, a)
                                            [1, 2, 3, 4, 5]
                                            >>> add_to_list(1)
                                            [1]
                                            >>> add_to_list(2)
                                            [1, 2]
                                            >>> add_to_list(3)
                                            [1, 2, 3]
                                            Ответить
                                            • Ок, согласен. Плохо уже помню все питонячьи багры.
                                              Ответить
                                              • >Плохо уже помню все питонячьи багры.
                                                Багры от мутабельных ссылок есть во всех языках, где эти мутабельные ссылки используются.

                                                Например С# (там же упоминание точно такой же траблы в js):

                                                http://govnokod.ru/11946
                                                Ответить
                                            • Если пример с умножением так себе: перед использованием надо просто почитать как оно «умножает». Это при всём моём неуважении к Питуху.

                                              Но вот это просто багор классический:
                                              >def add_to_list(value, lst=[]):

                                              Сколько раз говорилось: сделайте скриптуху с умолчательной немутабельностью.
                                              Может это сильно и не помогло бы.

                                              А может программеру пришлось бы писать:
                                              > return append(lst,value);
                                              Или явно копировать объёкт.

                                              В любом случае избавило бы от проёбов типа
                                              a=42
                                              ...
                                              ...
                                              ...
                                              ...
                                              ...
                                              ...
                                              a="koko"

                                              И не сильно бы выбешивало, т.к. 80-90% переменных в методе обычно не меняются.
                                              Ответить
                                            • >Проблемы value/reference не касаться можно только в полностью иммутабельном языке (1024-- приде, ссылочную прозрачность наведе!)

                                              Плюс там не будет циклической питушни.

                                              Поэтому помимо отсутствия ссылочных проблем, бонусом идут ARC-friendly структуры данных, отстутствие зацикливания при сериализации и ненужность tracing gc.

                                              Минус конечно, это постоянная борьба с немутабельностью.
                                              Ответить
                                    • Подтверждаю.
                                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                      • Общее rule of thumb — совать в ключи только иммутабельные объекты. С точки зрения доки (выделение моё):
                        >>> A mapping object maps hashable values to arbitrary objects.
                        >>> An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __eq__() method). Hashable objects which compare equal must have the same hash value.
                        Ответить
    • Блядь, а использование этого уёбища ещё смешнее:
      $post = new Post();
      $post->setTitle('Title');
      $post->setContent('...');
      $repo->save($post);

      Сразу представил, как аффтар будет делать «модель» с десятком свойств.
      Ответить
      • какая последовательная и аккуратная мокака.

        Он небось еще и круды руками пишет все
        Ответить
    • показать все, что скрытоvanished
      Ответить
      • На самом деле в «PHP» можно так:
        $petuz = new Petuz(['iq' => 12, 'id' => 654]);

        Безо всяких setIq, setId.

        Правда, придётся в кокококонструкторе сделать чуть-чуть бройлерплейта.
        Ответить
        • А в сишечке не придется.

          Бля, что с этим миром не так?! Структура с полями, инициализируемая сразу -- самое частоиспользуемое, самое родное, почему его нету из коробки в половине скриптухов кроме lua и js?
          Ответить
      • Разве в C89 так можно было?
        Ответить
        • может, ты и прав; но в c99 уже точно

          кста
          в objc же были @property, там руками тоже можно было не пусать сеттеры и геттеры

          или я пута.ю?
          Ответить
          • Да. И там можно заодно навесить атрибуты weak/strong, atomic/nonatomic, assign/retain/copy.
            Ответить
            • А когда появились, кстати? Кажется, что они были еще во времена NeXT
              Ответить
      • А чо тебе, кстати, не нравится.

        Мы тут огненно тёрли за инкапсуляцию как-то и пришли к выводу, что это вообще МАСТХЕВ, вот в твоей сисечке все поля видны, как пизда у молодой училки, а в пыхе поменял приват на vixenпротектед и gost доволен
        Ответить
      • > низкоуровневый язык си
        > высокоуровневый язык пхп
        Вот сам хотел такой коммент написать.
        Ответить
    • руби решает это с помощью опенсрухт еще
      Customer = Struct.new(:name, :address) do
        def greeting
          "Hello #{name}!"
        end
      end
      Ответить
    • То есть в «ЙАЖЕ» такое говном не считается?
      Ответить
      • Нет. Это хороший, идиоматичный код на «ЙАЖА».
        https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition
        Ответить
        • >if the number is divisible by 3
          >if the number is divisible by 5
          Кстати хорошая идея для модулей npm
          Ответить
      • >То есть в «ЙАЖЕ» такое говном не считается?

        В 2к20 считается.

        @lombok.Data
        class Post
        {
            String id;
            String title;
            String content;
        }
        @Data is a convenient shortcut annotation that bundles the features of @ToString, @EqualsAndHashCode, @Getter / @Setter and @RequiredArgsConstructor together
        In other words, @Data generates all the boilerplate that is normally associated with simple POJOs (Plain Old Java Objects)
        Ответить
    • Заржал на этом:

      > Под формулировкой "Модель — это исключительно бизнес-логика" подразумевается что модель — отражает сущности, данные и поведение предметной области, и никак не касается данных и объектов сервисного слоя и слоя приложения.

      protected $comments;
          protected $addComments = [];
          protected $removeComments = [];


      какой бизнес-объект без протекающих абстракций ))))
      Ответить
      • По поводу терминологии ему там, кстати, полную защёку накидали в комментариях.
        Ответить
      • catch (Throwable $e) {
            $this->rollbackTransaction();
            throw $e;
        }


        действительно, кому нужен finally
        Ответить
    • Афффтар убейся ап стену, как ты предлагаешь это реализовывать ?
      Ответить
    • Оффтоп.
      Пайтух такой пайтух.
      Нужно было поставить pip-модуль, pip install сломался.
      Сообщает что «пайтух не может снести яйцо»:
      Command "python setup.py egg_info" failed with error code 1

      Решение нашлось быстро:
      https://stackoverflow.com/questions/35991403/pip-install-unroll-python-setup-py-egg-info-failed-with-error-code-1
      https://stackoverflow.com/questions/32068325/python-setup-py-egg-info-failed-with-error-code-1


      И оказалось «тривиальным».
      Your setuptools do not appear to be installed. Just follow the Installation Instructions from the PyPI website.
      
      If it's already installed, try
      
      pip install --upgrade setuptools
      
      If it's already up to date, check that the module ez_setup is not missing. If it is, then
      
      pip install ez_setup
      
      Then try again
      
      pip install unroll
      
      If it's still not working, maybe pip didn't install/upgrade setup_tools properly so you might want to try
      
      easy_install -U setuptools
      
      And again
      
      pip install unroll

      БЛЯТЬ, МОЖНО БЫЛО ЗДЕЛАТЬ ЧТОБЫ РАБОТАЛО БЕЗ ПАЙТУШНИ И ПЕРДОЛИНГА??!!!
      Ответить
      • Именно поэтому я за «PHP».
        Ответить
        • Причём помогла первая строчка.

          >pip install --upgrade setuptools

          Из чего я делаю вывод что отребье било себя в грудь: «дак мы же как Сишка», «у нас тоже есть пакетный минетжер».

          А по факту не осилили простейший dependency resolver.
          Ответить
          • Проверил. Выполнил все строчки джва раза. «unroll» не ставится. Он сломан: во-первых, он пытается качать старую версию пакета «distribute» (0.6.14, которая несовместима с новым «Питоном», когда есть свежая 0.7.x), во-вторых, он её пытается качать по http:, а pypi.org недавно полностью перешёл на https:.

            Через easy_install новая версия «distribute» ставится, но «unroll» опять ставиться отказывается.
            Ответить
            • Какая пайтушня )))
              Ответить
              • Нашёл ошибку.

                «unroll» хочет устанавливаться только через «ez_setup», а «ez_setup» не обновляли с 2010-го года, т. е. уже десять лет. За это время некоторые ссылки на pypi.org стали недействительными.

                Чтобы поставить «unroll» в 2020-м году, нужно патчить пакет «ez_setup».
                Ответить
                • «ez_setup» ещё рассчитан на работу только с tar.gz, а «distribute» сейчас распространяется только в zip-файле.

                  Короче, там весь пакет переписывать надо.
                  Ответить
          • Выкиньте к чёрту этот «unroll». В нём сломано всё, включая документацию. Ну какой мудак написа́л следующие строки?
            Unroll can be installed by unzipping the source code in one directory and using this command:
            ::
                
                (sudo) python setup.py install
            
            You can also install it directly from the Python Package Index (PYPI_) with this command:
            ::
                    
                (sudo) pip unroll install
            Ответить
            • sudo ебись сам
              Ответить
              • pip unroll install
                ERROR: unknown command "unroll"


                Ну что за макаки!
                Ответить
                • да руками заанролль, чай не впервой-то
                  Ответить
                  • Да! И пожелай ты нам ни пуха, ни пера!
                    Да! Пусть не по правилам игра!
                    Ответить
      • easy_install, ez_setup

        всегда радовала эта хуйня
        Ответить
        • Я посмотрел, «ez_setup» не обновлялся с 2010-го года. Сейчас он уже бесполезен.
          Ответить
          • Я посмотрел, «питух» не сохранял обратную совместимость с 2010 года. Сейчас он уже бесполезен.
            Ответить
      • Куик! Пердолинговый инженер на связи.

        У меня пакет «unroll» установился. Мои действия:

        1. Если по глупости поставили «ez_setup», удаляем:
        pip uninstall ez_setup

        2. Скачиваем и распаковываем пакет «unroll» в чистую директорию:
        wget https://pypi.python.org/packages/source/u/unroll/unroll-0.1.0.tar.gz
        tar xzf unroll-0.1.0.tar.gz

        3. Переходим в директорию unroll-0.1.0 и из файла setup.py нахрен удаляем первые две строки:
        import ez_setup
        ez_setup.use_setuptools()
        Остальные строки оставляем.

        4. Собираем и устанавливаем «колёса»:
        pip wheel .
        pip install .


        Всё, «unroll» установлен.

        Ну что за обезьяны на «SO»? По нескольку раз вслепую повторяют бессмысленные команды вместо того, чтобы решить проблему.
        Ответить
        • P.S. MAKAKA, как всё-таки правильно чинить в такой ситуации?

          У меня два варианта:
          1. Искать в файле «setup.py» в сломанных пакетах строчки, упоминающие «ez_setup», и удалять.
          2. Написать фейковый модуль «ez_setup», состоящий из метода «use_setuptools», который ничего не делает.
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • >правильный способ это не использовать пакеты, которые ставятся через ez_setup:

              Правильный способ это не использовать питуха.

              Пайтух-гермафродит не нужен.
              Ответить
              • А на чем скриптовать? На хаскеле?
                Ответить
                • Питух — это даже не скриптуха, в классическом понимании. Это обёртка над Сишкой.

                  Некроссплатформенная, непортируемая, тормозная скриптуха с торчащими нативными костылями.

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

                  С нодушков здесь все смеялись, за то что пишут свои sshи.

                  А в это время анскильная Питухомразь просто ворует сишные либы.
                  Ответить
          • показать все, что скрытоvanished
            Ответить
            • Спасибо. Там ещё интересная ссылка:
              https://packaging.python.org/discussions/wheel-vs-egg/

              Колёса появились в 2012-м году. Т. е. вся эта питушня с «изяинсталлом» была актуальна до 2012-го года (точнее, до того года, когда перестали распространять «яйца»).
              Ответить
              • Easyinstall, distutils, setuptools, pip, какие-то колёса и яйца... Сколько всякой хуйни нужно знать, чтобы просто поставить пакет.
                Ответить
                • Ну вы же ноете, что в С++ нету пакетных манагеров, вот вам манагеры
                  А еще есть pyenv и poetry

                  Ах да, и к яйцам с колесами не забудьте sdist
                  Ответить
                  • Но почему надо каждые 5 лет выбрасывать все старые наработки и начинать юзать какую-то новую хуйню, которую через 5 лет тоже выбросят на помойку? Почему что-то одно нельзя довести до ума?
                    Ответить
                    • Ну вы же зудите, что в С++ много говна, для совместимости с кодом 1985-го года.
                      Вот вам переписывание Правильно.

                      Кстати: из твоего списка выкинули тока Easyinstall и яйца
                      Ответить
                      • distutils тоже задепрекейтили и он отстал от жизни.
                        Ответить
                        • кууик?

                          разве setuptools не работает поверх distutils?
                          Ответить
                          • Я не ебу как оно работает. Но в прошлом треде про сборку под винду советовали юзать setuptools вместо distutils. Типа там проблем со студией не будет.
                            Ответить
                            • distutils -- dpkg
                              setuptools -- apt

                              ясна ли аналогия ?:)
                              Ответить
                              • > setuptools - apt

                                А pip тогда что?
                                Ответить
                                • показать все, что скрытоvanished
                                  Ответить
                                  • А вот в D есть только dub и все споры около формата описаний пакетов - json или sdl
                                    Ответить
                                    • sdl это поди на самом ди?
                                      Ответить
                                    • Попахивает пиздецом.

                                      Формат описания пакетов это некая спека. При чём тут формат данных, в котором она будет храниться? Сколько интерфейсов напишут, столько тулза таких форматов и примет.

                                      Ничему никого жизнь не учит. А ещё называются домом высокой культуры быDа!
                                      Ответить
                    • Это потому что в «Python» пролезли вебмакаки. У вебмакак же старую хуйню принято вообще раз в полгода заменять на новую.
                      Ответить
                      • Потому что они мололые/гррячие и им проще переписать, чем доки читать. И статью на хабре писнуть про свое "изобретение"
                        Ответить
                        • Можно ещё параллельно иметь две стандартные либы евпочя
                          Ответить
                        • ну вот там старый и холодный питух из Яндекса тоже сказал, что всё любит с ноля сам писать. Видимо он (как и милениалы) не умеет читать более трех предложений подряд, а по видео на утюбе существующие либы не изучить. Приходится изобретать свое
                          Ответить
                          • А может постиг дзен и понимает, что все реализации говно, и что переписать - это меньшее из зол.
                            Или хочет показать малышне кто тут батя.
                            Ответить
                            • > переписать - меньшее из зол

                              Своё говно не воняет, угу.

                              Но вообще он там писал про какие-то совсем уж дикие кейсы когда numpy целиком тащат ради NaN и т.п.
                              Ответить
                  • >> Ах да, и к яйцам с колесами не забудьте sdist

                    Звучит как название книги. Что-то типа «Гарри Поттер и яйца на колёсах».
                    Ответить
                    • > Гарри Поттер и яйца на колёсах
                      В то время считалось, что питушиные яйца используют ведьмы для приготовления колдовских скриптов.

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

                      Но посонов такие доводы не убедили. Питуха, как еретика, сожгли на костре вместе с яйцом.

                      В XXI веке голландский ученый доказал, что птица, болеющая инфекционным заболеванием, может непроизвольно поменять версию со 2ой на 3ю.
                      Ответить
                • Выходит я в питоне не силен, т.к. пользовал только pip и колеса
                  Ответить
                  • > не силён

                    Ну скорее юзал свежие и популярные либы, которые из коробки работают и не надо лезть под капот.
                    Ответить
                  • Подтверждаю, ужосы ко-ко-кокие-то. У меня самым большим пердолингом была ручная сборка нативной либы «PyAudio»: колеса не было, а автоматически оно не собиралось из-за отсутствия каких-то библиотек (которые оно, разумеется, по принятым в венде традициям ожидало видеть в «XYZ:\dev\build\june1998\libs\hujlib.lib »).
                    Ответить
                    • Какой багор )))
                      Ответить
                    • Создай диск XYZ: с помощью кококоманды subst, в нём насоздавай симлинков на нужные библиотеки.

                      P.S. Кому-нибудь приходилось использовать команды JOIN, APPEND и MKLINK?
                      Ответить
                      • В венде у диска может быть только одна буква. Тяжёлое наследие досового режима.

                        «mklink» пару раз юзал, но параметры, естественно, забыл все.
                        Ответить
                        • Причём есть проблема, если кококоличество дисков не укладывается в 26.

                          В каких-то реализациях «DOS», если не задать «LASTDRIVE Z», для дисков с номерами после 26 назначались «буквы» [, \, ], ^, _, `, которые не принимали многие программы (бэкслэш уж точно никто не принимал).
                          Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • И с этим был связан какой багор в первых выпусках «NT».

                            В «DOS» у каждого диска свой текущий каталог. Я, например, делаю так:
                            c:
                            cd NC
                            d:
                            cd WORKDIR
                            c:
                            Вернувшись на диск C:, я вернусь в директорию NC, потому что последняя команда cd изменила текущую директорию только у диска D:.

                            В «NT» же сначала сделали глобальную текущую директорию. Т. е. после команд c: и cd NC текущей будет директория \DosDevices\C:\NC. Глобально. Изменение текущей директории на диске D: её сбросит.

                            Чтобы досовские батники работали в «NT», пришлось прикручивать костыль: теперь в енвиронменте создаются «скрытые» пельменные, имена которых начинаются со знака равенства, хранящие адрес текущей директории на каждом диске. Следующая команда их покажет:
                            SET =
                            Ответить
                            • > у каждого диска свой текущий каталог

                              Зачем? Зачем? Малость было места на дисках, поэтому юзали отдельный диск под каждую задачу?
                              Ответить
                              • сидишь ты такой в досе
                                cd a:\foo\bar\buz
                                a:\foo\bar\buz>
                                cd c:\buz\foo\bar
                                c:\buz\foo\bar>
                                a:

                                где ты должен оказаться?
                                Ответить
                                • > a:

                                  А вот кстати, это случаем не со времён, когда у доса не было каталогов пришло?

                                  Типа раньше я мог копировать a:1.txt в b:1.txt. Потом в дос завезли каталоги, но я не хочу ничего менять. Поэтому я могу сфокусировать каждый диск на нужный каталог и продолжать копировать a:1.txt в b:1.txt.
                                  Ответить
                                  • что именно?
                                    переключение диска? ну да, с тех пор.
                                    Были два диска: A: и B: (два дисковода на 360 что-ли килобайт).

                                    Каталоги завезли где-то в районе третьего доса что-ли
                                    Ответить
                                    • > что именно

                                      1) переключение диска через a:
                                      2) обращение к текущему каталогу на диске a: как a: (без слеша)
                                      Ответить
                                  • Да, в DOS 1.0 не было каталогов вообще. Точнее, у каждого диска была ровно одна директория: корневая.

                                    Только в DOS 2.0 в файловую систему завезли атрибут «директория», чтобы директории были не только корневыми, и у файловых функций добавили разделитель поддиректорий (почему-то выбрали бэкслэш).
                                    Ответить
                                • a:\foo\bar\buz> cd c:\buz\foo\bar
                                  c:\buz\foo\bar>


                                  Стоп. А разве это так работало?
                                  По-моему оно оставляло на диске А.
                                  Ну были там какие-то багры со сменой диска, что нужно писать
                                  C:
                                  А потом уже cd
                                  Ответить
                                  • Да, кстати, cd c:\buz\foo\bar сменит текущую директорию на диске c:, но не сменит текущий диск. Ты останешься на том же диске, на котором был, хотя на другом диске директория сменится.
                                    Ответить
                                    • >cd c:\buz\foo\bar сменит текущую директорию на диске c:, но не сменит текущий диск
                                      Ага, что-то в этом духе.
                                      Я помню что там было просто выбешивающее поведение.
                                      Ответить
                                      • > было

                                        Почему было? Оно и в десятке точно такое же выбешивающее.
                                        Ответить
                                        • Подтверждаю. Чтобы переключить диск — надо добавить флаг «/D».
                                          А вот в «Powershell» это говно исправили. Именно поэтому я за «Powershell».
                                          Ответить
                                        • >Почему было
                                          Потому что я давно уже виндой не пользовался. Вдруг починили.

                                          >Оно и в десятке точно такое же выбешивающее.
                                          Какой CHDIR )))
                                          Ответить
                                  • Вроде работало. Но если и нет, ты мог потом переключиться на "C:".

                                    Важно, что у каждого диска был свой каталог. Во всяком случае, в DOS 6.22
                                    Ответить
                                    • cd не переключает текущий диск. Для смены текущего диска придётся явно вводить команды c:, a: и т. п.

                                      Итого у нас два уровня текущей питушни:
                                      1. Глобальный переключатель текущего диска.
                                      2. На каждом диске переключатель текущей директории.
                                      Ответить
                                      • но у каждого диска в любом случае был свой текущий каталог
                                        Ответить
                                    • Попробовал в вайне
                                      $ wine cmd.exe
                                      Z:\>cd C:\Windows
                                      
                                      Z:\>C:
                                      
                                      C:\windows>
                                      То есть эта питушня даже не баг, но фича.
                                      Коли уж вайн так себя ведёт.
                                      Ответить
                                      • Архитектурное решение, принятое 40 лет назад для совместимости с первыми версиями dos.
                                        Ответить
                            • Кстати, а что будет если я в своей NT'шной проге попытаюсь открыть "d:1.txt"? CreateFile полезет в переменные окружения и посмотрит какой каталог на диске d сейчас текущий?
                              Ответить
                          • >или прикрутить его поапкой в другой диск (как в уникс)

                            Вроде это появилось только со времён 2K/XP. И вроде на NTFS. Но это не точно.

                            Кстати там свои приколы были.
                            Я вот точно не помню, но кажется когда-то ловил глюк с местом. На одном диске место было достаточно, а на другом мало.
                            А при копировании, встроенный в винду чекер свободного места тупил и выдавал окно что на диске мало места.
                            Ответить
                          • >Обращаться к диску можно по полному имени объекта
                            Можно папку было переименовать в хитрый UUID, и тогда вместо её содержимого эксплорером открывалась например Панель Управления.
                            Причём если переименовать папку обратно, то все данные в ней естественно оставались.
                            Ответить
                            • Ну это чисто фишка проводника. Для всех остальных это самая обычная папка. Как и корзина, в которой можно было хранить что-то своё.
                              Ответить
                              • Проводник вообще путает пользователей. Из него может сложиться ложное впечатление, что «Рабочий стол» в иерархии ФС находится выше дисков и даже выше компьютера.
                                Ответить
                              • С помощью этой питушни можно было прятать файлы, т.к. рядовой пользователь обычно использует Проводник.
                                Ответить
                              • Потому Макака за Far
                                Ответить
                            • Причём CLSID должно быть только расширение имени, а не имя целиком.

                              Ты можешь в одной папке создать подпапку с именем
                              pituh.{645FF040-5081-101B-9F08-00AA002F954E}
                              и подпапку с именем
                              kurochka.{645FF040-5081-101B-9F08-00AA002F954E}

                              В «Проводнике» обе будут отображаться как корзина.
                              Ответить
                              • Причём если в настройках «Проводника» стоит галочка «скрывать расширения для зарегистрированных файлов», то «чайники» ничего не заподозрят.

                                Кстати, для корзины есть такой раздел реестра:
                                HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellext

                                Там есть подразделы ContextMenuHandlers и PropertySheetHandlers. Похоже, что именно в них указано, какому обработчику делегируем показ этой папки.

                                Вот тут что-то про эту питушню написано:
                                https://docs.microsoft.com/en-us/windows/win32/shell/handlers
                                Ответить
                                • Я к тому что так можно было делать папки, которые выглядят как диски.
                                  Ответить
            • >зы; Изя Инсталл нужен только чтобы ставить яйца.
              >Но яйца не нужны: все давно перешли на колёса. Колёса ставит пип-инсталлер.

              Вооо. Теперь понятно и по делу.
              Ответить
              • Кто жаловался, что в «Windows» питоньи колёса собирать тяжело? Внимание! Вот официальная инструкция по сборке нативных расширений «PHP»:
                https://wiki.php.net/internals/windows/stepbystepbuild

                В «Линуксе» всё просто: phpize; ./configure; make
                Только перед этим нужно поставить пакет «php-dev» через «apt-get» или какой-нибудь другой пакетный менеджер. Возможно, даже команды phpize... запускать не придётся, их запустит сам «pecl».

                В «Windows» же нужно:
                1. Cоздать директорию «php-sdk».
                2. В неё распаковать предварительно скачанный архив «php-sdk-binary-tools.zip».
                3. В этой директории создать «phpdev» с кучей поддиректорий.
                4. В нужную поддиректорию распаковать «deps-5.6-vc11-x86.7z» или типа того (цифры зависят от версии «PHP», от того, какой версией «MSVC» её собирали и от разрядности процессора).
                5. В нужную поддиректорию распаковать исходники самого «PHP».
                6. Запустить «Visual Studio Command Prompt», чтобы установить необходимые переменные окружения.
                7. Перейти в директорию «php-sdk» и запустить «bin\phpsdk_setvars.bat».
                8. Перейти в директорию с исходниками «PHP» и запустить «buildconf».
                9. Вот теперь можно начинать компилировать расширения.

                Т. е. разработчикам «PHP» было лень даже написать тупой инсталлятор, который раскидает части SDK по нужным директориям.
                Ответить
                • >В «Линуксе» всё просто
                  Именно поэтому я за «Линукс».

                  В виндах исторически багры с любой свободушней, которая в Луниксе ставится простым apt/yum/... install.
                  То mingw надо, то работает хуёво, то с поддержкой POSIXa проблемы.

                  >распаковать предварительно скачанный архив «php-sdk-binary-tools.zip».
                  >>>Вот именно поэтому я за «Линукс».
                  Ответить
                  • > которая в Луниксе ставится простым apt/yum/... install
                    pacman -S
                    yaourt
                    Ответить
                  • Кстати да, угараю всегда, когда смотрю как виндузятники ебутся с банальным git.
                    Ответить
                    • Многие люди, особенно девелоперы, массово переходят на Луникс именно из того что там гораздо меньше ПЕРДОЛИНГА.
                      Не нужно ставить дрова, не нужно собирать зипованные какашки по файлопомойкам, не нужны кряки с ви-руснёй.

                      Потому M$ и пилит свои WSL 1/2.

                      Кстати зацени: https://www.phoronix.com/scan.php?page=news_item&px=Microsoft-DXGKRNL-Uphill-Battle
                      Ответить
                    • А. И вот ещё
                      [u]https://www.phoronix.com/scan.php?page=news_item&px=Microsoft-Writing-Wayland-Comp[u]

                      Там занятный срач:
                      https://www.phoronix.com/forums/forum/linux-graphics-x-org-drivers/wayland-display-server/1180655-microsoft-is-writing-its-own-wayland-compositor-as-part-of-wsl2-gui-efforts

                      Особенно я орнул с этого:
                      Actually now that I am thinking more about it, MS does not want to be a software company anymore, but a service/infrastructure provider.
                      
                      MS IE/Edge engine abandoned => switched to using Chromium with a thin layer of MS buttons and bookmarks ontop
                      
                      Silverlight, Windows Forms, Windows GUI abandoned => switched to electron and javascript
                      
                      Visual Studio abandoned => switched to visual studio code after buying the Atom development (which uses electron/js underneath) and adding nice colors to it
                      ​​​
                      SourceSafe/ ms team services abandoned => switched to git
                      
                      PowerShell abandoned => switched to bash/ssh through WSL
                      
                      Windows Phone abandoned => switched to some thin android apps like an android launcher or calendar app than having a whole OS
                      
                      .NET framework abandoned => switched to dotnet core coupled with an ngingx+linux hosting/proxying, because who in their right mind would use Microsoft IIS webserver afterall.
                      ​​​​​​
                      
                      Windows kernel (very soon I guess) abandon=> switch to linux kernel in the future because the win kernel is underperformant and undocumented and nobody knows how it works. Instead provide a "compatibility" layer so all these directx proprietary software can still run ontop of the ms-linux kernel.
                      
                      It will not surprise me at all if MS announces jn short term, that Win10 is going to abandon NTFS and ReFS in favour of ZFS or ext4.
                      Ответить
                      • Ещё в новых «Visual Studio» рядом с «MSVC» зачем-то кладут «Clang». Зачем? Зачем? Они хотят в будущем отказаться от «MSVC» и кладут «Clang», чтобы виндопогромисты привыкали?
                        Ответить
                      • Нихуя себе профессианальная аналитика!
                        Ответить
                        • А вдруг правда?

                          После таких знаков Аппокалипсиса как нарушение Emacsом GPL, Microsoft Loves Linux, посещения Столлманом ИХ штаб-квартиры я уже ничему не удивлюсь.

                          Тем более тому что мелкомягкие решать сэкономить на индусах портирующих винду на армы, и просто прикрутят к очередной десятке бекэнд линукс-кернел с вайном.
                          Ответить
                      • показать все, что скрытоvanished
                        Ответить
                      • Офтопик. Какой багор из-за несовместимости «MSVC» с «gcc»:
                        https://gist.github.com/Orvid/5c9bc8c54e960a604968

                        35 пунктов.
                        Ответить
                        • P.S. Все заметили, что после пункта 14 идёт пункт 3?
                          Ответить
                  • Иногда бывает и наоборот: в «Винде» свободушня, портированная самым наглым и тупым способом, работает быстрее и стабильнее, чем исконно виндовая питушня, завязанная на DDE, OLE, COM, COM+, DCOM, ActiveX, RPC и прочие баззворды.
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • В Луниксе своей оверинжинирной перепитушни хватает. Взять тот же «d-bus»

                        «systemd» например никуда толком не портирован.
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • > OLE/COM/ActiveX это была очень крутая идея

                            Да. OLE/ActiveX был прикольный. И в браузере можно было лепить аналог ява-апплетов.

                            Просто во-первых у них был целый зоопарк всяких технологий: DDE, MFC, ATL, ... От самого списка ехала крыша.

                            А во-вторых, ихнее RPC DCOM/ActiveX мало того что было сложным, так ещё и дырявым как решето. Фактически позволяя выполнять удалённо любой код.
                            Ответить
                          • @Другой вопрос, что система получилась архисложная, а чем сложнее питушня -- тем выше шансы соснуть хуйца

                            Вряд ли кто-то захочет поместить свой детородный орган в рот больного ОРВИ.
                            Ответить
                  • А вот у этих чуваков и в «Винде» всё собирается в автоматическом режиме (см. вкладку «Console», где видно запуск всех необходимых скриптов):
                    https://ci.appveyor.com/project/tideways/php-profiler-extension/build/1.0.139/job/pearxy1oq923u2v0


                    Проблема «PHP» в том, что компания «Zend» не посчитала нужным собрать инсталлятор для «Windows». Типа хороший парень сам инсталлятор соберёт, если нужно.
                    Ответить
    • Даже просить перевести на "PHP" не надо
      Ответить
    • показать все, что скрытоvanished
      Ответить

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