DEV: Рубиновые тона
3.19K subscribers
147 photos
2 videos
8 files
990 links
Анонсы новых видео о программировании (Ruby/Rails, Solidity/Ethereum, Python, JS и не только), практические советы, обзор полезных инструментов и новости из мира IT
Download Telegram
Я смотрел пару интервью Юры Дудя и он задавал своим гостям вопрос: "В чём сила?". Все почему-то, как под копирку, отвечают "в правде". Вероятно, как-то засел в подкорке фильм "Брат", хотя мне это не очень понятно.

Мне кажется, что сила в любви. К своему делу, к другому человеку, к своей стране, к природе, к искусству, к славе. Да хотя бы к деньгам 😂 Ради любви люди готовы идти на многое, на очень многое. Это то, что - во многом - заставляет нас жить дальше.

https://www.youtube.com/watch?v=PBa1iM29mGI
👍22🔥1
Ещё немного вас повеселю. Какое-то время назад я всё-таки подумал, что надо бы почитать книги об известном герое, а потом сел писать на него жалобу. Вышло примерно на сто страниц текста (может и больше, уже не помню), так что всё это оформлено в виде вот такого сайта. Кстати, сайт сделан на Hugo 😄 https://harrypot.lol/
😁7
DEV: Рубиновые тона
Ещё немного вас повеселю. Какое-то время назад я всё-таки подумал, что надо бы почитать книги об известном герое, а потом сел писать на него жалобу. Вышло примерно на сто страниц текста (может и больше, уже не помню), так что всё это оформлено в виде вот такого…
Да, и, конечно же, credits. Минималистичный дизайн придуман мной и @ailura24, а вот иллюстрация сделана очень талантливой художницей из нашей команды. Если требуются скетчи, иллюстрации и рисунки - могу дать контакты. Всё-таки, тут я себя чувствую обязанным, ибо работа сделана бесплатно, а выглядит весьма круто
🔥6
Друзья, хочу поправить одну дурацкую ошибку из видео "вопросы для собеседования" (часть 1). Область видимости переменных по умолчанию всё же internal, а не private:

contract C1{
uint test = 42;
}

contract C2 is C1 {
function demo() external view returns(uint) {
return test; // вот тут test виден!
}
}

Прошу прощения.
👍13
Немного про сигнатуры и селекторы в Solidity.

Сигнатура функции - это, по факту, просто строка, которая содержит имя функции и её аргументы (без указания на место хранения). К примеру, "test(uint256)".

Но вот когда мы обращаемся к этой функции в транзакции, мы не можем просто передать её сигнатуру в виде такой строки. Она должна быть правильно закодирована:

abi.encodeWithSignature("test(uint256)", 42)


В эту же функцию кодирования мы можем сразу добавить передаваемые аргументы (в данном случае, 42).

Но тогда возникает вопрос: а как именно кодируется сама сигнатура? Ответ следующий:

bytes4(keccak256(bytes("test(uint256)")))


То есть мы берём сигнатуру, считаем её хэш и забираем первые 4 байта этого хэша. Получившийся результат называется *селектор* и это именно, что мы используем для указания на вызываемую функцию. К примеру, если в вашем контракте есть функция test, принимающая uint256, то в ABI вы увидите что-то вроде:

"test(uint256)": "29e99f07"


По правую сторону как раз находится селектор этой функции.

При вызове функции первые 4 байта из calldata и будут содержать селектор функции. Это можно проверить либо так:

    function test(uint a) external view returns(bytes4) {
return bytes4(msg.data[0:4]);
}


Либо так:

    function test(uint a) external view returns(bytes4) {
bytes32 temp;
assembly {
temp := calldataload(0)
}
return bytes4(temp);
}


В любом случае результатом и будет тот самый 0x29e99f07. После первых 4 байт будут идти уже сами аргументы, которые передаются в функцию.

    function test(uint a) external view returns(bytes4, bytes32) {
bytes32 temp;
bytes32 _arg1;
assembly {
temp := calldataload(0)
_arg1 := calldataload(4)
}
return (bytes4(temp), _arg1);
}


При вызове функции test с аргументом 1 вернётся

    0:
bytes4: 0x29e99f07
1:
bytes32: 0x0000000000000000000000000000000000000000000000000000000000000001


Эта единичка как раз и видна в bytes32.

Правда всё несколько сложнее, к примеру, с массивами. То есть если у нас есть функция function test(uint[] memory a) и мы вызываем её с аргументом [1,2] то в msg.data будет нечто странное:

0xca1606840000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002


Да, первые 4 байта - это селектор, но зачем там какие-то двойки?

