Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Я решил попробовать Clojure: скачал Intellij Idea Comunity Edition поставил Cursive. Кодил значится, кодил, решил посмотре реализацию некоторых функци, начал шерстить по исходникам и дошел до джавовских исходников реализации кложура. Идея мне любезно предложила вместо декомпилированого кода скачать исходники и читать их. Я согласился и скачал, после чего увидел это. Исходное форматирование сохранено.
Это пиздец, товарищи. Кложур как язык - очень хорош, вот прям очень. Но мне в голове не укладывается что вот эта патлатая курва https://github.com/richhickey создатель такого крутого языка, не умеет в форматирование кода. Весь репозиторий - тупо рандом. Как блять, можно делать реализацию языка и даже блять не сделать код стайл. Вы можете подумать, что это и есть код стайл. Но хер там плавал, местами есть привычное джавовское форматирование, местами куча закоментированного кода. Короче полный бардак. Вот, наслаждайтесь https://github.com/clojure/clojure
На самом деле я не сильно то и разочарован. Да и вообще, я пытался смотреть видео с его докладами - меня просто тошнит от него. Тошнит точно так же, как от препода из универа, который вроде бы и шарит, вроде бы и что-то рассказывает, но без малейшего энтузиазма - просто поток текста, монотонный и неинтересный. У человека просто нету таланта/желания именно донести и поджечь интерес.
За создание кложура я его уважаю. Мне просто непонятно, как человек который создал такой хороши язык, не имеет понятия код стайл. Ваши мисли?
* когда надо чото рефакторить или делать find usage
* когда надо не выводить ошибки в браузер
* когда надо многопоточность
* когда надо профулироваться удобно
> Куда они будут выводиться, кстати?
Лол, никуда.
> Нет программы -- нет проблем. А фоновые задачи можно делать по крону.
Лол, так и делают.
> есть же "echo"
Воистину.
На самом деле написать что-то рабочее, худо-бедно масштабируемое, без SQL-инъекций можно в том числе и на "PHP". Но для этого программист должен держать в голове некоторые нюансы.
* Нужно не забыть перепидорасить "php.ini", в частности установить правильный "error_reporting" и не забыть выключить "display_errors" на продакшоне. Есть еще куча всякой магии, меняющей, блять, поведение самого приложения, типа "request_order", "magic_quotes", "session.save_handler" и ещё куча всякого говна.
* Нужно повесить свой "error_handler", преобразующий классические пыхоошибки в исключения. Так достигается хоть какая-то ко-ко-ко-нсистентность в обработке ошибок, но не всех, об этом тоже нужно помнить.
* Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения, композер в случае их отсутствия может только обосраться.
* Держать бутстрап приложения максимально легким. Да, дорогой джавист, тут парсить 640-килобайтные XML-конфиги - это моветон. Доводилось видеть, как чтение уебских конфигов становилось реально узким местом и такое говно "конпелировали" в "PHP" с дальнейшим помещением в "opcache". Выглядит экстравагантно, но работает действительно на порядок быстрее.
* Помнить, что нельзя сравнивать хеши паролей через "=="
* Не забыть установить мемкеш на локалхост. Наверняка захочется иметь быстрый компактный кеш, но шарить память между реквестами нельзя by design. (inb4: ололо, есть же шаред мемори)
* Настроить crontab с фоновыми задачами.
* Зареврайтить все урлы на index.php средствами веб-сервера.
* И помнить целый чемодан нюансов и исключений, коими изобилует практически каждая сраная функция
Итого получаем, что хороший "PHP"-разработчик - это такая нихуёвая зубрилка с солидным багажом знаний, применимых только в области укрощения взбесившегося шаблонизатора, а ведь все потраченные усилия человек мог направить в более полезное и широкоприменимое русло. Нахуй так жить?
>> Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения
Это самый главный багор. Если у тебя несколько сайтов на одной машине, ты должен сначала вычислить объединение (в смысле теории множеств) расширений, требуемых каждому сайту, руками их поставить (через «PECL» ставится не всё) и прописать в «php.ini». В результате из-за одного сайта, требующего хитрое прожорливое расширение, у тебя интерпретатор будет прожорливым.
А еще сайты ВНЕЗАПНО могут потребовать разные мажорные версии одного и того же расширения, и тут Зеев предлагает нам только соснуть. Именно поэтому я за "Docker".
Да, тут уже выяснили, что расширение «pecl_http» имеет как минимум две мажорные версии (это было на момент обсуждения; теперь их уже три) с несовместимым интерфейсом. Причём в новой версии отсутствует часть функционала старой. И это не что-то сверхъестественное, это всего лишь расширение для работы с протоколом «HTTP».
> magic_quotes
Кстати, там новую "защиту" завезли, с мышиным обучением. https://wiki.php.net/pecl/mysqlnd_poc_plugins#sql_injection_protec tion_plugin_-_peclmysqlnd_sip
> The SQL injection protection plugin attempts to detect and block malicious SQL statements. It has two operational modes. In the learning mode it records all SQL statements and remembers them. The recorded statements are considered safe. Recoding shall be done in a safe environment, for example, in a test environment. In the operational mode the plugins verifies that all SQL statements match the lift of safe statements. All SQL statements that match are executed. The other ones are rejects. Execution is prevented.
1. Бывают запросы, которые ну очень редко выполняются. Т. е. я для обучения должен подготовить среду, в которой моё приложение создаст всевозможные SQL-запросы, включая те, которые оно делает раз в сто лет.
2. Как в рабочем режиме этот плагин отличит «хорошие» запросы от «плохих»?
Мне кажется, идея очень хорошая. Код дописывают не до уровня "я анскильный пхпушок, мне плевать на инъекции", а до уровня "ну кажись всё предусмотрел". Любой код ревью делается такими же питушками с ограниченной внимательностью на этапе компиляции (для динамической питушни), в рантайме сидит только админ, но он не читает логи. И тут дополнительная проверка входит в чат как раз кстати.
Системы такого уровня позволяют хоть немного заглянуть в будущее и отловить ошибки и атаки, которые ещё не изобрели.
Полнейшее и лютейшее говно, как и любая другая попытка применять «мышыное обучение» для блокировки чего-либо. Такая хуйня лишь обеспечивает недоступность сайта у нескольких процентов пользователей, а админу — 24/7 разгребания тикетов о ложных срабатываниях этого говна.
От «SQL-инъекций» прекрасно защитит какой-нибудь статический анализатор, который ругается на скармливание в «$connection->prepare()» любой динамически генерируемой строки (а всякие mysql_query(), разумеется, по-умолчанию идут нахуй).
Придётся изобрести софт с мышиным обучением, который будет разгребать это говно. А потом придётся изобретать софт с мышиным обучением, который будет разгребать разгребальщик этого говна.
Программист - недетерминированная ненадёжная питушня, которая часто даёт сбои. Работает хуже, чем нешильдированная электроника в условиях сильных электромагнитных полей и радиации. Формализуемые алгоритмы следует исполнять на ЭВМ. Подвопроссную питушню следует анализировать статически автоматическим анализатором.
The script on this page will alert a string. Assume
that string is a persistent injection (where quote
<br>
characters are filtered so that normal XSS is not
possible). IE8's filters can be abused to enable XSS
<br>
by providing a "gratuitous GET parameter". For example,
try <b>
http://0x.lv/simple.html?foo=<script></b>
<p>
<script>alert('<img src=x:x onerror=alert(0)//>')</script>
>в частности установить правильный "error_reporting"
Ошибки программы пишутся в logger, ошибки контейнера сервлетов (исключения итд) пишутся в его логер, который можно настроить на что угодно. В аутпут ничего не пишецо.
> Есть еще куча всякой магии, меняющей, блять, поведение самого приложения, типа "request_order",
Контейнер сервлетов с его настройками (и настройками приложения в дескрипторе развертывания) обычно идет с приложением, и снаружи на него ничто не влияет.
>Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения
gradle собирает все зависимости приложения, и оно так деплоится.
>Держать бутстрап приложения максимально легким
Будстрап джавы делается один раз. Дальше она висит в памяти.
>Помнить, что нельзя сравнивать хеши паролей через "=="
Обычно есть всякафя высокоуровневая хуита типа spring-security или аутентификации контейнера сервлетов: руками пароли не нужно проверять.
>Не забыть установить мемкеш на локалхост.
Так как жаба висит в памяти, то можно кешировать просто в куче, хотя есть и готовые решения.
>Настроить crontab с фоновыми задачами.
И тут жабе ничего не нужно: она просто висит в памяти, и в одном из тредов переодически чото делает.
Статус можно хранить хоть в базе http://www.quartz-scheduler.org/
>Зареврайтить все урлы на index.php
Заворот чего угодно в контейнер делается в дескрипторе развертывания, и является частью приложения. Роутинг внутри уже зависит от фреймворка.
Итого получаем: пхп умудрился просрать джаве по ВСЕМ пунктам. Джаве. Казалось бы: как можно быть говёней джавы?
Но ПХП смог!
>> an xvalue is a glvalue that denotes an object or bit-field whose resources can be reused;
>> an lvalue is a glvalue that is not an xvalue;
>> an rvalue is a prvalue or an xvalue.
Изоморфизм — это биективный гомоморфизм.
Биекция — это сюръективная инъекция.
Да не, lvalue и rvalue - "левое" и "правое" значения по отношению к оператору =. Буква g вроде от "generalized". X видимо от "хуй знает". Не совсем рандомно называли.
90% мозга занял модулятор команд для vi, остальный 10%. доступные для всего остального, содержат полудохлые нейроны и поддерживают интеллект уровня осы.
Да ладно, человек использует лишь малую долю мозга.
Я верю, что человек может быть экспертом в С++, при этом виртуозно писать в vim, и знать еще два иностранных языка. Как минимум один человек в мире точно так может. Ну или два.
В чёрном-пречёрном лесу на чёрной-пречёрной поляне стоял чёрный-пречёрный дом, а в нём — чёрный-пречёрный компьютер, подключенный к чёрному-пречёрному дизель-генератору. В этом доме чёрный-пречёрный мальчик однажды написал бэкэнд на «Java Script», и у него отвалилась жопа.
Fike # 0
> vendor asm to sha 88a0aa8a79df7370cd178281bdf690ac2361c19a
какой менеджмент зависимостей )))
guest # 0
guest # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
Fike # 0 ⇈
guest # 0 ⇈
* когда надо не выводить ошибки в браузер
* когда надо многопоточность
* когда надо профулироваться удобно
Fike # 0 ⇈
ctrl + shift + r, ctrl + shift + f
> когда надо не выводить ошибки в браузер
error_reporting(0);
> когда надо многопоточность
нет многопоточности - нет рейс кондишена!
> когда надо профулироваться удобно
ты просто не успел привыкнуть к «microtime(true)»
guest # 0 ⇈
Очень удобно переименовывать, например, метод "getId()", который есть у трех десятков классов.
>error_reporting(0);
Куда они будут выводиться, кстати?
>нет многопоточности - нет рейс кондишена!
Нет программы -- нет проблем. А фоновые задачи можно делать по крону.
>ты просто не успел привыкнуть к «microtime(true)»
Я еще хотел написать про проблемы удаленного дебага, но потом вспомнил, что есть же "echo"
Stallman # 0 ⇈
Лол, никуда.
> Нет программы -- нет проблем. А фоновые задачи можно делать по крону.
Лол, так и делают.
> есть же "echo"
Воистину.
guest # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
Stallman # 0 ⇈
* Нужно не забыть перепидорасить "php.ini", в частности установить правильный "error_reporting" и не забыть выключить "display_errors" на продакшоне. Есть еще куча всякой магии, меняющей, блять, поведение самого приложения, типа "request_order", "magic_quotes", "session.save_handler" и ещё куча всякого говна.
* Нужно повесить свой "error_handler", преобразующий классические пыхоошибки в исключения. Так достигается хоть какая-то ко-ко-ко-нсистентность в обработке ошибок, но не всех, об этом тоже нужно помнить.
* Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения, композер в случае их отсутствия может только обосраться.
* Держать бутстрап приложения максимально легким. Да, дорогой джавист, тут парсить 640-килобайтные XML-конфиги - это моветон. Доводилось видеть, как чтение уебских конфигов становилось реально узким местом и такое говно "конпелировали" в "PHP" с дальнейшим помещением в "opcache". Выглядит экстравагантно, но работает действительно на порядок быстрее.
* Помнить, что нельзя сравнивать хеши паролей через "=="
* Не забыть установить мемкеш на локалхост. Наверняка захочется иметь быстрый компактный кеш, но шарить память между реквестами нельзя by design. (inb4: ололо, есть же шаред мемори)
* Настроить crontab с фоновыми задачами.
* Зареврайтить все урлы на index.php средствами веб-сервера.
* И помнить целый чемодан нюансов и исключений, коими изобилует практически каждая сраная функция
Итого получаем, что хороший "PHP"-разработчик - это такая нихуёвая зубрилка с солидным багажом знаний, применимых только в области укрощения взбесившегося шаблонизатора, а ведь все потраченные усилия человек мог направить в более полезное и широкоприменимое русло. Нахуй так жить?
bormand # 0 ⇈
Stallman # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
Это самый главный багор. Если у тебя несколько сайтов на одной машине, ты должен сначала вычислить объединение (в смысле теории множеств) расширений, требуемых каждому сайту, руками их поставить (через «PECL» ставится не всё) и прописать в «php.ini». В результате из-за одного сайта, требующего хитрое прожорливое расширение, у тебя интерпретатор будет прожорливым.
Stallman # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
Часть параметров можно менять на лету вызовом функции ini_set. Они помечены в таблице как PHP_INI_ALL:
https://www.php.net/manual/en/ini.list.php
"error_reporting" и "display_errors" как раз относятся к таким динамически изменяемым.
Остальные параметры можно устанавливать только глобально в php.ini. Какой багор )))
Stallman # 0 ⇈
Кстати, там новую "защиту" завезли, с мышиным обучением. https://wiki.php.net/pecl/mysqlnd_poc_plugins#sql_injection_protec tion_plugin_-_peclmysqlnd_sip
> The SQL injection protection plugin attempts to detect and block malicious SQL statements. It has two operational modes. In the learning mode it records all SQL statements and remembers them. The recorded statements are considered safe. Recoding shall be done in a safe environment, for example, in a test environment. In the operational mode the plugins verifies that all SQL statements match the lift of safe statements. All SQL statements that match are executed. The other ones are rejects. Execution is prevented.
guest # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
1. Бывают запросы, которые ну очень редко выполняются. Т. е. я для обучения должен подготовить среду, в которой моё приложение создаст всевозможные SQL-запросы, включая те, которые оно делает раз в сто лет.
2. Как в рабочем режиме этот плагин отличит «хорошие» запросы от «плохих»?
guest # 0 ⇈
1024-- # 0 ⇈
Системы такого уровня позволяют хоть немного заглянуть в будущее и отловить ошибки и атаки, которые ещё не изобрели.
gost # 0 ⇈
От «SQL-инъекций» прекрасно защитит какой-нибудь статический анализатор, который ругается на скармливание в «$connection->prepare()» любой динамически генерируемой строки (а всякие mysql_query(), разумеется, по-умолчанию идут нахуй).
HoBorogHuu_nemyx # 0 ⇈
guest # 0 ⇈
1024-- # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
guest # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
guest # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
http://p42.us/ie8xss/
HoBorogHuu_nemyx # 0 ⇈
Единственная вменяемая структура данных — массив.
guest # 0 ⇈
>в частности установить правильный "error_reporting"
Ошибки программы пишутся в logger, ошибки контейнера сервлетов (исключения итд) пишутся в его логер, который можно настроить на что угодно. В аутпут ничего не пишецо.
> Есть еще куча всякой магии, меняющей, блять, поведение самого приложения, типа "request_order",
Контейнер сервлетов с его настройками (и настройками приложения в дескрипторе развертывания) обычно идет с приложением, и снаружи на него ничто не влияет.
>Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения
gradle собирает все зависимости приложения, и оно так деплоится.
>Держать бутстрап приложения максимально легким
Будстрап джавы делается один раз. Дальше она висит в памяти.
>Помнить, что нельзя сравнивать хеши паролей через "=="
Обычно есть всякафя высокоуровневая хуита типа spring-security или аутентификации контейнера сервлетов: руками пароли не нужно проверять.
>Не забыть установить мемкеш на локалхост.
Так как жаба висит в памяти, то можно кешировать просто в куче, хотя есть и готовые решения.
>Настроить crontab с фоновыми задачами.
И тут жабе ничего не нужно: она просто висит в памяти, и в одном из тредов переодически чото делает.
Статус можно хранить хоть в базе
http://www.quartz-scheduler.org/
>Зареврайтить все урлы на index.php
Заворот чего угодно в контейнер делается в дескрипторе развертывания, и является частью приложения. Роутинг внутри уже зависит от фреймворка.
Итого получаем: пхп умудрился просрать джаве по ВСЕМ пунктам. Джаве. Казалось бы: как можно быть говёней джавы?
Но ПХП смог!
HoBorogHuu_nemyx # 0 ⇈
YxaHbckuu_nemyx # 0 ⇈
guest # 0 ⇈
admin # 0 ⇈
guest # 0 ⇈
Fike # 0 ⇈
guest # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
>> an lvalue is a glvalue that is not an xvalue;
>> an rvalue is a prvalue or an xvalue.
Изоморфизм — это биективный гомоморфизм.
Биекция — это сюръективная инъекция.
guest # 0 ⇈
bormand # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
gost # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
guest # 0 ⇈
gost # 0 ⇈
guest # 0 ⇈
> Не совсем рандомно называли.
ок
admin # 0 ⇈
)))
bormand # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
https://blog.tartanllama.xyz/initialization-is-bonkers/
Можно диссертацию писа́ть по видам инициализации.
OlegUP # 0 ⇈
Почему?
HoBorogHuu_nemyx # 0 ⇈
https://ideone.com/5USzXl
guest # 0 ⇈
guest # 0 ⇈
guest # 0 ⇈
Не, не слышал.
guest # 0 ⇈
Главное true не забыть
guest # 0
Fike # 0 ⇈
guest # 0 ⇈
1024-- # 0 ⇈
HoBorogHuu_nemyx # 0 ⇈
guest # 0 ⇈
Я верю, что человек может быть экспертом в С++, при этом виртуозно писать в vim, и знать еще два иностранных языка. Как минимум один человек в мире точно так может. Ну или два.
KpunoBblu_nemyx # 0
phpBidlokoder2 # 0
HoBorogHuu_nemyx # 0 ⇈
Именно поэтому я за «PHP».