- 1
https://tproger.ru/articles/frontend-roadmap-2021/
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
https://tproger.ru/articles/frontend-roadmap-2021/
Как много надо учить ради того, чтобы клепать красивые формочки.
Они там совсем ебанулись?
j123123 12.11.2020 10:07 # 0
Не, ну а что ты ожидаешь от такой хуйни?
j123123 12.11.2020 10:08 # +1
bormand 12.11.2020 10:17 # 0
Какой анскилл (((
bormand 12.11.2020 10:14 # 0
Зачем? Зачем? Следуй заветам Ротоёба и ты сможешь клепать красивые формочки уже сегодня.
defecate-plusplus 12.11.2020 10:45 # 0
хуита
несколько месяцев ебались на основном проекте этого года, преодолевая это говно, в итоге психанули и переделали всё на старый добрый рест
нигде не спасает, только лишнюю работу приносит, и ещё и неоптимально работает
bootcamp_dropout 12.11.2020 11:01 # 0
У меня сейчас какой-то graphql похожий на рест на беке
Но мне все кажется что это бекендщики анскилльные не могу правильно graphql сделать
YpaHeLI_ 13.11.2020 15:43 # 0
Куча хипсторских js - фреймворков, куча всяких LESS, SCSS и прочей питушни.
Понимаю еще на бекенде ОRМ + MVC - это годно и экономит кучу времени.
Bootstrap тоже неплох, но если лезть в его внутренности то пока поймешь как переделать какой-нибудь компонент под себя - потратишь уйму времени.
Но сэкономит ли кучу времени какой-нибудь React или Angular?
Это ли не то, что называется overengineered shit?
MAPTbIwKA 13.11.2020 15:44 # 0
bormand 13.11.2020 16:01 # 0
Да. Я сварщик не настоящий, но с Angular JS вьюхи получалось делать на порядок быстрее чем вручную. Да и не такой уж там rocket science.
j123123 12.11.2020 10:54 # 0
> Для чего хорош Си?
> Оптимизация участков кода на C++
> Объектно-ориентированные возможности C++ часто обходятся дороже, чем «чистый Си», так как расходуют больше ресурсов (в частности оперативной памяти). Поэтому иногда код в стиле Си может быть эффективнее. Если нужно заставить какой-либо алгоритм работать быстрее — используйте процедурный стиль и откажитесь от встроенных инструментов C++ для ООП, например от полиморфизма.
А есть ли реальные примеры, когда код в стиле C++ эффективнее?
j123123 12.11.2020 10:55 # +3
Блядь, да что вы несете нахуй?
gost 12.11.2020 11:45 # 0
bormand 12.11.2020 11:48 # 0
На самом деле с -fPIC и без глобалок должно прокатить.
gost 12.11.2020 11:53 # 0
UPD: Ну и в самом деле, откуда адреса функций-то брать?
bormand 12.11.2020 11:53 # 0
gost 12.11.2020 11:54 # 0
bormand 12.11.2020 11:55 # 0
Ну разве что для сисколла придётся одну инструкцию на асме написать.
gost 12.11.2020 12:01 # 0
bormand 12.11.2020 12:02 # 0
gost 12.11.2020 12:16 # 0
bormand 12.11.2020 12:04 # +1
Самое забавное, что мемсру очень сложно запилить самому. У меня вместо него рекурсия получалась т.к. конпелятор упорно выбрасывал его тело и заменял на... вызов мемсру.
j123123 12.11.2020 12:13 # +1
Можно поотрубать эту оптимизацию соотв. опциями.
https://stackoverflow.com/questions/57539509/
bormand 12.11.2020 12:16 # 0
bormand 12.11.2020 11:55 # 0
У call в пределах одного бинаря же относительная адресация, зачем ему адреса?
j123123 12.11.2020 11:56 # 0
bormand 12.11.2020 11:57 # +1
j123123 12.11.2020 12:04 # 0
Достаточно его единожды узнать, и можно его где-нибудь в регистре хранить, и от него дальше отталкиваться для вызова функций. Ведь относительные расположения всей хуйни известны на этапе компиляции
bormand 12.11.2020 12:05 # 0
Ну конпеляторы такой приём не юзают. Это всё-таки дороже чем готы. Да и новым процам это очень не нравится т.к. дизбалансит стека возвратов.
j123123 12.11.2020 12:09 # 0
Проблемы негров шерифа не волнуют. Вполне можно написать компилятор, который такую хуйню использует
> Да и новым процам это очень не нравится т.к. дизбалансит стека возвратов.
Там и без дизбаланса можно
GET_ESP:
mov eax, [esp]
ret
и потом где-то делаем
call GET_ESP
MAKAKA 13.11.2020 04:26 # 0
во-первых для "реализации наследования" С++ ничего не нужно насколько я понимаю, "таблицы" нужны для виртуальных методов, а наследование != виртуальные методы (если ты не скриптушок и не джавушок часом)
во-вторых у PIC кода вроде как вначале есть волшебное число, от которого считаются все оффсеты. Либо же они все считаются от какого-то регистра. В каком-то смысле "близкие" указатели в сегментной адресации моего досвоого детсва это и есть PIC код, не?
Чем глобалки отличается от других данных? Почему нельзя адреса к ним иметь относительные?
bormand 13.11.2020 04:30 # 0
Спроси у разрабов 8086, лол. На arm'е или x86_64 такой проблемы нет.
Доступ к глобалкам у pic кода, разумеется, есть. Иначе совсем пиздец был бы. На х86 на это тратится регистр, емнип.
> наследование
Нахуй нужно наследование без виртуальных методов? Это же антипаттерн наследование-ради-реализации. Ну разве что миксины из него сделать.
MAKAKA 13.11.2020 04:34 # 0
>Нахуй нужно наследование без виртуальных методов?
Если строго выполняется "is-a", то вполне симпатично выглядит. Миксины в крестах на шаблонах делают?
bormand 13.11.2020 04:36 # 0
MAKAKA 13.11.2020 04:39 # 0
bormand 13.11.2020 04:44 # 0
Это немного ортогональная проблема -- как-то надо узнавать адреса функций в других модулях.
guest6 13.11.2020 04:46 # 0
GOT:
petuh: [place addr here]
jmp $petuh
потом лоадер меняет петуха на реальное числ?
bormand 13.11.2020 05:08 # 0
1) Найти где твои собственные глобалки, на нормальных архитектурах это элементарно т.к. есть ip relative адресация
2) Найти чужие глобалки и функции, для этого в твоих глобалках лежит GOT которую патчит линкер
Как-то так вроде.
guest6 13.11.2020 05:14 # 0
на 32 битах легко найти только автоматические переменные (адресуясь от SP или BP, причем в древности вроде от SP было нельзя) а глобалки без GOT тебе не нати.
на 64 можно найти глобалки адресуяь от R.I.P, то есть лоадер должен просто поместить твой код на столько же байт на север от глобаки, чтобы ты смог его найти по IP.
А загруженную чужую либу все равно придется готить, ведь ты же не знаещь в момент компиляции ее смещения, а еще и ее могут ASLRнуть
глобалки на 32х битных либах не только дурной вкус, но еще и более медленая загрузка кода, лол
bormand 13.11.2020 05:16 # 0
guest6 13.11.2020 05:17 # 0
но в 32 ты не можешь оффсетица от кода
так?
bormand 13.11.2020 05:18 # 0
Но таблица там не нужна, просто база относительно которой ты уже знаешь оффсеты.
gost 13.11.2020 09:20 # 0
Как-то раз патчил бинарник и очень удивился, когда после загрузки обнаружил похеренный в случайных местах код. Дошло до того, что я тогда довольно длительное время дебажил процедуры PE-загрузчика, пока не нашёл процедуры, ответственные за парсинг и применение этой самой таблицы релоков, лол. Пришлось ещё и таблицу патчить.
bormand 13.11.2020 09:25 # +1
j123123 13.11.2020 09:30 # 0
Это не так. В прышах .so с релоками возможны
https://stackoverflow.com/questions/7131360/
bormand 13.11.2020 09:31 # 0
Это да, ну потому что тот же самый elf, что и для объектников. А в реальной жизни они встречаются?
j123123 13.11.2020 09:32 # 0
bormand 13.11.2020 09:33 # 0
j123123 13.11.2020 09:37 # 0
А почему б ему не запуститься?
https://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries - Load-time relocation in action
> Динамический линкер обязан уметь релоки?
Динамический линкер чего? Может быть в POSIX стандарте где-то написано, что динамический линкер чего-то там обязан, но я вообще хз
bormand 13.11.2020 09:53 # 0
Ну у меня, к примеру, на amd64 вообще не компилятся либы без -fPIC.
relocation R_X86_64_PC32 against symbol `x' can not be used when making a shared object; recompile with -fPIC
З.Ы. Хотя пишут можно как-то модель памяти другую выбрать в опциях. Но х.з. что там с пирфомансом после этого станет.
bormand 13.11.2020 10:16 # 0
Винда, если я не туплю, позволяет запускать такие проги, упихивая бинари в первые 4 гига, но от этого страдает ASLR. А Линус, видимо, решил что упихивать 64-битный код в 4 гига - это полное уебанство и вообще запретил.
j123123 13.11.2020 10:38 # 0
Можно адреса непосредственно в опкодах соотв. инструкций запатчить.
bormand 13.11.2020 10:41 # 0
Дык в том и жопа, что в опкодах только 32 бита. Если надо 64, то только через загрузку в регистр. Большая модель так и делает.
guest6 13.11.2020 10:42 # 0
bormand 13.11.2020 10:45 # 0
Да.
j123123 13.11.2020 10:48 # 0
Ну так в инструкции загрузки в регистр и пропатчить
bormand 13.11.2020 10:50 # 0
Ну так надо чтобы конпелятор сначала такую инструкцнию воткнул! А он с дефолтной моделью памяти (medium или что там) так не делает.
guest6 13.11.2020 10:22 # 0
я наверняка читал про это, но уже забыл, а зачем читать снова, если на гк всё знют?
bormand 13.11.2020 10:24 # 0
В линуксе вроде раньше тоже такой хуйнёй страдали (man prelink).
guest6 13.11.2020 10:41 # 0
Какой багор)
>prelink
у винде тоже вроде была такая тула для разработчиков либы?
bormand 13.11.2020 10:43 # 0
guest6 13.11.2020 10:50 # 0
зы: нашел, как прелинк на винде назывался
In Visual Studio 2008 environment, an application can be bound to DLLs by using editbin /bind[:PATH=path]. editbin (referred to officially as Microsoft COFF Binary File Editor) replaces what used to be bind.exe (and rebase.exe which used to be used to change preferred load address of binary and thus avoid address range conflicts among DLLs and speed up load times).
gost 13.11.2020 10:49 # 0
В пределах одного сеанса системные либы одной битности (ntdll, kernel32, user32 вроде тоже) грузятся по одному адресу во все процессы. Иначе из-за релоков действительно пришлось бы каждому процессу иметь по своей собственной копии каждой системной либы, что немножко пиздец.
guest6 13.11.2020 10:52 # 0
хорошо было было серверам с толпой питухов по RDP
bormand 13.11.2020 10:56 # 0
Иначе они друг друга переломают, лол.
guest6 13.11.2020 10:57 # 0
а если она не RO, то что мешает мне ловко сломать все приложения, работаюшие от моего имени?
разве что я могу узнать адреса и сделать шеллкод, но речь-то про 32, так и так адреса были боль мень известны как я понима
gost 13.11.2020 10:58 # 0
guest6 13.11.2020 11:14 # +1
Относительно сессии адресуется всякие говны обжменеджера
В сессии есть воркстейшены (только WinSta0 имеет доступ к экрану) в нем есть десктопы.
не следует путать сессии и того сессии LSA.
кое-что в памяти шарица внутри сесси, нужно читнуть
https://techcommunity.microsoft.com/t5/ask-the-performance-team/sessions-desktops-and-windows-stations/ba-p/372473
gost 13.11.2020 11:16 # +1
Сейчас проверил — адреса системных либ в csrss.exe и случайном процессе, запущенном от моего юзера, совпадают.
bormand 13.11.2020 11:18 # 0
MAKAKA 13.11.2020 11:21 # 0
алсо, системные либы на 64битной винде могут грузиться каждый раз в разное место после перезагрузки, не?
кстати, опенбздя сделала еще круче
https://undeadly.org/cgi?action=article&sid=20170613041706&mo de=expanded&count=18
bormand 13.11.2020 11:25 # 0
guest6 13.11.2020 11:28 # 0
bormand 13.11.2020 11:33 # 0
Либы злоумышленнику нужны ради небольших фрагментов кода из которых он сможет сложить свой паззл. DEP же ему не даёт напрямую код залить, приходится бомжевать.
guest6 13.11.2020 11:35 # 0
типа мне нужен код jmp по такому-то смещеню, и язнаю, что как раз в таком месте он и лежит?
bormand 13.11.2020 11:42 # 0
На самом деле ASLR, DEP и стек протектор таки закрывают большинство тривиальных атак.
Дальше уже надо код изучать, не каждый мамкин хакер за это возьмётся.
gost 13.11.2020 11:44 # 0
MAKAKA 13.11.2020 11:21 # 0
gost 13.11.2020 11:42 # +1
j123123 15.09.2021 08:26 # +1
j123123 13.11.2020 11:44 # +2
Звучит как очередная порнуха на порнхабе.
j123123 13.11.2020 10:53 # 0
guest6 13.11.2020 10:56 # 0
bormand 13.11.2020 10:57 # 0
j123123 13.11.2020 10:58 # 0
> TempleOS — операционная система (ОС) для персональных компьютеров платформы x86-64, поддерживающая невытесняющую многозадачность[7] и многоядерные процессоры; она имеет единое адресное пространство без ограничений доступа (есть только «кольцо 0»), без поддержки сетей, и подходит для любительского программирования
bormand 13.11.2020 11:02 # 0
Да такая хуйня с 1:1 RWX и в UEFI есть на каждой машине.
j123123 13.11.2020 11:02 # +1
> -] Where is the kernel memory?
> TempleOS identity-maps all memory, all the time. It is like paging is not
> used. There is no special kernel high half memory space. TempleOS is
> ring-0-only, so everything is kernel, even user programs. There is a special
> task called Adam and he doesn't die, so his heap never gets freed. That's as
> close to kernel memory as it gets. All code goes in the lowest 2Gig of
> addresses, known as the Code Heap, so that the REL32 addressing mode can be
> used. See MemOverview.
guest6 13.11.2020 11:08 # 0
грубо гря сегменты ведь в обычных ос тоже используются: один сегмент размером со всю память для всех процессов для кода, например
bormand 13.11.2020 11:12 # 0
Одной страницей всю память не покрыть, надо всё-таки немного попердолиться с таблицей. Но да, смысл в том что после трансляции адреса не меняются (identity-map, 1:1).
guest6 13.11.2020 11:15 # 0
ты прав, одной страницей не покрыть память, даже если она huge page )))
MAPTbIwKA 13.11.2020 15:25 # +1
Вспомнил, как читал у Руссиновича ужасный багор про w2k: при больших объемах памяти она использовала кое-где больше страницы (по 4 метра или как-то так) чтобы не засирать таблицы страниц, и с таким уровнем гранулярности у ней код и данные оказывались вместе, и она не могла запретить write таким страницам
bormand 13.11.2020 18:49 # 0
j123123 13.11.2020 09:24 # 0
В крестах наследование - это вообще какая-то ебаная хуйня. Например там есть public, private, protected наследование. https://studfile.net/html/2706/661/html_KwYFdKCAJA.BKEz/htmlconvd-UsDhyW4x1.jpg
Зачем? Зачем?
Лучше б сделали гомоиконы, которыми бы уже описывались сами эти классы, потом для них всякие там паблик приват протектед хуекдет и проч. методы, и всяких там ебанутых правил отнаследовать хуйню чтоб тоже можно было хоть 100500 придумать, чтоб даже можно было сказать "унаследуйся от вот этого говна, но только чтоб вот этого метода и вот этого поля класса там не было". Но нет, нихуя, лучше захардкодить в стандарт какое-то ебаное говно, непойми откуда взявшееся
guest6 13.11.2020 10:23 # 0
чтобы наследоваться в тайне от всех, например ради реализации паттерна "шаблонный метод" или ради переиспользования кода (плохой вариант)
но для шаблонного метода нужно конечно чтобы он был виртуальным
bormand 12.11.2020 11:08 # 0
Я думаю нет. В крестах нет какой-то магии, которую нельзя сделать на сишке при помощи копипасты, бутылки пива и какой-то матери. Даже исключения можно запилить вручную.
Fike 12.11.2020 11:09 # 0
Ну ебать. Особенно конечно стек жалко, его и так всего мегабайт.
bormand 12.11.2020 11:13 # 0
Ой да ладно... 12-24Кб стека вполне хватает если не выёбываться с некоторыми идиомами.
З.Ы. Это не контроллеры, если что.
Fike 12.11.2020 11:16 # 0
j123123 12.11.2020 11:37 # 0
Надо чтод DOS на IBM PC/XT. В базовой модификации там было всего 128 кб ОЗУ на всё про всё
https://www.youtube.com/watch?v=EY8Mey846IA
bormand 12.11.2020 11:37 # 0
Ты будешь смеяться, но 24Кб -- это ограничение ядерных стеков Windows под x86_64 (на 32-битной было вообще 12Кб).
j123123 12.11.2020 11:41 # 0
bormand 12.11.2020 11:43 # 0
MAKAKA 13.11.2020 04:36 # 0
MAKAKA 13.11.2020 04:04 # 0
bormand 13.11.2020 04:39 # 0
В отличие от ёбаных стрелочек в стримах. Вот что реально дорого обходится.
guest6 13.11.2020 04:42 # 0
в в крестах я должен подумать десять раз: а нету ли там тяжелого деструктора например
но если там есть десктрутор, то значит это уже не просто тупая структура, так что подумать все равно придется
а пустые конструткоры и десукторы ведь бесплатные, они вообще не существуют в коде?
>ёбаных стрелочек в стримах.
даа, я уже посмотрел на выхлоп годболта, и понял, почему гост для того примера взял printf с csdtio а не iostream
bormand 13.11.2020 04:46 # 0
guest6 13.11.2020 04:48 # 0
bormand 13.11.2020 04:49 # 0
З.Ы. Хотя и в дебаге продираться через операторы шаред птров и прочую хрень тоже не особо приятно.
guest6 13.11.2020 05:02 # 0
Брендан Грегг вроде пилил тулу, где у него в колоночку высраивались стеки таких вот тредов, а сверху были нативные стеки, в том числе и ядерный, правда это было для профайлера.
lto/ltg это как раз то, что умеет заинлайнить метод из другой единицы компиляции?
MAPTbIwKA 13.11.2020 16:23 # +1
Общие хитрости для C++
> 1. Макрос watch — один из самых полезных приёмов.
Это правда удобно. Жавабляди, например, так не могут.
>2. Другие полезные макросы:
#define pow2(x) ((x)*(x))
ээ
#define mod(x, m) ((((x) % (m)) + (m)) % (m))
ммм
вы сейчас точно про кресты??
>3. Не бойтесь использовать typedef.
какая хитрость ;))
> Никогда не используйте INT_MAX в качестве бесконечности для целых чисел
какая математика ))
>__gcd
какой нейминг ))
>Не используйте 1 << x, если x может быть больше 31
или 15 в случае borland c 3.1?
>вместо if(условие) x++ вы можете написать x += условие
какой бля )))
> Всегда компилируйте код с флагом -O2
почему имено 2?
>ios::sync_with_stdio(false),
спасибо
>Не стесняйтесь использовать глобальные переменные.
бля !!
>#include <bits/stdc++.h>
это чтоб _быстрее_ компилировалось?
bormand 13.11.2020 16:32 # 0
Потому что О3 часто раздувает код, а пирфоманса особо не добавляет. Короче его надо юзать в меру и по необходимости, а не как гентушки.
А О2 - хороший, годный, сбалансированный дефолт.
Saehrimnir 13.11.2020 17:35 # 0
Это стандартный код олимпиадников, чтобы быстрее набиралось. Это в нашей Чеховской-Кибальчеховской все-все знают.
guest6 13.11.2020 18:09 # 0
guest6 13.11.2020 18:08 # 0
Fike 13.11.2020 20:40 # +1
#define pow2(x) ((x)*(x))
давайте угадаем, сколько прочитавших это ребят сделали в своем коде
MAPTbIwKA 13.11.2020 20:41 # 0
bormand 13.11.2020 20:45 # 0
А почему? Брат жив, вроде.
MAPTbIwKA 13.11.2020 20:47 # 0
gost 13.11.2020 20:50 # +1
Подразумевается, что задача программиста — максимально быстро высрать имплементацию подходящего под задачу алгоритма, а уж как он работает и что там с чем складывается — проблема кого-нибудь другого.
gost 13.11.2020 20:58 # 0
>>>
Блядь, блядь, блядь! Сука, сука, сука!!!
MAPTbIwKA 13.11.2020 21:01 # +3
bormand 13.11.2020 21:05 # +1
Fike 13.11.2020 22:31 # +1
bormand 14.11.2020 04:17 # 0
OCEHHuu_nemyx 14.11.2020 04:19 # +1
А я?
bormand 14.11.2020 04:22 # 0
guest6 14.11.2020 04:42 # +1
mn m3[2];
guest6 08.09.2023 21:15 # 0