"PHP" / Говнокод #26746 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

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

    • Мудификаторы стоило запретить нахуй.

      >protected
      >public

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

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

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

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

      >Если честно, я не понимаю откуда столько негатива.
      ахахахах
      Ответить
      • Ну видимо с апачем ему привычнее. В нгинксе то только через fastcgi можно привернуть php?
        Ответить
        • Я не спец в PHP, но кажется, что да. Причем это рекомендуемый способ.
          Про него даже Конардо знает:
          https://www.php.net/manual/en/install.fpm.php

          Во-первых он безопаснее: у тебя PHP в отдельном процессе, и тебе пофиг какой там CRT Apache.
          Во-вторых Apache не нужен вообще.
          И наконец если уж ты взял Apache + mod_php, то нахуя тебе еще n ginx?
          Ответить
          • Ну у него там на картинке нарисовано ".htaccess тоже бывает нужен". Т.е. видимо какое-то жуткое легаси запускает, поэтому и апач. А нгинкс для статики и кода посвежее.
            Ответить
            • так зачем nginx тогда ему?
              у него типа локально apache Тормозит для статики? серьезно?
              Ответить
              • Да х.з., я ж не спец в пхп. Но мне кажется, просто чтобы обе модели были доступны. Чтобы не пердолиться с портированием с апача на нгинкс/фпм и обратно. А просто запускать и течь.

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

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

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

                    У меня совсем-совсем проблем не будет при запуске их на противоположной конфигурации? Идеальная совместимость и никаких подводных камней? Не верю.
                    Ответить
                    • Он НЕ запускает никакой код через нгинкс+фпм.
                      Он запускает ВЕСЬ код через apache+mod_php.

                      А сверху запускает nginx в качестве forward proxy.
                      Это как если бы ты запустил перед apache squid или nginx.
                      Ответить
                      • Ну может чтобы ближе к продакщен конфигу было, чтобы с настройками нгинкс поиграться и т.п.?
                        Ответить
                        • Он ничего не знает про продакшен, и прямо про это говорит

                          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.
                              Ответить
                                • ну да, это чтобы ты случайно не считал .htaccess через nginx.
                                  Локально.
                                  Ответить
                              • > location ~ \.(jpg|jpeg|gif|png|ico|css|
                                Блядь, а это вообще нормальный способ отдавать статику? Не первый раз вижу такую волшебную строчку, но терзают меня смутные сомнения…
                                Ответить
                                • Ну видимо он там запускает традиционный код на пхп где всё в кучу. Поэтому тупо раздать всю папку нельзя, надо пердолиться с фильтрами.
                                  Ответить
                                  • Именно по этому я за джангу.

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

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

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

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

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

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

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

                                                    то-есть разделить по папкам все таки не получится: придется писать в конфиге nginx обработку php файла и стат файлов отдельно, а еще закрывать .htaccess, который тоже наверняка там рядом лежит.

                                                    Верно?
                                                    Ответить
                                                    • «Zend Framework» требует перенаправления всех запросов к генерируемым страницам на index.php. Любой запрос, кроме статики, должен в итоге запускать index.php.
                                                      Ответить
                                                      • то-есть у тебя будет index.php и .htaccess в htdocs, там же, где и статика

                                                        верно?
                                                        Ответить
                                                        • Обычно так.

                                                          Интересно, для чего так делают. Чтобы в $_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. Какой багор )))
                                                          Ответить
                                                            • 2020-й год. Они до сих пор шлифуют совместимость с шаред-хостингами...

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

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

                                                          Какой анскилл )))
                                                          Ответить
                                                          • Зачем? Зачем? Почему упаковкой жс занимается фреймворк, а не отдельная тула? Ещё поди и делает это время юзерских запросов?
                                                            Ответить
                    • >> Ну вот есть у меня старое говнецо, которое было заточено под мод пхп. И новое говнецо, которое было заточено под нгинкс+фпм.

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

                      Специально для 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»).
                      Ответить
                      • Это всё могло бы теоретически иметь смысл для "приближения к проду", если бы он не навертел nginx поверх apache.

                        Это вообще бессмысленно
                        Ответить
                        • «пдіпх» поверх «Арасне» иногда имеет смысл: если у тебя дохрена статических файлов. Прямо так, что с одной страницы загружаются 100500 мелких файлов. Поскольку «пдіпх» более отзывчивый, чем «Арасне», он эти 100500 мелких файлов отдаст быстрее.

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

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

            FPM — это FastCGI process manager. FastCGI можно использовать с ним и без него. В первом случае детей рождает и убивает FPM, во втором случае детей рождает и убивает сервер («nginx», «lighttpd» и т. п.).
            Ответить
  • В языках для анальных педерастов именно так они и должны выглядеть.
    В языках для всех остальных они выглядят так:

    Коко
    data class Post(var id:Int, var title:String, var content:String)


    Я же говорю: пых берет всё самое плохое из всех возможных языков.
    Аксесоры и мутаторы в скриптушке это пиздец
    Отсутствие для них сахара это пиздец в кубе.

    Сука, даже в C# это симпатичнее: там проперти генерится
    Ответить
      • Да, старая джава, например.

        Но в джаве хотя-бы нет ключ слова function. Тоесть джава менее вербозна, чем пых.

        В си это будет структура.
        В питоне не будут лепить аксессоры и мутаторы
        В c# будут проперти
        В ruby аксесоры и мутаторы генерятся
        В JS будет просто объект

        Где еще будет такая же параша???
        Ответить
        • Да даже в джаве можно не лепить акцессоры, если ты не либу для других пишешь... Ну в чём проблема потом зарефакторить все точки, где поле используется? Да и часто ты реально писал какой-то код в геттерах?
          Ответить
          • В том, что скомпилированный с тобой код потом придется перекомпилировать.
            У Kotlin и C# таких проблем нет: там методы генерятся сами.
            Ответить
            • > перекомпилировать

              >> Если ты не либу для других пишешь.
              Ответить
          • interface PostRepository
            {
                public function save(Post $model);

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

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

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

                    Мне кажется совершенно здравой идея описать публичный интерфейс в отдельном файле (можно и с документацией) и потом распостранять его как часть SDK.

                    Вместо этого современные языки предлагают мне либо создавать интерфейсы (что тоже самое!) либо экспортировать наружу свои методы (если я просто делаю класс).

                    Разделение любого модуля или класса на интерфейс и имплементацию это логично, имхо
                    Ответить
                    • Логично, когда этот отдельный файл генерирует компилятор.
                      Ответить
                      • Прям как в D, когда компилятор сам создает .di файлы, сохраняя комменты.
                        Ответить
                        • Ага, я собсно из D в своё время про такую фишку и узнал.
                          Ответить
              • >а как ты тогда в интерфейсе приватный метод объявишь?!

                в жобе можно
                Ответить
        • В пыхе есть проперти. Да, вместо $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?

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

            Но даже в жобе есть Ломбок
            Ответить
            • >youtube
              Видео не нужно.

              Если у них есть Ценное Мнение -- пусть напишут статью или пейпер.
              Ответить
          • >Кстати, зачем в этой задаче геттеры и сеттеры? Почему нельзя поля сделать 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, ЕМНИП) инструмент для создания, собственно, датаклассов с (опционально) сложной логикой.
          Ответить
            • Это для типизации, в рантайме такой дикт будет просто мутабельным 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'}
              Ответить
                • Можно, конечно (плюс надо __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.
                    Ответить
                    • Странно, что питонобоги не дошли до того, что ключи словаря неплохо было бы копировать.
                      Ответить
                      • Это в крестах такие умные.

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

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

                          Если ты про время жизни, то освободился словарь, вместе с ним грохнули и ключи.
                          Ответить
                          • небольшого размера словарь, в который кладутся объекты огромных размеров.
                            Ответить
                            • Странно огромные мутабельные юзать в качестве ключа, конечно. А значение копировать никто и не предлагал.
                              Ответить
                              • Покчему?
                                user = get_obj(class='user', id=22)
                                
                                scores[user] += 1 #defaultdict


                                а у юзера того дохуя всяких своих полей и вообще он композиция
                                Ответить
                                  • потому что сёмантически красивее так.

                                    но твой варант верный конечно, а еще он не позволит захватить в кучу памяти юзером и теми,на кого он ссылается
                                    Ответить
                          • Ну вот представь, что у тебя тысячи небольших словарей. В каждом из них есть ключ "foo". Сейчас все эти "foo" на один объект ссылаются, а там у каждого словаря будет своя копия этого "foo".
                            Ответить
                            • Ну и что? Сколько это займёт памяти, особенно в контексте того, что мы говорим про пистон?

                              Там вообще можно хранить не объекты, а хеши, но тогда коллизии не разрулишь.
                              Ответить
                      • В «Python» нет механизмов для копирования произвольных объектов, поскольку вся рахитектура построена на ссылках.
                        Ответить
                          • 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.

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

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

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

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

                                              >Просто сравнивать надо ссылки на эти сокеты, а не их "содержимое".
                                              Так зачем тогда «глубина»? Я же говорю сами объекты, а не ссылки.
                                              Ответить
                                • И был язык Си с четким разделением объекта и указателя на него. И было программисту всегда понятно, что и куда копируется.

                                  Но пришли питузы, и отняли у программиста это понимание.

                                  Теперь есть всякие шеллоу копи, дип копи, никто нихуя не понимает, и все ебутся.
                                  Ответить
                                  • У тебя в сиське может быть массив указателей. Хочешь сказать, что и shallow copy, и deep copy одновременно здесь невозможны?
                                    Ответить
                                    • Если я скопирую массив, то я скопирую указатели.
                                      Если я хочу скопировать сами объекты, то мне нужно скопировать сами объекты, и исправить указатели.


                                      Это очень просто и логично. Это становится интуитивно понятно через пол года программирования на сишке.

                                      В других языках не так
                                      Ответить
                                      • Это не так только в тех языках, где программист вообще не касается проблемы 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.

                                            Минус конечно, это постоянная борьба с немутабельностью.
                                            Ответить
                    • потому в питухончике ключом может быть только строка или тупла, или специально замороженный объект
                      https://www.python.org/dev/peps/pep-0351/

                      в руби строки мутабельны, и это приводит к отдельной сущности -- символу
                      Ответить
                    • Общее 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);

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

      Он небось еще и круды руками пишет все
      Ответить
  • 1989 год, низкоуровневый язык си.
    struct petuz {
      int id;
      int iq;
    };
    //////////
    sturct petuz petuz = {.iq = 12; .id = 654};


    Год 2020, высокоуровневый язык пхп.
    class Petuz {
     private $iq;
     private $id;
    
        public function getId(): int
        {
            return $this->id;
        }
    
        public function getIq(): int
        {
            return $this->iq;
        }
    
      public function setId(int $id)
       {
            $this->id = id;
        }
    
      public function setIq(int $iq)
       {
            $this->iq = iq;
        }
    }
    /////////
    $petuh = new Petuh();
    $petuh->setIq(22);
    $petuh->setId(42);


    У меня всё
    Ответить
    • На самом деле в «PHP» можно так:
      $petuz = new Petuz(['iq' => 12, 'id' => 654]);

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

      Правда, придётся в кокококонструкторе сделать чуть-чуть бройлерплейта.
      Ответить
      • может, ты и прав; но в c99 уже точно

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

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

      Мы тут огненно тёрли за инкапсуляцию как-то и пришли к выводу, что это вообще МАСТХЕВ, вот в твоей сисечке все поля видны, как пизда у молодой училки, а в пыхе поменял приват на vixenпротектед и gost доволен
      Ответить
    • > низкоуровневый язык си
      > высокоуровневый язык пхп
      Вот сам хотел такой коммент написать.
      Ответить
  • руби решает это с помощью опенсрухт еще
    Customer = Struct.new(:name, :address) do
      def greeting
        "Hello #{name}!"
      end
    end
    Ответить
      • мегаметушня (на самом деле руби действительно один из самых метуёвых языков на свете)
        Ответить
        • Кто сейчас реально программирует на «Ruby»?
          Ответить
          • Руби лучший скриптух, а вы просто фишку не шарите
            Ответить
            • D лучший скриптух. Его в качестве скрипта взяли для игры Quantum Break
              Ответить
              • D скриптух разве?

                Скриптовать игры лучше на Lua.
                Lua лучший скриптух.

                Во-первых он очень быстрый.
                Во-вторых в нем бесплатный интероп с сями
                В-третьих в нем нет этой тупой разницы между ассоц.массивом и объектом
                Ответить
      • >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)
      Ответить
      • Ломбок хорошо, но он не часть языка.

        Именно потому я за groovy, kotlin, ObjC и C#, где проперти генерятся из коробки
        Ответить
  • Заржал на этом:

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

    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

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

        >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
          Ответить
      • Я посмотрел, «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», который ничего не делает.
        Ответить
        • правильный способ это не использовать пакеты, которые ставятся через ez_setup:
          https://bootstrap.pypa.io/ez_setup.py
          This method is DEPRECATED. Check https://github.com/pypa/setuptools/issues/581 for more details.

          Вместо них нужно использовать пакеты, которые ставятся через pip.

          Автору конкретного говнопакета ты можешь послать пулреквест.
          Но последняя версия говнопакета -- Released: Apr 16, 2014
          И коммитов не было давно https://github.com/Zulko/Unroll
          Автоу похуй

          Можеш его форкнуть, и починить у себя. Это нормльно для опенсурса
          Ответить
          • >правильный способ это не использовать пакеты, которые ставятся через ez_setup:

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

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

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

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

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

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

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

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

                    Кстати: из твоего списка выкинули тока Easyinstall и яйца
                    Ответить
                        • Я не ебу как оно работает. Но в прошлом треде про сборку под винду советовали юзать setuptools вместо distutils. Типа там проблем со студией не будет.
                          Ответить
                                • А вот в D есть только dub и все споры около формата описаний пакетов - json или 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 назначались «буквы» [, \, ], ^, _, `, которые не принимали многие программы (бэкслэш уж точно никто не принимал).
                        Ответить
                      • Мало кто знает, но буквы дисков в винде не нужны. Не даром же они лежат в DosDevices.

                        Обращаться к диску можно по полному имени объекта или прикрутить его поапкой в другой диск (как в уникс)
                        Ответить
                        • И с этим был связан какой багор в первых выпусках «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>
                                    То есть эта питушня даже не баг, но фича.
                                    Коли уж вайн так себя ведёт.
                                    Ответить
                          • Кстати, а что будет если я в своей NT'шной проге попытаюсь открыть "d:1.txt"? CreateFile полезет в переменные окружения и посмотрит какой каталог на диске d сейчас текущий?
                            Ответить
                        • >или прикрутить его поапкой в другой диск (как в уникс)

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

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

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

                    Зато DCOM/RPC позволяет удаленно создавать объекты на машине вообще без TCP/IP
                    Ответить
                    • В Луниксе своей оверинжинирной перепитушни хватает. Взять тот же «d-bus»

                      «systemd» например никуда толком не портирован.
                      Ответить
                      • да, но это свежачок же.
                        На самом деле OLE/COM/ActiveX это была очень крутая идея, а с учетом поддержки сети (DCOM) и kerberos в домене (с прозрачной аутентификацией) так и вообще блекс. Особенно в 1999-м году!

                        Другой вопрос, что система получилась архисложная, а чем сложнее питушня -- тем выше шансы соснуть хуйца
                        Ответить
                        • > OLE/COM/ActiveX это была очень крутая идея

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

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

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

                            Но самая идея того, что у тебя есть ActiveX, и ты можешь вставить его хоть в браузер, хоть в VB приложение -- она охуенна
                            Ответить
                            • >самая идея того, что у тебя есть ActiveX, и ты можешь вставить его хоть в браузер, хоть в VB приложение -- она охуенна

                              Мелкомягкие Ява-апплеты?
                              В VB даже виртуальная машина была 🙂 msvbvm
                              Ответить
                              • ява апплеты не имели такой плотной интеграции с ос

                                нельзя вставить документ word в качестве апплета
                                Ответить
                          • MFC и ATL — это не технологии, это просто библиотеки.
                            Ответить
                            • Странно. Я думал, библиотеки не работают на время моих шествий.
                              Ответить
                        • @Другой вопрос, что система получилась архисложная, а чем сложнее питушня -- тем выше шансы соснуть хуйца

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


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

    Теперь вы тоже это знаете
    Ответить

Добавить комментарий для 3.14159265 Отменить ответ

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8