Подготовка к собеседованию на Android Developer
Менторы
Специалисты своей области, которые смогут помочь вам
Middle .Net Developer
Senior Product Manager
Middle Python Developer
Ведущий программист
Backend Software Engineer (PHP)
Senior .NET/C# developer
Middle DevOps Engineer | Tbilisi, Georgia
Middle C# .NET
Senior PHP-разработчик
Middle python developer
Каналы
Полезные Telegram каналы и чаты
Транскрипция видео:
[музыка] как интересно я и тут и там [музыка] Всем привет С вами Android broadcast Я Кирилл Розов Сегодня у нас очередное собеседование Причем я решил отойти от этой скучной практики где все время собеседу я решил что пора смотреть вообще как это происходит собеседование в разных компаниях от разных разработчиков с разными взглядами максимально интересные Как можно шарик больше опыт поэтому сегодня собеседование буду проводить не я наоборот кажется мне только интереснее все будет главное что все это мы делаем
00:00:10 - 00:01:28
при поддержке нашего генерального партнера команда инженеров Авито тех классно ребята делают крутые хорошие полезные штуки переходите много чего интересного полезного для вас и также конечно карьерные возможности Где вы можете научиться всякому крутому и поработать В одной из крутейших технических компаний России а теперь Стартуем непосредственно нашу основную часть Сегодня собеседование провод я могу сказать для меня этот человек прямо легендарен легендарно Миша Горюнов вы могли что-то его знать еще под ником как гормонайзер
00:01:01 - 00:02:08
Миш привет привет да Миш Расскажи пожалуйста то есть вдруг кто-то про тебя не знает расскажи немножко про себя я разрабатываю Android приложение в основном это всякие разные коммерс но не скучные коммерс как это бывает обычно а со всяким красивым дизайном над которым приходится попотеть поэтому я интересуюсь всякой 2D графикой эффектами визуальными виджетами но это не отменяет того что я в целом хорошо знаю базу и собственно по базе Сегодня я буду собеседовать нашего товарища который появится позже
00:01:34 - 00:03:03
Расскажи пожалуйста какой сегодня формат ждет вообще куда мы что собеседуем мы сегодня собеседуем выдуманную компанию Android ли Дом который являюсь она выдуманная вакансия можно посмотреть ее текст сейчас появится на экране и Если вкратце то смысл такой нужен уверенный четкий android-разработчик который сможет взять и написать приложение и знает все основные аспекты То есть это сам язык его рантайм это Android sdk uino архитектуры асинхронщина форматы передачи данных формата хранения данных Ну и немножечко гид потому что как же
00:02:19 - 00:03:55
без Гита вот главный момент тут вакансии ничего не говорится про опытом сеньорис вот эти вот все штуки что касательно их Да я в эти штуки не играю потому что или на каком-то определенном уровне который может взять и сделать это означает что у него некоторые теоретические навыки позволяют не косячить во всяких местах в которых легко накосячить если не знаешь а в остальных местах но он может найти нужный ответ если он его не знает сходу то может разобраться и все равно выяснить короче такой толко
00:03:07 - 00:04:26
вый спец который может соответственно если что-то не знает покопаться разобраться и то есть на нем не нужно стоит можно него понадеяться требования принципе довольно справедливый Хороший кандидатом у нас сегодня будет Артем Артем Привет Привет Меня зовут Артём Меня зовут Артём сегодня будем мы собеседовать Миша вот что у тебя за плечами что-то сделал интересного Ну я занимаюсь программированием на протяжении полутора лет начинал с плюсов перешел постепенно потом решил заняться Android Ну сделай из того что я сделал Я сделал
00:03:51 - 00:05:25
три приложения на play market которых загрузил люблю делать всякие приложения которые Вот мне интересно которые довольно таки нестандартные То бишь допустим приложение которое позволяет тебе получить Ну типа список твоих активностей по типу когда ты разблокировал телефон когда ты заблокировал телефон когда кто-то попытался неправильно вести пароль и когда ты открыл такое приложение какое-то определенное приложение что типа такого Мне нравится работать с такими отличниками потому что интересное правда информации
00:04:48 - 00:06:06
Окей У тебя есть Open Source несколько проектов это была одна из причин почему Миша как раз то и заинтересовала твоя кандидатура Расскажи про них подробнее пожалуйста вообще Ну мое самое первое приложение это заметки шифрованием То бишь можно было как обычно там заметку создать создаешь заметку мы ее можно зашифровать и там еще список дел работал там со всякими отличниками по типу называется Короче их там ставил разрешение обрабатывал Ну так тренировался самое сложное наверное было получить разрешение чтобы
00:05:31 - 00:06:51
использовать отличник Google драйва мне пришлось сделать даже не сделать взять матец сайта который генерируется типа стандартный загрузить его чтобы мне дали доступ к отличнику вообще не понимаю зачем конечно нужно было сайт мне чтобы мне дали доступ и успешный проект потому что это единственный проект которого больше 30 активных пользователей про то что я рассказывал до этого приложение Окей А с какой то цель вообще делал это проект там опыт не знаю хотел полезное приложение сделать или куда это вообще
00:06:14 - 00:07:35
всё заходило тут как бы наверное все и сразу потому что Ну первое приложение я делал просто интересно было Ну наработать опыт сделать приложение грубо говоря себя вот следующее приложение Я уже делал что типа делаю приложение у меня типа и опыт будет И что показать так сказать будет тогда я еще не думал вообще что буду выкладывать их потому что первое приложение там на самом деле я когда Зашел туда буквально месяц назад я просто скажем так немного охренел Нужно [музыка] когда открыл все остальные приложения
00:06:59 - 00:08:30
уже делал Окей замечательно все тогда я сейчас практически оставлю наедине но отвечу на главный вопрос с комментариев который зрители мои до сих пор не смогли понять Да собеседование останется в записи вы сможете его посмотреть нет смысла об этом нигде писать в комментариях и спрашивать если будет спрашивать я просто буду тренировать и не отвечать все Стартуем А после всего конечно мы еще отвечаем на Ваши вопросы и ждет разбор Миша даст свое мнение Артем тоже поделится В общем разберем конечно все
00:07:52 - 00:08:52
что здесь сейчас увидим поехали Я предлагаю разделить наше общение на три с половиной секции первое будет теоретическая То есть я буду задавать вопросы на которые нужно знать и понимать ответ без этого понимания будут проблемы сразу же если не понимаешь что можно просто написать код который будет Неправильно работать второй вторая секция будет по практике там можно будет уже любовными средствами куда угодно подглядывать лишь бы сделать вот и последнее полусекция если у нас будет куча времени и желания мы можем
00:08:24 - 00:09:53
философствовать понятно хорошо предлагаю начать с теории и первый вопрос У меня это что такое char sequence это получается грубо говоря массив чисел винтовых которые по таблице аски получили не обязательно какая-то таблица кодировки преобразуется в символы по сути можно сказать что это строка похожая на строку в какое на кодировке зависит от языка Ну обычно самая стандартная которая поддерживает большинство языков это 8 но еще одна Одно понимание и у него один тип Чар есть элементов Ну если я ничего не путаю это
00:09:09 - 00:10:53
Ладно поехали дальше что такое дата класс в котлине это грубо говоря синтетические сахар котлин который позволяет сгенерировать для класса самый типовые методы для что дата класс это класс для данных То бишь у него Обязательно должно быть конструкторе хоть одно поле Var или вал вот он от него по моему нельзя наследоваться но он может наследоваться Вот у него переопределяются сразу equal seash код генерируется методы копии и компонент как-то получается Функция которую можно вызвать и получить поля Поэтому
00:10:12 - 00:11:52
да как компоненты кстати можно использовать на самом деле лично для меня это довольно таки опасная вещь как я считаю но ее можно использовать Я недавно видел что допустим цикл for ты пишешь ты ставишь скобки допустим пишешь для переменные Инна и вот этот вот так можно обращаться к переменным вот вот в этом Прикольная вещь от этого думал что это вообще какие-то мусорные методы Но оказалось что не хоть какое-то применение есть но все на что их довольно-таки опасными лучше их не использовать как по мне понял
00:11:06 - 00:12:28
За что отвечает наш runtime Java хоть в Андроиде хоть у него ответственность выполнение инструкции наверное находится Он байт-код выполняет отправляет на исполнение процессору Горбач коллектор да получается у нас допустим если мы должны были сами чистить за собой мусор то же время у нас есть горбыш коллектор который сам проходится по куче и ищет в ней элементы которые мы уже не используем не знаю тогда такой вопрос а вот обычно мы используем как бы обычные ссылки то есть мы просто ссылаемся на какой-то класс пишем там
00:11:48 - 00:13:49
string X равно чему-нибудь и с этими ссылками мы не замечаем работы сборщика мусора он нам как бы не мешает просто защищает то что нам уже не видно А есть ли у нас такие ссылки с которыми Нам видно работают больше мусора насколько я слышал Есть там можно класса Объявлять в этом типа Strong ссылки там Лик ссылки еще какие-то две К сожалению я особо этой темы не владею но просто слышал что такое есть Что такое лямбда с точки зрения Ну это как некая анонимная функция которая может что-то принимать на вход
00:13:06 - 00:14:47
может не принимать и возвращает какой-то результат Юнит там или какой-то другой результат в Ну во время компиляции она компилируется в анонимно Объект который у которого есть его можно вызвать а какой тип у лямбды [музыка] этого не знаю Какие какие у нас бывают опасности если мы в котле не Передаем лямбда в джавовый метод Возможно мы можем вызвать допустим Return еще [музыка] название Короче мы Передаем [музыка] К сожалению я как бы только на котле не всегда писал я вот этого не знаю но возможно это может связано как-то что
00:14:03 - 00:16:01
мы можем как-то неправильно выйти из я неправильно выйти из функций Мне кажется Ну То бишь там вызвать реторну и у нас завершится основная функция с которой мы вызываем возможно из-за этого Но точно я не знаю а как в Андроиде в его архитектурном компонентах сохранить состояние так называемые модели сохраняется Как нам сохранить состояние которое у нас есть модель которая архитектурная либо Да вот можно вызвать делегат by Models туда передать получается в Factory вот где она хранится по моему любишь когда
00:15:35 - 00:17:06
мы создаем нашу Activity она там поднимает процесс и когда мы активите создаем Ну ладно там создается специально по моему объект активите регистр или регистр рекорд и в нем вот в Model Store получается а как сохранить состояние Но если у нас какая-нибудь в модели не гугловская я думаю что можно если мы сохраняется но она сохраняет состояние между ними конфигурацией а если нужно передать Ну мы можем если мы в активите допустим это делаем мы можем во время он Create передавать туда бандал и проверять Если
00:16:47 - 00:18:33
там что-то что нам нужно или Он пустой точнее и нам нужно тогда получается Он своих инстанции он Save instance стоит переопределять в него банда уложить наша переменные которые у нас должны быть либо парса был либо Серова и забыл вот и не сохраняться либо если мы используем компост можем использовать для примитивов опять же был роман это была теоретическая секция нам Кирилл предлагал сразу сделать обратную связь Значит у меня первый вопрос был про Чар сиквенс и ответом что строки в Джаве хранятся в ютф-16
00:17:51 - 00:19:29
это очень неудобно очень неприятно и очень грустно но как бы без этого понимания можно что-нибудь сломать Вот и вдогонку но чары это соответственно utf-16 слово два байта lings Это количество 16 слов в строке то есть это не количество символов Hotpoint of или графен и из этого куча замечательных пропал Я не слышал сейчас картинка зависла У меня просто сейчас я слышу вас но я просто у меня картинка вот статичная кадр и все я не знаю кто из нас [музыка] странно Блин что делать [музыка] сейчас сок
00:18:52 - 00:20:41
задержка там случаем никто в сети локально не смотрит активно чего-нибудь или не все все вроде вроде бы все отлагала Сейчас вижу тогда продолжаю значит нет наушники на связь Я то слышал но она пропадает Давай я буду говорить Медленнее Это поможет Да к сожалению технически неполадки Что же поделаешь так сейчас ребятки порешаем немножко ну что попробовать переподключиться да Ну вот такие вечера у нас веселые Да пока Миша мы с тобой Сейчас вроде нормально Хорошо давай пробовать продолжать получается на это 16
00:20:14 - 00:21:53
uter sequence nuture sequence - это обертка над массивом чаров Ну а чарль это два байта это utf-16 слово Следовательно Чар эт возвращает нам либо символ либо половинку символа так называемые суррогатной пары и langs возвращает нам количество вот этих двух байтовых слов Вот То есть в принципе это можно на это смотреть как на черный ящик как на какой-то массив с какими-то буковками которые нам вот этими своими основными методами не слишком много о себе скажет Да я не стал уже до дал бывать там Чем
00:22:29 - 00:23:53
допустим отличается методы Чарльз от Points добавлены потому что Это тоже вопрос 4 [музыка] но как бы мораль здесь такая что если строчки не знать с ними можно сделать что-нибудь неправильное можно порезать строчку [музыка] короче вот так про дата класс ты сказал все что про него можно сказать все его методы назвал все круто им Джесси Roots и виды ссылок значит Джесси Roots так называют место Откуда начинается сборка мусора наш сборщик мусора на самом деле занимается тем что он смотрит что нам нужно
00:23:19 - 00:25:07
оставить что он еще живой осталась и он начинает как раз дрессирует то есть от тех объектов которые лежат на стеках работающих трейдов [музыка] от этих объектов которые явно используется пройдется по всем возможным под деревьям ссылок и посетит все объекты в себе все что не посетит окажется мусором частями Артема однозначно проблему на твоей стороне я ну прям вижу тут технически может браузер другой Можно попробовать проблему браузера Мне кажется проблемы соединения что у тебя Но похоже браузер
00:24:27 - 00:25:52
Яндекс ну Давайте попробуем мне было вопрос про лямбды ссылок там у нас конкретно есть классы которые называются О да я про них слышал но не пользовался ни разу если не вдаваться в подробности то и к референс позволяет обернуть объект и следующую сборку мусора он скорее всего не переживет но если мы не дойдем до следующей сборки мусора то у нас он будет моего как-нибудь можно использовать Я такую штуку использовал для каша битмапов То есть у меня был стандартный ларью кэш в пикасе Я туда прикрутил еще вторым
00:25:47 - 00:27:12
уровнем конечно слабых ссылках и если bitmap сборщик мусора не похавал то я все еще могу ее показывать То бишь ссылки это типа вот кэш если прибил то прибил типа заново будет если не прибил то мы оттуда то есть такие ссылки используются для таких объектов которые нам типа не важно он живой не живой не живой правильно Да которые нам не слишком жалко но точнее Как нам жалко потеряете но как бы если надо то пусть теряется то есть эта штука которая чувствует сколько у нас памяти осталось буду ждать
00:27:01 - 00:28:29
что полям там получается а полям дам там сам конверсия в Джаве Джаве у лямбды нету конкретного типа просто у лямдо выражения и ему нужен какой-то контекст с типом для того чтобы привестись к нужному типу То есть ты можешь написать он клизенер лиса нержав но скобки Стрелка и тогда у этого выражение будет типом криклисонер к примеру Интерфейс Да котлине это устроено иначе там у лямбды изначально есть тип тот который языке как раз выражается и поэтому когда мы Передаем нативную котлиновскую лямбуду какой-то
00:27:47 - 00:29:16
джаловой код который ожидает Она там оборачивается в прослоечку которая реализует нужный интерфейс Если получается из коты допустим у нас есть какая-то функция которая возвращает допустим Я правильно понял не понял ну а ну хотя бы про интерфейс говорили но допустим если это примитив будет то бишь мои скоты на допустим лямду которая возвращает boolean тип если мы Передаем вот в Джаве Нам нужен какой-то интерфейс например продюсер в более Короче если мы напишем там вал лиса не ржавного фигурные скобки напишем там
00:28:36 - 00:29:58
какой-то код а потом где-то напишем что-нибудь регистр какой-нибудь лицемер передадим его туда то он обернется в промежуточный класс который будет реализовывать нужно интерфейс когда мы в другом месте напишем та же штука точка ремув такой-то там лисы передадим туда этот же он еще раз вернется и у того и другого лица будут разные то есть мы не сможем отписываться понятно Вот про да про состояние VI модели [музыка] в принципе твой ответ будет работать можно реализовать Restore и дергать что-то из VI модели
00:29:38 - 00:31:19
сохранять восстанавливать Но вообще у модели есть своя штука которая называется Save State handle она странная Она довольно убогая она умеет отдавать мюта был дату и они считают что это Баг и она не умеет отдавать Уют был я считаю что это баг короче очень Спорная штука вот но тем не менее она есть это просто Киеве можно еще состоянии видел некоторых видосах думал что какой-то отдельно прикидывается [музыка] [музыка] фабрика либо создать свою фабрику И там какой-то объект будет на котором нужно вызвать
00:30:34 - 00:32:18
Вот то есть там все готово для того чтобы взять и использовать а если мы используем например Нам что-то нужно будет в диаре прописывать либо оно все само разрулиться Вот это вопрос к вашему диагноз вот я не знаю мы еще допустим даггер не знаю Ну тоже буду знать Это был по-моему последний вопрос да это был теоретический блок теперь практически блок в котором можно пользоваться абсолютно любыми шпаргалками звонить другу спрашивать чем гпт если пользуешься просто Google Как я обычно делаю свои ежедневной работе
00:31:40 - 00:33:13
и первый вопрос У меня будет прогиб У нас есть фича ветка в ней написано несколько битов в процессе работы несколько попыток по-разному чего-то сделать но в итоге нам этот результат нужно как один комит Какие есть способы сделать вот это вот конечно я могу предположить что возможно мы можем взять последний commit его Хотя возможно можно взять посредниками и его замерзлить в основную ветку но у нас получится в основной ветке мержками которого одним из родителей будет этот наш комит который за собой
00:32:28 - 00:33:59
потянет остальное цепочку К сожалению я не знаю Да но это практически вопросы его можно у кого-нибудь Да спросить посмотреть тут уже абсолютно свободной форме сейчас можно гуглить я правильно понимаю главное сделать это правильно и достичь результата [музыка] Ну получается вот тут нашел мы можем использовать Сначала мы переключаемся на ветку которую хотим мне пошарить Наш кот шерсть я пошла сначала переключаемся на ветку нужно используем можешь побольше сделать Shift то это ко мне они это и Артема
00:33:18 - 00:35:00
как это сделать потом использовать здесь нужно вот нет черепик это выдернуть содержимое вот этого комита невзирая на все его историю то есть допустим у тебя была длинная история это мы разрабатываем какой-нибудь восьмой версии сейчас и это мы зафиксили какой-то баг а кто-то там использует наши версии допустим 6x и мы можем взять из нового коммита любого сделать патч допустим к очень старой версии Но я не говорю что это обязательно так это просто пример из жизни то есть можем к любой версии накатить
00:36:01 - 00:37:29
вот этот патч совершенно отрываясь от его истории всех предпосылок Вот то есть мы таким образом оторвем один коммент а не с мертвым его историю Так нам же вроде задание было Именно что именно у нас есть ветка фича ветка и мы должны один коммент именно вот эту монетку так или нет У нас есть несколько коммитов и нам надо суммарно их изменения перенести истории из этой ветки мы можем без истории одним коммитом схлопнуть их она это можно сделать request это фишка не Гита а гитхаба githuba bitbucket
00:37:03 - 00:38:37
Но если так то это тоже решение [музыка] а Гитлер шнур не подойдет или мерж создаст нам вершка МИД который затащит за собой историю ты скажи Я может правда плохо сформулировал вопрос то есть Может это нормально ответил просто я не знал что на что ты отвечаешь Потому что если мои формулировки ты был уверен что нам надо забрать изменения из одного комита то не нужно забирать изменить блин То бишь у нас вот три комита допустим вот только вот берем один комит без остального То бишь у нас есть более
00:38:06 - 00:39:27
изменение этих комитов Но они в истории которую мы замерзли моих не будет Я так понял это все значит ты правильно ответил А я неправильно спросил тогда предлагаю еще вот такой вопрос другой вот у нас есть функция какая-то абстрактная и она должна давать точную сумму Как правильно написать тесты а что значит точно сумма и что такое А переполнение переполнение чего переполнение интеджера точную что Ну а что значит точно не совсем понял но хотя бы если функция не может посчитать сумму правильно она бросает
00:39:42 - 00:41:21
исключение любое возможно но есть у нас пойдет пополнение У нас есть константы Макс да да Но если у нас переполнение то получается она может переполнить это там будет вообще другое число да возможно есть какой-то метод который может определить в инте что переполненного в этом я не уверен либо как Ну мне кажется сейчас плохое решение но все же Сначала мы можем взять конвертировать число в Лонг сделать лук вернуть сложение Это не твоя проблема потому что я предлагаю тебе протестить эту функцию что там написано мы не знаем допустим да
00:40:44 - 00:42:22
допустим Она еще не написано мы играем какой-то а мне написать [музыка] получается сделал конечно Тут по идее если следовать асерт получается Здесь должна быть подготовка к тесту потом здесь выполнение теста и потом должна быть там проверки там ассет Но в данном случае просто будет сделан это набраться чтобы у нас выбрал выбралась исключение как-то так бы наверное это сделал Сколько у тебя разных методов было бы с проверками На какие условия Ну я бы проверил А я немного ошибся тут должно быть [музыка]
00:41:56 - 00:43:22
Я бы попробовал Возможно с минимальным значением с максимальным значением Инта тоже самое сделал бы написал бы еще одну функцию дописал бы чтобы было понятно название самой функции что она допустим с максимальным значением с минимальным значением с корректным значением но в целом да предлагаю пока спрятать котшер И порассуждать гипотетически нам пользователь выбрал из галереи какой-то видеофайл который мы хотим загрузить к себе на сервер поскольку это видео Оно довольно-таки большое и мы его не можем просто к себе
00:44:32 - 00:46:01
скопировать приватный каталог моего должны брать из контент-резойлера всегда То бишь у нас пользователи через какой-то пикер выбрал наш видео в галерее Да и мы хотим передать Да и нам хочется это сделать побыстрее и понадежнее если загрузка частично оборвется нам хочется ее продолжить как Это принципиально реализовать не так чтобы там пошагово конкретно возьми А вот просто в принципе Какие сущности а если мы выйдем из приложения оно должно типа продолжить или без разницы Но если мы допустим выйдем приложение
00:45:26 - 00:47:02
Ну допустим если Activity сайт мы стартуем программу сервисы продолжаем То есть это сейчас этот вопрос нам не мешает Ну тогда получается я бы наверное бы использовал именно foreground Service возможно именно баунт сервис но тут надо подумать Потому что балансервис если вы не отвязать он будет крутиться до бесконечности пока система не решит что во время пришло но не знаю можем в принципе просто запустить обычный сервис программу в интенсия передать его Юрий вот и получается Поэтому [музыка] возможно через баффер мы получаем
00:46:19 - 00:48:04
какие-то байты и эти байты возможно отправляем на сервер Главное чтобы сервер поддерживал на самом деле с файлами Хоть я и никогда нет отправлял потом именно был целый файл вот частично не отправлял но в целом Я думаю если можно отправлять запросы допустим с байтами раз запрос два запроса сервер Потом это в конце Ну пришла какой-то запрос терминальный и сервер эти все байты объединяет и получается какой-то файл возможно так работает да пусть у нас на сервере будет все что мы захотим Допустим мы ему Передаем
00:47:21 - 00:48:39
какой-то контент раньше и он умеет его сохранять а как нам на нашей стороне забрать из оллера произвольный контент раньше Ну через контент открываем Ну наверное если это файл потому что объект большой использовать какой-то баффер взять может быть и в него получается записывать эти байты баффер потом отправлять сервер и потом в цикле это продолжать пока мы не закончим за вину забирать это видео но сложность Может наступить в случае когда мы часть зальем допустим 100 мегабайт можно залили У нас оборвался Интернет да и вообще там
00:48:04 - 00:49:55
телефон перезагрузился или разрядился а потом пользователь снова зашел в наше приложение мы поднимаем эту задачу вспоминаем что надо заливать и вот как там продолжать из этой ситуации Тогда возможно лучше использовать Work Manager потому что он может сам себя поднять если грубо говоря завершится мы еще сможем проверять какие-то условия если у нас интернет и какой-то интернет тоже может быть важно только вот одна функция и допустим у нас какой-то части оборвался то как допустим начать с этого момента К сожалению так на ходу не
00:48:59 - 00:50:26
могу представить Возможно там когда мы Передаем типа Можно какой-то банду есть структура которая нам потом может быть но мы сами в целом-то можем себе куда-нибудь в базу писать сколько принял А ну допустим через сохранять Ну как вариант Кстати да Ну тогда мы можем допустим разделить Ну Пейдж можно назвать допустим по 5 мегабайт каждые 5 мегабайт это будет определенный Пейдж получается и сохранять это в базу данных и если мы вдруг оборвемся мы вначале получается наша функция менеджер проверяем если мы
00:49:47 - 00:51:16
допустим значение в этих референциях если оно есть то мы допустим делаем сначала байтов какой-то определенный Когда мы читаем из этого стрима мы можем передать Я тоже не пользовался Я помню просто что когда читаешь получается там можно писать OK Ну так пока вот грубо говоря в голове именно так представляется хорошо а Представь что у нас приложение с событиями как Google календарь нам нужно очень точно на клиенте знать что то или иное событие началось или закончилось потому что допустим нам нужно подсоединяться к онлайн
00:50:36 - 00:52:20
трансляции показывать кнопочку присоединиться и если события еще не началось то нам некуда присоединяться нам ничего не покажет там еще три монет то есть нужно синхронизировать время с нашим сервером и знать но какое время на сервере По какому времени он живет как это можно сделать [музыка] у нас эти уведомления приходят они не локально не удаленно получается мы можем зайти на страницу с календарем и там события будет либо оно активное либо оно какое-то там будущее или прошедшее а все я понял Мы можем время представить в количество
00:51:51 - 00:53:28
миллисекунд прошедшее как-то называется компьютерной эпохи 1970 года получается И вот это время мы можем передавать с сервера на клиент клиенте мы можем локал дата Time и оно преобразуется во время которое установлено на этом на клиенте устройства получается а на сервере у нас получилось без часового пояса [музыка] то есть Нам нужен либо инстанции если говорить в терминах Просто я на практике так никогда не делал Не ну я когда-то это дело в первый раз до этого я тоже этого не делал смотри у нас сложность в том что мы
00:52:42 - 00:54:22
можем посчитать время текущее спросить у наших часов встроенных телефон Мы можем получить время сервера которая была актуальным когда сервер писал нам ответ вопрос как их синхронизировать Как там жить по времени сервера [музыка] нам нужно показывать время которое Ну которая понимает сервер нам нужно тогда знать его часовой пояс но одного часового пояса недостаточно потому что вот у меня жертва деградации этого кварца вот сейчас 19:25 у меня по-настоящему нет верно сказал что время получить сервера
00:53:51 - 00:55:25
развитие не могу так думать что тут можно сделать по крайней мере предлагаю спроектировать другую штуку как бы без Вот таких подковырок но просто непростую У нас есть несколько метеостанций на разных частях планеты и на них очень быстро меняется температура потому что судьба маленьких планетах без атмосферы эти Меркурия в том что у них там в тени Минус 100 градусов а на солнце там плюс 300 и мы хотим в реальном времени видеть сразу одновременно графики с разных метеостанций вопрос в том как нам это спроектировать
00:55:07 - 00:56:45
от начала и до конца то есть в каком формате по какому протоколу серверным это отдает Какими асинхронными примитивами мы это у себя обрабатываем и какой архитектура это все доставляем рисуем Ну Наверное начну с ЮА Я бы взял архитектуру игру То бишь у нас есть какой-то ua или compose принципе на без разницы и есть наш объем модель которая не знает о том какая будет View но View будет знать объем модели Ну либо может допустим каком полозья может принимать какие-то дела и инвенты Нет отправлять его
00:56:13 - 00:57:31
инвенты и просто читать стоит с этой модели А мы там стоите мы можем какой-то репозиторий вот этих вот метеостанций информация о них Возможно даже несколько репозиторов с каждой метеостанции он может жить вот эти все три потока который мы допустим там где-то определили но нам без разницы какой именно можем скомбинировать и сделать какой-то общее состояние и на него подписаться вот так что касается как Мы это можем получать конечно возможно делать запрос каждый раз Возможно это будет накладно по сети и по
00:56:56 - 00:58:33
процессору Да и нам нужно какой-то задержка тогда это делать нам принципе нужно Лайф тайм то есть теперь запрос правда накладно У нас есть разные другие штуки Кроме этого способа этого способа не знаю возможно как-то открывать соединение через сокет ну я с этим никогда не работал просто было дело но возможно через 40 можно типа открывать его как ты там какие-то данные между собой отправлять принимать возможно так можно сделать принимать можем допустим с сервера строку в формате json отправляйтесь на
00:58:01 - 00:59:30
мой клиент через сокет этот вот на клиенте мы можем поток байт попробовать преобразовать строку потом эту строку преобразовать строку преобразовать какой-то нашу локальную модель потом получается прокинуть репозиторий вот репозиторий там уже получается она нужна кэшировать значение Мы заходим сразу нам сервер отдает допустим за последний час все значения А после этого досылает нам все новые значения тогда получается на какой-то репозиторий это дает Допустим это все будет показывать какой-то и вот этот репозитории
00:59:05 - 01:00:38
получается использует эти значения если их много нужно только последнее значение нет Нам нужен график который помнит все но там будет скользящее окно значение которым больше часа Их можно выкинуть на все остальные остаются жить на графике Ну тогда бы я наверное бы попробовал бы использовать shared Flow Наверное потому что у него там есть политики переполнения у нас максимальное значение есть который мы можем одновременно держать или как а нет не про это Нам нужен график строить тогда можно с листом это объединять Ну как это сейчас
00:59:56 - 01:01:30
я вижу тогда получается можем использовать [музыка] Ну Хорошо пусть будет например все-таки sharedfall вот у нас этот Flow будет Вот мы у него иметь им эти значения и прокидываем через репозиторий модель но можно в принципе через кейс это еще дополнительно сделать допустим у нас много модульная архитектура то мы можем в модуле где у нас получается экран лежит можем как я называю контракты допустим получения информации [музыка] которую мы будем подписываться там это все обрабатываем потом уже подписываемся
01:00:50 - 01:02:16
список значений за весь час [музыка] приходит именно через лист целое значение [музыка] Но это будет Flow и там лист то есть когда нам сервера прилетает новое значение моего к листу приклеиваем и закидываем его во Flow и она доезжает даю в таком виде хорошо Это вариант Я предлагаю теперь задачу на базы данных скинул сейчас так я пошарил видно [музыка] Короче у нас есть база таблица в которую забиты измерения температур на разных планетах в разное время продолжает уже тематику на это уже совершенно другое
01:02:01 - 01:03:44
задание и нужно Здесь посчитать среднюю температуру по каждой планете там сейчас справа стоит игрушечный Запрос который просто выбирает хардкодом и внизу написано игрушечный ответ который максимально похож на тот который нужно получить как это сделать собрать среднее значение температур по планетам то что нужно все значения температур суммировать и потом разделить на их количество правильно или максимальный минимум делать этого руками Хотя конечно [музыка] будет работать это получается этот запрос нужно удалять
01:03:55 - 01:05:32
он если я не ошибаюсь есть нет значит я точно знаю есть имена Макс не ошибаемся есть он называется AVG когда нужно по планетам это сделать Да у каждой планеты нужно среднее собрать [музыка] Может быть но я не пользовался просто здесь он поможет [музыка] получается Ну вот вроде пока по каким планетам только да ну Да все круто именно так это и решается и теперь предлагаю переместиться к философским вопросам она я могу дать обратную связь по-прежнему включать Можно да тут все давай отдам обратную связь По этим
01:04:59 - 01:07:01
вопросам и уйдем уже в область вообще философии и дичи хорошо значит про коммиты я Неправильно сформулировал Поэтому ты в итоге правильно пикнул нужный коммент я хотел спросить как сумму изменений из нескольких коммитов забрать в один комит мастер ветки то есть имелся ввиду либо адрес несколько коммитов и сделать один коммент либо прямо в пол реквесе выбрать чтобы с репейсом сквашин rebase такая опция есть Ну я честно говоря вот не знал как это делать Просто ни разу еще не делал так должен признать что один вопрос я просто
01:07:55 - 01:09:45
скипнул это развернуть строку да Сейчас я покажу как это Кирилл Покажи пожалуйста это вот так это очень непросто непростая особенно вот в этом месте это это нам кажется что там Три символа там на самом деле такая каша Там же получается смайлик каким-то числом должен быть представлен наверное Смайлик Но вот этот представлен скорее всего как суррогатная пара как два Чара просто который друг без друга не могут а вот этот представлен как три отдельных смайлика каждый из которых суррогатная пара и которые между собой и скреплены
01:09:07 - 01:10:39
то есть там я вам говорю что там 5 поинтов и соответственно что-нибудь 6 8 чаров кто-нибудь будет интересоваться данным вопросом В общем это пропущенный вопрос Кирилл спрячь пожалуйста эту шару или А это я могу сам сделать круто а протестировать фонд Да тут у меня никаких вопросов нет потому что ну ты правильно сделал что проверил на переполнение туда переполнение обратно В общем так и надо я бы наверное взял под это дело параметризованные тесты чтобы проверить что там Intel + 1 + 2 Макс или плюс 3 и так далее куча
01:10:35 - 01:12:19
вариантов что они все там завершаются одинаковые Exception и все там максвелью плюс там минус один минус 2 и так далее они все корректные это все в одном тесте или просто много разных тестов это можно сделать тест с параметрами а параметры сгенерировать соседним методом случайными [музыка] Это только неудобно из-за того что могут периодически сваливаться удобнее сгенерировать вот самые угловые значения самому включая Макс и алюминиевая и вокруг них проверить все вот эти вот острые углы в одном случае твой ответ я засчитываю
01:11:51 - 01:13:24
а загрузить на сервер файлы с галереи а здесь сложность Ну в моей формулировке сложности имелось ввиду в том месте где чтение файла из контент-резойлера а потому что я не знаю насколько проматывание стрима и эффективно собственно Да я тут виноват я должен был посмотреть насколько это эффективно Мне кажется что сказать Я я кое-что вот не учел разу мы выходим получается в background то у нас вот рай который нам дали он будет действительно пока мы не перезагрузим устройство если мы вы хотели чтобы он всегда был предоставлен
01:12:45 - 01:14:11
там еще нужно было бы вызвать по моему специальные флаги в интенси когда мы открывали этот пикер допустим и потом еще После того как мы получили наш его рай мы должны были еще в конце метод вызвать чтобы ну грубо говоря получить этот забирать его не подумал сразу а я не подумал хорошо что ты его сказал потому что у меня весь вопрос был вокруг загрузки по частям Я думал как мы будем отматывать а если мы будем грузить несколько потоков так как нам как нам еще отматывать то есть мы сразу начинаем загружать и
01:13:29 - 01:15:04
уже отматываем вот и я бы предложил использовать [музыка] файл descriptor забрать оттуда и через файл импульс Stream получить файл Channel rema 5 буфер вот эта штука дала бы нам вообще сколько угодно гибкости она счет синхронизации времени первый наверное подвох можно сказать там заключается в том что когда к нам приходит ответ сервера он уже постарел то есть мы можем приблизительно прикинуть что вот у нас был момент отправки запроса был момент получения ответа и сервер нам этот ответ писал приблизительно между ними
01:14:19 - 01:16:00
соответственно наше вот это вот время между ними между запросами ответом примерно соответствовало времени которое прописано сервером в этом ответе и вот из этих двух ничего из этих двух отметок можно посчитать разницу во времени и дальше Ну либо вручную эту разницу накатывать либо с Java Time использовать Clock который подкручен на это время там уже как угодно Ну для меня это пока неизведана так сказать что там насчет по моему следующая было просто здание на приложение Значит мы можем открыть просто
01:15:25 - 01:16:58
но он наверное единственная единственная ограничения первое мы не знаем когда он оторвался поэтому допустим и во-вторых нас нету понятия фреймов кусочка данных который начался и закончился то есть Нам нужно допустим писать Перенос строки и флажить а проще всего нам вместо этого взять готовый протокол типа вебсокета или любых других перечисленных вакансий это называла grpc и Air Socket они все примерно одним и тем же занимаются то есть это полно дуплексный софтриал тайн [музыка] Ну а так-то все правильно сказал что
01:16:28 - 01:18:13
данные заберемся не знаю что сюда еще можно добавить среднего с группировка и Да все круто Тем более что ты говоришь никогда не использовал группа можем теперь Представь что нам нужно отобразить на планету со спутниками это проекции сейчас Даже картиночку покажу Ну вот Правдивая картинка Покажи пожалуйста Правдивая картинка выглядит вот так понятно что она очень скучная А вообще красивые картинки есть вот вот здесь кликабельная По отдельности короче вот допустим у нас есть вот эти все текстурки
01:17:35 - 01:19:29
Допустим мы можем эти тропы нарисовать и даже за счет а вопрос Как нам нарисовать планету и спутники на текущий момент будучи оффлайне В произвольной проекции то есть Вид допустим вот хоть так мы смотрим хоть там сбоку какого-нибудь или еще с какой-нибудь стороны 3D модели вот без привлечения 3D моделей с тем что вот эти вот дрова была готовая У нас есть то есть мы можем положить в центр допустим Юпитер там рядом положить его и остальные и сказать какой-то И у них будет Вот это поверхность повернута под нужным углом
01:19:32 - 01:21:22
то есть они сами это могут сделать уже там уже написал нам нужно только их разложить под нужными углами нужного поворота все сделать оффлайн но правильно На текущий момент оффлайн а типа поворот именно а планеты я понял ну нас по идее должен быть у этой планеты часовой пояс какой-то определенный если правильно понимаю допустим там 38 часов или там набрать два часа наверное длительность суток Да да часовых поясов у каждой планеты может быть много У нас стоят из суточного вращения Земли и она разделена Ну как бы можно ее
01:20:36 - 01:22:38
логически разделить на 24 соответственно часовых пояса но на практике и больше потому что кому-то удобно жить плюс 14 или минус 14 это не главное главное что у каждой планеты может быть столько поясов логических сколько часов у нее периоды обращения вокруг своей оси и часы у каждой планеты могут быть свои местные основной земле удобно 24 часа в сутках а там кому-нибудь на другой планете будет удобно другое количество часов и часы другой длительности по идее должно быть какое-то конкретное число сколько там допустим
01:21:58 - 01:23:25
сутки одни длятся И вот уже по этой То бишь у нас какая-то Начальная точка Рассчитать процент получается ну узнать вообще Какой сейчас час на этой планете по текущему времени получается опять же можно использовать это Юникс время какие сутки какие сутки да какой час текущих суток через Юникс время рассчитать это и потом вычислить процент грубо говоря Ну сколько суток уже прошло процентов и уже на количество процентов получается развернуть получается Если правильно понимаю угол разворота максимальный 360 градусов вот мы можем
01:22:48 - 01:24:23
60 градусов развернуть Да и вокруг неё еще летают спутники Ну спутника уже получается свой часовой пояс Ну количество суток часов в сутка у них у них своя длительность суток и есть еще периоды обращения если у нас картинка Планета центричная нам безразличен период обращения планеты вокруг Солнца но периоды обращения спутника вокруг планеты для нас будет играть роль Ну по идее там же оборот вокруг планеты он же тоже длится определенное количество времени вот допустим дней 12 и вот по такой же схеме получается мы можем
01:23:46 - 01:25:13
остаток от деления 12 сначала там узнать сколько количество часов вообще у нас во времени а потом узнать остаток отделения От количества часов случае 12 опять же посчитать процент сколько у нас прошло времени опять же количество градусов которую нужно в итоге Какие данные ты запросишь у менеджмента Если тебе дали дизайн дали текстурки планет нужно их показать со спутниками и с их текущим обращением и поворотом Ну я бы попросил бы информацию вообще количество часов в сутках получается не нужно и
01:24:42 - 01:26:20
количество спутников называется и тому подобное вообще полную информацию о планете что может пригодиться мне чтобы отрисовывать планета получается не нужно звание планеты количество часов в сутках этой планеты потом название всех информация на них там еще есть периоды обращения и есть поворот оси потому что у нас например на земле смена лета осени вызвано тем что вот осень вокруг которой мы крутимся на туда-обратно покачивается в течение года если там спутников есть покачивание силы они тоже будут
01:25:30 - 01:27:07
по-другому чуть поворачиваться будет вращение в другой плоскости туда-обратно или вращение Или покачивание это у каждого по своему может быть туда получается тут уже немного посложнее но если так вот навскидку взять нож же по-любому должно быть какая-то точка центра ее мы можем например взять как за 0 вот мы не хотим все Солнечной системы рисовать рисуем планету и спутники значит наш центр планеты вообще то бишь у нас допустим но в определенный момент у нас у нас вообще как бы этот сдвиг Вот получается планеты
01:26:45 - 01:28:08
он грубо говоря одинаковый шаг у него либо каждый раз мы разные может быть зависимости от времени А что задвиг Ну я имел ввиду что типа ну когда вращается оси там как солнце приближается То есть каждый день допустим он приближается на одинаковое расстояние либо на разные она мы будем считать что она одинаковая потому что оно все достаточно стабильное и меняется очень медленно как бы это рассчитывал наверное узнал В каком вообще сейчас стадии допустим вот Точки которые мы считаем 0 Ну допустим цикл этот цикле ноль мы находимся с этим
01:27:38 - 01:29:10
сдвигом мы находимся Ровно Круг тогда у него есть же Градусы наклона и от 0 до 300 60 Вот получается можем рассчитать и просто количество вот дней в цикле мы можем опять же по проценту узнать насколько градусов нам нужно повернуть ось правильно все поставку отделения У меня еще была записана задача спроектировать календарь для произвольной планеты но мне кажется мы только что это сделали вопрос как нарисовать планету но в итоге спроектировать календарь тоже пришлось календарь количество суток вообще там месяц какие-то же по идее
01:28:27 - 01:30:06
будут свои какие-то условная штука Их можно выкинуть Главное что есть год астрономические сутки астрономический год месяцы это деление условное кстати можно в Java Time подсмотреть там есть даже такая штука Как длительность месяца это усредненное Но в секундах прямо этом мире секундах это усредненная длительность какого-то среднестатистического месяца но опять же нам нужно взять какую-то точку старта Ну в данном случае для удобства Я бы взял все-таки начала компьютерной эпохи Но вообще может быть
01:29:41 - 01:31:04
от рождения Христа если бы это реально какое-то приложение было там уже пришлось бы конечно использовать нет такой информации Вот получается нужно будет информация о том Сколько в сутках Сколько в году времени короче и опять же какой у нас в данный момент но еще траектории углы то есть высота спутника над планетой либо над поверхностью либо между центрами и Под каким углом он вокруг нее летает потому что они же все летают не по одной орбите по разным да еще и не сталкиваются друг с другом она может на
01:30:31 - 01:32:00
высоте это все Нам тоже понадобится это получается еще высота должна быть какая-то нам неудобно думать в обычной в этой системе ширина высота глубина нам удобно принимать вот здесь в комнате которая прямоугольная такая но неудобно в космосе где у нас есть центр либо вокруг Солнца и дальше все находится на какой-то высоте там лучше представить такой луковичную систему координат Окта блин Ну получается Планета же ним находится по одной высоте правильно просто все равно высоту иду на Планета ходит по одной высоте вокруг Солнца
01:31:39 - 01:33:23
высота очень медленно растет Пока Пока все разлетается в сторону Но это настолько медленно что мы это не считаем тогда и получается можно считать как за константу мы просто определенную высоту и по ней будет ходить как я до этого рассказывал как спутник с определенной высотой Ну тогда у меня все я спросил все что хотел Спасибо тебе Но вот эту штуку последнюю мы обсуждали вместе нет такого что это я у тебя спрашиваю ты мне отвечаешь друг с другом как бы обратно мяч кидали можно так сказать а по всем остальным Я же
01:32:54 - 01:34:21
рассказал нас было синхронизация времени были реалтайм график поэтому всему я уже ответил результаты Я очень рекомендую Разобраться со строками потому что эта штука которая рано или поздно укусит вот а в остальном то главное что голова работает это круто Сейчас вроде нормально говорят что главное это что голова работает это круто ответ этот пытаешься до них додуматься и отвечаешь Так что в целом то я доволен то вещь прошел да или как Нет смысла отвечать прошел или не прошел потому что куда то есть у меня
01:33:51 - 01:35:44
у меня даже нет проекта который я буду нести ответственность прошел и в целом Я доволен многими ответами просто не мне [музыка] Но люди говорят что в Роскосмос ты бы прошел что-то сомневаюсь Да там кого там только не было настолько же Ну да я думаю тоже там вот Окей Так что вопросы вопросы Сейчас подождем чуть есть вариант закидать задачу на следующий Собес Ну вот следующий Собес будет следующий Эксперт он сам выберет как ему собеседовать Мы кстати уже готовим может тот кто предложил накидать задачи
01:35:26 - 01:37:03
и проведется без в любом случае Можете написать и все свои предложения все те кто писал по крайней мере получили ответ конструктор какого-нибудь следующего средства кто будет это Франкенштейна коды разврата строки хорошо тоже бы не мешало бы про этого а Можно позже думаю Миша просто потом в канал как как у вас там было на позапрошлом собесе соответственно Я всё это и закинул Ion проведет спрашивать Нужно ли он спрашивает Ну может наоборот сделать собрать вопросы начали думать что все нас всех заменят
01:36:52 - 01:38:32
Ну ладно тогда ладно так вопросов вроде никаких нет она потом ссылочку просто скинь а я ее в канальчике соответственно опубликую все То есть как было в прошлом собесом хорошо вот на этом принципе тогда и все Спасибо большое вам ребята Что показали провели Артем молодец большой вот как минимум Артем заслуживает ваших громких аплодисментов потому что человек действительно не побоялся пришел большой аудитории необычно необычный Собес был не растерялся провел дошел до конца как минимум он за это уже заслуживает
01:38:40 - 01:39:49
вашей похвалы вот дальше немножко анонса следующий Собес будет жена как вы просили вам нужно очень совместная жена и его проведут хороший Эксперт которая занимается этим регулярно Вот и будет интересно В общем ждите анонсов Android заходите подписывайтесь на этом все уже точно все всем хорошего вечера любого времени когда вы смотрите эту запись этого стрима и до новых встреч пока пока Всем пока до свидания
01:39:27 - 01:40:44