- 1
IT Оффтоп #60
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
IT Оффтоп #60
#32: https://govnokod.ru/26440 https://govnokod.xyz/_26440
#33: https://govnokod.ru/26449 https://govnokod.xyz/_26449
#34: https://govnokod.ru/26456 https://govnokod.xyz/_26456
#35: https://govnokod.ru/26463 https://govnokod.xyz/_26463
#36: https://govnokod.ru/26508 https://govnokod.xyz/_26508
#37: https://govnokod.ru/26524 https://govnokod.xyz/_26524
#38: https://govnokod.ru/26539 https://govnokod.xyz/_26539
#39: https://govnokod.ru/26556 https://govnokod.xyz/_26556
#40: https://govnokod.ru/26568 https://govnokod.xyz/_26568
#41: https://govnokod.ru/26589 https://govnokod.xyz/_26589
#42: https://govnokod.ru/26600 https://govnokod.xyz/_26600
#43: https://govnokod.ru/26604 https://govnokod.xyz/_26604
#44: https://govnokod.ru/26627 https://govnokod.xyz/_26627
#45: https://govnokod.ru/26635 https://govnokod.xyz/_26635
#46: (vanished) https://govnokod.xyz/_26646
#46: (vanished) https://govnokod.xyz/_26654
#47: https://govnokod.ru/26671 https://govnokod.xyz/_26671
#48: https://govnokod.ru/26707 https://govnokod.xyz/_26707
#49: https://govnokod.ru/26750 https://govnokod.xyz/_26750
#49: https://govnokod.ru/26776 https://govnokod.xyz/_26776
#50: https://govnokod.ru/26804 https://govnokod.xyz/_26804
#51: https://govnokod.ru/26809 https://govnokod.xyz/_26809
#52: https://govnokod.ru/26817 https://govnokod.xyz/_26817
#53: https://govnokod.ru/26833 https://govnokod.xyz/_26833
#54: https://govnokod.ru/26840 https://govnokod.xyz/_26840
#55: https://govnokod.ru/26844 https://govnokod.xyz/_26844
#56: https://govnokod.ru/26862 https://govnokod.xyz/_26862
#57: https://govnokod.ru/26890 https://govnokod.xyz/_26890
#58: https://govnokod.ru/26916 https://govnokod.xyz/_26916
#59: https://govnokod.ru/26934 https://govnokod.xyz/_26934
Этот оффтоп сгенерирован автоматически.
Индекс оффтопов: https://index.gcode.space/.
Зеркала Говнокода и полезные ресурсы:
* https://govnokod.xyz/ (альтернативный Говнокод)
* https://gcode.space/ (read-only зеркало Говнокода)
* @GovnokodBot в «Telegram»
* https://vorec.space/ (глоссарий Говнокода)
Хотя у этого петуха орбита не низкая, конечно.
https://gcode.space#!/search?q="как ты попал в этот тред"
ща пол интернета варнингами засрет
мажорную вряд-ли конечно, если он не идиот, но я не уверен точно
5.3 до 5.4 или 7.3 до 7.4 никто обновлять не будет, потому что половина сайтов вообще работать не будет. Админы не настолько дураки.
Обычно туда ложили скриптеца с перлом в шебанге, и чмодили (+x) его. Но ничто не мешало покласть туды бинаря.
Правда, нужно было знать версию libstdc++ наверное, бо хуй знает, чо там с ABI.
а что мешает?
Если cgi-bin нет в пределах видимости, то что делать? Попробовать позвать функцию system из «PHP»?
> Попробовать позвать функцию system из «PHP»?
Я ХЗ как они это настраивают, но на их месте, я бы запретил ставить +x у файлов, а то и вовсе запретил бы их на уровне прикрутки файловой системы
Если у тебя нет CGI, то зачем тебе это?
С другой стороны, админы могут и лажануться. Проверь
Какой багор.
подделать pgp
https://github.com/slavniyteo/upgraded-octo-funicular/commits/master (ссылка из статьи).
Ну и если я ядро форкнул - там реально есть коммиты торвальдса.
Ну вот добавил я ключ ради одного важного проекта. Мне теперь вообще всё подряд подписывать, даже в петпроджектах которые нахуй никому не сдались? Иначе я не я?
Имхо, надо просто людям вбивать с детства простую истину - нельзя доверять всему, что на заборе написано. Если нет явного пруфа.
Сейчас же «Гитхаб» в том проекте пишет «[Торвальдс] Committed to this repository in the past month», что есть пиздёж. Пиздёж в UI — это плохо.
имел в виду gpg. но всё равно все всё поняли, видимо
я вот не вижу разницы на гитхабе в UI между коммитами реального Линуса и коммитами "Линуса". в чём тогда смысл gpg? или Линус им не пользуется?
https://docs.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key
причем к С можно добавить ++
https://tyumen.zarplata.ru/vacancy/card/132987921/Imitator_programmista?position=29
Если ты купишь устройство со сборкой вендора, то так и будешь сидеть на четвертом андроиде 10 лет
а нексус пиксель будет обновляца
но про софт ты прав: обновлять ios можно долго
Есть 2 пакета. В одном либа точена, во втором сосноль для неё дрочена. Как идиоматично из второго поюзать первый?
А, ну ок, т.е. так не делают.
и импортить можешь по полному пути
Спасибо. Получается, что питон добавляет каталог с главным скриптом в path, поэтому абсолютные импорты работают только если он в корне проекта. А относительные импорты в главном скрипте в принципе никогда не работают (у главного скрипта в __name__ фигня).
Если ты туда явно добавишь верхний уровень, то вероятно можешь и по полному импортировать, но это ебля
Вообще лучше всегда использовать полные импорты, а в запускаемых файлах всегда-всегда.
Кстати, хочешь, чтобы консоль автоматически находилась, если установлена на интерпретатор или виртуалэнв?
Используй
https://packaging.python.org/guides/creating-and-discovering-plugins/
Я сам не пробовал, но судя по тому, что овердохуя пакетов на pypi имеет запускалку (virtualenv, django, flask, jupyter, pytest, to name few) и все они как-то на прыщах имеют sh с шебангом в нужный питон, а на винде .exe (ну вероятно импортирующие нужный .dll?) это работает.
*
https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html
[quote]
Setuptools will generate a standalone script ‘shim’ which imports your module and calls the registered function.
[/quote]
Типа ты можешь написать несколько консолей
* терминально/коснольную
* вебовскую например
* гуйную (ну тут 10050 фреймворков есть для этого)
* сетевую телнетную например
и зарегистрировать их как плагины. И твой скрипт бы находил их, и спрашивал пользователя какую косноль он хочет
И я мог бы написать плагин с поддержкой еще одной консоли не трогая твой код
Но механика с плагинами прикольная, да.
http://xion.io/post/programming/python-dont-use-click.html
А статью я не понял, если честно. Челу не нравится, что либа позволяет добавлять аргументы не задумываясь над UX и в итоге получается неудобная хуйня? Сомнительный аргумент, если честно.
хуясе мелочь: интерфейс командной строки)
>хуйня
ну да, примерно.
Командлайн интерфейс надо продумывать, а не хуяк-хуяк, иначе будет по степени удобства как какойнить netsh или dism)
Ну оно и на аргпарсе не сильно длиннее, если честно. Просто с аргпарсом всё централизованно а в клике эта портянка размазана по самим функциям.
Это же Арминовская поделка, как и фласк: там тоже функции декораторами
Туда же в основном катаются чтобы поболтать в перерывах и после конфы. А сами доклады можно и в записи посмотреть.
Why is reading lines from stdin much slower in C++ than Python?
(в 10 раз)
Крестобляди соснули )))
да ваш с++ уже все по скорости обогнали
ого, какие лалки
Вот так и рождаются легенды
Для отправки оперативной информации они предлагают установить свой софт:
https://i.imgur.com/ThSsTUM.png
ФСБ не доверяет браузерному TLS?
ЦРУ тоже Ростелекому не доверяет, и правильно делает
А зачем тебе сайт фсб? Хочешь на нас настучать?
Хочу узнать, какие технологии они используют. Если они не доверяют HTTPS, это жжж неспроста. Вдруг нас наёбывают, что HTTPS надёжен, а на самом деле в нём есть дырка, через которую наш трафик спокойно слушают? Стали бы внедрять СОРМ, если бы через неё ничего нельзя было бы прослушать?
А насчёт СОРМа - ну список айпишек/доменов тоже полезная инфа, даже если без контента.
Как узнать, оригинальный сайт %SITENAME% передо мной или спуфнутый?
Это ж не банк и не говнокодик.
Кстати, если заходишь в интернеты с публичного «Wi-Fi», который требует логина, то пока не залогинишься, он любые http-сайты редиректит на форму входа. Если я попытаюсь открыть kremlin.ru, а вместо него увижу форму входа провайдера, то можно настучать, что провайдер спуфнул госрерурс?
Инканусу все верят и доверяют. Вдруг ты начнёшь хуйню писать и сливать дезинформацию?
В чём прикол этого непонятного и сложного говна? Не проще ли было бы использовать "Notepad++"?
если тебе отключили javascript на лето то и на сайте делать нечего
А если в обратную сторону скроллишь, то задом наперёд играет?
Нявээмню. Сатаня же медленная и устарела, ня.
Time to facebook?
Ебаная автозамена в Андроеде
https://4.bp.blogspot.com/-43tRbbXPc0g/UpOQhFe31yI/AAAAAAAAC9w/Dt6ZdeO0_Nw/s1600/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0% B9%D0%BA%D0%B8_044.png
а 15 лет назад было очень лулзово
Все таки самые крутые дизигнеры редко работают в опенсурсе: они скорее в каком-нить эппле кучкуются
Причем прыщи с TWM там какимнить, KDE еще вроде тогда не было
Чего там делать дизайнерам, если там и UI кривой, и адоб не работает, и время от времени нужно с чем-то пирдолица.
Но пользуются все почему-то "Windows" и "macOS", а не "Linux"/"UNIX"; "Photoshop", а не "GIMP"; "Final Cut Pro", а не "Shotcut". Странно...
не, ну хуёвые программисты в опенсерсе тоже бывают, тут ты прав. Лердорф там, например, или Видениус.. те еще пидары
а так-то я ит ам и там
Но там заводчане не выбирают ос: чего им админ поставил, то и работает
Даже Владимир Владимирович Путин, который, казалось бы, должен максимально ограждать себя от закрытых и потенциально шпионских программ (тем более западного производства), сидит на "Windows". Единственное - он придумал себе преднамеренное отставание по времени, чтобы все западные технологии слежения относительно него устаревали (долгое время использовал "Windows XP", и только недавно перешёл на "Windows 7").
гугл грит, это Мужская парикмахерская №1
>Сураски
гугл грит это Клиника Ихилов в Израиле (Сураски)
>Стогов
вот тут хз, но ничего хорошего конечно там нету
вбил в гугл
Перевод "de biche" на русский biche
олень лань овечка олененок пташка
Яб на их месте в МФЦ выдавал бы флешку с прогой
чтобы работали гостовые алгоритмы, тебе в системе нужен криптопровайдер (типа криптопро цсп или випнет цсп) с соответствующим апи
и да, иногда лицензию на криптопровайдер поставляют вместе с токеном, но только у меня хуй знает но не заработало
Т.е. хранить приватный ключ на компе не положено.
Это логично, так как у меня на компе стопудово ботнет или еще какая нито хуита
Вечно забываю, кто из них кто. Приходится гуглить. Благо очень редко нужно.
Угу, пиздец интуитивный дизайн.
Кстати, в современных крестах, наверное, сделали бы std::prefix и std::postfix фейковым параметром вместо сраного int'а.
фейковый параметре же в любом случае говно, не?
ну и да: кто из них пост, а кто пре -- я не помню конечно
Писать operator,(), operator[]() и operator()() ведь гораздо веселее, чем operator comma(), operator index() и operator call().
i++ - вернуть i, а затем сделать ++
++i - сделать ++, а затем вернуть i
А вот operator ++ (int) как бы намекает своей записью на ++int. Но хуй там.
а шо ж делать китайской бабушке
wasp'ы сраные!
а китайские погромисты чем чаще пользуются?
Ћ плус плус
при этом
Ћ плус плус (Serbian, "C plus plus") is a JavaScript like programming language based on Cyrillic script
а у вас как? вертатися какойнить?
скорее всего будет "повернути"
крестобляди соснули
как и слово "lambda", "variable" итд
а поди пойми кто тут экскремент, а кто эксперемент: ++() и ++(int)
Потому без инта у тебя pre, а с нитом -- post.
или наоборот...
Хорошо, что есть https://en.cppreference.com/w/cpp/language/operators/.
Ну это уже просто плюс какой-то.
У вас база данных внезапно стала кушать много CPU и захлёбывается. Продакшену плохо. Ваши действия?
я докидываю dtu и теку
я овню только одну реляционную бд и в подобных проблем у меня не возникало
много цпу (надеюсь, не путаешь с ио-лоад) = много хеш джойнов, сортов и агрегатов
в оракле вообще есть дохуя умный планировщик, который если узнает, что вместо честного селекта можно из онлайн мат вьюхи взять, то он возьмет из неё (это сложно устроить, но можно)
в постгресе с матвьюхами не так заебись, конечно
> внезапно, за 5 минут
и чо
как будто она самопочинится и больше никогда-никогда такого не случится, поэтому делать ничего не надо?
их когда-то вроде надо было перегенерить явно, или уже не надо?
не слежу как там двигается в новых версиях, но вроде, пока всё ещё не збс
в оракле есть фаст рефреш, а это уже полдела по ускорению джойнов
Мы тогда угорали над mysqlщиккми, которые вручную делали денормализованные копии данных, чтобы быстрее делать селекты..
зы: оказывается, правильно помню
"One difference is that SQL Server’s indexed views are always kept up to date. if a view’s base tables are modified, then the view’s indexes are also kept up to date in the same atomic transaction."
Только они Indexed views
2. найти долгие
3. сделать им explain
а дальше всё зависит от конкретной субд
702 килограм аж ахуй!
например, ты джойнился без индекса с другой таблицей, в которой было 2 записи
А тут внезапно их стало 9500000 там
бывает еще N+1.
Когда у тебя кол-во запросов растет в зависимости от кол-ва записей
Пока их мало -- всё летает
А потом внезапно бум, и все лежит
Это надо срочно чиинить!
В Django есть Debug toolbar
Для каждой страницы он выдает картинку типа
https://vegibit.com/wp-content/uploads/2020/02/debug-django-sql-query.png
какая аллюзия
нахуя иметь процессор, половина возможностей которого не используется?
Но я не о частоте.
Я о, например, 16 и 32 битных режимах, о хардваном переключении контекста, о сегментах, даже об i/o (ну кому оно особо надо?)
И вот я уверен, что какое-то кол-во инструкций реально не используется. Нет?
А ты не согласен? Скажешь, у интела чистый и логичный дизайн без легаси и костылей?
> I no longer build software; I now make furniture out of wood. The hours are long, the pay sucks, and there's always the opportunity to remove my finger with a table saw, but nobody asks me if I can add an RSS feed to a DBMS, so there's that 🙂
> add an RSS feed to a DBMS
А JSON в СУБД нормально? А XML с XPATH?
А вот такое не хочешь??
https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql?view=sql-server-ver15
А к тебе такое не носят?
В прошлом городе носили, а сейчас особо и некому.
Видел ссылку про ms-sql? Как тебе идея отправлять email средствами СУБД?
Можно даже the message may include a query result set, file attachments, or both.
http://glenn-renfro-dev.blogspot.com/2012/02/adding-attachement-to-email-via-spring.html
Fuck you
КИБЕРБУЛЛА ИСПОЛЬЗУЕТ ЗАКЛИНАНИЕ РЕПЛАЙ ТУ ОЛЛ
> По оценкам следствия, Кху удалось добыть около $6,8 тыс. в криптовалюте — Ethereum и Monero. При этом в полиции подсчитали, что ущерб от использования суперкомпьютера для майнинга составил $55,4 тысячи.
Какой майнинг )))
Кстати, это сколько в битках щас? Один или полтора?
мог сделать инкукубатор и высиживать цыплятор без кур
Скорее варить...
продавец: можно подумать, в других креслах не так
покупатель: а вы видели другие кресла?
продавец: пока такой необходимости не было
Что думаете, питухи?
— определённо является.
я так и ответил, что всё окей до тех пор, пока родители и наследники срут одними и теми же исключениями
По принципу Лисков ты не должен кидать чего-то, что не мог кинуть базовый класс. И если он мог кинуть что угодно - то ты тоже можешь.
Жопа начинается когда интерфейс обещал чего-то не кидать, а тебе в реализации это кинуть надо. И любой джавист на это налетал...
Тоже в бизнесмены подался?
да и вообще мемоизация лучших практик при помощи зазубривания аббревиатур это такое, на мой взгляд
А надо при помощи тыканья носом на ревью? Ну серьёзно, это ж не какие-то там сраные паттерны, которые могут не пригодиться, это довольно общие принципы.
я ж не говорю, что описанные принципы какие-то неправильные
> сраные паттерны, которые могут не пригодиться
- не соглашусь, если нормально писать, то паттерны пригодятся так же, как и солид
Приведи реальный пример.
а про визитор ты и сам рассказывал вроде
Или стратегия здесь выбирается динамически, для каждого случая отдельно? Поэтому представление получает не конкретный инстанс стратегии, а фабрику?
сразу в золотые цитаты
Это у Конардо вроде так. Один файл для админки, один для гостевой книги
почему вообще всего три градации?
если откликается на { Вы случайно не PHP Middle ? }, значит это мидл, а если на { Вы случайно не PHP Senior ? }, то сеньор
ну и при осмечивании проекта можно и по средней по больнице, конечно, посчитать, а можно по градациям
но это больше к вопросу о личном росте сотрудника, он же ведь не хочет быть "Младшим программистом" много лет?
Мальчик молодой.
Все хотят поворцевать с тобой
https://www.litmir.me/br/?b=41605&p=1
Там можно и самому по себе обосраться
для кого?
Вот тебе мой любимый вопрос для джунов про говноооп: можно ли квадрат наследовать от прямоугольника?
Если были read-write - значит нет, квадрат от такого офигеет.
можем взять тебя джуном
вроде еще надо спросить про квиксорт и байнарисёрч
Если это типичный рантайм, то он откуда угодно может вылетить.
Расскажи это джавапитушкам с их Checked exceptions
В винде есть такое понятие -- тип говна в буфере обмена:
https://docs.microsoft.com/en-us/windows/win32/dataxchg/clipboard-formats
Вероятно, в маке такого нет
а неужели в сафре не работает?
зы: ты прав, всё там есть
https://developer.apple.com/documentation/appkit/nspasteboard/pasteboardtype
пейстбоард, лол
хотя может быть там специфичная хуйня какая-то. Чесс гря не знаю, как в JS обрабатывается paste
лул)
говорю же вам: говно ваши веб клиенты
своё детское колесо!
Подари, молодой Пикассо,
треугольное колесо!
Мой любимый, любимый Ван Гог,
подари провансальский звонок!
Раму мне одолжи, Сера.
Остальное лежит в сарае.
На моей могиле трахнули лося
Колесо сансары завращалося
(c)
Думаю, в этом шизоидном ужасе потоке вореций тебе больше всего понравилась рифма «Сера́ — в сарае».
https://hi-tech.mail.ru/news/new-sberbank-sber/
—– Спросите в ЖОПе.
–— Где?
—– В железнодородном отделе полиции.
–— Это где же вас таким сокращениям научили?
—– В ПИЗДе.
–— Где?
—– В правительственном институте защиты демократии.
Научно-исследовательская лаборатория операций по армированию бетона и железобетонных работ по сооружению сборно-монолитных и монолитных конструкций отдела технологии строительно-монтажного управления Академии строительства и архитектуры СССР
Нехватку плодов России, странам Европы и Ближнего Востока предрекают из-за извержения вулкана в Эквадоре.
https://news.mail.ru/economics/43486610
А вот коты нет. И вообще, они огурцов боятся
чото вспомнилось
https://www.youtube.com/watch?v=WwOII5xWlW4
> погрызть все огурцы
Лучшая защита - это нападение.
и ещё вареную кукурузу прямо пиздец как божественное лакомство, проверь
видосики-мемасики это в основном про то, как неожиданно подложить за спину коту что-то напоминающее змею - работают инстинкты
ну а макросы воще огонь, да
Сразу на хуй.
В то время как любой код на ПХП написан "ротоёбами"
знаешь, почему?
Кстати, я хочу потечь от F#. читал как-то про него, и увложнился.
Мне нравятся статически типизированные кросс платформенные функицональные языки
В таких погремушках можно и увязнуть
мутабельность это зло
чем меньше мутабельности -- тем стабильнее софт
а то можно сказать, что "иммутабельность это для внимательных программистов"
иммутабельность это как раз для простых смертных
а вот разное поведение оператора это так себе конечно
ты же согласен я надеюсь, что иммутабельным должно быть всё, что в принципе может быть иммутабельным? *
* Хотя Мац думает с точностью до наоброт
Подтверждаю.
Только var, только массивы.
> Нормальные пацыки используют "array" и текут
Их благословил Царь всея Ру-Си.
может задавать семантику
а что со стабильностью?
Чем меньше состояний -- тем проще доказать, что объект работает верно.
Что не так?
кстати, то, что "объект работает верно", вроде должно подтверждаться работой внутренней логики объекта
напишешь его логику с учётом потенциальной иммутабельности и проблем быть не должно
Когда читает код
>напишешь его логику с учётом потенциальной иммутабельности и проблем быть не должно
Эта логика будет значительно более сложной. Тебе придется убеждаться, что поля не изменяются во время работы твоего алгоритма
у него есть иммутабельное поле ссылочного типа
у этого поля есть своё мутабельное поле ссылочного типа
тебе придётся убеждаться
но всё таки количество проверок будет меньше
а на уровне программиста?
если ты хочешь изменяемую переменную, то тебе и придётся делать её изменяемой, дрочиться с критическими секциями и синхронизацией
если ты берёшь библиотечные типы, как ты можешь гарантировать иммутабельность, не изучив подробно кишки?
иллюзия безопасности
Тоже.
Если поле foo не изменяемо, то я могу расчитывать на то, что оно не поменяется в процессе.
>если ты берёшь библиотечные типы, как ты можешь гарантировать иммутабельность
Именно потому я за const и C++)
На самом деле в Kotlin многие библиотечные типы неизменяемы
Скажем, List по умолчнаию рид-онли
В свифте не так?
>иллюзия безопасности
сломать можно что угодно, потому любые гарантии это лишь иллюзия
Угу. Тем не менее даже в крестах и сишке юзают конст. Хотя там можно сломать вообще всё что угодно.
Ты же не предлагаешь везде юзать 64х битные числа сужая тип только если тебе это реально нужно?
Аргументы там по значению и по указателю.
Для значения смысла большого нет. Для указателя можно конст.
А также можно скастить конст в неконст, ибо ишь чего ты захотел, в рамки царя загнать?
Ты можешь снять кондом, или разогнать процессор, или джейлбрейкнуть ios, или рутануть андроид.
Но лучше не делать это без необходимости
Ты можешь его сломать конечно (у тебя есть инструменты), н тогда ты сам себе злобный буратино
Производитель компа гарантирует тебе стабильную работу при такой-то частоте памяти и процессора. Если ты их погнал -- может случиться беда
Производитель класса гарантирует тебе стабильную работу при неизменности неизменямых полей.
Если ты исправил их рефлексией -- может случиться беда
В обоих случаях ты сам виноват
Что будет?
Может быть ничего плохого. А может быть сегфолт. Как карта ляжет
- сделай let, будет ридонли
В обжси конкретно NSArray и NSMutableArray
> многие библиотечные типы неизменяемы
- это ты щас про стандартную библиотеку, а всякие там 3rd party.
> Если поле foo не изменяемо, то я могу расчитывать на то, что оно не поменяется в процессе.
- ну а почему оно должно вдруг поменяться в процессе? программист совсем мышей не ловит и не знает, что делает его коТ?
кстати, а рефлексией в Котлине нельзя насрать в ридонли поле?)
Это плевок в вечность, к сожалению
А лучше бы их не было
>- ну а почему оно должно вдруг поменяться в процессе?
Компилятор ничего не знает, и не может доказать. Это усложняет статический анализ.
Программист может проверить вручную конечно, но даже в этом случае он может отдать объект в 3рд парти код, который поменяет его через 2 часа в другом треде.
>кстати, а рефлексией в Котлине нельзя насрать в ридонли поле?)
Можно.
А в си можно насрать куда угодно вообще. Предлагаю по этой причине отказаться от использования енумов. И от модификатора const. И от була.
Зачем мне как-то ограничивать программиста, если он всё равно может туда насрать?
(например, ридонли поле ему бессмысленно защищать дополнительными локами или проверками)
> Программист может проверить вручную конечно, но даже в этом случае он может отдать объект в 3рд парти код, который поменяет его через 2 часа в другом треде.
- ок, это один из юзкейсов, но нафига помечать let'ом, например, приватные поля с точки зрения помощи погромисту? или локальные пельменные внутри функции
просто потому что?
Не только. Еще и ради программиста.
Как пользовтаель класса я могу поменять мутабельные поля.
Таким обоазом у меня увеличивается количество действий, которые я могу сделать, и я вынужден больше думать.
Как автор класса, я не могу быть увереным, что пользователь класса не поменяет значения полей, приведя объект в непонятное состояние.
>но нафига помечать let'ом, например, приватные поля с точки зрения помощи погромисту
Чтобы он знал, что в коде класса нет мест, где их меняют.
Что установлено в конструкторе, то и есть всегда.
Но в классе/структуре лучше иметь ключевые поля немутабельными. (Это те которые от которых считаются хеши, и которые мапятся на ключ в базе).
Пруфов не будет.
У полностью немутабеьного объекта я могу посчитать хеш один раз и закешировать.
у мутабельного я вынужден буду считать его много раз, и это медленно
Что будет в случае, если этот объект работает ключем в мапе, а я поменял ему хеш -- тут уже и подумать страшнно
Именно потому в пиздончике только немутабельные хрени (строки и туплы) могут быть ключами дикта
- это не работает, мы убедились на примере полей у полей у объекта
Рид олни поля можно установить один раз: в конструкторе
и всё
Если для взлома этой системы используется рефлексия или прямая работа с памятью, то это хак, и работа класса не гарантируется
Точно так же, как не гарантируется например работа материнской платы, если ты будешь тыкать туда отвёрткой
Не полностью иммутабельный объект лучше, чем полностью мутабельный)
тебе надо одно паблик ридонли поле
ты радостно хуячишь let на всё, что видишь на мониторе
в состоянии аффекта переходишь на полностью иммутабельные объекты и получаешь сотни тысяч копирований на ровном месте там, где ты их не ждал
в итоге ты решаешь проблему, которая может и не собирала проявляться, получаешь новую, приходишь на гк и говоришь, что новые языки говно
Многие твои соплеменники ушли в него из пхп
В руби строки мутабельны
В пыхе небось нет
Во-1. Не факт. Ну если как в Хаскеле не делать.
Во-2. Копирований может быть не так и много (COW). Зато багров с многопоточностью на порядок меньше.
Вообще, кмк, вы оба правы.
> Зато багров с многопоточностью на порядок меньше
- каких именно багров? клиенты начнут дрочить твои поля в обе стороны из ста потоков? ну сделай их private(set), если конечно твой езык умеет такое (обычный приватный сеттер-то точно умеет)
race condition
Классика мутабельной питушатни. Йажа:
> ну сделай их private(set),
Предлагаю угадать почему этот код хуёвый. Ошибка просто классическая.
я могу взять и написать у себя
Ну это идиоматично и правильно.
Этот код тоже ошибочен.
Кстати. Если взять ту же Йажу, мутабельность массивов снижает пирфоманс.
Т.к. для бубликации приватного массива каждый раз нужно делать копию.
Но обычный программист даже не догадывается об возможности такого проёба.
Если бы SimpleDateFormat был внутри себя немутабельным (не имел приватного мутабельного стейта), такой хуйни бы не было.
https://dzone.com/articles/java-simpledateformat-is-not-simple
Они там прям так и пишут:
>This is a common mistake most of us have made when formatting dates in Java.
Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.
https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
если доберётся до доки, то всё увидит
----
а как ему не иметь мутабельный стейт, если он ему нужен (допустим, это не переписать)?
Ну даже в доке явно не сказано: не делай SimpleDateFormat статическим или даже нестатическим полем в классе.
А логическая цепочка не у каждого сработает.
Это стандартная либа, и то люди факапят регулярно.
А если это чей-то класс, а и этот нюанс даже не откомментирован толком?
Это был хрестоматийный пример того как люди положили хуй на немутабельность, и потом миллионы джавашков бегали по граблям.
это внутренние кишки
про ограничения указано в доке, там же написано, что, если надо, синхронизируйте ручками или создавайте новый инстанс
а где тут именно private state, а то я жабу плохо парсю?
https://android.googlesource.com/platform/libcore/+/cff1616/luni/src/main/java/java/text/SimpleDateFormat.java
например, formatData задаётся в конструкторах, ещё есть публичный сеттер и десереализатор, но они же вряд ли про наш пример?
ну да это неважно, в общем
а как это перевести на иммутабл? создавать в конкретной функции и потом передавать в другие функции по мере надобности?
вот это интерфейсы раздуются, конечно 🙂
Десктоп мог это не знать, он не пишет на джаве
Мутабельное состояние.
>мог это не знать, он не пишет на джаве
Многие кто пишут на джаве тоже этого не знают :)))
Такая проблема действительно есть. Но она важна только для действительно горячих точек.
Там можно пожертвовать элегантностью, и сделать мутабельный объект.
Перформанс часто заставляет нас жертвовать элегатностью.
Один питух заменил объект на массив байт (это был не царь, другой питух) именно ради того, чтобы супер быстро обрабатывать котировки по сети.
Но это же не повод всегда так делать
> приходишь на гк и говоришь, что новые языки говно
Так и есть.
90% багров rustа от свинского боров-чекера.
Который даёт или много ссылок на чтение, либо одну на запись.
Тоже разновидность принудительной иммутабельности.
У меня есть однопоточная программа, я хочу сделать простой double-linked list. А Пuтушатня как раскукарекается:
error: cannot borrow `bagor` as immutable because it is also borrowed as mutable
на самом деле, let это как раз для перформанса, потому что компилятор получает большую свободу для работы с такими объектами
вернулись к тому, о чём я говорил: иммутабельность помогает компилятору
нет. let для корректности в первую очередь.
Корректность иммутабельного объекта проще доказать программисту. Я же про это уже писал.
я пишу, что let добавляет пирфоманс
ты мне опять про корректность лол
Но разумеется, имутабельность так же сильно упрощает многопроцессорные вычисления (пушо и там корректностью у нее лучше), позволяя таким образом повысить перформанс.
а что с парусностью и ходкостью?
мутабельные объекты могут добавить перформанса, особенно при налдичии одного ядра.
у иммутабельных объектов проще доказать корректность, таким образом их проще параллелить, получив более высокий перфлорманс на многоядерных системах
- value type, не? или интерфейс копирования
иммутабельность объекта здесь как попытка загрести солидную кучку под коврик
Это котлин. Вектор это класс. В нем хранится указатель на Point.
Но даже если бы Point харнился внутри класса, что мешает мне изменить его из другого потока во время работы мтеода?
сделай его value type, как там у вас, датакласс вроде?
датаклассы же копируются при передаче в функцию?
тебе вообще тут нужен интерфейс, который указывает, что у типа есть поля x, y и что такой объект можно скопировать
это правильный подход к дизайну имхо
нет. В джаве/котлине ничего никуда не копируется, кроме примитивов и указателей.
Это не C# и не C++.
В языках с копированием ситуация чуть лучше, потому что действительно насрать снаружи будет сложнее.
Но можно насрать внутри класса.
Так же если я захочу сделать эти поля доступными снаружи, то их тоже смогут изменить.
Перевёл на более популярный язык
>тебе вообще тут нужен интерфейс,
Ты предлагаешь создать новую сущность вместо обычной структуры из двух r/o полей?
а в чём смысл датакласса тогда?
в свифте value types при передаче копируются
> Ты предлагаешь создать новую сущность вместо обычной структуры из двух r/o полей?
- а в чём проблема?
ты не завязываешься на реализацию
у тебя есть чёткий и простой контракт (как ты любишь)
ничего не бывает бесплатно
* Автоматически появляется метод copy(), позволяющий скопировать инстанс изменив какие-то поля
* Автоматически появляется toString(), hashCode() и пр.
Котлин работает поверх JVM, так что никаких чудес там нет.
Копируются только int, short, long, char, boolean, double, float и инже с ними.
Любая структура (даже из двух булов) *всегда* передается по ссылке.
Знаешь, я наверное приму кусочек твоей идеи:
В языках, где любая структура передается по ссылке (Java/Kotlin, JavaScript) иммутабельность адски важна.
В языках, где можно передавать структуры (как их правильно назвать? Нескалярные сущности?) по *значению* (Swift, C++, C# с его ValueTypes) иммутабельность *менее важна*.
У тебя бекграундс свифтовый, а у меня джавовый (где все передается по ссылке и мутабельно), так что моя боль тебе может быть не так очевидна)
>у тебя есть чёткий и простой контракт (как ты любишь)
Я не люблю интерфейс из двух методов getX и getY.
В 99% случаев у него будет одна и та же реализация. Это копипаст.
Лучше иметь сразу реализацию. Причем в С++ я могу сделать один и тот же класс как R/O так и R/W (благодаря магии const). А джаве я вынужден пирдолица с интерфейсом для r/O
- всё по солиду))
Не могу не пнуть джаву в очередной раз.
Кресты
А джава теперь
Само собой, кресты просто дают тебе инструменты. Если ты ими захочешь себе палец отпилить - никто тебе мешать не станет.
В Java тоже можно кастануть к Point, но это выглядет более грязно (ты можешь вообще не иметь доступа к классу, а только лишь к интерфейсу)
Но и минусы: сигнатуры функций должны тоже уметь реагировать, а такое есть не везде
Таким обоазом у меня увеличивается количество действий, которые я могу сделать, и я вынужден больше думать.
- пофикси мудификаторами видимости
а, я забыл, они же не нужны
https://govnokod.ru/12316#comment165792
(у Немерле есть какие-то другие нескучные обои, кроме "встроенного" хтмл?)
https://govnokod.ru/26980
https://govnokod.xyz/_26980/