- 1
https://tproger.ru/articles/frontend-roadmap-2021/
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
https://tproger.ru/articles/frontend-roadmap-2021/
Как много надо учить ради того, чтобы клепать красивые формочки.
Они там совсем ебанулись?
Не, ну а что ты ожидаешь от такой хуйни?
Какой анскилл (((
Зачем? Зачем? Следуй заветам Ротоёба и ты сможешь клепать красивые формочки уже сегодня.
хуита
несколько месяцев ебались на основном проекте этого года, преодолевая это говно, в итоге психанули и переделали всё на старый добрый рест
нигде не спасает, только лишнюю работу приносит, и ещё и неоптимально работает
У меня сейчас какой-то graphql похожий на рест на беке
Но мне все кажется что это бекендщики анскилльные не могу правильно graphql сделать
Куча хипсторских js - фреймворков, куча всяких LESS, SCSS и прочей питушни.
Понимаю еще на бекенде ОRМ + MVC - это годно и экономит кучу времени.
Bootstrap тоже неплох, но если лезть в его внутренности то пока поймешь как переделать какой-нибудь компонент под себя - потратишь уйму времени.
Но сэкономит ли кучу времени какой-нибудь React или Angular?
Это ли не то, что называется overengineered shit?
Да. Я сварщик не настоящий, но с Angular JS вьюхи получалось делать на порядок быстрее чем вручную. Да и не такой уж там rocket science.
> Для чего хорош Си?
> Оптимизация участков кода на C++
> Объектно-ориентированные возможности C++ часто обходятся дороже, чем «чистый Си», так как расходуют больше ресурсов (в частности оперативной памяти). Поэтому иногда код в стиле Си может быть эффективнее. Если нужно заставить какой-либо алгоритм работать быстрее — используйте процедурный стиль и откажитесь от встроенных инструментов C++ для ООП, например от полиморфизма.
А есть ли реальные примеры, когда код в стиле C++ эффективнее?
Блядь, да что вы несете нахуй?
На самом деле с -fPIC и без глобалок должно прокатить.
UPD: Ну и в самом деле, откуда адреса функций-то брать?
Ну разве что для сисколла придётся одну инструкцию на асме написать.
Самое забавное, что мемсру очень сложно запилить самому. У меня вместо него рекурсия получалась т.к. конпелятор упорно выбрасывал его тело и заменял на... вызов мемсру.
Можно поотрубать эту оптимизацию соотв. опциями.
https://stackoverflow.com/questions/57539509/
У call в пределах одного бинаря же относительная адресация, зачем ему адреса?
Достаточно его единожды узнать, и можно его где-нибудь в регистре хранить, и от него дальше отталкиваться для вызова функций. Ведь относительные расположения всей хуйни известны на этапе компиляции
Ну конпеляторы такой приём не юзают. Это всё-таки дороже чем готы. Да и новым процам это очень не нравится т.к. дизбалансит стека возвратов.
Проблемы негров шерифа не волнуют. Вполне можно написать компилятор, который такую хуйню использует
> Да и новым процам это очень не нравится т.к. дизбалансит стека возвратов.
Там и без дизбаланса можно
GET_ESP:
mov eax, [esp]
ret
и потом где-то делаем
call GET_ESP
во-первых для "реализации наследования" С++ ничего не нужно насколько я понимаю, "таблицы" нужны для виртуальных методов, а наследование != виртуальные методы (если ты не скриптушок и не джавушок часом)
во-вторых у PIC кода вроде как вначале есть волшебное число, от которого считаются все оффсеты. Либо же они все считаются от какого-то регистра. В каком-то смысле "близкие" указатели в сегментной адресации моего досвоого детсва это и есть PIC код, не?
Чем глобалки отличается от других данных? Почему нельзя адреса к ним иметь относительные?
Спроси у разрабов 8086, лол. На arm'е или x86_64 такой проблемы нет.
Доступ к глобалкам у pic кода, разумеется, есть. Иначе совсем пиздец был бы. На х86 на это тратится регистр, емнип.
> наследование
Нахуй нужно наследование без виртуальных методов? Это же антипаттерн наследование-ради-реализации. Ну разве что миксины из него сделать.
>Нахуй нужно наследование без виртуальных методов?
Если строго выполняется "is-a", то вполне симпатично выглядит. Миксины в крестах на шаблонах делают?
Это немного ортогональная проблема -- как-то надо узнавать адреса функций в других модулях.
GOT:
petuh: [place addr here]
jmp $petuh
потом лоадер меняет петуха на реальное числ?
1) Найти где твои собственные глобалки, на нормальных архитектурах это элементарно т.к. есть ip relative адресация
2) Найти чужие глобалки и функции, для этого в твоих глобалках лежит GOT которую патчит линкер
Как-то так вроде.
на 32 битах легко найти только автоматические переменные (адресуясь от SP или BP, причем в древности вроде от SP было нельзя) а глобалки без GOT тебе не нати.
на 64 можно найти глобалки адресуяь от R.I.P, то есть лоадер должен просто поместить твой код на столько же байт на север от глобаки, чтобы ты смог его найти по IP.
А загруженную чужую либу все равно придется готить, ведь ты же не знаещь в момент компиляции ее смещения, а еще и ее могут ASLRнуть
глобалки на 32х битных либах не только дурной вкус, но еще и более медленая загрузка кода, лол
но в 32 ты не можешь оффсетица от кода
так?
Но таблица там не нужна, просто база относительно которой ты уже знаешь оффсеты.
Как-то раз патчил бинарник и очень удивился, когда после загрузки обнаружил похеренный в случайных местах код. Дошло до того, что я тогда довольно длительное время дебажил процедуры PE-загрузчика, пока не нашёл процедуры, ответственные за парсинг и применение этой самой таблицы релоков, лол. Пришлось ещё и таблицу патчить.
Это не так. В прышах .so с релоками возможны
https://stackoverflow.com/questions/7131360/
Это да, ну потому что тот же самый elf, что и для объектников. А в реальной жизни они встречаются?
А почему б ему не запуститься?
https://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries - Load-time relocation in action
> Динамический линкер обязан уметь релоки?
Динамический линкер чего? Может быть в POSIX стандарте где-то написано, что динамический линкер чего-то там обязан, но я вообще хз
Ну у меня, к примеру, на amd64 вообще не компилятся либы без -fPIC.
relocation R_X86_64_PC32 against symbol `x' can not be used when making a shared object; recompile with -fPIC
З.Ы. Хотя пишут можно как-то модель памяти другую выбрать в опциях. Но х.з. что там с пирфомансом после этого станет.
Винда, если я не туплю, позволяет запускать такие проги, упихивая бинари в первые 4 гига, но от этого страдает ASLR. А Линус, видимо, решил что упихивать 64-битный код в 4 гига - это полное уебанство и вообще запретил.
Можно адреса непосредственно в опкодах соотв. инструкций запатчить.
Дык в том и жопа, что в опкодах только 32 бита. Если надо 64, то только через загрузку в регистр. Большая модель так и делает.
Да.
Ну так в инструкции загрузки в регистр и пропатчить
Ну так надо чтобы конпелятор сначала такую инструкцнию воткнул! А он с дефолтной моделью памяти (medium или что там) так не делает.
я наверняка читал про это, но уже забыл, а зачем читать снова, если на гк всё знют?
В линуксе вроде раньше тоже такой хуйнёй страдали (man prelink).
Какой багор)
>prelink
у винде тоже вроде была такая тула для разработчиков либы?
зы: нашел, как прелинк на винде назывался
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).
В пределах одного сеанса системные либы одной битности (ntdll, kernel32, user32 вроде тоже) грузятся по одному адресу во все процессы. Иначе из-за релоков действительно пришлось бы каждому процессу иметь по своей собственной копии каждой системной либы, что немножко пиздец.
хорошо было было серверам с толпой питухов по RDP
Иначе они друг друга переломают, лол.
а если она не RO, то что мешает мне ловко сломать все приложения, работаюшие от моего имени?
разве что я могу узнать адреса и сделать шеллкод, но речь-то про 32, так и так адреса были боль мень известны как я понима
Относительно сессии адресуется всякие говны обжменеджера
В сессии есть воркстейшены (только WinSta0 имеет доступ к экрану) в нем есть десктопы.
не следует путать сессии и того сессии LSA.
кое-что в памяти шарица внутри сесси, нужно читнуть
https://techcommunity.microsoft.com/t5/ask-the-performance-team/sessions-desktops-and-windows-stations/ba-p/372473
Сейчас проверил — адреса системных либ в csrss.exe и случайном процессе, запущенном от моего юзера, совпадают.
алсо, системные либы на 64битной винде могут грузиться каждый раз в разное место после перезагрузки, не?
кстати, опенбздя сделала еще круче
https://undeadly.org/cgi?action=article&sid=20170613041706&mo de=expanded&count=18
Либы злоумышленнику нужны ради небольших фрагментов кода из которых он сможет сложить свой паззл. DEP же ему не даёт напрямую код залить, приходится бомжевать.
типа мне нужен код jmp по такому-то смещеню, и язнаю, что как раз в таком месте он и лежит?
На самом деле ASLR, DEP и стек протектор таки закрывают большинство тривиальных атак.
Дальше уже надо код изучать, не каждый мамкин хакер за это возьмётся.
Звучит как очередная порнуха на порнхабе.
> TempleOS — операционная система (ОС) для персональных компьютеров платформы x86-64, поддерживающая невытесняющую многозадачность[7] и многоядерные процессоры; она имеет единое адресное пространство без ограничений доступа (есть только «кольцо 0»), без поддержки сетей, и подходит для любительского программирования
Да такая хуйня с 1:1 RWX и в UEFI есть на каждой машине.
> -] 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.
грубо гря сегменты ведь в обычных ос тоже используются: один сегмент размером со всю память для всех процессов для кода, например
Одной страницей всю память не покрыть, надо всё-таки немного попердолиться с таблицей. Но да, смысл в том что после трансляции адреса не меняются (identity-map, 1:1).
ты прав, одной страницей не покрыть память, даже если она huge page )))
Вспомнил, как читал у Руссиновича ужасный багор про w2k: при больших объемах памяти она использовала кое-где больше страницы (по 4 метра или как-то так) чтобы не засирать таблицы страниц, и с таким уровнем гранулярности у ней код и данные оказывались вместе, и она не могла запретить write таким страницам
В крестах наследование - это вообще какая-то ебаная хуйня. Например там есть public, private, protected наследование. https://studfile.net/html/2706/661/html_KwYFdKCAJA.BKEz/htmlconvd-UsDhyW4x1.jpg
Зачем? Зачем?
Лучше б сделали гомоиконы, которыми бы уже описывались сами эти классы, потом для них всякие там паблик приват протектед хуекдет и проч. методы, и всяких там ебанутых правил отнаследовать хуйню чтоб тоже можно было хоть 100500 придумать, чтоб даже можно было сказать "унаследуйся от вот этого говна, но только чтоб вот этого метода и вот этого поля класса там не было". Но нет, нихуя, лучше захардкодить в стандарт какое-то ебаное говно, непойми откуда взявшееся
чтобы наследоваться в тайне от всех, например ради реализации паттерна "шаблонный метод" или ради переиспользования кода (плохой вариант)
но для шаблонного метода нужно конечно чтобы он был виртуальным
Я думаю нет. В крестах нет какой-то магии, которую нельзя сделать на сишке при помощи копипасты, бутылки пива и какой-то матери. Даже исключения можно запилить вручную.
Ну ебать. Особенно конечно стек жалко, его и так всего мегабайт.
Ой да ладно... 12-24Кб стека вполне хватает если не выёбываться с некоторыми идиомами.
З.Ы. Это не контроллеры, если что.
Надо чтод DOS на IBM PC/XT. В базовой модификации там было всего 128 кб ОЗУ на всё про всё
https://www.youtube.com/watch?v=EY8Mey846IA
Ты будешь смеяться, но 24Кб -- это ограничение ядерных стеков Windows под x86_64 (на 32-битной было вообще 12Кб).
В отличие от ёбаных стрелочек в стримах. Вот что реально дорого обходится.
в в крестах я должен подумать десять раз: а нету ли там тяжелого деструктора например
но если там есть десктрутор, то значит это уже не просто тупая структура, так что подумать все равно придется
а пустые конструткоры и десукторы ведь бесплатные, они вообще не существуют в коде?
>ёбаных стрелочек в стримах.
даа, я уже посмотрел на выхлоп годболта, и понял, почему гост для того примера взял printf с csdtio а не iostream
З.Ы. Хотя и в дебаге продираться через операторы шаред птров и прочую хрень тоже не особо приятно.
Брендан Грегг вроде пилил тулу, где у него в колоночку высраивались стеки таких вот тредов, а сверху были нативные стеки, в том числе и ядерный, правда это было для профайлера.
lto/ltg это как раз то, что умеет заинлайнить метод из другой единицы компиляции?
Общие хитрости для 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>
это чтоб _быстрее_ компилировалось?
Потому что О3 часто раздувает код, а пирфоманса особо не добавляет. Короче его надо юзать в меру и по необходимости, а не как гентушки.
А О2 - хороший, годный, сбалансированный дефолт.
Это стандартный код олимпиадников, чтобы быстрее набиралось. Это в нашей Чеховской-Кибальчеховской все-все знают.
#define pow2(x) ((x)*(x))
давайте угадаем, сколько прочитавших это ребят сделали в своем коде
А почему? Брат жив, вроде.
Подразумевается, что задача программиста — максимально быстро высрать имплементацию подходящего под задачу алгоритма, а уж как он работает и что там с чем складывается — проблема кого-нибудь другого.
>>>
Блядь, блядь, блядь! Сука, сука, сука!!!
А я?
mn m3[2];