Всё по классике - если есть какой-то хуёвый зарубежный опыт, то нашим говноедам обязательно нужно на него сослаться как на непревзойденный эталон, и сделать точно так же!
Минтранс обсуждает введение овербукинга в России на авиарейсах, которые выполняются с частотой не реже двух раз в сутки. Об этом сообщил статс-секретарь — замминистра транспорта Дмитрий Зверев.
«Минтранс России вместе с потребительскими сообществами сейчас обсуждает новые механизмы, в том числе введение овербукинга», — сказал Дмитрий Зверев на XIII Петербургском международном юридическом форуме.
Охуеть, с потребительскими сообществами они это обсуждают...
Это, блядь, не те ли самые потребительские сообщества, которые писали письма терешковой с просьбой отодвинуть пенсионный возраст подальше?
Овербукинг — это намеренная продажа авиакомпанией большего числа билетов на рейс, чем мест на борту. При невозможности отправить пассажира намеченным рейсом авиакомпании обычно предлагают билет на ближайший рейс по тому же направлению в расписании и денежную компенсацию за невылет.
Трудно поверить в эту историю. Мой долг её вам изложить. А верить или нет - дело ваше.
Я жил обычной жизнью, занимался скалолазанием, другим передавал знания. Но однажды, по воле рока, лютый недуг сразил меня.
* Функционировать мог 1-2 часа в день. Остальные 22-23 часа - в лежачем состоянии. Сил не было даже ходить.
* Обезболивающее - ежедневно в конских дозах.
*
Времени лежать на печи было завались - читал и поглощал всё. Медицину,
анатомию, паразитологию, спиртологию, сыроедение, народную медицину,
органическую химию и др.
* Мы с ребятами снимали дом компанией и
жили как братья. У нас постоянно гостили совершенно разные люди -
сибирские травники, путешественники, нейрохирург, мастера спорта,
творческие люди и многие другие... Со всеми я подолгу общался и пытался
вытащить щепотку мудрости. Так и собирал по крупицам.
* Когда ты зажат в углу - подыхай или дерись как окаянный.
*
От безысходности я начал экспериментировать. Занялся зельеварением, как
в Хогвартсе, мать его. Началось всё с обычного кофе с чили перцем.
Закончилось довольно сумасбродной формулой, которую разрабатывал на
протяжении 2 лет.
* У меня нет лабораторных исследований. Нет
желания патентовать. Микроскопа даже нет. Всё, что я знаю - эта штука
работает. Как - не спрашивайте.
* Я опробовал это лекарство на
70-90 людях разного возраста и состояния. Результаты - фантастические.
Каким-то невероятным образом эта формула уничтожает большинство недугов.
* Лучшие пациенты - те, кому нечего терять. Они с удовольствием пробовали это зелье.
Назвал это чудо лекарство - галактический кофе. Во имя материнской силы природы.
После
месячного курса ежедневного приёма, я встал и пошёл пилить деревья.
Силушка появилась. Так и отработал 5 лет. А сегодня хочу поделиться с
людьми рецептом галактического кофе.
На 3х литровую банку:
+
8-10 любых лекарственных трав (берутся в аптеке, магазине трав или в
лесу - есть мобильные приложения, распознающие растения) - подойдут
любые лекарственные травы (крапива, чистотел, хвоя, подорожник, пижма,
девясил и т д).
+ Насыпьте всех трав понемногу (2-3 столовых ложки
сушеных трав, или каждой свежей травы по несколько стеблей с листьями и
цветами).
+ Несколько столовых ложек соды. 5-7 столовых ложек.
+ Перец. Десяток чили перцев или несколько столовых ложек чёрного / жгучего перца. Чем острее, тем лучше.
+ Заливаете 2-2,5 литрами водки. Любой.
+
В жидкую фазу добавляете сок 3-4 лимонов, 100-150 мл перекиси водорода,
3-4 сырых желтка. Размешать как следует неметаллическим предметом.
Банку закрыть медицинской перчаткой - пойдёт брожение. Настаивать 4-5 суток. Употреблять можно начинать через несколько часов.
Через
4-5 суток галактический кофе готов. Слить в любую неметаллическую
ёмкость через марлю. Перед употреблением взбалтывать. Каждый день перед
едой 20-30 мл в течение 1 месяца. Беременным нельзя. Детям с 4 лет,
примерно, можно.
ВАЖНО! За 1 сутки - не более 1 рюмки (20-30 мл).
Галактический кофе имеет огромную биологическую мощь. Примете больше -
сляжете на пару недель, потекут сопли, слизь, слёзы со всех щелей.
После 1 месяца приёма перейти на порцию по 10 мл в сутки перед едой один раз в сутки.
Да, бывает. Хоть я уже и четвертый год не пью. Бывает в виде мыслей об употреблении. Точнее даже мыслишек:"А не послать бы мне всё к черту и не уйти ли от реальности вновь? Там ведь и неплохо тоже было..."Это очень быстро купируется осознанием того, что десять минут облегчения не стоят возвращения того безумного состояния "я хочу ещё!" и тех потерь, что придётся вновь понести в употреблении. Да и само алкогольное "облегчение" – всего лишь шоры и ни в какое сравнение не идёт с результатами, которые теперь я получаю в выздоровлении. Сейчас я обрёл возможность отдохнуть и расслабиться по-трезвому.
Само по себе всё это никогда бы ко мне не пришло. Размышляя пришёл к выводу, что не было бы всех этих блогов, чатов, программы и т.д. – уже давно бы сорвался. Работа с головой решает и спасает. И в одиночку её совершить я не представляю возможным. Не уходи в изоляцию – вот, наверное, первое правило для любого выздоравливающего зависимого.
Это сейчас моя тяга – всего-лишь блоха в закрытой пробирке, она даёт о себе знать, я её помню и нужно поддерживать тот новый образ жизни, те условия, при которых пробирка останется закрытой. Или, как ещё говорят, двигаться по эскалатору вверх, чтобы он не унёс меня вниз. А той сумасшедшей овладевающей тяги, которая практически не оставляла мне выбора, у меня давно уже нет.
А если вы тоже алкоголик, который хочет бросить пить...
То рекомендую общение с другими трезвыми алкоголиками, которые поддержат, подскажут и поделятся своим опытом. Не будь в одиночестве на этом пути! Это бесплатно. Для мужчин и женщин.
Этот чат основали местные пикабушники, которые когда-то и одной пятницы не могли представить себе без убогого нажирания в хлам. Свободное, а главноетрезвоеобщение практически на любые темы: флуд, фотки котиков, мемы, юмор. Но если желаете прямо узнать, как встать на безалкогольные лыжи – с удовольствием поделимся опытом.
В этом чате не до шуток и флуд запрещен. Да и не удивительно, уже почти 5 тысяч участников набралось! Тут всё серьезно, очень много инструментов трезвости, литература, спикерские, коллекция видео в помощь бросающему алкоголику. И, конечно же, опыт тех, кто смог, поддержка друг другу на этом пути. Если что-то непонятно, задавайте вопросы, вам ответят те, кто уже прошел те трудности, что возникли у вас. Прямо прекрасное подспорье тому, кто устал спиваться и хочет начать делать действия, но не знает, какие и как.
Только пожалуйста, прочитайте правила поведения в обоих чатах, прежде чем что-то там написать. Чтобы не было потом комментариев в стиле:«Я пришел, нарушил правила, мне сделали предупреждение, я обиделся и ушел».
Встретимся там! Пусть ваши изменения начнутся сегодня!
Не рекомендуется принимать данную статью близко к сердцу или как истину в последней инстанции. Скорее как научпоп-грелку для мозгов. Тут довольно много упрощений, упущений или просто странно написанных моментов. Если что-то объяснено совсем криво, то добро пожаловать в комментарии.
Все сказанное далее применимо везде, но детали описаны для защищенного режима x86 (только я опустил префиксEдля регистров) и языков семейства C (в основном C и C++, местами C#). Для понимания рекомендуется знать про указатели и базово представлять, что происходит в процессоре.
Приятного чтения.
Думаю все помнят, что такое функция в математике
Начнем со сложного
Глоссарий
Чувствую, что большинство не имеет ни малейшего представления об указателях
В части про x86 я упоминал о том, что процессор представляет из себя бешенный самоуправляемый калькулятор, которому указом может быть разве что хранилище кода, аппаратный сброс и немаскируемое прерывание. И что у него есть системная шина, состоящая из шины адреса, шины данных и шины управления, к которой подключена память, хранящая данные и код.
А память это огромная одномерная полоска, в которой каждая ячейка имеет свой порядковый номер от 0 до 2^(разрядность шины адреса)-1. И указатель представляет из себя самую обычную численную переменную, хранящую номер (адрес) любой ячейки.
Я не понимаю, почему для многих это настолько сложная тема, а существенное количество новичков забрасывают изучение C после встречи с ними. Они в своей сути максимально элементарны (до тех пор, пока не нужно исправлять уязвимости и ошибки, которые появились в результате злоупотребления или неполного понимания нюансов).
Также существуют ссылки, так или иначе представляющие из себя подвид указателей, но обычно с запретом на арифметику с ними (основная сложность и опасность указателей) и/или подсчетом количества активных ссылок для сборки мусора.
Все языки или имеют указатели (Pascal, C, C++, блоки unsafe в C# и Rust), или являются ссылочными (Java, C#, Python, JS, т.д. (почти все современные языки)). С++ тоже имеет ссылки, но как синтаксический сахар над указателями, призванный упростить их передачу в функции и избавиться от проблемы нулевых указателей.
Ассемблер - если вы даже примерно не знаете, что это такое, то первую часть статьи вероятно можно пролистать и перейти на обсуждение парадигм.
Регистр - именованная численная переменная внутри процессора. Может иметь особое предназначение, а может просто использоваться для хранения любых чисел и арифметики. Их немного.
Инструкция - одиночная команда, представляет из себя последовательность из нескольких байт со специальным значением. Любая программа представляет из себя последовательность инструкций внутри памяти. Указатель на инструкцию, которая будет выполнена следующей, содержится в регистре IP, который сам увеличивается после выполнения каждой инструкции. По-хорошему стоило нарисовать пошаговую наглядную анимацию с демонстрацией всех регистров и куском ассемблерного кода, но мне лень, а в гугле я ничего толкового не нашел.
Метка - константа, содержащая адрес чего-либо. К примеру процедуры или глобальной переменной. Примерно как метка для goto в высокоуровневых языках, но универсальнее. Применяются при написании на ассемблере, в процессоре как таковые не существуют и разрушаются до обычных чисел при ассемблировании и линковке.
Разыменование - операция над указателем, когда тот превращается в переменную с адресом, который был записан в указателе (своеобразный пульт Д/У для переменной).
Парадигма - "стиль" написания и постройки архитектуры программы, частично определяется языком. Технически на том же C можно писать в практически любой парадигме (через костыли можно писать в стиле ООП, через макросы реализовать метапрограммирование, а через нестандартные расширения вообще ядерный бред), но родная для него - процедурная. А Go, к примеру, хоть и имеет недоклассы и методы, но лишен практически всех благ ООП и не сильно далеко ушел от C.
Синтаксический сахар - необязательная возможность, которая сокращает количество кода, повышает его читаемость или удобство поддержки
Стек
Большинство процессоров Фон-Неймановской архитектуры в своей конструкции предлагают механизмы стека. Кто играл в покер должны вспомнить стеки фишек. То есть некие значения, сложенные друг на друга (обычно это переменные, в частности адреса в памяти). При этом основными операциями являются добавление фишки на вершину (инструкция PUSH) и ее снятие (инструкция POP). Еще можно косвенно читать и заменять (перезаписывать) фишки относительно вершины (на вершину указывает регистр SP, неявно обновляется через POP и PUSH) или основания (указывает регистр BP) вглубь.
Стеки можно переключать (но не в MOS6502), это нужно для многозадачности
Помимо хранения локальных переменных стек позволяет делать довольно интересную вещь: мы можем положить на стек все необходимые аргументы (x в математике, но их может быть несколько), адрес следующей инструкции (взяв из указателя инструкции IP, это будет адрес возврата), после чего совершить прыжок на какой-нибудь другой адрес (сохранение адреса и прыжок делаются инструкцией CALL).
А на этом адресе может быть функция. Сначала она кладет текущий BP на стек, после чего приравнивает основание к вершине (BP к SP), тем самым создав для себя "новый стек" сразу после предыдущего (это еще называется стековым кадром), в котором якобы лежит только значение старого основания стека (BP), чтобы можно было восстановить его перед возвратом.
Серое это стековый кадр от предыдущей функции
После чего функция может прочитать переданные ей аргументы относительно основания своего стека вниз (технически это будет выход за границы текущего стека), выполнить с этим какие-либо действия (записать в файл, вывести в консоль, просто перемножить) и сохранить результат (обычно результат сохраняется не на стек, а в регистр AX).
После чего функция восстанавливает старое значение BP, сняв его со стека, и выполняет команду RET, которая снимает со стека адрес возврата и совершает переход на него, тем самым переключившись на инструкцию сразу после CALL.
И эта система так или иначе перекочевала в большинство высокоуровневых языков начиная с FORTRAN. К примеру в C CALL превратился в круглые скобки, RET в return, а адреса и метки в имена (при этом без скобок они все еще являются указателями, то есть адресами).
Пример кода (к сожалению, штатного форматирования не предусмотрено):
#include <stdio.h> int pow2(int x) { return x * x; } int main() { int y = pow2(16); // Вызов функции. В y будет сохранено число 256 printf("%p", pow2); // Без скобок вместо вызова просто выведет адрес функции return 0; // Возврат нуля из главной функции означает отсутствие ошибок. }
Такой стиль программирования называется процедурным (выделение кода в блоки называется структурным). А вот называть процедурный язык функциональным совершенно неправильно, ибо функциональное программирование ≠ процедурное, они даже в разных категориях (императивное и декларативное).
А теперь скомпилируем этот код и разберем ассемблерный листинг
Важно понимать, что стек в большинстве архитектур традиционно растет от больших адресов к меньшим (и в x86). То есть для того, чтобы отодвинуть его вершину вверх, от регистра SP нужно отнимать значения, а вот для ужимания и съедания ненужных значений к указателю на вершину значения прибавляют. И для доступа к значениям относительно основания или вершины это тоже важно учитывать. Это может звучать запутанно, но через время привыкаешь и всё становится очевидным.
Надеюсь это возможно будет разобрать. Код скомпилирован MSVC v19.28 для x86 со стандартными настройками в Godbolt
Post scriptum
Это всё довольно упрощенно. Как минимум, в защищенном режиме используется больше 5 разных соглашений о вызове, которые отличаются деталями реализации. Это было описание для cdecl, обычно используемого в C. Еще часто используются соглашения pascal, fastcall, thiscall, winapi и другие. Fastcall, к примеру, избегает хранения аргументов на стеке, если их возможно передать через регистры, что улучшает производительность. А winapi отличается от cdecl тем, что функция сама очищает стек от аргументов для себя при возврате. А еще я упустил, к примеру, сохранение регистров, которые функция может перезаписать и испортить, а потому обязана предварительно сохранить и перед возвратом восстановить, передачу переменного количества аргументов (как в printf) и возврат значений шире 32 бит (которые не влезут в EAX).
Плюс сейчас мало кто компилирует ПО под защищенный 32-битный режим, а в длинном режиме (AMD64) используется пара других соглашений, основанных на fastcall и имеющих несколько отличий друг от друга.
Так процедура или функция? Или подпрограмма?
Процедурное программирование предлагает делить код на подпрограммы, которые принято называть функциями и процедурами (функция обычно является наиболее понятным, частым и обобщенным названием, поэтому я его использую).
Процедура от функции отличается только тем, что функция возвращает какое-то значение (как в математике), а вот процедура этого не делает. Не во всех языках явно есть процедуры (в Pascal есть, но не в C). В таком случае их заменяют функции, возвращающие ничего (void, Unit, undefined, None).
Хотя и тут есть свои особенности. К примеру функция, возвращающая void в C и Java является прямым аналогом процедур, как-либо использовать возвращенное значение из такой функции невозможно, ибо его нет физически. А вот Unit в Kotlin это синглтон (а-ля единственная и уникальная константа уникального типа), ссылку на который можно присвоить в переменную, но в этом особого смысла нет. Undefined в JS и None в Python тоже уникальные константы специальных типов.
Но не тут-то было
Вроде бы процедура никогда не может ничего вернуть...
Только она этого никогда не делает напрямую. При она этом может записать результат в глобальную переменную, а еще часто принимает в себя указатели или ссылки, по которым может записать результат. Это еще удобно тем, что можно "вернуть" несколько значений. Пример:
void procedure(int x1, int *x2, int *x3) { // Функция ничего не возвращает, то есть это процедура *x2 = x1 * x1; // Разыменовываем указатель и записываем по его адресу результат. *x3 = x1 * x1 * x1; // Разыменовываем другой указатель и записываем по его адресу результат. } int y1, y2; procedure(16, &y1, &y2); // В y1 оказался результат, аналогичный прошлому примеру. А в y2 куб числа.
PS: оператор звездочка при указании типа превращает его в тип-указатель, а при применении на переменную-указатель разыменовывает ее до изначальной переменной. Амперсанд превращает переменную в указатель на нее (иногда еще называется оператором получения адреса).
То есть мы вернули сразу 2 разных значения из процедуры, которая якобы ничего не возвращает. Чудеса. Подобные чудеса есть в том числе в Pascal с явным делением на процедуры и функции (плюс там это сделано немного удобнее). Хотя механизм тут отличается от того, который используется в возврате значения из функции и совпадает с механизмом передачи обычных аргументов, поэтому никакой магии.
Еще про связь с математикой
Главное отличие функций в программировании от функций в математике в том, что они могут делать что-то на стороне и не обязаны возвращать одинаковый результат при одинаковых аргументах.
К примеру функция получения случайного числа по определению не может существовать в математике, если она не принимает в себя предыдущее случайное число или зерно для его видоизменения. Или функция записи в файл, возвращающая 0 в случае успеха и другое число при провале. Ко всему прочему, такая функция имеет побочный нематематический эффект, то есть запись в файл, что тоже недопустимо традиционной математикой без высоких абстракций.
Поэтому придумали чистые функции. По сути это ограничитель, которые делают функцию полным отражением таковой в математике. Им запрещено возвращать разные значения при одинаковых аргументах (точнее запрещено всё, что может такое позволить сделать), запрещено обращаться к нечистым функциям, запрещено обращаться к тому, что не является аргументом или локальной переменной, запрещены вообще любые действия, которые могут сделать что-то на стороне (даже функция sin() в C не всегда является чистой, ибо может зависеть от состояния FPU).
Чистые функции через ключевое слово pure явно есть в D и FORTRAN (проверка на чистоту во время компиляции), а также являются основой функционального программирования.
Чистая процедура тоже имеет право на жизнь, используя механизм со ссылками (на счет указателей не уверен из-за возможности арифметики над ними).
Функциональное программирование
Это очень сложная категория, которую постоянно путают с процедурным программированием. А еще это де-факто противоположный стиль: декларативный. Традиционное императивное программирование детально описывает процесс получения результата, а декларативное сам результат, без деталей реализации (хотя разделение обычно довольно нечеткое). При этом второй типичен для языков разметки типа HTML и CSS. То есть, условно, как одна и та же операция могла бы выглядеть в императивном и декларативном стиле:
document.tags.A.color = "blue" /* Императивный (JSSS). Сделать ссылки синими */
a { color: blue } /* Декларативный (CSS). Ссылки должны быть синими */
Почувствуйте разницу.
И функциональное программирование я никогда не изучал и слишком мало о нем знаю. Так что готовьтесь к ошибкам и не воспринимайте всё за чистую монету.
Внутри чистого функционального программирования
Основано полностью на математике, все функции обязаны быть чистыми. Операция присваивания запрещена (разрешены константы), переменных в привычном виде нет. Прикольно? Очень!
Во многих процедурных языках функции и процедуры являются объектами второго класса (не путать с классами из ООП), что не позволяет их свободно присваивать в переменные, передавать как аргументы в другие функции или возвращать из них (только через указатели). Функциональные языки расценивают функцию как объект первого класса, то есть их можно, а часто нужно передавать в другие функции напрямую.
Это дает некоторые преимущества, особенно в плане безопасности и при работе с многопоточностью (по причине неизменяемости данных и отсутствия глобального состояния), но вся концепция имеет один фатальный недостаток: вы мало чего полезного можете сделать, ибо что ввод, что вывод являются математически нечистыми, а потому запрещены. Вот такое вот гениальное изобретение безумных математиков.
Функциональное и процедурное программирование. Холст, масло
Каждый чисто функциональный язык выкручивается из этого по-своему, к примеру через монады. Это позволяет им существовать вне шуток и даже использоваться на практике.
Это не все особенности функциональных языков, но одни из самых важных. Самый известный такой язык: Haskell. Функциональные F#, Lisp, ML и многие другие не являются 100% чистыми.
Смешанное функциональное программирование
Последнее время часто используются смешанные языки, к примеру вместе с процедурным или объектно-ориентированным программированием, что избавляет от ограничений математики, но дает гибкость в том, что функциями можно оперировать как с любыми другими типами данных, а еще дает много очень удобного сахара вроде замыканий и лямбд. Это C#, Python, JS, частично Java и C++ (в них нужны костыли в виде интерфейсов из одного метода или оберток над указателями).
Особенности
Функции как объект первого класса. К примеру в C# это реализовано через систему делегатов, которые представляют из себя тип-обертку для функций:
Action<string> printer = Console.WriteLine; // Action<string> - тип-делегат. Неявно создаем его объект и присваиваем туда функцию printer("Hello, World!"); // Вызываем функцию через делегат
Локальные функции: как обычные, только вложенные в другую функцию (объявленные внутри нее)
void Func1() { // Глобальная функция void Func2() { // Локальная функция Console.WriteLine("В локальной функции"); } Func2(); }
Лямбды: возможность объявить безымянную функцию посреди кода (часто удобнее локальных)
var pow2AsLambda = x => x * x; // => - оператор лямбда-выражения pow2AsLambda(5); // Вернет 25
Замыкания (можно использовать вместе с лямбдами и локальными функциями):
int someValue = 42; var pow2AsLambda = x => x * x + someValue; // someValue будет захвачено замыканием, хотя напрямую не передано pow2AsLambda(5); // Вернет 67
Особенность замыканий в том, что они могут захватить локальную переменную родительской функции внутрь себя, продлевая ей время жизни за пределы блока с кодом. После чего такую лямбду можно передать в другую функцию, которая просто так не имеет доступа к someValue (в обычных условиях someValue вообще уже будет уничтожен), а вот переданная лямбда сможет ее прочитать или записать всегда и откуда угодно. И самое интересное то, что значение этой переменной будет сохранятся между вызовами к замыканию. То есть она становится глобальной, но видимой только из функции-замыкания.
ООП
Посмотрим на индекс TIOBE по популярности языков. Фиолетовым я пометил чистые функциональные языки. Языки, имеющие возможности, присущие функциональным языкам (смешанные) - синим, процедурным - красным, а объектно-ориентированным (ООП) - зеленым. Языки, в которых нельзя объявить функцию, принадлежащую самой себе или модулю, процедурными считать не совсем корректно (Java).
Не претендую на 100% точность
Видите фиолетовые точки? И я не вижу. А вот синих 12. В то же время красных и зеленых по 16. При этом реально применяемый чисто процедурный язык всего 1: С. Остальные имеют какую-либо встроенную поддержку других парадигм.
И сейчас практически всё большое ПО пишут в ООП. Ибо позволяет хоть как-то сдерживать структурированность кода после перехода с десятков тысяч строк к сотням (и миллионам).
Внутри
ООП является развитием идеи процедурного программирования. Проблема была в том, что помимо кода в программе существуют еще и данные, которые было бы неплохо связать с соответствующим им кодом. И через некоторое время после появления процедур появились структуры (они же записи в Pascal, не путать со структурным программированием).
Структуры были удобным способом объединить несколько переменных в единое целое. Пример:
typedef struct user_struct { char *username; int userid; int reputation; } user_t; user_t someuser = { "IvanKr08", 17002, 253 }; // Инициализируем значениями someuser.reputation += 10; // Обращаемся к полю
(Вместе с этим объявляем структуру новым типом через typedef, что не делается по умолчанию в C, в отличии от C++. Один из ярких примеров несовместимости C и C++):
После чего user_t превращается в новый тип, как int или char. Можно создать полноценную переменную типа user_t (или массив такого типа), а потом обратиться к какой-нибудь ее части (полю) через оператор точки (.). Можно сделать функцию, которая будет принимать или возвращать переменную типа user_t (к примеру someuser). Можно сделать указатель на user_t, тогда для обращение к полю используется оператор стрелки (->). Или можно встроить переменную типа одной структуры в другую, это тоже не запрещено. Внутри структурная переменная представляет из себя последовательно слепленные поля в одно целое.
Если поля разного размера, то часто добавляют пустоты между полей в целях выравнивания по размеру наибольшего поля и улучшения производительности, но это сложная тема
Возвращаемся к ООП
Суть ООП в том, что помимо полей структуры могут содержать процедуры и функции. Такая структура называется классом, переменная класса - объект, а процедура класса - метод.
Метод принципиально ничем не отличается от любой процедуры или функции, кроме того, что неявно принимает в себя специальный аргумент this (в Python это делается явно, в некоторых языках вместо this может быть self). Он содержит в себе ссылку/указатель на объект класса, от которого был вызван. Пример:
class User { public: char *username; int userid; int reputation;
void print() { printf("Пользователь \"%s\" (%i). Репутация: %i\n", this->username, this->userid, this->reputation); // Постоянно писать this-> не обязательно. Если локальной переменной с таким именем нет, то будет произведен доступ к полю } }; User someuser = { "IvanKr08", 17002, 253 }; // Инициализируем значениями someuser.print(); // Вызвали метод, print() неявно получил в себя указатель this, который указывает на someuser someuser.reputation += 10;// Обращаемся к полю someuser.print(); // Теперь вывод поменяется
Да, никто не мешает объявить обычную функцию, которая будет явно принимать в себя указатель на User и ничего не поменяется, и так повсеместно делают в C (тот же WinAPI на этом построен целиком и полностью), но ООП на самом деле крайне сложная, большая и холиварная тема, которая развивалась на протяжении 60 лет в разных направлениях и которую поднимать тут глупо. Только опишу еще несколько разновидностей методов:
Статичный метод - как обычный метод, только не получает в себя this и вызывается от имени класса, а не объекта (не someuser.method(), а User::method()). Зачем это нужно и в чем отличие от просто функции? Статичный метод можно спрятать за инкапсуляцией, плюс он привязан к классу, а не болтается в глобальном пространстве имен.
Конструктор - автоматически вызывается при создании нового объекта. Может иметь аргументы, тогда обязан явно вызываться как функция с именем класса, т.е. User("IvanKr08", 17002, 253)
Деструктор - есть в C++. В C# называется финализатором и имеет несколько важных отличий. Автоматически вызывается перед уничтожением объекта (к примеру выход из области видимости, явное удаление оператором delete или удаление сборщиком мусора в C#). Не может иметь аргументов.
Свойство - есть в Delphi и C#, куда перешел от первого. С точки зрения синтаксиса это поле, которое можно читать и записывать, только вместо прямого обращения в память вызываются соответствующие методы (set и get). Пример: ... int SomeProperty{ get =>42; set => Console.WriteLine("Set"); } ... test.SomeProperty = 10; // Значение никуда не сохранится, будет выведено "Set" в консоль Console.WriteLine(test.SomeProperty); // Всегда будет 42
Перегрузка оператора - специальный метод, который позволяет переопределить стандартные операции для типа. К примеру нельзя сложить два объекта User или User и число, но если перегрузить оператор +, то можно будет определить свою логику для этого (не обязательно, чтобы оно что-то реально складывало. Это может быть любое действие).
Индексатор - синоним перегрузки оператора квадратных скобок. Объект начинает вести себя как массив.
Функтор - перегрузка оператора круглых скобок (иначе называется перегрузкой оператора вызова функции). Позволяет "вызывать" объект так же, как и функцию. Звучит запутанно, но можно погуглить. Есть в C++. Также бывает функтор в функциональном программировании, но он не имеет ничего общего с функтором в C++.
Виртуальная функция (метод) - самый интересный и сложный тип, составляет основу полиморфизма. Вкратце объяснить его невозможно, но одним из ключевых принципов ООП является наследование, то есть один класс (наследник) копирует в себя все поля и методы другого класса (родитель), и может добавить новые. И суть в том, что указатель (ссылка) на объект класса-наследника может быть присвоен в переменную-указатель родительского типа. А самое интересное то, что любые обращения (к примеру вызовы методов), сделанные через родительский указатель, будут вести себя аналогично обращениям, сделанным напрямую через указатель с типом наследника. Это называется полиформизмом. Но это было бы не слишком полезным, если бы не возможность объявить метод в родительском классе виртуальным, а в наследнике полностью переопределить его код.
И то, что я забыл
Послесловие
Если вы осилили эти 3000 слов и даже смогли что-то понять, то найдите и распечатайте себе утешительную грамоту. А я устал и пойду искать смысл жизни...
UPD: исправлены косяки форматирования, очепятки, добавлено еще пару пунктов про разновидности методов и функциональное программирование.
1. На самом деле многие известные актеры это дети других известных актеров. Очень многие известные актеры и музыканты имели богатых и влиятельных родителей, которые уже имели связи в индустрии. Случаи, когда человек с улицы становится известным, все более редкие. Когда вдруг из ниоткуда появилась Билли Айлиш, о которой никто до этого ничего не знал, мне это показалось подозрительным. Да, она талантлива, но ее продвижение это грамотное дергание за нужные ниточки. А потом выяснилось, что ее семья уже занималась музыкальным бизнесом. Тейлор Свифт тоже богатый ребенок. А вот Бибер сначала получил популярность на ютубе, и только потом у него появился богатый спонсор. Но схема всегда одна. Один богатый и знаменитый помогает взлететь другому, который в итоге тоже становится богатым и знаменитым. Вот самые известные такие тандемы. Билли Рэй – Майли Сайрус, Стив – Лив Тайлер, Мартин – Чарли Шин, Дональд – Кифер – Сара Сазерленд, Пол – Стелла Маккартни, Блайт Даннер – Гвинет Пэлтроу, Кит – Лили и Альфи Аллен, Минни Рипертон – Майя Рудольф. И это просто знаменитости. Вы еще не видели семейные деревья политиков.
2. Мой телефон слушает меня, и это просто не может быть совпадением. Он показывает рекламу, основываясь на разговорах о какой-то вещи. Недавно мы обсуждали одну штуку, о которой я не вспоминал годами, и вечером уже вижу ее рекламу.
3. Когда мне было 10 лет, я участвовал в одном конкурсе для школьников. Суть вот в чем. Нужно было написать сценарий для очередной серии «Доктор Кто», и организаторы обещали экранизировать самый лучший вариант, указав имя автора в титрах. Мне очень нравился этот сериал, и я отнесся к конкурсу со всей серьезностью. В моей истории Доктор Кто приземляется на планету, полную дефективных киберлюдей. У них были сбои в программах, и они погибали на этой планете. Доктор прилетел сюда, потому что получил сигнал бедствия от одной женщины, и теперь ему нужно найти ее, одновременно отбиваясь от киберлюдей. Я отдал сценарий учителю, но через несколько дней он вернул его мне, сказав, что организаторы конкурса не приняли сценарий из-за неправильного оформления. Конечно, я расстроился, но вскоре обо всем позабыл. И вот через пару лет выходит очередная серия Доктора Кто под названием Убежище Далеков. За исключением мелких разночтений это один в один мой сценарий. У меня нет никаких доказательств, но я до мозга костей убежден, что Стивен Моффат украл у меня сценарий, и лишь немного его подрихтовал.
4. Я считаю, что практически полное отсутствие в американских школах уроков по финансовой грамотности сделано намеренно. Ведь в 80-х годах эти уроки были практически во всех штатах, а потом вдруг посчитали, что это не нужно. В моей школе этот предмет вели целый семестр. Нам давалось воображаемое хозяйство, которое мы должны были поддерживать на плаву, разруливать ситуации с непредвиденными расходами, инвестировать прибыль в фондовый рынок и заполнять налоговую декларацию. Нас учили искать в газетах предвыборные материалы разных кандидатов и анализировать их. Чтобы получить хорошую оценку, ты должен был не угробить свое хозяйство и подготовить анализ предвыборной программы какого-нибудь кандидата. Предмет был обязательным, без него не получишь аттестат.
5. Все магазины матрасов, которые есть в США, это прикрытие какой-то преступной организации. Когда вы в последний раз покупали матрас? Правильно, не можете вспомнить. Почему тогда в городе с населением 80 тысяч человек в пределах шести кварталов есть 7 магазинов, в которых продают только матрасы? Я уверен, что вся эта индустрия скрывает нечто большее. После колледжа за все эти годы я три раза покупал матрас, и всегда был единственным покупателем в магазине.
1. Я нашел блокнот моей жены. На первой странице был план из 10 пунктов, в котором подробно описывалось, как она собирается бросить меня ради другого парня. Я сократил этот план до одного пункта.
2. Она достала свой смартфон, чтобы снять видео на вечеринке по случаю дня рождения моего сына, и на ее экране появилось сообщение: «Я тоже тебя люблю».
3. Я узнала, что муж изменяет мне, когда засорился душ. Я стала прочищать слив и вытащила оттуда клок рыжих волос. А я блондинка.
4. У нас была связанная учетная запись в Apple и приложение «Найти iPhone» на наших двух смартфонах. В конце концов, я обнаружила, что многие сверхурочные часы на работе он проводил вне офиса.
5. Однажды утром я проснулся и увидел, что она ставит сердечные смайлы в какое-то сообщение. На тот момент мы были женаты 7 лет, и у нас было двое детей. Более того, это был мой день рождения.
6. Ко мне домой пришла подруга. Я причесала ее, а волосы с расчески положила на рубашку мужа, чтобы посмотреть, что он на это скажет. Он признался, что изменял мне с другой женщиной, и у нее как раз такой цвет волос.
7. В моей машине постоянно пахло табаком, хотя мы с женой не курили. Я спросил ее об этом. Она побледнела. Потом я вспомнил все так называемые сверхурочные часы, которые она якобы отрабатывала по вечерам в своем ресторане. Она увидела по моим глазам, что я обо всем догадался, и призналась, что у нее роман с официантом. После работы они ехали на нашей машине к нему, и он курил по дороге.
8. Моя блестящая бывшая жена действовала мне на нервы из-за нашего общего счета за телефон. Она раскритиковала меня за то, что я слишком много по ее мнению говорю по телефону. Но я никогда никому не звоню, кроме нее, и ее номер является бесплатным по моему тарифу. Поэтому я проверил счет и нашел номер, на который очень часто звонила жена. Оказалось, что это номер парня, с которым она мне изменяла.
9. Моего друга посетил дальний родственник его жены. Они оказали ему гостеприимство, и вместо того, чтобы остаться на несколько дней, он решил пожить еще немного. Но мой друг что-то почувствовал. Это оказался никакой не родственник, любовник его жены, и он пробыл у них больше месяца. Потом он выгнал жену вместе с любовником.
10. Моя девушка проходила университетский обмен в моем университете. Ради любопытства я погуглил. Наткнулась на блог ее парня, в котором подробно описывались их романтические отношения на расстоянии. Оказалось, что это ее любовник.
11. Мы с мужем стояли в пробке. Стекла автомобиля запотели. Мне нужно было захватить сумку с заднего сиденья. Я обернулась и увидела на окнах отпечатки рук и ног. Так я узнала, что муж мне изменяет.
1. Мой дядя учился в колледже вместе с Джоном Синой. Рассказывал, что тот любил ходить по коридорам общаги почти без одежды.
2. Моя тетя знала Снупа Дога в старшей школе. Все в то время относили себя к какой-нибудь банде и носили отличительные цвета. Тетя тоже решила стать членом банды и повязала на руку цветную бандану. А Снуп подошел к ней, и снял ее, не говоря ни слова. Оказалось, что на людей с такими банданами объявили охоту. В целом, еще со школьных лет он был крутым чуваком. Слышал, что и сейчас мало изменился.
3. Мой отец стажировался с Томом Хэнксом на Шекспировском фестивале на Великих озерах, когда тот только начинал сниматься в кино. Том был добрым, харизматичным и необыкновенно энергичным человеком. Когда родился его сын Колин, он с гордостью показывал ребенка всем подряд. Около трех лет назад была встреча выпускников. Отец пошел туда, не зная, придет ли Том Хэнкс, а если придет, то узнает ли его. Том узнал отца и даже назвал его полное имя. Он просто потрясающий человек.
4. Я учился в школе вместе с Софи Тернер. Она была на два года младше, но я играл с ней в нескольких пьесах. Честно говоря, она была среднестатистической девушкой во всех отношениях. Она никогда не получала больших ролей в школьном театре, всегда была просто частью группы. Потом я очень удивился, когда узнал, что она получила одну из главных ролей в Игре Престолов.
5. Тейлор Лотнер, который потом играл в Сумерках, в школе приходил в бешенство, когда его называли Шаркбоем. Но я не могу винить его за это.
6. В средней школе я училась вместе с Пинк. Я была немного застенчива, но многие мои друзья хорошо с ней общались. Она была нормальной, и часто напевала что-нибудь себе под нос.
7. Майк Майерс учился в средней школе на соседней улице, и мы часто тусовались в одной компании. Очаровательно смешной и очень скромный. Я давно его не видела, но смотрю интервью с ним, и мне кажется, что он такой же милаха, что и раньше. Я рада, что у него все так хорошо сложилось. Он был шутником и всегда хорошо относился к людям. Он не забыл, откуда родом. Это очень круто, и редко встречается среди знаменитостей.
8. Я был лучшим другом Пост Малона в средней школе, и он почти не изменился с тех лет. Помню, он занимался инди-музыкой, носил гавайские рубахи и черные джинсы с высокой талией. Самый крутой, веселый и забавный чел, с которым каждый хотел тусоваться.
9. Учился в средней школе с Нилом Патриком Харрисом. Он был неплохим парнем, но совсем не скромным. Он уже тогда снимался в сериале «Доктор Дуги Хаузер». Но руководство школы не позволяло ему понтоваться и раздавать поклонникам автографы. Некоторые в школе называли его театральным пацаненком. Он не приходил ни на одну встречу выпускников.
10. Я учился в той же школе, что и Дженсен Эклс (играл Дина Винчестера в Сверхъестественном). Учителя его хвалили, говорили, что он молодец и добьется большого успеха. Он приходил в школу посмотреть на выступление своей сестры в школьном театре. Остался до конца и выглядел очень гордым за нее.
1. Моей девушке 31 год, она считает, что острова не касаются дна океана. Впрочем, один конгрессмен тоже так думает. Он на официальных слушаниях спросил, не приведет ли слишком большое количество людей к тому, что Гуам перевернется? Раньше я работал инструктором по подводному плаванию на Гавайях, и у меня очень часто спрашивали, как проплыть под островом, и сколько это занимает времени.
2. Бабушка всегда заставляла съедать меня хлебную корку. Говорила, что в ней больше всего питательных веществ. Когда я вырос, как-то сказал это двоюродной сестре в присутствии бабушки. Тогда бабушка рассмеялась и сказала, что специально мне в детстве так говорила, чтобы я все съедал полностью.
3. Искал в интернете классические произведения. Мне нужен был Бетховен и Бах, но вся их музыка была в исполнении современных оркестров. Я долго пытался найти оригинал 18 века, пока не понял, насколько я тупой.
4. Пони это маленькая лошадь. Я думал, что пони это дети больших лошадей. Узнал, что это не так, только в 37 лет.
5. Про пони и для меня это было открытием. Но я узнала об этом в 23 года, когда стала встречаться с парнем, который вырос на ферме. Я рассказала дома родителям о своем открытии. Мама была в шоке, что я, дипломированный магистр, этого до сих пор не знала. Папа тоже был в шоке, что это так.
6. Моей тете 60 лет. Она до недавнего времени думала, что кошку можно скрестить с собакой. Я ей доказывала, что нет. Она мне не верила. Тогда я спросила, она видела хоть раз полукошку-полусобаку. Тетя долго думала, а потом нехотя призналась, что я права.
7. Мой друг только в колледже узнал, что Мартин Лютер и Мартин Лютер Кинг младший это разные люди.
8. Мама говорила, что машина не заведется, если ремни безопасности не пристегнуты. Я верил в это до 22 лет.
9. Я очень долгое время не знал, что рецензии на фильмы о Роллинг Стоунз это не отзывы слушателей об этой же группе. Я долгое время жил с мыслью, что музыканты этой группы и создали журнал с таким же названием. Я все понял только в 39 лет.
10. Мой друг учится в аспирантуре. До 24 лет он не знал, что существуют куры мужского и женского пола. Он считал, что петух и курица это разные виды птиц.
11. Имя моей кузины. Сколько помню себя, мы всегда звали ее Тори. Мне было под 30, когда я узнал, что ее настоящее имя Виктория, а Тори просто сокращение.
12. Мелким гостил у тети Крис. Зазвонил телефон, спросили Кристину. Я сказал, что здесь такие не живут, и повесил трубку. Я тогда всерьез считал, что полное имя моей тети Крис это Кристофер.
13. В бассейны не добавляют химическое вещество, которое в присутствии мочи окрашивается в синий цвет. Это выдумка, которой пугают детей, чтобы те не мочились в бассейне. Но сам я об этом узнал, будучи взрослым.
14. Искала в магазине праздничную свечу для торта с числом 10, но так и не нашла. Пожаловалась мужу, а он сказал, что надо взять свечи с 1 и 0 и воткнуть рядом. Какая я тупая. А еще я раньше думала, что глупо делать свечи с цифрой 0, ведь никто не отмечает 0 лет.
15. Я уже почти вышла на пенсию, и только пару недель назад узнала, что между Европой и Америкой проложен телеграфный кабель. Всегда считала, что такое невозможно.
16. Моему соседу было 21, когда он узнал, что у коров есть шерсть. Он думал, что это кожа у них такая с черными разводами.
17. В детстве дедушка часто брал меня на рыбалку. Он говорил, что нельзя шуметь, иначе вся рыба уплывет. Мне было 29 лет, мы с мужем поплыли на катере на рыбалку. Он закинул удочки и включил радио. Я ему рассказала, о чем меня предупреждал дед. Муж улыбнулся и сказал, что раз мы винтом мотора не распугали рыбу, то музыка ее точно не распугает, а дедушка просто хотел порыбачить в тишине.
18. Учительница в начальной школе говорила, что когда идет снег, нельзя шуметь, иначе он прекратится. Я верила в это еще в колледже.
19. В колледже пришлось доказывать другу, что желтый цветок одуванчика и белый шарик это одно растение. Он думал, что разные.
20. В детстве я думал, что когда мы едим, еда скапливается в ногах, и когда ее уровень поднимается до попы, мы идем в туалет. Не помню, откуда я это взял, но верил в это гораздо дольше, чем следовало.
21. Я смог разглядеть заглавную букву D в логотипе Диснея только месяц назад. Мне всегда казалось, что это отзеркаленная G. Мне 29 лет.
22. А я думал, что в конце слова Дисней не Y, а P, и это какое-то причудливое написание на французский манер. В 20 лет сказал об этом брату. Он сначала не понял, что я всерьез, а потом долго смеялся.
23. Мне было 4 года. Мама принесла мне воздушный шарик, наполненный гелием. Я его отпустил, и он улетел. Я расстроился. А вечером мама приносит этот шарик и говорит, что случайно увидела, как он пролетал около заправки, и поймала. Мне было, наверное, под 30, когда до меня дошло, что мама просто купила другой такой же шарик.
Что, православные, все соблюдают Великий пост? Скоро уж и пасха... Это я к чему? Не так давно был в Третьяковке, увидел на стене живопись из прошлой жизни, вспомнил анекдот.
Спрашивают у сельского попа, здоровенного мужика: -
Батюшка, а сколько водки Вы можете выпить? – Ну, это смотря по обстоятельствам
- По каким обстоятельствам, батюшка? – Выпивать за свой счёт, али за счёт
чужаго? – За чужой, батюшка. - Ну, тогда смотря по обстоятельствам - По каким
обстоятельствам, батюшка? Выпивать-то в помещении али на воздусях? – На свежем
воздухе, батюшка - Ну, тогда смотря по обстоятельствам- По
каким обстоятельствам, батюшка? - Выпивать-то под закуску али без оной?..- Под
закуску, под закуску. - Ну, тогда смотря по обстоятельствам - По каким
обстоятельствам теперь, батюшка? – А закуска постная али скоромная? –
Скоромная, батюшка, скоромная - Ну, тогда конца не предвижу.
«Тот, кто целится рукой, забыл лицо своего отца.» (с)
Рисовал на заказ персонажей «Тёмной башни» Стивена Кинга. Как я их представляю. Собственно первый из них - Стрелок, он же Роланд Дискейн
Получилось не совсем так как я его себе представлял, но это обычное дело в рисовании. В целом результатом был доволен. Фон «бросовый» так как заказчик собирался сам объединять персонажей на татуировке.
Рисовал естественно пользуясь референсами. Подсматривая элементы у «брутальных мужиков» ))) Думаю большинство лиц вам знакомо ;)
В списке "за" было "постоянный компаньон" и "лучше чем собака". Список "против" включал "придется навещать родственников" и "меньше денег на покупку книг".
Ярослав Дронов (SHAMAN) и Екатерина Мизулина публично объявили о своих романтических отношениях 9 марта 2025 года во время концерта «Ты моя» в московской «Live Арене». SHAMAN пригласил Мизулину на сцену, вручил ей белые розы и заявил: «Мы пара, мы встречаемся, и мы вместе». Екатерина ответила лаконичным «Да», после чего пара поцеловалась на глазах у зрителей3813. Это событие положило конец многомесячным слухам, которые активно обсуждались в СМИ с лета 2023 года1011.
История развития отношений
Начало: Первые подозрения о романе возникли после развода SHAMAN с его второй женой Еленой Мартыновой в 2024 году. Пара стала чаще появляться вместе: посещала концерты, публиковала совместные фото в Telegram и даже сняла клип на песню «Я останусь с тобой» с элементами романтики3410.
Публичные жесты: Мизулина неоднократно поддерживала SHAMAN, включая визиты на его выступления и участие в благотворительных акциях (например, поздравление детей в образах Деда Мороза и Снегурочки)10.
Совместные проекты: В феврале 2025 года они представили клип с поцелуем, снятый в московской школе №1409, что вызвало новый всплеск обсуждений35.
Реакция окружения
Мать SHAMAN, Людмила Дронова, одобрила выбор сына, отметив, что Екатерина — «верный друг и заботливая девушка»4.
Коллеги из шоу-бизнеса, включая Юлию Савичеву и Анастасию Вознюк, выразили поддержку паре, пожелав им счастья48.
Однако некоторые эксперты и пользователи соцсетей выражают сомнения, считая отношения пиар-стратегией. Например, астролог Виктор Богданов предсказывает, что союз продлится не более 3–5 лет из-за астрологической несовместимости9.
Контекст личной жизни
SHAMAN: До отношений с Мизулиной певец был дважды женат. Первый брак (2012–2016) с вокалисткой Мариной Рощупкиной закончился из-за разногласий в карьерных планах. Второй брак (2017–2024) с Еленой Мартыновой распался из-за напряженного рабочего графика310.
Мизулина: Информация о её прошлых отношениях не разглашалась. Известно, что она никогда не была замужем и не имеет детей311.
Прогнозы и планы
SHAMAN подчеркивает, что ценит в Мизулиной духовную близость и общие интересы, а не внешность: «Мне важно, чтобы к человеку тянуло»4.
Астрологи предполагают, что пара может объявить о беременности уже в 2025–2026 годах, но долгосрочного будущего у союза не видят9.
Поклонники ожидают, что вдохновленный любовью SHAMAN выпустит новые хиты и проведет юбилейный концерт к 30-летию творческой деятельности4.
Итог: На текущий момент (1 апреля 2025 года) Мизулина и SHAMAN официально подтвердили романтические отношения. Их союз сочетает публичные жесты, профессиональную поддержку и общие проекты, но остается под прицелом критиков и скептиков.
А как вы считаете она под хвост даёт ? Или называет его по РУССКИ ???? !!! Шаманом ?