Автор про свободу движений задал вопрос: А в какой степени свободны Вы?
Мой ответ - В 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
После того, как с помощью Моисея еврейский народ обрёл свободу в 1280 гг. до н.э. они долго бродили по пустыне и наконец пришли в землю Ханаанскую, или Землю Обетованную.
Эпоха, последовавшая за этим в истории, была известна как период судей, потому что тогда Эрец-Исраэль был под властью судей и священников. Саул стал первым царем Эрец-Исраэль в 1020 г. до н.э. По традиционной версии история основания Израиля начинается с этого времени.
Царь Соломон взошел на престол в 965 г. до н.э. Он правил в течение почти сорока лет, как раз в этот период был построен Первый иудейский храм.
В 925 г. до н.э. королевство было разделено на две части, в одной части жили израильтяне, в другой – иудеи. В 721 г. до н.э. Эрец-Исраэль был завоеван Ассирией, а в 586 г. до н.э. он был захвачен Вавилоном. Иерусалим был разрушен, Храм уничтожен, а евреи были изгнаны из страны в Вавилон.
На иудейских изгнанников, переброшенных из маленького провинциального городка Иерусалима в самую гущу большого мира, Вавилон произвел ошеломляющее и ужасающее впечатление.
Попав в водоворот вавилонской жизни, часть евреев ассимилировалась и забыла о своей родине. Но для большинства народа память об Иерусалиме оставалась священной. Они часто садились вместе где-нибудь на каналах - этих "реках вавилонских" - и, исполненные тоски по родине, пели печальные песни. Религиозный поэт, автор сто тридцать шестого псалма, следующим образом выразил их чувства: "При реках Вавилона, там сидели мы и плакали, когда вспоминали мы о Сионе... Если я забуду тебя, Иерусалим, - забудь меня десница моя; прилипни язык мой к гортани моей, если не буду помнить тебя, если не поставлю Иерусалима во главе веселия моего" .
Эта печальная история рассказывается в песне "Реки Вавилона" (Rivers of Babylon), написанную и исполненную Брентом Доу и Тревором МакНотоном из ямайской группы Melodians в 1970 году. Особую известность получила в исполнении поп-группы Boney M. в 1978 году. Именно их версия стала международным хитом.
В 538 г. до н.э. Вавилон был завоеван царем Персии, этот исторический факт позволил евреям обрести свободу и вернуться на родину, где они восстановили иудейский храм и начали воздвигать то, что стало известно как второе еврейское государство.
Хотел написать про работу системы управления памятью, но понял, что для полноценной статьи у меня не хватает практических знаний. Поэтому кратко
Куча
Баян
Помимо стека, о котором было рассказано в прошлой статье и который содержит локальные переменные, в "потребительской" программе в среднестатистической ОС еще бывают глобальные переменные и динамическая память. Глобальные переменные описываются внутри сегментов .bss и .data, резервируясь в памяти сразу после загрузки образа программы (по-правильному это называется процессом).
Динамическая память иначе называется кучей, так как представляет из себя кучу динамических данных, который могут появляться и исчезать во время работы.
Для работы с динамической памятью в C существует malloc(size_t), запрашивающий (выделяющий, аллоцирующий) у ОС кусок памяти указанного размера и возвращающий указатель на первый байт, и free(void *), принимающий этот указатель и возвращающий (освобождающий) кусок назад в ОС.
В C++ есть операторы new и delete, они устроены гораздо сложнее и я не буду их рассматривать, ибо не пишу на нем. Помимо запроса памяти у ОС они занимаются ее инициализацией.
Если по какой-то причине стандартной библиотеки языка в наличии не имеется, то в Windows за память отвечает HeapAlloc и устаревшие GlobalAlloc и LocalAlloc из времен Windows 3.11 (malloc к ним и обращается внутри. Еще есть парные HeapFree, GlobalFree и LocalFree). Они предоставляют больше контроля над результатом, но проприетарны для Windows. А полный список функций для работы с памятью в WinAPI есть здесь, их сотни на любой случай жизни. Можно даже внутри контекста чужого процесса выделить или освободить кусок памяти (обычно такое используется вирусами и прочей нечистью).
Утечки
А что будет, если постоянно выделять, но не освобождать? А еще лучше: выделять, но терять адреса выделенной памяти. ОС достаточно быстро подскажет правильный ответ.
В теории есть несколько возможных выходов, можно даже обработать подобный случай и, к примеру, экстренно освободить всё выделенное (только если не терять указатели) или попытаться спасти нужные данные из разваливающейся программы, но если никаких действий не предпринять, то ОС заставит процесс экстренно прекратить свою деятельность и существование.
Случай с потерей указателей на выделенную память называется утечкой памяти и ее последствия необратимы. Но как только ОС завершает выполнение процесса, то вся его память, даже утекшая, становится снова свободной.
Ленивые программисты и мусоросборка
Отслеживание правильности выделения и освобождения памяти является достаточно сложной и опасной задачей, особенно если требуется обеспечивать стабильность и безопасность (лучше даже не думать, что будет, если рукожопый программист забьет на MISRA и устроит утечку памяти в подсистеме тормозов в Тесле), и практически невыполнимой в некоторых парадигмах (особенно в функциональном программировании). Поэтому еще с древнейших времен (с 1959 года) существуют языки со сборкой мусора:
Особенности
Первое: в таких языках указателей или нет вообще, или они очень ограничены в пользовании (C#).
Второе: для работы с динамической памятью вместо указателей применяются ссылки. Ссылка по факту представляет из себя тот же указатель, только очень сильно ограниченный. Над ссылками запрещены все операции, кроме присваивания значения другой ссылки и разыменования, в то время как указатели имеют права и возможности обычных целых чисел.
Третье: Каждый выделенный кусок памяти всегда занят каким-то объектом.
Четвертое: такие языки всегда тянут за собой подсистему сборки мусора, которая самостоятельно учитывает каждый объект и выделенный под него кусок памяти, а еще подсчитывает количество активных ссылок на каждый подчиненный объект. Это называется подсчетом ссылок.
Пятое: как только процент использованной памяти переходит через порог, то запускается сборщик мусора, который сканирует все объекты и количество существующих на них ссылок. Если ссылок на объект нет (то есть он "утек"), то его память освобождается.
Минусы и проблемы
Дорого. При злоупотреблении сборщик мусора может запускаться слишком часто, а каждый его запуск вносит заметный лаг. Особенно критично это в играх.
Он не устраняет все возможные способы вызвать утечку памяти, к примеру просто выделяя бессмысленные данные, но сохраняя на них ссылки. Или если объект, который управляется сборщиком мусора будет содержать в себе то, что сборщиком мусора не управляется (открытые файлы или нативная память вне его подчинения).
А еще он изредка может удалять то, что удалять не нужно, поэтому появляются костыли уровня GC.KeepAlive() (а-ля самый маленький метод в C#).
Но несмотря не это, практически все современные языки используют сборку мусора, кроме C++ и Rust. C++ по большей части перешел на умные указатели, которые тоже считают количество активных ссылок, но делают это без сборщика мусора. А Rust использует свой уникальный Borrow Checker, который понимают только растофилы.
Let My people go (Позволь моему народу уйти) - это пересказ восьмой главы Исхода, в которой Моисей убеждает фараона отпустить еврейский народ:
И сказал Господь Моисею: пойди к фараону и скажи ему: так говорит Господь: отпусти народ Мой, чтобы он совершил Мне служение.
Этими словами Господь призывал Моисея добиться исхода израильтян из египетского плена.
Песней её сделали африканские рабы приблизительно в 1862 году в методистских церквях Американского юга. Пели её в стиле спиричуэл и она считалась гимном американских рабов.
Жизнь рабов была невыносимо тяжёлой, и музыка была одной из немногих вещей, которые делали её сносной.Музыка была священна для рабов, будь то пение в церкви или на полях.
Самым известным исполнителем песни стал Луи Армстронг, чья версия была записана в Нью-Йорке 7 сентября 1958 года.
Падение Берлинской стены - это яркий символ окончания
холодной войны, наступившей «свободы» и победы либеральной демократии в
Восточной Европе.
В 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 году выпустили
компьютерную игру под названием «Попугай Кеша: Свободу попугаям!» Лично я в неё не играл, может быть есть тут, кто играл? Как она вообще?
Или нечестная процедура изъятия денег у населения.
"Say say say" - песня в исполнении дуэта Пола Маккартни и Майкла Джексона, вышедший в октябре 1983 года и возглавлявшая чарты США и многих других стран.
Видеоклип снимался в Калифорнии (Лос Оливос, долина Санта Инес), режиссировал Боб Джиральди. Среди прочих в нём снимались жена Пола, Линда Маккартни, и сестра Майкла, Ла Тойя Джексон. Главных героев видеоклипа артистов "Mac and Jack" и по совместительству странствующих лекарей играли сами Пол и Майкл. Деньги по сюжету они отдали в детский дом.
- Дамы и господа, прошу вашего внимания, подойдите сюда! Давайте, подходите все!
-Подходите ближе, давайте, дамы и господа! Я расскажу вам о чудодейственном средстве Мака и Джека, оно гарантированно придаст вам необыкновенную силу! Да, друзья мои, оно может дать вам силу разъярённого быка!
Сэр Пол сказал:
- Он (Майкл) позвонил мне, и я не поверил, что это он, поэтому спросил: Кто это?Он сказал: - Майкл...В общем, мы пошутили на эту тему, и он сказал: Да, я бы хотел прийти и сотрудничать с вами, и я ответил: Отлично!
Итак, он приехал в Англию, и мы просто сели и начали писать. Я подумал, что нелегко просто сесть с кем-то, кого ты не знаешь, и начать писать, потому что нужно правильно подобрать слова. Но я подумал, что это Майкл - знаете, я просто попробую! Если не получится, мы просто выбросим это…
6 октября 2015 года Маккартни выпустил новую версию песни, в которой вокальные партии Маккартни и Джексона поменялись местами. Режиссёр и хореограф Райан Хеффингтон показал в нём группу молодых танцоров, снятых в чёрно-белых тонах в кварталах Лос-Анджелеса, с движениями, напоминающими движения Майкла Джексона.
Когда словом недели выпало Процедура, то многие вздрогнули,
ибо перед внутренним взором встало, что-то подобное.
запах дезинфекции не забываем
Однако находчивые и креативные вомбатяне, что особенно
хочется отметить и новые участники ивента, доказали, что процедура это не
только запах больницы и сухие строчки кода, но и…
Лев 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
Так что всем желаю брать пример с хомяков и больше двигаться.
А засим низкий поклон всем прочитавшим, бодрости духа и здоровья.
Итак, кто мне скажет как называется процедура водружения вражеского человека (и не только, но это уже совсем запредельно) на крест? Правильно! Распятие. А если по английски? Enemy crusifiction. Да именно так и называется коллектив, с которым я хочу вас познакомить. Ну, не совсем так, там... в общем, ENEMY CRUCIFIXION. Так вот они себя называют. А вот и они, собственно.
Александру Серую не напоминает? Похоже, она у них на вокале, теперь.
Итак, ENEMY CRUCIFIXION, ещё один отличный коллектив из княжества Московского. Напомню про Katalepsy. Что же касается наших сегодняшних гостей, то они знают свою дело. Рубят как надо. Смотрим/слушаем, к сожалению, сегодня только ВК, их нет даже на рутрупе, ютруп даже трогать не стал. ENEMY CRUCIFIXION - AUTHOTOPIA (Official Music Video)
ВК днина, всё настроение убил. Да чтоб их топ-менеджеры получали медицинскую помощь в любых ситуациях с той же скоростью, с которой работает эта площадка.
Прошу прощения, просто в последнее время я чуточку злее чем обычно. Так-то я белый и пушистый, вот прям как этот красавчик.
Так, ENEMY CRUCIFIXION насколько я смог понять, у них на вокале теперь деваха, та самая милашка посередине с первой фотографии. И да, они готовят новый релиз.
Простите, сегодня что-то совсем плохо с яростью, даже с пивчанским. Может погода влияет?
В комментариях к
итоговому посту предыдущей недели, @skiphпредложил, точнее, высказал идею о написании
статьи про хлороформ. Что же, идея интересная.
Пожалуй, начнём с истории. Впервые он был открыт в 1831 году, сразу
тремя учёными (независимо друг от друга). На этом урок истории закончен, перейдём к более интересной
практической части. Наверняка многие из вас видели как в фильмах, злодеи (ну, или не совсем)
использовали хлороформ, для того, чтобы усыпить свою жертву. Для начала классика,
узнаёте этот кадр?
- А где бабуля? - Я за неё. Х/Ф Операция “Ы” и другие приключения Шурика 1965 г.
Из более современных примеров, могу предложить сцену из сериала «Голяк»
(англ. Brassic), сезон 1, серия 1. Вот скриншот того момента, когда Дилан (он же
Дилдо), говорит, что если хлороформ попал на одежду, то всех вырубит.
Кстати, рекомендую к просмотру.
Что тут можно сказать? Всё это, наглая ложь. Просто когда-то давно
сложился такой миф, вполне возможно, что из-за тех же киношников, якобы если
вдохнуть хлороформа, то человек засыпает. Но реальность, как обычно, далека от
фильмов. Всё дело в том, что хлороформ, ранее, действительно применялся во
время медицинских операций в качестве общего наркоза. В частности Джеймс Янг
Симпсон (англ. James Young Simpson) стал вторым учёным, который решил применять
наркоз при различных (болезненных) медицинских процедурах.Однако, для того, чтобы хлороформ подействовал должным образом (усыпил
человека), вдыхать пары необходимо несколько минут, а так он действует как
анестетик, снижая чувствительность к боли. Кроме того, у 10% населения
наблюдается аллергия на данный препарат. Разумеется, сейчас, хлороформ не применяется как наркоз, т.к. ещё в 19
веке выяснилось, что это яд, когда участились случаи летальных исходов во время
операций с его применением. Сейчас хлороформ активно применяется как растворитель в
фармакологической, химической и физической отраслях. Так же применяется для производства хлорфторметана (фреон), который
используется как хладагент в охлаждающих установках (холодильники,
кондиционеры). К сожалению, этот газ разрушает озоновый слой, поэтому надеюсь,
в скором времени от его применения откажутся совсем, в пользу других соединений. В общем, не самый полезный «товарищ». Но, как говорится, не так страшен чёрт, как его малютка.
В данном случае это фосген (слышали о таком?), который образуется при окислении
хлороформа на свету кислородом из воздуха. Поэтому, если у вас дома хранится
хлороформ в прозрачной таре, то лучше хранить его в тёмном, прохладном месте. А если серьёзно,
то фосген чрезвычайно токсичен, в частности его пары, которые сохраняют
летучесть продолжительное время от 30 минут и дольше.
По различным данным вдыхание фосгена в концентрации 0,004 мг/л в течение
60—90 минут не приводит к отравлению. Именно при такой концентрации начинает
ощущаться запах фосгена, который напоминает запах прелого сена или фруктов. Но,
этот коварный злодей влияет на обоняние таким образом, что оно притупляется, как
следствие перестают ощущаться даже более высокие концентрации. И это ещё не
всё! Последствия начинают проявляться только через несколько часов. В среднем
от четырёх до восьми. Только после этого начинают проявляться симптомы
токсического отёка лёгких (кашель, одышка, синюшность кожи лица), который и
вызывает вдыхание паров. При сильной концентрации паров летальный исход может
наступить в течение нескольких часов.
Поэтому! Если вы вдруг почувствовали запах, напоминающий запах прелого
сена или прелых фруктов, а рядом нет ни сена, ни фруктов, то покиньте, то место
как можно скорее и обратитесь за медицинской помощью. В данном случае лучше
перебдеть, чем недобдеть.
Это помогло спасти немало жизней, потому, что при небольших
концентрациях запах может вообще не ощущаться. Надеюсь никому не придётся
проверять это на практике. Будьте внимательны и осторожны, берегите себя и
своих близких! Ну, а я на этом, пожалуй, закончу. До новых встреч!
P.S. Фосген хоть и опасен для здоровья, но при этом
является важным продуктом в промышленном органическом синтезе.
Очень активен во многих реакциях присоединения, благодаря этому активно используется в органическом синтезе (фосгенирование). Применяется для получения ряда красителей.
Методом межфазной поликонденсации раствора фосгена в метиленхлориде с щелочным раствором 2,2-бис (4-оксифенил) пропана (более известен как бисфенол А) в присутствии катализатора получают один из важных термопластов инженерно-технического назначения — поликарбонат.
В июле и августе 1943 года проходила битва на Курской дуге, в результате которой Красная Армияокончательно перехватила стратегическую инициативу в Великой Отечественной войне и перешла в наступление. 5 августа 1943 года был освобождён Орёл, 17 сентября - Брянск, а 26 ноября - Гомель.
В ноябре 1943 года поэт Евгений Долматовский, находясь в только что освобождённом от гитлеровских войск Гомеле, написал короткое стихотворение: "С боем взяли мы Орёл, Город весь прошли, Улицы последней Название прочли: Брянская улица на запад ведёт? Значит - в Брянск дорога, Значит - в Брянск дорога. Вперёд!".В своих воспоминаниях Долматовский сообщал, что он заметил интересную особенность: "последняя улица освобождённого города, по которой проходили наступающие войска, как бы указывала маршрут к следующему городу, который предстояло брать. Дальше ничего не было сочинено, только в намеченную схему вставлялась строка: во вторую строфу - о вступлении в Брянск, в третью - о Гомеле, а кончалось всё строфой про Минскую улицу, про то, что нам предстоит дорога на Минск. Стихотворение Долматовского было опубликовано в газете "Красная Армия" под названием "Улицы-дороги".
Евгений Долматовский отправил стихи композитору Марку Фрадкину, который находился в Москве. Фрадкин в начале 1944 года написал музыку, и получилась песня. Первым исполнителем песни "Улицы-дороги", впоследствии получившей название "Дорога на Берлин", был Леонид Утёсов - по словам Долматовского, она была специально написана Фрадкиным для Утёсова и его оркестра. Впоследствии Утёсов вспоминал: "Одна беда - песня скоро начала стареть. Ведь кончалась она призывом: „Вперёд, на Минск!“ А в июле 1944 года столица Советской Белоруссии была уже освобождена. Советские воины шли дальше на запад, и я стал прибавлять названия новых городов, взятых нашими войсками:Брест, Львов, Люблин, Варшаву и так далее, заканчивая словами „На Берлин!". Песня снова стала злободневной. Таким образом, "обновление" текста песни происходило в соответствии с последними сводками Совинформбюро".
Песня "Дорога на Берлин" прозвучала во время Парада Победы, который состоялся 24 июня 1945 года на Красной площади в Москве - её исполнил военный оркестр в ритме марша.
И притяну сову - песня "Дорога на Берлин" - это процедура изгнания фашисткой нечисти с территории Советского Союза и Европы!
8:00. Звоню на 122. Отвечает голосовой помощник: "Здравствуйте, то-сё, какой у вас вопрос". И тут я простодушно допускаю ошибку №1: говорю, что хочу вызвать врача на дом.
Искусственный интеллект бодро переключает меня на автоответчик с алгоритмом создания заявки вызова врача на дом. И дальше эта срань, простите за мой китайский, медленно и подробно выспрашивает меня про номер полиса, ФИО заболевшего, дату рождения, ФИО законного представителя, адрес проживания, подъезд, этаж, домофон, симптомы, имеются ли какие-то ограничения по здоровью и прочее. Всё это каждый раз с повторным прослушиванием и моими многократными подтверждениями.
Потом, вдоволь наговорившись, ИИ переключает меня (!) на живого Оператора. Трубку берет женщина, которая выспрашивает у меня всё то же самое, один в один, опять-таки каждый раз требуя подтверждения. К концу 20 минуты разговора тётка задает свой коронный вопрос: имеются ли у заболевшего какие-то ограничения для самостоятельного похода в поликлинику? "У 4 летнего ребенка с температурой 38?" - уточняю я. "Да, инвалидности и прочие ограничения". Я чувствую подвох, но как честная говорю - таких ограничений нет. И дальше она выдаёт: перевожу вас на скорую помощь, досвидания. Типа, если очень надо, вызывайте их, а врача из поликлиники вам не положено.
Изрядно удивившись, извиняюсь перед скорой и объясняю, что нам неотложка не нужна и вообще это какая-то ошибка.
Опять звоню 122. Только теперь на все попытки ИИ узнать про мою проблему отвечаю: "Оператор", и через пару минут, снова пройдя верификацию 16 цифрами полиса, наконец слышу новую женщину-оператора.
В голове крутится мысль: как же пройти этого боса.. но на ум ничего дельного не приходит и снова следуют 10 минут подробного опроса. В финале коронная фраза: имеются ли у заболевшего какие-то ограничения для самостоятельного похода в поликлинику?
Тут я понимаю, что меня опять готовятся кинуть, и кричу, что нам просто нужен врач из поликлиники, почему вы это снова спрашиваете, зачем нужны были вопросы про адреса, телефоны и фамилии? И если нам врач не положен, то так и скажите, зачем морочить голову. Но женщина изворачивается, и снова три раза повторяет свой последний вопрос, уверяя, что это такая форма для выдачи заявки. Я опять говорю, что нет ограничений, женщина быстро произносит фразу про скорую и досвидания, и переключает меня дальше, в трубке щёлкает, и я отменяю вызов.
Ровно 30 минут разговоров с ботами впустую. Ощущаю себя, тем мужиком из мема, который кидается песком на пляже.
Дальше неожиданный хэппи энд. Звонит скорая. Спрашивают, что случилось, я объясняю, что 2 раза пыталась вызвать врача из поликлиники. Они задают ещё пару вопросов про самочувствие ребёнка и говорят, что вызовут нам участкового врача сами (у них есть такая возможность). И ещё добавляют, что сейчас творится что-то странное.
Мне приходит смс:
И днем приходит врач. Классный квест?
А вы говорите скучно жить в цифровом мире. Да обхохочешься.)))
Крокодилы альбиносы – животные ну очень уж редкие. В 2021 году по всей планете было известно о существовании всего 12 особей!
А всё потому, что в природе у них нет и шанса на выживание. Новорождённый крокодил – отличная добыча для десятков видов хищников, и отсутствие маскировки в столь нежном возрасте равносильно гибели.
Как ни удивительно, но развал СССР дал сильный толчок к развитию в РФ и странах СНГ методам криптоанализа, которые превзошли зарубежные аналоги.
При этом данные процедуры хорошо были изложены в учебной литературе для ВУЗов господином П.А. Трушевым.
К сожалению книга очень и очень дефицитная - ознакомится не удалось
Данные отечественные средства имеют высокую степень успешного взлома всех криптоалгоритмов, таких как DES, 3DES, AES, Blowfish, Twofish, Serpent, Кузнечик, Магма, ГОСТ 28147-89 и даже "одноразовый блокнот". Вероятность успешного взлома достигает 99.9%, причём одна десятая процента неудачных взломов образуется исключительно на подготовительных этапах - выбор носителя ключевой информации и выбора самой процедуры.
Что самое примечательное, то оборудование, необходимое для проведения данных процедур стоит копейки и реализуется через обычную розничную сеть:
Его величество ЭПСН 100ВТ 220В выполненный по ГОСТ 7219-83 "Терморектальный криптоанализатор, устройство, принципы действия, технические условия производства".
Различают два способа проведения процедуры криптоанализа:
1. Терморектальный криптоанализ - прибор непосредственно применяется к «цели» УЖЕ прогретым до рабочих температур, что обеспечивает высокую скорость и точность взлома шифра, однако в этом методе имеется недостаток - носитель криптоключа будет значительно повреждён и в некоторых случаях это может привести к его непреднамеренному уничтожению до окончания процедуры взлома.
2. Ректотермальный криптоанализ - тот же прибор изначально вводится в "целеуказатель" и только потом начинается его прогрев. Применяется при работе со старыми, имеющими дефекты вспомогательных систем (сердце, сосуды и т.п.), т.е. там, где есть риск непреднамеренного уничтожения носителя ключевой информации, работая по первому способу. При этом эффективность несколько ниже, а время проведения криптоанализа увеличивается.
Замечено множество случаев, когда при проведении этих процедур добывалась ключевая информация даже если носитель ею не обладал.
Некоторые факты о б этом приборе:
* При использовании терморектального криптоанализатора скорость перебора пароля прямо пропорциональна квадрату температуры.
* В отличие от разработок западных ученых, использующих для взлома пароля сложные технические изделия, терморектальный криптоанализатор использует обычную бытовую сеть 220 Вольт/50 Герц и не требует специальной технической подготовки оператора.
* Сложность задачи в случае использования криптоанализатора не зависит от длины ключа и типа используемого алгоритма шифрования.
* Есть свидетельства успешных взломов даже если носитель ранее не обладал ключевой информацией, изучив данные свидетельства Донецкий завод паяльников выпустил новую и улучшенную серию полиграфов «Электровспоминатель-3000».
Зарубежные системы криптоанализа не так эффективны и сложны технически, доказательство ниже:
Информация, представленная в этом посте получена из достовернейших источников: 123