Сделаем следующее:

    function test(uint[] memory a) external view returns(bytes4, bytes32, bytes32, bytes32, bytes32, bytes memory) {
bytes32 temp;
bytes32 _startIn;
bytes32 _elCount;
bytes32 _firstEl;
bytes32 _secondEl;

assembly {
temp := calldataload(0)
_startIn := calldataload(4)
_elCount := calldataload(36)
_firstEl := calldataload(68)
_secondEl := calldataload(100)


}
return (bytes4(temp), _startIn, _elCount, _firstEl, _secondEl, msg.data);
}


Итак, после первых 4 байт идут блоки по bytes32.

* startIn - через сколько байт от начала хранится значение нашего аргумента (массива). Тут вернётся значение 0x20 (нули в начале пропускаю), что равно 32. То есть через 32 байта от начала calldata (плюс ещё 4 байта селектора) начинается наш массив
* elCount - сколько элементов массиве. Вернётся значение 0x00000...02 то есть 2 элемента
* firstEl - первый элемент массива, то есть 0x00000...01
* secondEl - второй элемент, 0x00000...02
🔥19👍1
В ближайших 2-3 уроках более подробно поговорим о написанном выше, посмотрим, как работать со слотами storage, с памятью и где хранятся локальные переменные типа value. Это полезно хотя бы для того, чтобы понимать как контракты работают.

Ну, а на сегодня немного музыки. Всем мира https://www.youtube.com/watch?v=6ey4yAgLZlw
👍12🔥4
Обычно я не публикую ничего по педагогической теме (хотя как инструктор, я время от времени почитываю соответствующие статьи), но тут наткнулся на материал один и потом глянул позиции комментаторов под этим материалом. Конечно, от такого оторопь берёт, если честно. "Учителю нужно было просто пойти к директору, учеников бы в случае чего выгнали из школы - да и всё".

Поделюсь некоторыми инсайдами - всё равно в этом институте я уже давным-давно не работаю, да и живу в другой стране. Вообще студенты никогда особенным прилежанием не отличались, но когда произошло великое слияние двух вузов (МАИ и МАТИ), то стало совсем паршиво. Суть в том, что нам новый заведующий кафедрой, которого внезапно поставили в самом начале учебного года, прямо сказал: делайте что хотите, но кафедра просто не может отчислять студентов больше, чем некий процент N (точно не помню). Иначе её признают неэффективной и могут расформировать, поэтому будь добр ставить хотя бы тройки. Особенно на старших курсах, и никого не интересует, что студент в терминале работать за 4 года не научился, потому что на занятиях не появляется.

Причём не появляться может не то, что один-два студента, а вообще вся группа в полном составе. Ну, мне-то как преподавателю хорошо: я посидел 15 минут, да домой поехал. Но на всякий случай я писал сразу же докладные на имя заведующего, чтобы потом не говорили, что это я прогулял.

На одном из курсов студенты взяли моду на экзаменах заниматься газлайтингом. Я точно вижу, кто и откуда списывает, на что получаю невинный ответ "а я не списываю на самом деле, вам кажется". Вероятно, думали, что я просто отстану, но подобные умники просто отправлялись на пересдачи. Однажды ко мне заявилась целая делегация и заявила, что я несправедливо поставил двойки и требует, значит, пересмотра своего дела третьим лицом. Ну, а так как все их ответы у меня сохранились в письменном виде, я честно ответил, что выше двойки за такое ставить не собираюсь, но если заведующий своей рукой им нарисует другую оценку в ведомости - welcome.

Особенно забавно получилось потом, так как пересдачу согласился принять мой коллега и бывший начальник, параллельно с экзаменом у другой группы. Я остался - просто ради интереса. Минут через 20 я наблюдаю картину, как студентка, сидя прямо передо мной буквально в 2 метрах, преспокойно достаёт конспекты и оттуда списывает. У меня чуть челюсть не отвалилась. Ну, коллега это тоже заметил и выпроводил восвояси. Этого манёвра я не могу понять до сих, если честно.

Да много чего было, что сказать. Но такие рычаги давления есть в институтах, откуда вылететь всё-таки можно, хотя и со скрипом. А уж из школ никого выгонять не будут, это практически исключено.

https://mel.fm/vospitaniye/psikhologiya/5812790-teacher_bullying#comments
👍3👏1😢1
Сегодня интересный вопрос разбирали в школе программирования: как именно размещаются по слотам переменные в случае наследования? Ответить на этот вопрос вам поможет вот такой пример кода:

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Parent1 {
uint public parentInt1 = 45;
uint public parentInt2 = 55;

}


contract Parent2 is Parent1 {
uint public parentInt3 = 65;
uint public parentInt4 = 75;

}

contract Parent4 {
uint public parentInt5 = 100;
uint public parentInt6 = 101;

}

contract Parent3 is Parent4 {
uint public parentInt7 = 102;
uint public parentInt8 = 103;

}

