Квакши – это почти исключительно древесные лягушки, поэтому способность закрепляться на любых поверхностях для них – не приятный бонус, а жизненная необходимость.
На кончиках пальцев каждой квакши находится небольшой диск с желёзками, выделяющими клейкий секрет при надавливании, а сами диски работают как присоски. Благодаря сочетанию этих факторов квакша может дрыхнуть даже на стекле!
Если кто-то помнит, то разархивирование мы уже показывали - тут
Я думал, что с развитием технологий, нарисовать плакат сейчас может любой школьник, и времена, когда плакаты рисовали бездарные художники уже в прошлом, а вот и нет.
Микробиолог из Чикаго провёл эксперимент: клал еду на пол на 5, 10, 30 и 60 секунд, а потом проверял, сколько микробов на ней осталось. Бактерии попадают на пищу моментально и размножаются активно, независимо от времени.
1. Я влюбилась в парня, который жил недалеко от моего дома. Я украла его собаку, а потом привела ее, якобы нашла. Хотела с ним поговорить, но он сказал, что видел, как я уводила собаку. После этого я избегала его.
2. В школе я был влюблен в одну девушку. В то время я немного занимался писательством, поэтому сделал ее героиней рассказа в жанре фэнтэзи. Рассказ ей не понравился, она всем его показала. Меня и так травили одноклассники, а этот случай только подлил масла в огонь. Мне все еще не по себе, когда вспоминаю, каким тогда был фриком.
3. Когда мне было 17, я типа случайно отправила парню, который мне нравился, свою фотку в офигенном платье, чтобы он пригласил меня на танец на классной вечеринке. Он не пригласил.
4. В 11 классе в последний день перед рождественскими каникулами в школьном автобусе была девочка, которая обращала на меня внимание в начале учебного года, но сейчас остыла. Мне нужно было снова разжечь огонь. Я решил взять с собой в автобус веточку омелы и вытащить ее из рюкзака перед той девочкой. Я рассчитывал, что она поцелует меня, потому что в наших краях есть такая традиция целоваться под омелой. Но поскольку омела растет высоко на дереве, я срезал веточку остролиста, удалив с него колючки. Никто ведь на самом деле не знает, как выглядит эта омела. И вот, я сижу в автобусе, она позади меня, я весь на нервах. И тут к ней подходит какой-то парень и дарит розу. Она в восторге обнимает его, а я так и остался сидеть с веткой остролиста в рюкзаке.
5. Когда была глупой и наивной девушкой, я танцевала вокруг фонарного столба, как вокруг шеста, у дома парня, который мне нравился. Сначала он смотрел в окно, а потом покрутил пальцем у виска и задернул шторы в своей комнате.
6. Я была по уши влюблена в одноклассника. Мой девичий мозг думал, что если я буду постоянно смотреть ему в глаза, то это будет для него соответствующим сигналом. Каждый раз, когда мы разговаривали, я неотрывно смотрела ему в глаза. Я где-то вычитала, что мальчикам нравятся большие глаза, но я не умела краситься, поэтому таращилась изо всех сил. А он потом говорил, что я с приветом.
7. Каждый день на занятиях я смотрела его тетради и копировала его почерк. Я тренировалась, пока наши почерки не стали совсем похожи. У меня была теория, что когда наши почерки станут совсем одинаковыми, он в меня влюбится. Но он ничего не знал про эту теорию, поэтому не влюбился.
8. В старшей школе была влюблена в одноклассника Джимми. Я не знала, как привлечь его внимание, и придумала вот что. Я написала фанфик в стиле Гарри Поттера, в котором Гарри был он, а Джинни была я. Краснея, я дала ему тетрадь с рассказом. Я знаю, что он прочитал, но никак не отреагировал. Но конец у этой истории хороший. Я стала встречаться с Джимми через год после школы, и мы уже 9 лет, как женаты. Он все еще хранит ту тетрадь. Иногда достает и начинает читать вслух, и я также краснею.
Интеллектуальное управление инженерными сетями снижает потребление электроэнергии, газа и топлива благодаря оптимизации режимов работы оборудования. Это достигается путём анализа внешних условий (температура воздуха, влажность), поведения пользователей и интеграции с погодозависимыми датчиками.
2. Улучшение комфорта и качества среды обитания
Автоматизированные системы регулирования микроклимата обеспечивают оптимальный уровень температуры, влажности и воздухообмена в помещениях независимо от сезона и погодных условий. Особенно актуально это для общественных зданий, торговых центров, больниц и офисов.
3. Экономия затрат на обслуживание и ремонт
Постоянный мониторинг состояния оборудования помогает выявлять проблемы на ранних стадиях, предотвращая крупные поломки и дорогостоящие ремонты. Например, датчики протечек обнаружат проблему задолго до появления серьёзных последствий.
4. Уменьшение рисков чрезвычайных ситуаций
Автоматические системы мониторинга пожарной сигнализации, обнаружения протечек газа, электричества способны мгновенно реагировать на опасные ситуации, повышая безопасность обитателей и сотрудников здания.
Примеры конкретных решений:
a) Система управления освещением
Система автоматизации освещения регулирует интенсивность света в зависимости от уровня естественного освещения и присутствия людей в помещении. Датчики движения автоматически включают свет в нужных зонах и выключают его при отсутствии активности.
b) Управление отоплением и вентиляцией
Используя погодозависимые алгоритмы, система управляет температурой и влажностью внутри помещения, минимизируя потери тепловой энергии и поддерживая заданные температурные параметры. В результате снижаются расходы на обогрев и охлаждение пространства.
c) Водосбережение
Датчики потока и давления воды регулируют подачу жидкости таким образом, чтобы минимизировать расход воды при сохранении необходимого напора и производительности водоразборных точек.
Технологии и стандарты интеллектуализации зданий:
KNX: Открытый стандарт коммуникации между устройствами различных производителей, позволяющий интегрировать освещение, климат-контроль, сигнализацию и другие подсистемы в единую сеть. KNX поддерживает разные типы связи: проводную (шина EIB/KNX), беспроводную (радиочастоты) и IP-сети.
BACnet: Протокол обмена данными, разработанный специально для управления HVAC (отопление, вентиляция и кондиционирование). Позволяет объединять устройства разных брендов и типов в одну систему.
Modbus: Простой протокол передачи данных, используемый преимущественно в промышленности для сбора показаний приборов учета и удалённого управления оборудованием.
Эти технологии делают возможным создание гибких, надёжных и масштабируемых архитектур, позволяющих реализовать концепцию «интеллектуального дома» или «интеллектуального офиса».
Таким образом, внедрение интеллектуальных решений в управление инженерными коммуникациями становится необходимым условием современной инфраструктуры, способствующим снижению эксплуатационных расходов, улучшению экологической обстановки и обеспечению высокого уровня комфорта и безопасности.
В действительности известен один подобный случай. В 1914 году американская почтовая служба переправила 5-летнюю девочку из штата Айдахо в город за 150 километров. Таким образом родители переправили дочку к дедушке и бабушке. И хотя это единичный такой случай, все-таки в 1920 году генеральный почтмейстер США Альберт Берльсон запретил отправлять детей по почте.
Я долго не мог понять, почему одни люди, сталкиваясь с
тревогой, превращаются в парализованное существо, неспособное ни думать, ни
действовать, а другие — с тем же уровнем тревоги — делают вдох, смотрят в
потолок, морщатся… и продолжают делать своё. Не идеально. Не героически. Но
продолжают. И вот когда я начал всматриваться в этот механизм, я понял: вся
разница — в одной маленькой вещи. В мета-позиции.
Да, звучит как что-то вычитанное в учебнике по философии или
в пособии по психотерапии для студентов. Но на деле — это почти биологическая
необходимость. Если ты хочешь жить среди людей, в XXI веке, в реальности, где
тревога — это не исключение, а почти константа — тебе нужно учиться вставать в
эту самую мета-позицию. Иначе сожрёт. Или тревога, или твоё стремление её
заглушить.
Что такое мета-позиция? Объясню по-человечески. Это когда ты
перестаёшь быть участником тревожной сцены и становишься её наблюдателем. Как
будто изнутри себя делаешь шаг в сторону. Не чтобы сбежать. Не чтобы
отключиться. А чтобы увидеть. Чтобы поймать себя в моменте — в моменте, когда
автоматическая мысль уже сработала, тело отреагировало, а ты… вместо того,
чтобы поддаться, говоришь себе: «Стоп. Что сейчас происходит?»
И вот это «стоп» — оно меняет всё. Потому что именно в этом
моменте появляется выбор. Пока ты в тревоге — ты не выбираешь. Ты рефлекторно
реагируешь. Ты — заложник. Но как только ты смог наблюдать — ты уже можешь
думать. Спрашивать. Сомневаться. Анализировать. И, главное, — не верить на
слово всему, что говорит тебе твой испуганный мозг.
Мне не раз приходилось работать с клиентами, которые были
уверены: их тревога — это проклятие. Болезнь. Неустранимый дефект. А я им
говорил: нет. Тревога — это навык. Да, искажённый, да, болезненный, но это всё
ещё навык. И как любой навык — его можно корректировать. Улучшать. Осознавать.
Переобучать.
И вот мета-позиция — это главный рычаг в этом обучении.
Потому что нельзя изменить то, что ты не видишь. А пока ты в тревоге — ты
ничего не видишь. Ты — внутри тумана. Внутри ощущения, внутри паники. Внутри
катастрофического сценария. А выйти можно только одним способом — посмотреть со
стороны. И задать себе несколько простых, но жёстких вопросов.
Например:
— Что сейчас со мной происходит?
— Что я только что подумал?
— Откуда эта мысль?
— Это факт — или моя интерпретация?
— Что бы я сказал другому человеку, если бы он чувствовал то же?
И вот здесь начинается волшебство. Потому что как только ты
начинаешь мыслить из позиции наблюдателя — ты меняешь не только своё мышление,
но и физиологию. Тело откликается. Дыхание выравнивается. Сердце бьётся ровнее.
Потому что ты выходишь из режима «бей или беги» и входишь в режим «смотри и
думай».
Я иногда сравниваю это с кино. Когда ты смотришь триллер и
герой попадает в опасную ситуацию — ты можешь переживать, но ты понимаешь: ты —
зритель. А теперь представь, что ты вдруг оказался внутри фильма. Без сценария.
Без понимания, что это — фильм. Вот это и есть обычная тревожная жизнь. Когда
каждый сигнал мозга воспринимается как сигнал тревоги. Как угроза. Как
опасность.
А теперь — снова шаг в сторону. Ты берёшь на себя роль
режиссёра. Или хотя бы критика. Ты смотришь на происходящее: «Интересно, почему
я так отреагировал? Почему я решил, что меня отвергли? Почему я снова включил
катастрофизацию?»
Это не волшебная таблетка. Это работа. Иногда утомительная.
Иногда болезненная. Потому что ты вдруг начинаешь видеть, сколько мусора у тебя
в голове. Сколько автоматических мыслей. Сколько ложных интерпретаций. Сколько
сценариев ты таскаешь с собой с детства. Но только через эту работу появляется
зрелость. Настоящая. Не имитация спокойствия, не подавление эмоций, а честная,
взрослая способность сказать: «Да, мне тревожно. Но я могу быть с этим. Я вижу
это. Я не сливаюсь».
Кейс из практики. Ко мне пришла клиентка — молодая женщина,
внешне успешная, но измотанная тревожным мышлением. Её ежедневный цикл
начинался с мысли: «А вдруг сегодня произойдёт что-то ужасное?» — и
заканчивался тем же. У неё не было панических атак в классическом смысле, но
было постоянное напряжение, гиперконтроль, перманентная готовность ко всему
плохому. Мы начали работу с того, что я попросил её записывать мысли, которые
возникают в тревожные моменты. Сначала было сложно: она даже не замечала их. Тревога
возникала как лавина. Тогда я предложил ей ежедневно по 2–3 раза в день
останавливаться и задавать себе один вопрос: «Что я сейчас думаю?» И не просто
отвечать, а записывать. Сначала на автомате, потом с паузой.
Через две недели она приходит ко мне и говорит: «Вы знаете,
я поняла, что 90% моих мыслей — это прогнозирование катастроф. И я им верю. Я
не просто думаю — я в них живу». Мы начали разбирать: какие именно мысли? Что в
них общего? На чём они основаны? И вот здесь я аккуратно ввёл мета-позицию.
Сказал: «А давайте попробуем понаблюдать за этим. Как будто вы — не вы. Как
будто это вы читаете чужой сценарий. Что бы вы сказали автору?» И тут —
щёлкнуло. Она впервые засмеялась. «Я бы сказала: ты перегибаешь! Это же
сплошной апокалипсис!» И вот с этого момента началась настоящая работа. Она не
просто видела тревогу. Она начала замечать, как запускается тревожная мысль.
Как тело реагирует. Как внимание схлопывается. И — что она может делать
по-другому. Мы выстроили систему микро-пауз, меток и вопросов. Она начала вести
дневник наблюдателя. Через месяц она сказала: «Я впервые за полгода смогла
спокойно уснуть без фонового напряжения». Вот что делает мета-позиция.
Мне писали люди после консультаций: «Дмитрий, я начал
использовать мета-позицию, и вдруг понял — я не моя тревога. Я — тот, кто может
видеть тревогу». И в этом — ключевое отличие. Пока ты думаешь, что тревога —
это ты, ты в ловушке. Но как только ты начинаешь видеть — ты свободен. Не от
тревоги. От отождествления.
Я, кстати, тоже не святой. У меня бывают моменты, когда
что-то происходит — и внутри поднимается волна. Волнение. Паника. А потом —
пауза. «Так. Что это было? Какая мысль пролетела? Почему я так резко
среагировал?» И иногда мне достаточно одного этого внутреннего диалога, чтобы
вернуть контроль. Не контроль в смысле подавления. А контроль в смысле: я снова
на месте. Я снова в себе.
Иногда мета-позиция проявляется в самых простых вещах.
Например, ты замечаешь, что стал раздражителен. Всё бесит. Люди тупят. Задержки
бесят. А потом ты ловишь себя: «Погоди. Это же симптом. Значит, я в тревоге.
Значит, я устал. Значит, что-то внутри перегружено». И ты идёшь не разносить
всех, а пить воду, дышать, делать паузу. И это — акт зрелости. А не то, как ты
держишься на людях и не подаёшь вида.
Мета-позиция — это внутренний взрослый. Это ты, который
умеет не только чувствовать, но и думать о том, что ты чувствуешь. Это вторая
сигнальная система. Это твой персональный терапевт внутри головы. И если ты
научишься обращаться к нему — ты станешь крепче. Гибче. Свободнее.
Поэтому я и настаиваю: справиться со страхом можно. Но не
напрямую. Не лоб в лоб. А через шаг в сторону. Через понимание. Через
наблюдение. Через осознанность. Через честный взгляд на свои мысли.
И нет, это не значит, что вы станете роботами. Или будете
жить в вечной аналитике. Наоборот. Вы начнёте чувствовать чище. Глубже. Потому
что перестанете тонуть в эмоциях. Перестанете бояться страха. И начнёте жить. С
тревогой — но не под ней. С ней — но не внутри неё.
Вот такие дела, друзья. И если вы дочитали до конца —
значит, вы уже на пути. Осталось только продолжать. Ошибаться. Замечать.
Возвращаться. И снова вставать в эту мета-позицию. Каждый раз. Снова и снова.
Будьте счастливы друзья!
Мой телеграмм-канал: https://t.me/mir_kpt где я лично отвечаю на
ваши вопросы, провожу бесплатные консультации и делюсь своими мыслями.
За мого веков только научились друг друга убивать эффективней? Может стоит взглянуть в суть себя? Может Иисус правильные вещи говорил, а мы так и не поняли.
Чтобы к другим планетам стремиться, должна быть цель, и смысл. А мы в себе даже разобраться не смогли.
Кто мы вообще здесь? Для чего мы?
Каждый же знает, что жизнь конечна. Как бы кто не хорохорился. Что бабки, тачки, девки. А помирать то одинаково будем.
Для детей? Ну тогда дети для чего? обычная блядь рекурсия. Плодимся для того, чтоб кто то другой смысл нашёл. Разве не лицемерие?
Я об игре Phantasy Star II говорил уже несколько раз, так как это первая JRPG, в которую поиграл, и она навсегда в моём сердце. Даже имя одного из персонажей стало моим творческим псевдонимом. Но в этой заметке хотел бы рассказать вам пару интересных моментов из сюжета игры.
Многие игроки, когда поиграли в Final Fantasy VII, были в шоке от смерти Айрис в конце первого диска. Как так, чтобы одна из главных героинь, которая так полюбилась игрокам, умерла, и её нельзя воскресить? Но я не был так шокирован, так как похожий момент был в Phantasy Star II. Притом даже с ограниченными техническими возможностями драматизм ситуации передали не хуже, чем в Final Fantasy VII.
Второй момент, который заставляет задуматься, — это то, что системой планет в мире игры управляет так называемый Материнский мозг. И вроде благополучие у жителей, хотя какие-то странные монстры везде появляются и всё такое, но главные герои решают противостоять этой системе. В конце оказывается, что всеобъемлющий искусственный интеллект создали люди с далёкой планеты Земля. Это последние выжившие, и они решили управлять местными жителями. Чтобы все решения принимал суперкомпьютер. В конце игры главные герои вступают в битву с землянами — и… неизвестно, чем всё заканчивается. Либо побеждают главные герои, но уничтожают последнюю колонию землян, либо земляне, которые убивают главных героев и продолжают управлять местными жителями.
Если вам интересны мои текстовые или видеообзоры, то подписывайтесь на меня на Вомбате! Постараюсь и дальше радовать вас интересным контентом. Буду очень рад подписке на мой YouTube-канал: https://www.youtube.com/@ivan_lutz
Астрономы обнаружили в его строении особенности, которые позволяют предположить, что перед нами не просто звездное скопление, а сохранившееся ядро древней карликовой галактики, поглощенной Млечным Путем миллиарды лет назад.
Спектральный анализ звезд NGC 6717 показывает уникальный химический состав, отличающийся от типичных шаровых скоплений нашей Галактики. Особенно примечательно повышенное содержание тяжелых элементов и характерные закономерности в распределении звезд разных возрастов — черты, свойственные остаткам галактических ядер.
Когда словом недели выпало Процедура, то многие вздрогнули,
ибо перед внутренним взором встало, что-то подобное.
запах дезинфекции не забываем
Однако находчивые и креативные вомбатяне, что особенно
хочется отметить и новые участники ивента, доказали, что процедура это не
только запах больницы и сухие строчки кода, но и…
Лев 14 - новый папа выбранный на этой неделе и ребята из Евротура одобряют этот пост
Суровой методикой процедуры взлома шифров поделился lovefst,
методика проверенная 90-ми, к повторению не рекомендована, что только
добавляет шарма к посту
На этой неделе UrmasTormas напомнил, что песня это то, что
сильно помогало в процедуре изгнания фашисткой нечисти с территории Советского
Союза и Европы! История песни дорога на Берлин отличное тому подтверждение
Слово следующей недели такое, что грешно не отметиться постом!
слово недели на 12.05-18.05
Напоминаем правила ивента: 1.
Раз в неделю, по понедельникам случайно генерится слово. Это слово
будет основой для ваших постов. Неважно что вы сделаете, слепите,
нарисуете, напишите стих с этим словом, расскажете анекдот, свою историю
с этим словом, даже с помощью генератора мемов можно, абсолютно
неважно.
2. Ивент с данным словом длится до следующего понедельника, когда будет озвучено новое, случайно сгенерированное слово.
3.
Необязательно чтобы выпавшее слово было лейтмотивом. Ну например
выпадет слово кит - может быть картинка загадка о морских существах, на
которой изображен один кит, а найти надо дельфина. Или созданный
комикс/мем, в котором вообще речь о другом, но на пряжке у героя
изображен кит. Или может у вас завалялась история из жизни, где кит
просто был второстепенным объектом, или названием бара где все
происходило. Т.е. слово обязательно должно присутствовать в работе, но
может не являться ее заглавной темой. А может и являться.
4. Все посты публикуйте под тегом "Ивент Вомбата" и "Свобода".
@vombat просьба закрепить новое слово, пожаалуйста
Римский скорпион (лат. scorpio), использовавшийся легионами со II века до н. э., был легкой баллистой, ставшей символом инженерного мастерства римлян в осадных технологиях.
Эти небольшие метательные машины применялись для точечных ударов и поддержки пехоты в полевых сражениях.⠀Скорпион представлял собой деревянную конструкцию с двумя рычагами, натягиваемыми скрученными жгутами из сухожилий или конского волоса. Он стрелял короткими стрелами (дротиками) длиной около 70 сантиметров с железными наконечниками, пробивая доспехи на расстоянии до 100 метров. Один скорпион обслуживался двумя солдатами, а его скорострельность достигала 3–4 выстрелов в минуту.
Это оружие было идеально для подавления вражеских лучников или защиты укреплений: скорпионы могли вести прицельный огонь, прикрывая легионеров при наступлении или отступлении. Согласно Полибию, во время Второй Пунической войны (218–201 годы до н. э.) именно скорпионы помогли римлянам отбить атаки карфагенских войск при осаде Сиракуз.
Главным недостатком скорпиона была его уязвимость к влаге, которая ослабляла натяжение жгутов, снижая точность и дальность стрельбы. Кроме того, против крупных осадных машин или массированных атак пехоты он был малоэффективен, что вынуждало римлян комбинировать его с другими видами оружия.
Обучение работе со скорпионом требовало высокой точности и слаженности. Историк Вегеций отмечал, что римские артиллеристы тренировались на специальных полигонах, стреляя по мишеням с расстояния 50–70 метров, чтобы добиться максимальной меткости в бою.
Друзья, мне тут посчастливилось отдохнуть в больнице недельку. Хотел бы с вами поделиться своими впечатлениями о пребывании в этом заведении.
Обычно при слове "больница" в памяти всплывает что-то типа "Пролетая над гнездом кукушки" где в застиранных халатах по коридору медленно, как тени двигаются пациенты, носятсяаниматорыреаниматоры с капельницами наперевес: "доктор, мы его теряем!", скудная еда состоящая из перловки с водянистой котлетой, обшарпанные стены... Короче, "мама, забери меня домой!". Удивительно, но в моём случае всё было совсем по другому.
Огромное здание, современный интерьер, новое оборудование, картины на стенах, и кажется не какие-то репродукции. Но самое главное - это люди, а именно - персонал. Поразила доброта врачей и медсестёр. Не просто профессиональная этика, а именно доброта, как свойство личности. И ещё - чувство юмора. Вот несколько эпизодов из общения с медиками и пациентами, которые мне запомнились.
Слева: кадр из фильма "Пролетая над гнездом кукушки", справа: из сериала "Интерны".
Начну с того, что на ресепшене - в регистратуре, то есть - когда распределяли по палатам, врачи никак не могли вспомнить мою фамилию, я сказал, что если что - я помню. Задорный смех сестёр был для меня наградой и к тому же помог снять стресс.
Уж не знаю, в шутку ли, но меня положили в… гинекологическое отделение. Нет, нет - это не то, что вы подумали - я не собирался менять пол, по крайней мере, не сейчас. Просто в моём отделении не было свободных мест и меня положили в свободную палату. И нет, я лежал не с женщинами - единственными моими соседями были 2 неработающих холодильника. Почти 4 дня одиночества для физически и эмоционально истощённого человека - настоящий подарок.
Кормили 4 раза в день "на убой". Медсестре, которая раздавала еду, я сказал, что кормят так вкусно и много, что попрошу здесь политического убежища. Сестра замахала руками:
-Да что вы! Только не здесь!
Терапевт, осматривавшая меня при поступлении, удивилась - что я делаю здесь такой здоровый? Я признался, что лёг ради еды. Она отнеслась к этому с пониманием.
3,5 дня одиночества, чтения, тупого смотрения в окно – царский подарок клиническому интроверту - прошли незаметно. На 4-й день меня перевели в общую палату. Вроде бы всё - лафа закончилась. Но нет - это был не конец, а только начало. Начало знакомства и общения с интереснейшими людьми. Ещё одна награда свыше. Дело в том, что я ненавижу нецензурную лексику. Целыми днями я вынужден слышать её на работе, что приводит в конечном итоге к эмоциональной усталости. Хотелось хотя бы в больнице от этого отдохнуть, но я понимаю, что сюда кладут тех же людей, что меня окружают «в реальном мире».
Но, о чудо! Меня положили в палату где уже лежало 5 человек. Я шестой. Ну так вот. Из 6-ти человек высшего образования не было только у одного! Угадайте у кого? Правильно - у меня. Четверо закончили физико-математический факультет университета, один медицинский институт. Один из физиков - профессор. Он писал учебники для университетов. Остальные в разное время работали учителями физики. Медик работает на скорой помощи. Надо ли говорить, что за несколько дней, что я лежал с этими людьми, я не услышал ни одного матерного слова! Уважаемые читатели, как вы думаете - это просто случайность? Случайность, что в одной палате, в одно время собрались интеллектуалы? В купе с другими подобными событиями, которые постоянно происходят в моей жизни, я уверен, что нет.
Учёные мужи были под впечатлением от того, что простой работяга свободно рассуждает о 4-х фундаментальных взаимодействиях. В наших беседах я мягко подводил своих собеседников к вопросу - как так получилось, что эти взаимодействия вообще образовались и так сбалансированы иточно настроены?
Для информации.
4 фундаментальных взаимодействия - это сильное, слабое, электромагнитное и гравитационное. Они лежат в основе всех физических процессов во Вселенной и точно настроены относительно друг друга.
Они поняли к чему я клоню, и разговор плавно и бесшовно перешёл с чисто научной в мою любимую - научно-духовную плоскость. Кому-то эта тема показалась не интересной, с кем-то мы общались довольно долго. Так, у одного из физиков сын был православным верующим и ему (физику) хотелось разобраться в некоторых учениях Библии.
В любом случае, когда в одной палате собирается, хоть и по разному, но всё-таки мыслящие люди - это подарок для меня. Я уверен - подарок свыше.
Ещё небольшой эпизод. В нашей палате был душ и подумал, что должна быть и вытяжка. Нажал на какую-то кнопку, ничего не включилось. Ан, нет, включилось! Представляете – это была кнопка вызова дежурного врача на случай, если кому-то в ду́ше станет плохо! По сути – скорая помощь. Буквально через несколько минут примчалась медсестра (весьма не молодая, кстати) – «Кому плохо!?». Я извинился за ложный вызов. Вот это забота о людях!
Итак, операция!
Операция - это вообще стендап! Когда на каталке меня везли на операцию, я попросил медсестру не превышать скорость, особенно на поворотах. Сестра заверила меня, что всегда соблюдает скоростной режим. На одном из перекрёстков коридора, когда мы не могли разъехаться со встречной каталкой, сестра, как бывалый водитель маршрутки:
-Опа, пробка!
В лифте нас набилось человек 8. Одно сестра стала рассказывать про вкусные плюшки, которые продаются в буфете. Потом:
-Ой, а при молодом человеке, наверно, не сто́ит про еду говорить. (перед операцией нельзя ничего есть).
Я успокоил сестру, сказав, что еда - это последнее о чём я сейчас думаю.
-Еду голый в одном лифте с такими красивыми женщинами! (Все 50+).
-Да, вот едете и ничего не делаете... С шутливой укоризной сказала мне одна из женщин.
На всякий случай поясню, что я не стоял в таком виде в лифте и не нажимал на кнопки, а лежал на каталке под простынёй.
На операционном столе мы с врачами продолжили зажигать.
Когда меня привязывали к операционному столу ремнями, я поинтересовался:
-Это чтобы не убежал?
Сестра загадочно:
-Нуууу, знаете, тут всякое бывает...
Далее, в процессе подготовки к операции, сестричка спросила, не печёт ли затылок. Я ответил, что, вроде нет.
-Пациент, я доктора спросила.
Я чувствовал улыбку сестры сквозь медицинскую маску. Дело в том, что медсестра настроила освещение так, что лампа светила прямо на затылок хирурга.
-Они мне регулярно пытаются мозг зажарить - пожаловался доктор.
Очнулся я после наркоза на том же месте, и на том же столе. Первый вопрос:
-А когда операция начнётся?
-Она уже закончилась.
-Эх, опять всё самое интересное проспал!
Потом в течении дня и в следующие дни, доктор (молодой парень, кстати) по несколько раз в день приходил и интересовался моим самочувствием. Настоящий профессионал! А ещё он искренне удивлялся, что мне не требовалось обезболивание после операции. Похоже, он настолько качественно сделал свою работу, что у меня реально не было боли.
Хотел бы ещё отметить нашу молоденькую медсестричку Настю. Она так часто посещала нашу палату и интересовалась всё ли у нас хорошо, что нам приходилось чуть ли не выгонять её (шутка). Как-то я спросил, нравится ли ей её работа. Она ответила, что да, очень.
-Нагрузка большая. В день 11-15 человек госпитализируют только в нашем отделении. Небольшой спад поступлений бывает только во время посадок.
В палате повисла тягостная тишина. Увидев на наших лицах испуганный немой вопрос, Настя поспешила уточнить
-Во время огородных посадок, я имею ввиду.
Палата громко смеялась.
Надо отметить, что по части юмора, пациенты здорово уступали врачам. Как-то идя на перевязку, я поравнялся в коридоре с девушками, которые шли туда же.
-Девушки, вы тоже на ампутацию?
-Неееет, мы на перевязку - ответили они абсолютно серьёзно и даже как-то испуганно.
Хотя нет, вру. И среди пациентов были любопытные персонажи.
Стою в очереди на получение направления на госпитализацию, никого не трогаю, изо всех сил пытаюсь не шутить. Подходит пожилая женщина. 80+. Стандартные вопросы.
-Кто крайний?
-Я
-А вы за кем?
-За этой девушкой.
Далее бабуля начинает тихонечко напевать: "Ах, эта девушка меня с ума свела". Я ей подпеваю: "Разбила сердце мне, покой взяла".
-А вы знаете, молодой человек, когда мы были студентами, мы пели: "Набила морду мне, костюм сняла".
Я ей:
-А я слышал версию: "Набила морду мне, часы сняла".
-Э-э, костюм дороже.
-Ну, с этим не поспоришь.
Завязался живой разговор, двух совершенно разных людей, как будь-то мы 100 лет знакомы. Боковым зрением я видел, как очередь "грела уши".
И последнее.
К сожалению, в любую бочку мёда, всегда кто-нибудь добавит ложку дёгтя. В этом повествовании это не ложка, всего лишь капля. Я говорю о дежурных на входе в стационар. Мужчина и женщина с синдромом вахтёра в запущенной стадии.
Для информации.
Синдром вахтёра - это склонность человека, неделённого невысоким социальным статусом, демонстрировать свою значимость и власть.
"Дай человеку ключи от офисов - он возомнит себя генеральным директором" - глаголет народная мудрость.
И эти "вахтёры-директора" "демонстрировали свою значимость и власть" на полную - они постоянно орали на пациентов, оскорбляли их. Не стесняясь священных медицинских стен, матерились. На просьбы посетителей вести себя повежливей, они отвечали, что у них большая нагрузка и поэтому они на нервах. Предложения в таком случае поменять работу, вызывали у них лишь дополнительную порцию брани.
У медперсонала нагрузка не меньше, но ведут себя они очень достойно, в том числе, когда общаются с недовольными пациентами. Я видел такие сцены и восхищался этими людьми (врачами я имею ввиду).
А теперь, точно последнее.
Друзья, сейчас принято чуть ли не демонизировать медицину вообще и врачей в частности. Скорая долго едет, очереди в поликлиниках, конвейерная система приёмов, врачебные ошибки. А виноваты ли в этом только врачи? Может дело в системе, которая довольно не навязчиво заботится о нашем здоровье? Может дело и в нас? Как часто врачам приходится иметь дело с неадекватами! Мой друг – врач, зав. отделением - рассказывал о мужчине, который обивал пороги кабинетов их поликлиники с требованием определить на какие лекарства у него аллергия, а на какие нет. Попытки объяснить, что есть уйма препаратов, и определять возможную аллергию на них никто не будет, ни к чему не привели. Мужчина настаивал на своём. По словам друга, цель этого человека была просто всех достать. Вот на таких кадров врачи часто тратят время вместо того, чтобы помогать настоящим больным.
А ещё не будем забывать, что медработники такие же люди, как и мы - со своими достоинствами и недостатками. Да, среди них бывают и некомпетентные , и ленивые - одной моей знакомой, например, врач предложила лечиться узнахарки! - но мне такие не встречались.
Друзья, хотите профессионального и вежливого обращения к себе? Работающий совет был дан2 000 лет назад: «Во всёмпоступайте с людьми так, как хотите, чтобы они поступали с вами».
P.S. Здоровье автора в полном порядке. Чего и вам желаю.
Не рекомендуется принимать данную статью близко к сердцу или как истину в последней инстанции. Скорее как научпоп-грелку для мозгов. Тут довольно много упрощений, упущений или просто странно написанных моментов. Если что-то объяснено совсем криво, то добро пожаловать в комментарии.
Все сказанное далее применимо везде, но детали описаны для защищенного режима 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. Я работаю менеджером в самом крупном ломбарде в Северной Калифорнии. Через нас проходит больше вещей, чем через все остальные ломбарды в регионе. У меня много таких историй. Один парень принес выкрашенный зеленой краской камень, утверждая, что это древнее золото, которое покрылось патиной. Когда я объяснил, что это и близко не золото, он очень расстроился, потому что купил этот камень у какого-то незнакомца за 4000 долларов. Один чел приволок целый мешок с использованными шприцами, просил обменять их на телевизор. Еще один чел принес кусок лобового стекла и стал доказывать, что это бриллиант. Еще один принес кусок размером с кулак из согнутых и немного оплавленных вилок и ложек. Утверждал, что это мусор, выброшенный с МКС, который упал на землю в виде метеорита. Девушка принесла мантию, говорила, что это настоящий реквизит из фильма о Гарри Поттере, который она украла на съемках. Еще одна девушка принесла часы Ролекс, которые ей подарил отец. Когда я ей показал, что на них написано «Роликс» и «Сделано в Шмейцарии», она стала утверждать, что это уникальные опечатки, что делает часы еще дороже. Я открыл их, чтобы посмотреть механизм, а его и не было. Заявилась пара с телевизором из 90-х. Они сказали, что это антиквариат, и просили 800 долларов. Мне пришлось найти такой телевизор на сайте какой-то барахолки, где за него просили всего 4 доллара. А один раз нам принесли диализный аппарат. На нем еще были капли крови, будто его только что вырвали из пациента.
4. Женщина принесла свою старую лампу. Оценщик стал осматривать ее и сказал, что это очень редкая ваза эпохи Мин. Но, к сожалению, кому-то пришла идея просверлить в ней отверстие, и теперь она ничего не стоит. Женщина прямо при нас грохнулась в обморок, пришлось вызывать скорую.
5. К нам часто приносят комиксы, и каждый уверяет, что его экземпляр дорогой и уникальный. Когда людям начинаешь объяснять, что это не так, они часто обижаются и говорят, что мы просто хотим сбить цену.
6. Я часто посещаю дворовые распродажи, покупаю старину и реализую ее через антикварные магазины. Это мой дополнительный источник дохода. Однажды я увидел статуэтку, на которой было написано «Сделано в оккупированной Японии». Я купил ее за 25 центов, потом продал за 45 долларов. В том магазине ее выставили за 125 долларов, и она стоит на витрине уже несколько месяцев.
7. Женщина принесла золотой зуб своей бабушки, оставшийся после кремации.
8. Один мужик принес настоящий противотанковый гранатомет. Потом он объяснил полицейским, что получил его в качестве платы за уборку заднего двора у одной старушки, и он думал, что это муляж, понятия не имел, что он настоящий, и готов к использованию. Старушку нашли, но она сказала, что не знает, откуда у нее эта штука, сколько помнит себя, она валялась в сарае. На РПГ стояла дата изготовления 1970 год.