Раз у нас слово недели свобода,
то я решил себя не ограничивать одним памятником свободе, а добавить ещё и
целый монумент.
«Монумент Свободы» стоит в Риге
на бастионной горке. Его установили в 1935 году как памятник независимости
Латвии, которую она обрела в 1918 году. Высокая 42-метровую стела выполнена из
серого и красного гранита, травертина и бетона. На обелиске высечена надпись
"Отчизне и свободе". В скульптурах и лепке памятника высечена история
Латвии.
Монумент Свободы
Молодая женщина, олицетворяющая
«Свободу», держит в руках три звезды, которые символизируют три исторические
области Латвии: Курземе (Курляндия), Видземе (Лифляндия) и Латгале (Латгалия).
Высота самой статуи – 9 метров.
Эту девушку называют Милда, а вот отсылка ли это к латышской богине любви или к прототипу скульптуры, я гадать не буду, темна вода в облацах
И каждый раз удивляюсь, как дико
выглядят попытки разделить культуру и историю и дать им оценки исходя из
текущего политического «момента».
Например в интернетах пишут, что памятник
после присоединения к СССР предлагали и реконструировать и переместить и даже
разобрать, но уроженка Риги Вера Игнатьевна Мухина, выступила в защиту монумента
и памятник оставили в первоначальном виде. Однако до сих пор не найдено никаких
документов, свидетельствующих о намерении советских властей снести этот
монумент. Рассказ о чудесном заступничестве Веры Игнатьевны впервые появился в
90-е годы в интервью с её родственником, но скорей всего это одна из легенд. Ведь
советская власть только и делала, что уничтожала доступные памятники и уж
особенно свободе...
При этом следим за культурными
переплетениями: памятник создан скульптором Карлисом Зале, который учился в
Петербургской академии художеств - выпуск 1920 года и архитектором Эрнестом Шталбергом, учеником
Николая Леонтьевича Бенуа.
А сама история?
Подножие памятника украшают
скульптурные группы и барельефы - Свобода, Мать Латвия, Лачплесис и другие.
Мать Латвия, центральная скульптура
Например: «Борьба против
бермонтовцев на Железном мосту» - во время гражданской войны, северо-западная
добровольческая армия вела бои с литовской национальной армией, и не известно,
как бы развернулась история, участвуй её корпуса в боях за Петроград на стороне
Юденича, вместо штурма Риги.
Бермонтовцы - по имени командира
Или «Латышские стрелки» - история этого
соединения требует отдельной статьи, но эти части активно влияли и на ход
революции и укрепления советской власти и национальной республики.
Суровые латышские парни
Лачплесис – герой национального латвийского
эпоса созданный Андреем Индриковичем Пумпурсом, латвийским поэтом представителем
«народного романтизма», который для поправки семейного благосостояния служил в
русской императорской армии.
Ох уж этот народный романтизм 19 века...
P.S. Лично на меня памятник особого впечатления не произвёл, на картинках выглядит величественнее чем в живую
Let My people go (Позволь моему народу уйти) - это пересказ восьмой главы Исхода, в которой Моисей убеждает фараона отпустить еврейский народ:
И сказал Господь Моисею: пойди к фараону и скажи ему: так говорит Господь: отпусти народ Мой, чтобы он совершил Мне служение.
Этими словами Господь призывал Моисея добиться исхода израильтян из египетского плена.
Песней её сделали африканские рабы приблизительно в 1862 году в методистских церквях Американского юга. Пели её в стиле спиричуэл и она считалась гимном американских рабов.
Жизнь рабов была невыносимо тяжёлой, и музыка была одной из немногих вещей, которые делали её сносной.Музыка была священна для рабов, будь то пение в церкви или на полях.
Самым известным исполнителем песни стал Луи Армстронг, чья версия была записана в Нью-Йорке 7 сентября 1958 года.
Автор про свободу движений задал вопрос: А в какой степени свободны Вы?
Мой ответ - В 156, и в 289.
Вопрос: Какой ответ верный?
Если сравнивать строение опорно-двигательного аппарата человека с различными системами механизмов, то можно выделить как отдельные крупные "узлы", например, локтевой сустав состоит из 3 частей- сам шарнир и 2 прикрепленных к нему кости, которые могут вращаться в суставной сумке (впадине).
Будем рассматривать механические системы, состоящие из твёрдых, нерастяжимых и негнущихся звеньев, соединённых шарнирами. Шарниры для начала рассмотрим двух типов: цилиндрические и шаровые.
Цилиндрический шарнир: с двумя свободными звеньями и с одним закреплённым звеном — опорой.
Где мы можем найти такое соединение в человеческом теле? Это, например, локтевой сустав. Межфаланговые суставы пальцев. Коленный сустав, в первом приближении, тоже подходит, хотя с ним всё несколько сложнее: тут реальная биомеханика сильно отходит от абстрактного механизма.
Цилиндрический шарнир, или шарнирная петля, это соединение двух звеньев, которое позволяет им вращаться вокруг общей оси. Или, если мы считаем одно звено неподвижно закреплённым — неподвижной опорой, — то этот шарнир позволяет второму звену вращаться вокруг оси шарнира.
Возьмём цилиндрический шарнир с одним закреплённым звеном. На рисунке закреплённое звено изображено просто как неподвижная опора. Свободное звено может двигаться только одним образом: поворачиваться вокруг оси шарнира, оставаясь при этом в одной плоскости. Его незакреплённый конец двигается при этом только по одной линии — дуге окружности с центром на оси шарнира.
Если мы зафиксируем плечевую кость, то наш шарнир будет закреплен и неподвижен.
Второй тип шарнира — это шаровой шарнир, где звенья вращаются вокруг общей точки. Опять же, можно считать одно звено неподвижной опорой, тогда второе звено может вращаться вокруг некоторой точки этого шарнира. Точки, а не оси.
Какие суставы в нашем теле подходят под эту модель? Плечевой и тазобедренный.
Шаровой шарнир допускает уже гораздо больше различных движений. Свободное звено может качаться в нём во все стороны. К тому же оно может поворачиваться вокруг собственной продольной оси, оставаясь на месте. Всё то же самое умеет делать и наше плечо. Незакреплённый конец свободного звена двигается при этом уже не по линии, а по участку сферы с центром в шарнире.
Для того, чтобы однозначно задать положение звена, нам потребуются три угла. Два из них задают наклон звена в пространстве, а третий — поворот звена вокруг собственной оси. Получаем три координаты и три степени свободы для шарового шарнира и плечевого сустава.
Человеческие суставы вообще устроены гораздо сложнее, чем простые шарниры. Приведём ещё пару примеров суставов, не подходящих под простейшие механические схемы.
Кажется, что коленный сустав вполне подходит под схему цилиндрического шарнира. Если мы зафиксируем бедро — например, сядем на стол, свесив ноги, — то колено будет качаться, рисуя дугу, так же, как свободное звено шарнира. Но, на самом деле, при согнутом колене голень может ещё и немного поворачиваться вокруг своей продольной оси, добавляя коленному суставу ещё одну степень свободы. Когда мы сгибаем колено, ослабляется натяжение некоторых связок коленного сустава, крепление голени становится более свободным и появляется возможность поворота, которой нет, когда колено выпрямлено. Получается, что коленный сустав имеет одну степень свободы при почти выпрямленном колене и две при согнутом.
Локтевой сустав мы тоже приводили как пример цилиндрического шарнира. И он действительно подходит под эту схему, если мы будем рассматривать крепление только локтевой кости. Но, говоря о лучезапястном суставе, мы заметили, что предплечье может поворачиваться, обеспечивая движение пронации/супинации кисти.
Это возможно из-за сложного устройства локтевого сустава, состоящего фактически из трёх отдельных суставов. В нём сходятся три кости — плечевая, локтевая и лучевая — и каждая пара костей соединяется своим суставом.
Локтевая кость крепится к плечевой суставом с одной степенью свободы, образуя цилиндрический шарнир. А вот лучевая соединяется с плечевой уже шаровидным суставом — аналогом шарового шарнира, с тремя степенями свободы. Подвижность лучевой кости относительно локтевой ограничивается двумя суставами, которыми они скреплены: в локте и в запястье.
Всё это сложное устройство приводит к тому, что лучевая кость может неким своеобразным образом проворачиваться вокруг локтевой. Кисть крепится именно к лучевой кости лучезапястным суставом и поэтому может воспользоваться её подвижностью. При этом локтевая кость остается неподвижной. Т. е. к одной степени свободы, которую имеет локтевой сустав, на протяжении предплечья добавляется ещё одна.
Заметим, что, хотя голень тоже состоит из двух костей — большеберцовой и малоберцовой, — но в ней отсутствует механизм, подобный предплечью, и обе эти кости двигаются как одна.
Соединим теперь три звена. Первое будет, как обычно, неподвижной опорой. Второе присоединим к нему цилиндрическим шарниром. А к свободному концу второго звена прикрепим ещё одно звено. Тоже цилиндрическим шарниром. Наш механизм для простоты сделаем плоским: пусть оси обоих шарниров будут параллельны, тогда все звенья будут двигаться в одной плоскости.
Сколько координат нам понадобится, чтобы задать положение всего механизма? Первое звено неподвижно, его положение известно. Второе звено мы можем повернуть в шарнире на какой-то угол. Не любой: угол поворота как-то ограничен неподвижным звеном, но нам это не важно. Одного этого угла нам достаточно, чтобы задать положение второго звена. Зададим этот угол.
При этом дальний конец первого звена окажется во вполне определённой точке. Мы можем рассчитать положение этой точки по заданному углу и длине этого звена. (Длину звена мы не считаем координатой, поскольку она постоянна.) В этой точке находится шарнир, которым крепится третье звено. Значит, чтобы задать положение и этого звена, нам достаточно задать угол его поворота (например, относительно второго звена) — точно так же, как для второго звена.
Получается, что задав две координаты — два угла — мы задаём положение всего нашего механизма. Значит, у него две степени свободы.
Заметьте, что соединив звенья двумя шарнирами, каждый из которых даёт одну степень свободы, мы получили две степени свободы. Т. е. степени свободы просто складываются.
В теле подобный механизм можно найти в пальцах руки: это два последовательных фаланговых сустава.
Теперь в нашем механизме из трёх звеньев заменим первый шарнир на шаровой, а второй так и оставим цилиндрическим.
Аналогией в нашем теле будет соединение предплечья и плеча с туловищем. При этом мы не учитываем способность предплечья поворачивать кисть.
Если вы помните, шаровой шарнир имеет три степени свободы. Прибавляя к ним одну степень свободы второго шарнира, цилиндрического, получаем четыре степени свободы. И действительно: положение второго звена (первое — неподвижное) мы задаём тремя углами. При этом положение второго шарнира и направление его оси вычисляется. Поэтому для задания положения третьего звена нам нужен ещё только один угол его поворота в цилиндрическом шарнире. Значит, чтобы задать точное положение всего механизма, нужны четыре угловые координаты. И наш механизм действительно имеет четыре степени свободы.
Выше мы писали, что если тело двигается по какой-либо поверхности, то у него две степени свободы. Три — если мы хотим учитывать также и поворот тела в этой плоскости. Будем двигать ладонью по столу. Вот тело, которое двигается по поверхности. Значит, у ладони три степени свободы. А где же семь?
Но мы также писали, что подсчёт степеней свободы зависит от модели, от задачи. Если нам важно только положение ладони на столе и неважно, что там дальше к ней крепится и что с ним происходит, то степени свободы три. Если же мы хотим знать и положение всей руки, то семь.
Действительность ещё сложнее. Если мы, сидя за столом, потянулись за хлебом, то мы включаем дополнительно сложную механику пальцев, а также, возможно, наклон и поворот туловища. Если мы будем рассматривать такую, более сложную, модель, то и количество степеней свободы у всей системы будет гораздо больше. Как наш мозг управляется с расчётом такой кучи координат — опять-таки тема, требующая отдельной статьи.
Количество степеней свободы опорно-двигательного аппарата (ОДА) человека зависит от типа суставов:
Одноосные суставыобладают одной степенью свободы, движения в них происходят только вокруг одной оси. В организме человека таких суставов насчитывается85. 2
Двуосные суставыимеют две степени свободы, движения в них происходят вокруг двух осей. В организме человека33двуосных сустава. 2
Многоосные суставыобладают тремя степенями свободы, движения в них происходят вокруг трёх осей. В организме человека таких суставов29. 2
Общее число возможных движений в суставах (так называемых степеней свободы) превосходит250.5
По подсчёту О. Фишера, учитывая возможные перемещения между корпусом, головой и конечностями, в теле человека не менее 107 степеней свободы1. Это не считая движений лица и внутри корпуса
В биомеханике человека число степеней свободы может быть значительным. Например:
Кисть относительно лопаткиимеет7 степеней свободы. Это значит, что кисть по отношению к лопатке ведёт себя как свободное, не закреплённое в пространстве тело. 3
Головаперемещается в сагиттальной и во фронтальной плоскостях и совершает вращательные движения, поэтому имеет3 степени свободы. 3
Верхняя конечностьимеет7 степеней свободы, то есть для обеих рук —14 степеней свободы. 3
Нижняя конечность(без суставов стопы) имеет6 степеней свободы, то есть обе ноги имеют вместе12 степеней свободы. 3
Движения в пястнофаланговых и межфаланговых суставах дают для каждой кисти и стопы19 степеней свободы. Таким образом, человеческое тело, не считая движений туловища, имеет105 степеней свободы. 3
Наконец! Я сдала экзамен и возвращаюсь к нормальному расписанию постов, буду стараться) Аж месяц назад был последний пост, кошмар!
Прошлое Зироу обсудили вдоль и поперек. Многие насторожены, но всё же решили дать второй шанс, наблюдая за поведением. Её свобода всё равно под угрозой из-за письма. Решили не тратить время на долгое пребывание на посту и вновь отправились в путь. Группа встретила нового знакомого, который охотился на тролля, но не убил его. Драка с врагом была сложной, Зироу чуть не отдала душу богам, Хамако тоже сильно пострадал.
Все приходили в себя, после столкновения с троллем. Как только Хамако поднялся на ноги, он тут же набросился на Ийанну с обвинениями в превращении его в кота. Разумеется девушка была с этим не согласна, сказав, что если бы умела такое, то не стала бы превращать юношу во что-то такое же очаровательное. Пока брат с сестрой препирались, Крис узнал имя мужчины-охотника. Его зовут Экандейо, родом он из Речных королевств, успел побывать в Питаксе. Здесь же он охотился на троллей, неподалеку где-то обитает целая банда “Драконоборода”. Они грабят караваны и путников, убитый тролль как раз состоял в ней. Крис подметил отсутствие высокого интеллекта у великанов и удивился, что они могут работать вместе, на что Хамако возразил, что они компенсируют это мощью. Во время этого разговора Ийанна поделилась с Зироу одеждой, у той вместо рубашки после битвы остались почти одни лоскуты. В ответ плут поблагодарила за исцеление.
Хамако было интересно послушать про Питакс, что он из себя представляет. Это город-королевство, где правит король Ироветти, основавший академию великих искусств. Все очень удивлены, ведь все были уверены, что там процветает преступность, и ни о какой культуре там и речи нет. Нет, конечно, преступники есть, но явно не в таких количествах, как было раньше, когда сформировалась репутация. Хамако и Ийанна также спросили про Тартуччио, именно из-за него им была интересна информация про Пинтакс. Экандейо не слышал о нем, но рассказал, что гномам необходимо путешествовать, иначе они начинают стареть.
Как раз под вечер нашли место для ночлега, рядом с ручьем. Зироу пошла охотиться с собакой. Крис рассказал Хамако об устройстве своей пушки, а ещё про свое обучение у отца и наставника. Ийанна ехидно заметила, что Хамако это можно не рассказывать, он ничего не расскажет в ответ. Экандейо заинтересовался внешностью учителя, и Крис рассказал, что последний раз, когда он видел его, тот был часовым. Никто не понимал, что это значит, пока стрелок не пояснил, что часовыми называли тех, кто помещал свою душу в механизмы, превращая себя по сути в бессмертное существо. Регонгар сказал, что им могла заинтересоваться Технолига, они любят такие необычные экземпляры. Несколько минут все наперебой обсуждали как именно можно поместить душу в металл. Когда Зироу вернулась с охоты, она решила подлатать Регонгара. Конечно, он не мог удержаться и попытался подбить к ней клинья, но Зироу это быстро пресекла и с небольшим отвращением отошла от него. Хамако также получил долю заботы. Пока обрабатывала его раны, Зироу спросила о ведре с водой рядом с его постелью. Не потому ли он ставит ведро с водой рядом, что боится огня и того, что не сможет его контролировать? Хамако в ответ лишь грустно кивнул. Ийанна в этот момент гадала Крису на учителя, так что не слышала этого разговора. А перед сном сделала массаж Регонгару, как и обещала. Но попросила его сначала ополоснуться в ручье, чтобы она могла воспользоваться маслами. Для смущения остальных, поскольку их пару было не видно, он громко простонал несколько раз в самом начале. Однако при возвращении честно рассказал про массаж на вопросительный взгляд Хамако.
На следующий день двинулись дальше уже без Экандейо. Он отправился на пост Олега. Кинетик попросил Криса разузнать у Ийанны про странную фею, которую видит только она. Крис отказался, уж слишком странный и нелепый вопрос с его стороны. Хамако пытался его убедить, поскольку этой странной хранительнице он не доверяет и беспокоится за сестру, но Крис был непреклонен.
Путь был тихим, пришли к прошлому лагерю разбойников. Зироу перекинулись парой слов с Хамако, о чем-то в стороне. Ийанна занялась штопкой вещей, и, когда плут освободилась, извинилась перед Зироу за своё отношение к ней. Не каждый способен после такого детства вообще встать на путь исправления, так что она заслуживает поддержки. Но Ийанна всё ещё не понимала слепой любви Зироу к своей матери. Мать Ийанны научила её крутить мужчинами, это в большинстве своем безобидно и весьма полезно. А мать Зироу учила мужчин убивать. Плут пыталась убедить Ийанну, что её мама на самом деле заботилась о ней, но Ийанна никак не могла понять её точку зрения.
Ночью, во время своего дежурства, Зироу почувствовала мерзкую вонь. Сначала никого не было видно, но чуть погодя послышалось шуршание. Девушка обернулась и увидела прямо перед собой тощее существо, обтянутое тонкой бледной кожей. Оно уже занесло руку с огромными когтями для скрытного удара, но, благо, внимательность Зироу не подвела.
Битва была не сложная и довольно быстрая, но все кроме Ийанны почувствовали, что такое паралич. Ненадолго, что удачно. Зироу поняла, что скорее всего эти твари заразны, и есть большая вероятность того, что все покусанные теперь заражены. На утро стало очевидно, что Зироу и Крис больны.
Поскольку болезнь неизвестна, решили держать путь домой. Помимо обычных занятий и приготовлений на вечернем привале, Зироу намекнула Хамако, что ему надо поговорить с Ийанной. Она была с ними открытой, а они ей вот как отплатили, так что неудивительно, что она в последнее время холодна в общении с ним, ведь про Зироу она уже знает многое. Ночь прошла спокойно. Однако на утро Крис и Зироу уже выглядели очень плохо. Группа очень вовремя добралась до поста Олега, где Джод сумел излечить болезнь с помощью свитков, сказав, что им неимоверно повезло. Эта гульская хворь превращает заболевшего ей в гуля примерно за сутки. Ийанна обзавелась новой одеждой, вся запасная вышла из строя. Днем на пост как раз вернулись Линдзи и Джейдал. Их приключения были не такими опасными. Они дрались с пауками, нашли мёртвого разбойника Рогача. У него была карта с примерной отметкой логова, что все восприняли довольно радостно. Ийанна всё ещё хранила информацию о точном расположении при себе. Также чародейка выслушала длинный поучительный монолог относительно её письма и отсутствия обратного адреса на нем от Линдзи, она была очень раздражена такой непредусмотрительностью.
За ужином Ийанна спросила Криса про семью. Оказалось, у него дом - полная чаша, шестеро братьев и сестер. Отец оружейник, не последний человек в гильдии. Именно из-за этого в детстве Криса даже похитили, чтобы выманить знания отца. И там, в плену, Крис познакомился со своим наставником. Так началось его обучение, длившееся чуть больше трех месяцев. После заточения их дороги разошлись, но когда пришло письмо, Крис отправился на поиски.
После этого Ийанна подсела к наемникам и, немного пофлиртовав с одним из них, пригласила на прогулку. Немного отдалившись от любопытных ушей, девушка с улыбой попросила поучить её верховой езде (Подмиг-подмиг). Пара взяла коней и отлучилась из лагеря на время. Когда они вернулись, девушка была весьма растрепана, так что скрыть, что именно произошло, не получилось. Хамако даже кружку уронил, увидев её в таком виде, спрашивать, правда ничего не стал.
Перед сном Зироу долго что-то искала под кроватью. Даже юноши уже спросили, что она ищет. Девушка с ужасом сообщила, что похоже её карманный скорпион сбежал. Его пришлось долго искать, но в итоге Зироу обнаружила его в руках у Джейдал. Та с ухмылкой сказала, что поладила с ним, потому что оба ядовиты. Зироу молча забрала его обратно и немного ещё постояла рядом, на что Джейдал с оттенком радости сказала, что ей нравится молчание. За прошедшую неделю Линдзи почти довела её до убийства, потому что во время путешествия она почти постоянно о чем-то болтала. Ответом был только кивок, после которого Зироу ушла спать.
На следующий день, не теряя времени в пустую, отряд отправился вместе с Линдзи исследовать окрестности дальше. Ночью, пока Крис дежурил и разбирался со своим оружием, на стоянку тихо и стремительно нагрянули бандиты. Всех быстро связали и обезвредили. Волшебникам также заткнули кляпом рот. Очнувшись, путники увидели перед собой высокого довольно симпатичного мужчину с длинными темными волосами, одетого в черную одежду. На руках у него татуировки, а вооружен красивой рапирой. Он хищно улыбался, глядя на улов.
Похоже прошлое Зироу нас никак не отпустит, игрок очень радовалась такому повороту событий) Следующая часть уже в процессе.
Словом
недели выбрано слово «свобода» и, лично я, очень её ценю и уважаю. Но далеко не
все разделяют мои убеждения, именно поэтому существует рабство (как добровольное,
так и принудительное). К чему это я веду, да к тому, что хотел представить
вашему вниманию композицию ConveyoroftheSlaves (Конвейер рабов) в исполнении прекрасного
вокально-инструментального ансамбля Infiltration из Расчленинграда. Но такого клипа у
них нет. На ютрупе был целый альбом, кстати, он называется Cognitive Warfare (2023),
но ютруп видимо совсем отказался работать. Да и чёрт с ним, пойдём в ВК, там, у
ребят и страничка есть, официальная (ссылку кину в конце), и посмотрим
официальный клип на композицию Malevolent Retribution стогожеальбома.
Обложка альбома
К сожалению, информации, даже на их официальной страничке, практически
нет (может быть, если порыться в глубже, что-то и можно найти, но ВК меня дико
раздражает, поэтому прошу понять и простить). А обложку я искал несколько
минут! Точно известно, что они из Санкт-Петербурга. В их арсенале пять альбомов: Nuclear Strike Warning (2017) EP Point Blank Termination (2020) LP Extinct (2022) LP Cognitive Warfare (2023) LP Sociobastard (2025) LP вышел 28 апреля Вот такой вот получился короткопост. А на сегодня, пожалуй, всё. До новых встреч! Всем металл \m/
P.S. Сам я слышал далеко не всё, поэтому
буду навёрстывать упущенное, чего и вам советую. Кстати, все альбомы есть на
цифровых площадках. В том числе и в ВК. Да, вот ссылка на их группу в ВК.
Падение Берлинской стены - это яркий символ окончания
холодной войны, наступившей «свободы» и победы либеральной демократии в
Восточной Европе.
В 1989 году
открылась граница между западным и восточным Берлином, а на следующий год Германия
вновь стала единой. Берлинская стена, окружавшая с 1961 года весь западный
сектор Берлина была демонтирована, а куски ее разлетелись по всему миру.
Множество из них было увезено в США. В частности, фрагменты стены украшают
центральный офис компании Microsoft, штаб-квартиру ЦРУ, музей Рональда Рейгана.
фото стены до 1989
Долетели эти куски и
до Москвы. Кусок стены, был в 1990 году подарен берлинским музеем
Чекпойнт-Чарли. Московский «Памятник Берлинской стене» был установлен возле
общественного центра имени Андрея Сахарова скульпторами А. Григорьевым и Д.
Митлянским. Как пишут люди в интернетах: «Настоящий фрагмент Берлинской стены как
будто прорывают летящие бабочки, символизируя идею свободы.»
Памятник "свободе"
Адрес: Земляной Вал д. 5. на пересечении с Яузой
Бабочки для
"Монумента Свободе" в Москве скульпторов А. Григорьева и Д.
Митлянского, 1996. Металл, роспись М. Митлянского. В мастерской Д. Митлянского.
Фото из архива семьи Кадошниковых
"Ода Свободе" - заключительная композиция из девятого и последнего студийного альбома Абба "Voyage", выпущенного в 2021 году. Это единственный альбом группы с новым материалом за 40 лет после "The Visitors" (1981) и последующего роспуска группы в 1982 году. На диске представлено девять новых композиций и одна доработанная из архива нереализованных записей. Все написаны творческим дуэтом Бенни Андерссона и Бьорна Ульвеуса.
При создании новых композиций альбома "Voyage" авторы сознательно игнорировали современные поп-тренды, смены моды и стиля, которые произошли в популярной музыке в последние десятилетия. Музыкантам хотелось воссоздать первозданный дух ABBA и сохранить оригинальный стиль коллектива, так как, по словам Андерссона, "в современной музыке нет ничего, что меня бы захватывало, ничего, чему хотелось бы подражать".
Заключительная композиция "Ода Свободе" была признана одной из самых амбициозных на диске. Торжественная, эпическая оркестровая баллада с нотками Шуберта, напоминавшая вальс Чайковского из балета "Лебединое озеро", была настолько величественна, что её сочли достойной стать мелодией церемонии закрытия Олимпийских игр, государственным гимном какой-нибудь европейской страны либо альтернативой существующему официальному гимну ЕС - "Ода к радости". Её лирика говорит о тщетности написания оды к свободе, которую стоит запомнить. Звучали мнения, что композиция демонстрирует, чем могли бы оказаться ABBA, если бы они остались вместе, и большинство критиков сошлось на том, что "Ode to Freedom" представляет собой достойный финал одной из величайших музыкальных групп всех времён.
Речь идёт не о социальных свободах, а более формализуемых - механических. Да-да, опять эта физика. Надеюсь хоть в этот раз смогу рассказать как можно попроще.
В теоретической механике есть понятие "число степеней свободы". Грубо говоря - это то число независимых перемещений механической системы. Слово независимый тут является ключевым, но вернёмся обратно. Пример: Столб вкопанный в землю имее степень свободы 0 - он вообще не может двигаться. Поршень в насосе или двигателе - степень свободы 1 - двигается только в одном направлении -вверх-вниз, крутиться поршню не даёт шатун. Ннежелательные перекладывания и люфты не учитываем - мы же играем в теорию, а не практику. 😉
Сейчас, для простоты, будем говорить исключительно о нашем, привычном евклибовом пространстве. Так вот свободная, не связанная с к-либо механической системой, геометрическая точка (ну со школы же должны помнить, что точка не имеет размера) имеет три степени свободы - вверх-вниз, влево-вправо и вперёд-назад. Движение под углом - это просто совокупность этих трёх движений, если мы должным образом повернём систему координат - всё встанет на свои места.
А вот любое, свободное трёхмерное тело, оказывается ещё может дополнительно и вращаться по трём осям:
Три вращения + три прямолинейных движения
Для твёрдого тела 6 - это максимальное кол-во степеней свободы.
Тут вроде всё понятно и доступно. Но механика исследует механизмы, зачастую сложные.
GIF
Этот механизм Чебышёва
имеет только одну степень свободы, так как его положение полностью
определяется углом поворота одного (любого) из трёх подвижных звеньев —
L2, L3 или L4.
Казалось бы должно быть много больше, но мы видим, что все звенья взаимосвязаны, и какую бы точку в каком бы звене мы не выбрали - она будет двигаться только по одному криволинейному пути. Это как поезд на рельсех - вперёд или назад, и пофиг как извивается Ж/Д дорога - путь будет только один.
Расчёт шарнирных систем и кол-во степеней свободы - это уже нехилая такая математика, потому не буду вам и себе пудрить мозг. Скажу только что у человеческой руки (без учёта пальцев кисти) семь степеней свободы, а жётско закреплённую роботизированную руку сделали с восемью степенями свободы (и тут железные ящики переплюнули кожанных мешков).
Вообще кол-во степеней свободы механизмов во многом зависит от количества звеньев - чем больше тем лучше. На практике же роборука должна обладать сервоприводами, поворотными механизмами + учитываются ещё и допустимые нагрузки - это уже достаточно сложная инженерная задача.
А теперь представьте, что шарниров море и каждый может не только изменять угол, но и вращаться на 360 (только вот в большинстве случаев это нах не нужно)
В довесок задачач со звёздочкой: какое кол-во степеней свободы у резинового мячика (ответ в спойлере)?
Ответ: бесконечное, потому как надо рассматривать деформацию мяча, т.е. каждая точка, каждая молекула мяча имеет свои степени свободы
Я серьёзно. Вот уже сутки (даже больше), как объявили неделю свободы, а
никто до сих пор не запостил самого известного борца за свободу! Ну, догадались про кого я говорю? Конечно же…
… не про него.
А про него!
Вот вам картинка со звуком.
Я надеюсь, все смотрели этот замечательный мультипликационный сериал? Если
нет, то нужно срочно заполнить этот пробел. Кстати, для тех, кто не знает или
не помнит, этот сериал называется «Возвращение блудного попугая». Да, нужно
пересмотреть его, а то уже мало что помню. В общем, я пошёл смотреть, а вы уж
сами решайте. До новых
встреч!
P.S. Оказывается, в 2005 году выпустили
компьютерную игру под названием «Попугай Кеша: Свободу попугаям!» Лично я в неё не играл, может быть есть тут, кто играл? Как она вообще?
Новое слово недели "Свобода" как-то сходу напомнило мне эту песню молдавского певца Дана Балана. И хоть у певца отличный голос и музыкальный стиль, слово "Freedom" в припеве поёт американский певец и композитор Кори Гибсон, который, если верить википедии, ещё и автор слов этой песни.
Когда словом недели выпало Процедура, то многие вздрогнули,
ибо перед внутренним взором встало, что-то подобное.
запах дезинфекции не забываем
Однако находчивые и креативные вомбатяне, что особенно
хочется отметить и новые участники ивента, доказали, что процедура это не
только запах больницы и сухие строчки кода, но и…
Лев 14 - новый папа выбранный на этой неделе и ребята из Евротура одобряют этот пост
Суровой методикой процедуры взлома шифров поделился lovefst,
методика проверенная 90-ми, к повторению не рекомендована, что только
добавляет шарма к посту
На этой неделе UrmasTormas напомнил, что песня это то, что
сильно помогало в процедуре изгнания фашисткой нечисти с территории Советского
Союза и Европы! История песни дорога на Берлин отличное тому подтверждение
Слово следующей недели такое, что грешно не отметиться постом!
слово недели на 12.05-18.05
Напоминаем правила ивента: 1.
Раз в неделю, по понедельникам случайно генерится слово. Это слово
будет основой для ваших постов. Неважно что вы сделаете, слепите,
нарисуете, напишите стих с этим словом, расскажете анекдот, свою историю
с этим словом, даже с помощью генератора мемов можно, абсолютно
неважно.
2. Ивент с данным словом длится до следующего понедельника, когда будет озвучено новое, случайно сгенерированное слово.
3.
Необязательно чтобы выпавшее слово было лейтмотивом. Ну например
выпадет слово кит - может быть картинка загадка о морских существах, на
которой изображен один кит, а найти надо дельфина. Или созданный
комикс/мем, в котором вообще речь о другом, но на пряжке у героя
изображен кит. Или может у вас завалялась история из жизни, где кит
просто был второстепенным объектом, или названием бара где все
происходило. Т.е. слово обязательно должно присутствовать в работе, но
может не являться ее заглавной темой. А может и являться.
4. Все посты публикуйте под тегом "Ивент Вомбата" и "Свобода".
@vombat просьба закрепить новое слово, пожаалуйста
Не рекомендуется принимать данную статью близко к сердцу или как истину в последней инстанции. Скорее как научпоп-грелку для мозгов. Тут довольно много упрощений, упущений или просто странно написанных моментов. Если что-то объяснено совсем криво, то добро пожаловать в комментарии.
Все сказанное далее применимо везде, но детали описаны для защищенного режима 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: исправлены косяки форматирования, очепятки, добавлено еще пару пунктов про разновидности методов и функциональное программирование.
Пару недель назад стали мы тут счастливыми заводчиками двух милейших сирийских хомяков.
Вот они.
Дочь назвала их Рыжик и Серик.
И внезапно оказалось, что они очень любят бегать! Никогда бы не поверила, если бы сама не увидела.
Мы повесили им в клетку колесо, и вот в 8 часов вечера хомяки просыпаются (они кстати ночные животные), выходят из своего домика, потягиваются, умываются, завтракают
и по-тихоньку идут на беговую дорожку.
Но сразу марафонскую дистанцию не бегут: сначала немного разомнутся, сменят друг друга, походят по клетке... а потом как втопят... Только лапки мелькают.
GIF
И вот так бегают попеременно до утра с перерывами на перекус и попить.
Супруг прикрепил к колесу два магнита и велокомпьютер, который считывает число оборотов колеса. И оказалось, что хомяки напару за ночь пробегают 13-14 км.
То чувство, когда даже хомяк бегает, а ты -нет
Сначала напрочь не могла понять их мотивацию. Зачем?? Потом почитала, и оказалось, что в природе хомяки постоянно бегают марафоны, спасаясь от хищников и в поисках еды. Бег способствует выработке хомячиного эндорфина и снижает уровень стресса.
Поэтому наши хомяки через какое-то время уверенно подходят к занятому колесу и прямо настойчиво требуют пустить их черёд побегать.
GIF
Так что всем желаю брать пример с хомяков и больше двигаться.
А засим низкий поклон всем прочитавшим, бодрости духа и здоровья.
Или нечестная процедура изъятия денег у населения.
"Say say say" - песня в исполнении дуэта Пола Маккартни и Майкла Джексона, вышедший в октябре 1983 года и возглавлявшая чарты США и многих других стран.
Видеоклип снимался в Калифорнии (Лос Оливос, долина Санта Инес), режиссировал Боб Джиральди. Среди прочих в нём снимались жена Пола, Линда Маккартни, и сестра Майкла, Ла Тойя Джексон. Главных героев видеоклипа артистов "Mac and Jack" и по совместительству странствующих лекарей играли сами Пол и Майкл. Деньги по сюжету они отдали в детский дом.
- Дамы и господа, прошу вашего внимания, подойдите сюда! Давайте, подходите все!
-Подходите ближе, давайте, дамы и господа! Я расскажу вам о чудодейственном средстве Мака и Джека, оно гарантированно придаст вам необыкновенную силу! Да, друзья мои, оно может дать вам силу разъярённого быка!
Сэр Пол сказал:
- Он (Майкл) позвонил мне, и я не поверил, что это он, поэтому спросил: Кто это?Он сказал: - Майкл...В общем, мы пошутили на эту тему, и он сказал: Да, я бы хотел прийти и сотрудничать с вами, и я ответил: Отлично!
Итак, он приехал в Англию, и мы просто сели и начали писать. Я подумал, что нелегко просто сесть с кем-то, кого ты не знаешь, и начать писать, потому что нужно правильно подобрать слова. Но я подумал, что это Майкл - знаете, я просто попробую! Если не получится, мы просто выбросим это…
6 октября 2015 года Маккартни выпустил новую версию песни, в которой вокальные партии Маккартни и Джексона поменялись местами. Режиссёр и хореограф Райан Хеффингтон показал в нём группу молодых танцоров, снятых в чёрно-белых тонах в кварталах Лос-Анджелеса, с движениями, напоминающими движения Майкла Джексона.