contract Demo is Parent2, Parent3 {
uint public demoInt = 76;


function readSlot(uint _n) external view returns (uint data) {
assembly {
data := sload(_n)
}
}
}


Просто указывайте номера слотов и смотрите, что получается.
👍4
Рубрика "записки в стол". Если кому-то нестерпимо хочется написать игру - ну, хотя бы, угадайку, то вот тут рассказывается, как это сделать. Это одно из более старых видео на канале https://www.youtube.com/watch?v=fy1qwUeNSEo
👍10🔥2
GitHub продолжает вводить ачивки https://github.blog/2022-06-09-introducing-achievements-recognizing-the-many-stages-of-a-developers-coding-journey/ Правда они не сообщают, какие именно: дескать, открывайте сами. У меня парочка появилась, но, честно говоря, они какие-то дурацкие 😂
Небольшая статейка для тех, кто использует Lokalise API - в ней я показываю разные примеры на TS, Ruby, Python https://lokalise.com/blog/lokalise-apiv2-in-practice/
👍5
Yarn писал капитан, видимо
😁3👍1
В этом уроке мы обсудим, как использовать популярное решение VCR для тестирования сторонних сервисов (API и прочего). VCR записывает запрос и ответ от сервера в виде специальных кассет, после чего "проигрывает" эти кассеты в последующих тестах. https://www.youtube.com/watch?v=uc5f7vxUyHA
🔥152🎉2👍1
Все любят котиков, а уж котиков, которые показывают трюки - тем более. Так что сегодня наша кошка покажет пару фокусов https://www.youtube.com/watch?v=f6R1kfqEzkg 😄
4👍1
Сейчас заговорили в чате о ситуации в мире и прочем, поэтому в тему придётся эта песня шведов Sabaton. Война - это самое страшное, что может произойти. https://www.youtube.com/watch?v=oXnnbjC7Fok
👍2👎1
Хотел рассказать вам о забавном и довольно необычном случае, который случился со мной в прошлой жизни лет N или даже M назад (лет 10 назад или около того). Мне он показался интересным тем, как сложились события.

Так вот, мы в очередной раз поехали навестить нашу подругу в Беларусь, в один небольшой городок. Она уже много лет как незрячая, но вполне толково ведёт хозяйство (мне бы так уметь), зарабатывает на жизнь, и в общем-то живёт неплохо. Мы планировали смотаться на несколько дней в Минск, сходить на концерт Ольги Арефьевой, и просто хорошо провести время. В целом, так оно и было, но в один из вечеров мне позвонил мой друг, который присматривал за квартирой.

"Дружище", - сообщил он, - "мне кажется, что несколько мышей сбежали из клетки". Так и вышло. Быстрый осмотр с помощью веб-камеры показал, что из клетки смылось по крайней мере 4 африканских мыши, которые также называются мастомисы. Это такие здоровенные мыши, которые живут в районе Камеруна, кушают самое обычное зерно, очень любят людей и обожают путешествовать по квартире, если есть такая возможность. Серьёзно - они ужасно любопытные, но легко становятся ручными.

Дальше мы устроили практически шутер от первого лица, так как мой товарищ взял камеру в руку и я говорил ему, куда идти дальше. В общем, двух мышей мы поймали, но ещё две куда-то делись. Это было тревожно, так как они могли сгрызть провода или ещё что-нибудь ценное (вообще-то, впоследствии именно это и случилось - они прогрызли здоровенную дырку в нашей надувной лодке).

В этот момент я понял, что надо срочно ехать обратно и разбираться с данной проблемой. Нам пришлось сажать нашу подругу на машину до её родного города и договариваться, чтобы её встретили, после чего брать втридорога обратные билеты в купе (да, это были голодные времена, когда купе казалось недоступной роскошью).

Войдя в поезд, мы обнаружили, что в купе совсем пусто - неужели, с нами никто не едет? Я уселся читать книгу, @ailura24 (бессменный дизайнер нашего канала) уснула. Внезапно прямо перед самым отправлением в купе вошёл или даже ворвался (как и в мою жизнь) довольно необычный персонаж: эдакий Зак Эфрон в пиджаке и брюках. "Извините", - сказал он, - "от меня, наверное, немного пахнет, но пришлось бежать, чтобы не опоздать на поезд. Простите, я вас не потревожу и скоро сойду".

Если честно, у меня чуть челюсть не отвалилась, потому что я никак не ожидал чего-то подобного. Видел я всякое: молчаливые попутчики, семьи с детьми, бабушки/дедушки, которые ругают современную молодёжь, пьяные дядьки, которые полдороги не могут прийти в себя... Но какой-то супер-вежливый парень в пиджаке? В общем, я только выдавил что-то вроде "всё в порядке, не стоит беспокоиться" и вернулся к книге. Затем Эфрон уселся на противоположную койку и довольно долго занимался какими-то своими делами. У нас проверили билеты, потом он как-то невзначай завёл разговор (на русском, ибо белорусский я могу в лучшем случае читать).

