- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 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/
>>> Как должны выглядеть модели?
>protected
>public
Бочку варенья тому кто пропихнёт новый Йазык без вот такой дристни.
Никакие мудификаторы кроме var кмк не нужны.
Даже от стасика пользы нет особой, больше проблемы.
Там всё по умолчанию
* финальное
* закрытое
Нужен только модификатор val
Попробуй коко-коко.
Вот тут он рассказал, как запустить apache+nginx. Зачем? Зачем?
https://habr.com/ru/post/346086/
>Если честно, я не понимаю откуда столько негатива.
ахахахах
у него типа локально apache Тормозит для статики? серьезно?
Выглядит вполне разумно, тем более как ты говоришь, это для локального запуска.
Если ты запускаешь все через apache + mod_php, то зачем поверх apache еще nginx?
Про локальный запуск он сам говорит
У меня совсем-совсем проблем не будет при запуске их на противоположной конфигурации? Идеальная совместимость и никаких подводных камней? Не верю.
Docker production
По данному вопросу к сожалению я ничего сказать не могу, зато может сказать официальная документация.
Если у вас есть опыт использования docker на боевых проектах, то просьба поделиться своим опытом в комментариях: стоит ли, какие трудности и подводные камни у вас возникли и др. полезную информацию для молодых и неопытных.
как видишь, он просто отдает им статику (причем весьма уныло, даже не настраивая кеш) а всё остальное тупо форвардит на apache.
Какой хтакцесс )))
Блядь, а это вообще нормальный способ отдавать статику? Не первый раз вижу такую волшебную строчку, но терзают меня смутные сомнения…
https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/
Хотя я бы конечно сделал через content type, но я хз -- можно ли так в nginx
З.Ы. Хотя если пыхомакаку не заставить срать в отдельный угол, то она и в еду себе насрёт.
Но пыхеры, как видишь, умеют только копировать готовые куски конфига даже не задумываясь "зачем?". Куда уж им до такой хуйни додуматься
Может быть, у него код, как у «Конардо», где всё в кучу.
внутри htdocs может лежать двадцать php файлов и картинки рядом и .htaccess
В директории htdocs лежит единственный php-файл, а именно index.php, в котором ничего критического нет, только вызов bootstrap.php, который лежит вне htdocs.
Вот реальный пример из документации по первой версии фреймворка (специально выбрал самую старую), тут htdocs названа public:
https://framework.zend.com/manual/1.12/en/learning.quickstart.create-project.html
Интересно, для чего так делают. Чтобы в $_SERVER['DOCUMENT_ROOT'], $_SERVER['SCRIPT_NAME'], $_SERVER['PHP_SELF'] были определённые значения?
Ему не пофигу, где лежит index.php. Какой багор )))
Ебать… Слов нет.
Именно поэтому я за «PHP».
В ZF есть свойство $this->basePath, через которое можно узнать путь к статике. Иногда этот путь требуется (например, когда нужно упаковать css- и js-файлы или что-то сделать с картинками). Так вот фреймворк определяет путь к статике по положению скрипта index.php. Как в первой версии ZF какой-то дурак предложил, так оно осталось и в ZF2, и в ZF3, и в Laminas.
Какой анскилл )))
https://github.com/hobodave/bundle-phu
В пыхе не так много функций, которые зависят от типа интерпретатора.
Специально для 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»).
Зачем же тогда вообще нужен «Арасне»? Он нужен, только если проект использует какие-то нативные модули «Арасне», аналогов которых нет у «пдіпх», или файлы .htaccess, которые анскильная обезьяна не может перевести в конфиг «пдіпх». Всё, больше низачем.
Если у проекта куча точек входа, и каждая точка входа требует свои параметры рнр.іпі, то портировать его с «Арасне» на что-то другое нелегко. Придётся либо переносить настройку в рнр-файл (функция ini_set; в документации по параметру должен быть флаг PHP_INI_USER или PHP_INI_ALL), либо запускать несколько FastCGI-серверов, каждый со своими параметрами.
Это чтобы не шкварить прекрасный «Nginx» дерьмом вроде «PHP». А «Апач» можно, «Апач» и сам, скажем так, не самый качественный продукт.
https://www.php.net/manual/ru/book.htscanner.php
Расширение заброшено в 2012-м году, поддерживает только PHP 5.3-5.6.
>> fpm
FPM — это FastCGI process manager. FastCGI можно использовать с ним и без него. В первом случае детей рождает и убивает FPM, во втором случае детей рождает и убивает сервер («nginx», «lighttpd» и т. п.).
А «lighttpd» может:
https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModFastCGI
У Kotlin и C# таких проблем нет: там методы генерятся сами.
>> Если ты не либу для других пишешь.
но опять таки: джавий блох не велит
Кстати
https://projectlombok.org/features/Data
В груви кстати тоже геттеры генерятся емнип.
Не все знают, но в Йаже на методах интерфейса бублик можно не писать.
Автовывод.
Звучит как форма онанизма у ООПушков.
Оксюморон, да.
Но к этому я и подвожу.
Мудификаторы нахуй не нужны, если в языке уже есть интерфейсы.
Экспортировать из модуля методы через интерфейс (публичное).
Всё остальное делать видимым внутри мудуля (приватное).
По сути выходят улучшенные .h-файлы с примесью ООП.
Опять всё лучшее придумано ещё в Сишке.
в жобе можно
Примерно так:
Вообще мне ?:'' не нравится. Вместо этой питушни можно было установить дефолтные значения полей.
Кстати, зачем в этой задаче геттеры и сеттеры? Почему нельзя поля сделать public, а не protected?
Потому что автор подсмотрел, что в джаве так делают, и тоже сделал. Мозга-то нету. Пыхер-с.
Но даже в жобе есть Ломбок
https://www.youtube.com/watch?v=lfdAwl3-X_c
Технически, так делают для защиты этих полей (данные можно проверять при их поступлении), тут это избыточно, говнокод.
У джанги это вообще через атрибуты решено:
с помощью магии))
«dataclass» — более мощный, универсальный и новый (>=3.7, ЕМНИП) инструмент для создания, собственно, датаклассов с (опционально) сложной логикой.
https://www.python.org/dev/peps/pep-0589/
ёбаные анскилябры
— ключ x1 испарился.
UPD:
Да. Не учёл.
Ну это общая проблема, инвариантная языку.
>>> x1.x = 42
Разве нельзя запретить его мутировать?
А коли нельзя, то человек сам виноват.
Кстати именно поэтому я за умолчательную немутабельность и модификатор var.
Жавашки к примеру так же обосрались, чему посвящена отдельная глава у Блоха.
Великий kill приди, память освободи!
А в последней версии за каким-то хером прикрутили gc.
Если ты про время жизни, то освободился словарь, вместе с ним грохнули и ключи.
Там вообще можно хранить не объекты, а хеши, но тогда коллизии не разрулишь.
Копирование это NSCopying и @property(copy).
Понятно.
Ты сначала пишешь, что в Питоне нет механизмов копирования произвольных объектов, а теперь, что можно руками всё копировать. Это как?
В ObjC тип, который ты хочешь использовать в качестве ключа в словаре, должен быть Equatable, Hashable и NSCopying. Все механизмы на столе. В питоне как?
Питоновскому дикту нужны __hash__() и __eq__() (N.B.: про cmp в начале ветки напиздел). Ещё ключи нельзя менять, иначе будет багор — т.е. либо они должны быть иммутабельными, либо их никто не должен трогать.
> Ты сначала пишешь, что в Питоне нет механизмов копирования произвольных объектов, а теперь, что можно руками всё копировать. Это как?
Я про встроенные механизмы, вроде копирующего конструктора из крестов. Но да, тут я не совсем прав: для этого есть магические методы __copy__() и __deepcopy__(). Тем не менее, некоторые объекты (вроде перечисленных выше сокетов и файлов) глубоко скопировать нельзя.
> В ObjC тип, который ты хочешь использовать в качестве ключа в словаре, должен быть Equatable, Hashable и NSCopying.
А NSCopying зачем?
В обжективе ещё есть 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).
Теперь, если мы изменим x1-x3, то внутри словаря изменится и ключ со всеми полагающимися баграми.
Вот если бы словарь мог узнавать, когда его ключи меняются, тогда было бы интереснее.
С произвольным объектом всё немного проще.
> Вот если бы словарь мог узнавать, когда его ключи меняются, тогда было бы интереснее.
- я давно не ковырялся в ObjC, не могу сказать про такие тонкости. Чисто технически это возможно при помощи KVO/KVC, но вызовет ещё больший оверхед.
Надо будет как-то поиграться с разными кейсами, как словарь будет эрогировать на такое.
Бриджинг между Dictionary и NSDictionary естественным образом накладывает некоторые ограничения на типы ключей.
Реализация протокола NSCopying не даёт ровным счётом ничего до того момента, пока класс не помечен как @objc. Если его пометить таким образом, то происходит копирование ключа в словарь и изменение изначального объекта не приводит к UB.
Нахуевертили, в общем.
Честно говоря трудно представить себе долбоёбов, которые ложат в качестве ключа открытые объекты сокетов или файлов.
Ну удобно же. Можно быстро найти контекст по сокету, с которого пришёл пакет. Я на сишке так делал.
Просто сравнивать надо ссылки на эти сокеты, а не их "содержимое". В джаве вроде так и делается по-умолчанию если ничего не перегружать?
Да.
>Просто сравнивать надо ссылки на эти сокеты, а не их "содержимое".
Так зачем тогда «глубина»? Я же говорю сами объекты, а не ссылки.
> Питон такой язык
Не-а. Проблемы value/reference не касаться можно только в полностью иммутабельном языке (1024-- приде, ссылочную прозрачность наведе!). А в «Python» ссылки на мутабельные объекты приводят к регулярным баграм. Классические питоньи ссылочные багры:
Багры от мутабельных ссылок есть во всех языках, где эти мутабельные ссылки используются.
Например С# (там же упоминание точно такой же траблы в js):
http://govnokod.ru/11946
Но вот это просто багор классический:
>def add_to_list(value, lst=[]):
Сколько раз говорилось: сделайте скриптуху с умолчательной немутабельностью.
Может это сильно и не помогло бы.
А может программеру пришлось бы писать:
> return append(lst,value);
Или явно копировать объёкт.
В любом случае избавило бы от проёбов типа
И не сильно бы выбешивало, т.к. 80-90% переменных в методе обычно не меняются.
Плюс там не будет циклической питушни.
Поэтому помимо отсутствия ссылочных проблем, бонусом идут ARC-friendly структуры данных, отстутствие зацикливания при сериализации и ненужность tracing gc.
Минус конечно, это постоянная борьба с немутабельностью.
>>> 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.
Сразу представил, как аффтар будет делать «модель» с десятком свойств.
Он небось еще и круды руками пишет все
Безо всяких setIq, setId.
Правда, придётся в кокококонструкторе сделать чуть-чуть бройлерплейта.
Бля, что с этим миром не так?! Структура с полями, инициализируемая сразу -- самое частоиспользуемое, самое родное, почему его нету из коробки в половине скриптухов кроме lua и js?
https://ideone.com/6XwEjJ
кста
в objc же были @property, там руками тоже можно было не пусать сеттеры и геттеры
или я пута.ю?
Мы тут огненно тёрли за инкапсуляцию как-то и пришли к выводу, что это вообще МАСТХЕВ, вот в твоей сисечке все поля видны, как пизда у молодой училки, а в пыхе поменял приват на vixenпротектед и gost доволен
> высокоуровневый язык пхп
Вот сам хотел такой коммент написать.
https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition
>if the number is divisible by 5
Кстати хорошая идея для модулей npm
В 2к20 считается.
@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)
> Под формулировкой "Модель — это исключительно бизнес-логика" подразумевается что модель — отражает сущности, данные и поведение предметной области, и никак не касается данных и объектов сервисного слоя и слоя приложения.
какой бизнес-объект без протекающих абстракций ))))
действительно, кому нужен finally
Пайтух такой пайтух.
Нужно было поставить pip-модуль, pip install сломался.
Сообщает что «пайтух не может снести яйцо»:
Решение нашлось быстро:
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
И оказалось «тривиальным».
БЛЯТЬ, МОЖНО БЫЛО ЗДЕЛАТЬ ЧТОБЫ РАБОТАЛО БЕЗ ПАЙТУШНИ И ПЕРДОЛИНГА??!!!
>pip install --upgrade setuptools
Из чего я делаю вывод что отребье било себя в грудь: «дак мы же как Сишка», «у нас тоже есть пакетный минетжер».
А по факту не осилили простейший dependency resolver.
Через easy_install новая версия «distribute» ставится, но «unroll» опять ставиться отказывается.
«unroll» хочет устанавливаться только через «ez_setup», а «ez_setup» не обновляли с 2010-го года, т. е. уже десять лет. За это время некоторые ссылки на pypi.org стали недействительными.
Чтобы поставить «unroll» в 2020-м году, нужно патчить пакет «ez_setup».
Короче, там весь пакет переписывать надо.
Ну что за макаки!
Да! Пусть не по правилам игра!
всегда радовала эта хуйня
У меня пакет «unroll» установился. Мои действия:
1. Если по глупости поставили «ez_setup», удаляем:
2. Скачиваем и распаковываем пакет «unroll» в чистую директорию:
3. Переходим в директорию unroll-0.1.0 и из файла setup.py нахрен удаляем первые две строки: Остальные строки оставляем.
4. Собираем и устанавливаем «колёса»:
Всё, «unroll» установлен.
Ну что за обезьяны на «SO»? По нескольку раз вслепую повторяют бессмысленные команды вместо того, чтобы решить проблему.
У меня два варианта:
1. Искать в файле «setup.py» в сломанных пакетах строчки, упоминающие «ez_setup», и удалять.
2. Написать фейковый модуль «ez_setup», состоящий из метода «use_setuptools», который ничего не делает.
Правильный способ это не использовать питуха.
Пайтух-гермафродит не нужен.
Некроссплатформенная, непортируемая, тормозная скриптуха с торчащими нативными костылями.
ECMA хотя бы портабельный, и не приколоченный сишными гвоздями к платформе.
С нодушков здесь все смеялись, за то что пишут свои sshи.
А в это время анскильная Питухомразь просто ворует сишные либы.
https://packaging.python.org/discussions/wheel-vs-egg/
Колёса появились в 2012-м году. Т. е. вся эта питушня с «изяинсталлом» была актуальна до 2012-го года (точнее, до того года, когда перестали распространять «яйца»).
А еще есть pyenv и poetry
Ах да, и к яйцам с колесами не забудьте sdist
Вот вам переписывание Правильно.
Кстати: из твоего списка выкинули тока Easyinstall и яйца
разве setuptools не работает поверх distutils?
setuptools -- apt
ясна ли аналогия ?:)
А pip тогда что?
Формат описания пакетов это некая спека. При чём тут формат данных, в котором она будет храниться? Сколько интерфейсов напишут, столько тулза таких форматов и примет.
Ничему никого жизнь не учит. А ещё называются домом высокой культуры быDа!
Или хочет показать малышне кто тут батя.
Своё говно не воняет, угу.
Но вообще он там писал про какие-то совсем уж дикие кейсы когда numpy целиком тащат ради NaN и т.п.
Звучит как название книги. Что-то типа «Гарри Поттер и яйца на колёсах».
В то время считалось, что питушиные яйца используют ведьмы для приготовления колдовских скриптов.
Для пользователей этот факт был неопровержимым доказательством пердолинга птицы. Адвокат апеллировал тем, что несение яйца - это непроизвольное действие, в котором не было злого умысла, поэтому и наказывать за это несправедливо.
Но посонов такие доводы не убедили. Питуха, как еретика, сожгли на костре вместе с яйцом.
В XXI веке голландский ученый доказал, что птица, болеющая инфекционным заболеванием, может непроизвольно поменять версию со 2ой на 3ю.
Ну скорее юзал свежие и популярные либы, которые из коробки работают и не надо лезть под капот.
P.S. Кому-нибудь приходилось использовать команды JOIN, APPEND и MKLINK?
«mklink» пару раз юзал, но параметры, естественно, забыл все.
В каких-то реализациях «DOS», если не задать «LASTDRIVE Z», для дисков с номерами после 26 назначались «буквы» [, \, ], ^, _, `, которые не принимали многие программы (бэкслэш уж точно никто не принимал).
В «DOS» у каждого диска свой текущий каталог. Я, например, делаю так: Вернувшись на диск C:, я вернусь в директорию NC, потому что последняя команда cd изменила текущую директорию только у диска D:.
В «NT» же сначала сделали глобальную текущую директорию. Т. е. после команд c: и cd NC текущей будет директория \DosDevices\C:\NC. Глобально. Изменение текущей директории на диске D: её сбросит.
Чтобы досовские батники работали в «NT», пришлось прикручивать костыль: теперь в енвиронменте создаются «скрытые» пельменные, имена которых начинаются со знака равенства, хранящие адрес текущей директории на каждом диске. Следующая команда их покажет:
Зачем? Зачем? Малость было места на дисках, поэтому юзали отдельный диск под каждую задачу?
где ты должен оказаться?
А вот кстати, это случаем не со времён, когда у доса не было каталогов пришло?
Типа раньше я мог копировать a:1.txt в b:1.txt. Потом в дос завезли каталоги, но я не хочу ничего менять. Поэтому я могу сфокусировать каждый диск на нужный каталог и продолжать копировать a:1.txt в b:1.txt.
переключение диска? ну да, с тех пор.
Были два диска: A: и B: (два дисковода на 360 что-ли килобайт).
Каталоги завезли где-то в районе третьего доса что-ли
1) переключение диска через a:
2) обращение к текущему каталогу на диске a: как a: (без слеша)
Только в DOS 2.0 в файловую систему завезли атрибут «директория», чтобы директории были не только корневыми, и у файловых функций добавили разделитель поддиректорий (почему-то выбрали бэкслэш).
Стоп. А разве это так работало?
По-моему оно оставляло на диске А.
Ну были там какие-то багры со сменой диска, что нужно писать
C:
А потом уже cd
Ага, что-то в этом духе.
Я помню что там было просто выбешивающее поведение.
Почему было? Оно и в десятке точно такое же выбешивающее.
А вот в «Powershell» это говно исправили. Именно поэтому я за «Powershell».
Потому что я давно уже виндой не пользовался. Вдруг починили.
>Оно и в десятке точно такое же выбешивающее.
Какой CHDIR )))
Важно, что у каждого диска был свой каталог. Во всяком случае, в DOS 6.22
Итого у нас два уровня текущей питушни:
1. Глобальный переключатель текущего диска.
2. На каждом диске переключатель текущей директории.
То есть эта питушня даже не баг, но фича.
Коли уж вайн так себя ведёт.
Вроде это появилось только со времён 2K/XP. И вроде на NTFS. Но это не точно.
Кстати там свои приколы были.
Я вот точно не помню, но кажется когда-то ловил глюк с местом. На одном диске место было достаточно, а на другом мало.
А при копировании, встроенный в винду чекер свободного места тупил и выдавал окно что на диске мало места.
Можно папку было переименовать в хитрый UUID, и тогда вместо её содержимого эксплорером открывалась например Панель Управления.
Причём если переименовать папку обратно, то все данные в ней естественно оставались.
Ты можешь в одной папке создать подпапку с именем и подпапку с именем
В «Проводнике» обе будут отображаться как корзина.
Кстати, для корзины есть такой раздел реестра:
Там есть подразделы ContextMenuHandlers и PropertySheetHandlers. Похоже, что именно в них указано, какому обработчику делегируем показ этой папки.
Вот тут что-то про эту питушню написано:
https://docs.microsoft.com/en-us/windows/win32/shell/handlers
>Но яйца не нужны: все давно перешли на колёса. Колёса ставит пип-инсталлер.
Вооо. Теперь понятно и по делу.
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».
>>>Вот именно поэтому я за «Линукс».
Не нужно ставить дрова, не нужно собирать зипованные какашки по файлопомойкам, не нужны кряки с ви-руснёй.
Потому 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
Особенно я орнул с этого:
После таких знаков Аппокалипсиса как нарушение Emacsом GPL, Microsoft Loves Linux, посещения Столлманом ИХ штаб-квартиры я уже ничему не удивлюсь.
Тем более тому что мелкомягкие решать сэкономить на индусах портирующих винду на армы, и просто прикрутят к очередной десятке бекэнд линукс-кернел с вайном.
https://gist.github.com/Orvid/5c9bc8c54e960a604968
35 пунктов.
«systemd» например никуда толком не портирован.
Да. OLE/ActiveX был прикольный. И в браузере можно было лепить аналог ява-апплетов.
Просто во-первых у них был целый зоопарк всяких технологий: DDE, MFC, ATL, ... От самого списка ехала крыша.
А во-вторых, ихнее RPC DCOM/ActiveX мало того что было сложным, так ещё и дырявым как решето. Фактически позволяя выполнять удалённо любой код.
Мелкомягкие Ява-апплеты?
В VB даже виртуальная машина была :) msvbvm
Вряд ли кто-то захочет поместить свой детородный орган в рот больного ОРВИ.
Проблема «PHP» в том, что компания «Zend» не посчитала нужным собрать инсталлятор для «Windows». Типа хороший парень сам инсталлятор соберёт, если нужно.