Рассказал о том, как работал таксистом и был вынужден ссориться с вокзальными бомбилами, которые обещали его избить. Как разводил голубей, учился на ювелира, а теперь взял кредит и закупил специальное оборудование. Как занимался бодибилдингом и показывал мне фото с состязаний, как работал тренером. Я тогда и сам занимался боксом, но честно сказал, что мне ещё надо худеть и худеть.

Эфрон посочувствовал и заметил, что расписал бы для меня диету, но ему скоро сходить. Потом он рассказал, как познакомился с невестой и как сделал для неё кольцо своими руками, и какая классная свадьба у них скоро будет. Скажем так, я и сам могу порассказывать много всего, но в тот момент я понял, что просто нужно послушать. Это вовсе не была какая-то глупая похвальба или, как говорится, "понты". Нет, просто совершенно незнакомый человек, который прямо перед отправлением поезда вбежал в купе, делится своими мыслями и переживаниями. В конце концов, что тут такого - он меня знать не знает, и больше никогда не встретит (хотя мне до сих пор интересна его судьба, так что, Эфрон, если ты это читаешь - дай знать!).
👍13
Через час Эфрон действительно собрал вещи и сообщил, что сейчас он выходит (это было всё ещё на территории РБ, само собой). Мы тепло попрощались, я пожелал ему отличной свадьбы - одно только жаль, хотел подарить на память свои часы (у меня небольшая коллекция). Глупо, но до сих пор вспоминаю с сожалением.

Потом поезд тронулся, мы проехали мимо переезда, на котором стоял мой знакомец - он помахал мне и тепло улыбнулся.

Прошло уже много лет, но я почему-то до сих пор вспоминаю именно этот момент, хотя сколько всего уже произошло с тех пор... Развал нашего института, безвластие на кафедре, ликвидация компании, бесконечное фрилансерство, бесконечные "творческие эксперименты", бесконечные записи уроков... Да чего только не было. А вот Эфрон всё-таки вспоминается. Почему?..

Это напоминает книгу "Уличный кот по имени Боб". Книга глупая и простая, но она о реальной жизни: простой кот кардинально изменил жизнь уличного музыканта. Не скажу, что Эфрон сразу и кардинально изменил мою жизнь. Вовсе нет: тогда она продолжала лететь в направлении к югу (выражение такое есть "going south"). Но всё-таки я задался вопросом: а всё ли правильно я делаю? А затем жизнь действительно стала меняться. Связано ли это с той странной встречей? Не знаю.

Я верю в то, что в мире существует некая высшая сила, некое божество, но верить в конкретного бога мне тяжело. Это, видимо, называется "антиклерикализм". Так или иначе, есть что-то, что подталкивает нас к новому пути.

В определённый момент времени нам нужен некто, кого мы можем назвать своим учителем. И я благодарен "высшему разуму" за то, что это случалось со мной до определённого момента. В детстве таким учителем, конечно, был мой дед. Он научил меня кататься на велосипеде, забивать гвозди, отличиям между фазой и нулём, и тысяче других необходимых вещей. Затем вторым отцом для меня стал С.Ю. Гуснин, основатель первого в РФ центра обучения, где учились сотни будущих системных администраторов и где мне довелось несколько лет преподавать. Когда наш центр обучения уже дышал на ладан, С.Ю. всё равно оставлял меня в штате, хотя мы и не получали никакой особенной прибыли. Ну, а к моменту завершения института учителем стал @kutanov - один из самых сильных инженеров, которых я вообще знаю. Тогда он помог мне с дипломной работой и пригласил в стартап, где я в итоге стал ведущим инженером и получил бесценный опыт. Видимо, в какой-то момент Эфрон тоже стал моим учителем, пусть и на пару часов.

Поэтому совершенно неважно кто и как изменит вашу жизнь. Главное - разглядеть этот шанс, поймать этот момент. А ещё очень важно помнить, что мы учимся всю жизнь. В этом плане для меня символично имя одного из героев М. Семёновой - Астин Дволфир, что означает просто "ученик". Пожалуй, это я. Просто ученик, который помогает учиться вам.
👍20🔥5
Channel photo updated
В этом уроке мы обсудим довольно важный вопрос: что же такое memory и calldata, в чём их отличия и как они работают? Почему calldata нельзя менять? Почему хранение в memory дороже, чем в calldata? Мы сделаем серию экспериментов, чтобы рассмотреть особенности этих "хранилищ" на примерах. Также мы отдельно обсудим селекторы функций и узнаем, как они кодируются. https://www.youtube.com/watch?v=xsV9FkDKcJY
👍17🔥6🎉1