Русский
Русский
English
Статистика
Реклама

Лайфхаки для гиков

Анонс как я переехал в Лондон c Revolut

27.09.2020 20:23:04 | Автор: admin
Завтра, 28 сентября в наших соцсетях пройдет прямой эфир об IT-эмиграции с Revolut с Дмитрием Михайловичем
image

Дмитрий продуктовый разработчик, он решает продуктовые задачи в Revolut, являясь при этом Senior Backend разработчиком. Полтора года назад он переехал в лондонский офис и готов поделиться историей, как это происходило, как проходит карантин в UK, а также несколькими инсайдами о том, как устроен один из самых интересных финтех проектов.

Стрим можно будет посмотреть в любых наших соцсетях где удобно, там и смотрите.



Подробнее: о чем расскажет Дмитрий?


  • Как Дима уезжал в Лондон с помощью Revlout
  • Детские сады в UK: как комфортно переехать
  • Как проходил карантин для айтишников в UK
  • Кто такой продуктовый разработчик: почему ему все время приходится защищать эту специализацию
  • Почему он стал таким специалистом, что в этом интересного и кому это подходит
  • Технологический уровень российских банков выше чем в UK
  • Чем отличается emoney от банка и почему Revolut это emoney
  • Что такое safeguarding в банковском бизнесе
  • Его задачи прямо сейчас: как я делаю safeguarding надежнее
  • Почему Дима в Революте: задачи, которые его привлекают
  • Работа в револют: какие ценности есть у компании и на что обращают внимание на собеседовании
  • Как и зачем он делал систему управления платежами в Revolut для бизнеса
  • Почему финансовый отдел в банкинге самое эффективное место, что вырасти продуктовому разработчику

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



Куда жать, чтобы не пропустить эфир?


Жмите на колокольчик на ютубе или подписывайтесь на наш инстаграм, тогда вам придет уведомление о начале эфира.



Еще раз напоминаем дату и время: понедельник, 28 сентября, 20:00.

До встречи в эфире!

Подробнее..

Как я переехал в Лондон c Revolut

04.10.2020 12:19:00 | Автор: admin
Неделю назад в наших соцсетях выступал Дмитрий Михайлович. Дмитрий продуктовый разработчик, он решает продуктовые задачи в Revolut, являясь при этом Senior Backend разработчиком. Полтора года назад он переехал в лондонский офис и поделился с нами историей, как это происходило, как проходит карантин в UK, а также несколькими инсайдами о том, как устроен один из самых интересных финтех проектов.

Делимся с вами расшифровкой и записью интервью



Меня зовут Дмитрий Михайлович, я работаю в Revolut. Формально backend software engineer, неформально я расскажу далее. Буду рассказывать немного про свою историю переезда, про Revolut, в целом про то, что такое банки, EMI, свою историю открытия банковских счетов в Лондоне, про то, что мне в Revolut нравится, и немного слов про продуктовую разработку что это такое, и почему я хочу отдельно обратить на это внимание.

Я к Revolut присоединился в 2018 году. Как раз мне исполнилось 28 лет, и в первую неделю июня я пришел в Revolut. Хотел завершить предыдущую работу символично. Процесс собеседования происходил довольно забавно; про Revolut я слышал несколько раз: я состою в физтеховских группах, и Revolut также светился на Хабре. Я пошел на JPoint конференцию Java-разработчиков и увидел стенд Revolut. Название было примелькавшееся, и я подошел поболтать. На стенде оказались ребята с физтеха. Мы разговорились, оставили друг другу контакты.

После JPoint у меня был отпуск. Как это ни смешно, я поехал в первый раз в Лондон; было интересно, да и знакомые тут жили. Суббота JPoint, а в понедельник я прилетел в Лондон, доехал до апартаментов и подключил ноут. Первое сообщение от Богдана человека со стенда Revolut было: Дима, ты хочешь релоцироваться в Лондон? По мне, это получилась забавная и символичная история; я посмеялся, у меня не было мгновенного ответа, но я задумался. Потом я начал собеседоваться в Revolut; на собеседованиях говорил, что скорее хочу в Москву, но Лондон тоже интересно. Устроился в Москву. Но по мере того, как я начал работать, ко мне пришло осознание: хотя много разработки происходит в Москве, HQ находится в Лондоне, и, если я хочу чего-то добиться в рамках этой компании, нужно переехать ближе к основному движу. Я посчитал, что это важно, и уже на испытательном сроке (он тут 3 месяца) был в командировке в Лондон, общался здесь и говорил, что хочу переехать. Мне ответили: ты вроде парень нормальный, давай переезжай, будешь здесь код писать. Тогда получать аппрув на переезд было просто; я пообщался с CTO, он дал одобрение.

Если аппрув получался легко, то процесс переезда у Revolut тогда еще не был отработан. От момента, как я получил аппрув, до переезда прошло около полугода переехал я в начале марта, а аппрув получал в августе. Процесс был долгим с двух сторон; Revolut был стартапом, процессы отрабатывались, и я сам тормозил: а нужно ли мне оно. Я был не уверен. После того, как я получил оффер (я еще скажу про него), я еще долго сомневался. Тогда меня еще на Хабре спросили как я оцениваю оффер, зарплаты. Я сомневался конкретно из-за своей истории: я родился в Московской области, учился там же (в Долгопрудном), никогда не жил дальше 30 км от родителей и раз в 1-2 недели приезжал в гости. То, что нормальные мальчики и девочки делают в 16-18 лет, мне надо было сделать в 28. Плюс, оффер в Лондон: я пообщался с несколькими товарищами, и они говорили, что Лондон дорогой город. За полтора года жизни здесь это мнение у меня не изменилось. Мне тогда дали грубую оценку: для того же уровня комфорта, что и в Москве, нужно получать на руки примерно в 2 раза большую зарплату. А в оффере столько не было.

Я на это смотрел; у меня двухлетний (на тот момент) сын и жена, и уровень жизни придется терять. Я засомневался вроде бы в Москве хорошо. Но я подумал, что вернуться всегда успею; в крайнем случае, получится приключение. И я поехал.
Когда меня спрашивают о том, что было сложного при переезде в Лондон, я отвечаю: самое сложное договориться с собой. Я хорошо помню этот момент; на каждом этапе переезда было много сомнений, страхов, непоняток. Но я вышел из визового центра на Курской с тремя паспортами (мой, жены и ребенка) со штампиками и понял: можно ехать. Это была очень сильная эмоция, она у меня до сих пор ощущается.

Это было в феврале; дальше началась волокита. Надо было понять, куда конкретно переезжать, что будет на момент переезда. Revolut покупал билеты всей семье, покупал дополнительный багаж. Я договорился, что мне оплатят отправку одной коробки почтой очень не хотелось везти коляску и еще пару дополнительных багажей. Revolut потом оплачивал Airbnb на первый месяц. Когда мы выбирал район в Лондоне, когда еще были в Москве, мы почему-то остановились на Стратфорде это северо-восток. На самом деле, оказалось смешно: пока мы шли от метро, наткнулись на два восточноевропейских магазина и одну вывеску БУХГАЛТЕР. В ближайшем к нам магазине продавщица разговаривала по-русски, даже бомжи около станции орали по-русски. Как будто из Москвы и не уезжал.

После того, как мы пожили месяц в Airbnb (в течение которого мы выбирали постоянное место), мы переехали на другой край Лондона юго-восток, район Бекенхем, один из лучших зеленых семейных районов. Отдельно хочу подчеркнуть то, чем он меня подкупил. Есть такая красивая фраза мальчика из Королёва можно вывести, но Королев из мальчика нельзя (в оригинале было про девочку, но неважно). Я не москвич, я подмоскович; я учился в школе в Королёве, я каждый день добирался на работу за час на электричке и на метро, и мне казалось это нормальным. И сейчас тоже все тоже нормально и приемлемо. Я не стремился оказаться в пешей доступности от работы; для меня было важнее то, где будет гулять ребенок, насколько хорошие парки (в перспективе детские сады и школы) будут доступны. Нужно было иметь в доступности большую площадь. Поэтому мы выбрали этот район; до работы я добираюсь за 40-50 минут. Он очень зеленый, что очень круто. Вообще, Лондон очень каменный город; питерцы ржут, но мне, когда я был в командировке и жил близко к офису, было трудной найти нормальное место для бега. Приходилось бегать по камню. Но здесь очень зелено, везде парки, даже тротуары отделены зеленой полосой от проезжей части я знаю, что есть такие же крутые районы на севере, но я оказался на юге.

Про детский сад хотел рассказать отдельно. В Великобритании школы бесплатные это правда; начинаются с 4 лет, действительно бесплатные. До этого садик. Детский сад до 3 лет не оплачивает никто; немного не так: если оба родителя работают, и оба граждане Великобритании или ЕС, то дается 15 бесплатных часов в неделю. В нашем случае (три российских паспорта) до 3 лет ничего не оплачивается, и в районе Canary Wharf, где находится офис, садик может стоить 1700 фунтов. Это 170000 рублей в месяц, это дохрена. А в том районе, где живем мы, будет 1200-1300-1400 в месяц до 3 лет; все равно большие цены особенно учитывая то, что работаю только я. Сыну уже исполнилось 3 года этим летом, и мы смогли получить 15 бесплатных часов. Я не уверен, как это градуируется, но цена после 3 лет снижается. Цена теперь порядка 1000 фунтов все еще много, хотя не настолько.

Еще один важный момент для тех, кто с семьей. Моя жена не технарь; она закончила хороший лингвистический ВУЗ, у нее шикарный английский язык, которого у меня нет, но это не помогает ей найти работу по специальности. Это частный кейс, но Маша после декрета в России не работала, и здесь на её резюме смотрели косо: человек после ВУЗа немножко поработал и два года не работал, что такое? Очень мало кто здесь рожает до 30 лет, это в какой-то степени связано с ценами на детский сад. Рожают сразу очередями: например, троих детей в 35-37-39 лет. Это мы наблюдаем у местных; то есть, никто не спешит это сделать раньше. Поэтому резюме моей жены выглядит странно по местным меркам. Но все разрешилось довольно интересно: Мария сейчас заканчивает магистратуру в местном университете и начинает поиск работы по новой.

Касаемо зарплаты: как я уже сказал, в 2 раза больше мне не предложили. Благо, спустя несколько месяцев после переезда Revolut сделал мощную переиндексацию зарплат в Лондоне; в два раза больше все равно не стало, но наступил относительный порядок. Важно понимать, что в моем любимом городе Королеве я не снимал квартиру; была старая родительская квартира, в которой нам было комфортно. Но здесь жилье это большая статья расходов. Если в Москве мне хватало на то, чтоб хорошо жить, содержать машину и оплачивать няню, то здесь такого финансового спокойствия нет.

Конечно, в связи с этим встает вопрос: чего я, в таком случае, забыл в Лондоне. Собственно, я в Лондоне потому, что он мне любопытен. Я 28 лет прожил в Московской области, и ничего другого не видел. Я хочу посмотреть на этот город ещё; вернуться я всегда успею.
Кстати, мои контакты останутся на Хабре. Можно задавать вопросы.

Насчет банков. Когда я в первый раз, на JPoint, общался про Revolut, мне говорили: крутой финтех, все топово, статьи. Про статьи мы еще поговорим, но тогда я спросил: а что именно крутого? Есть уже Рокетбанк, Тинькофф, другие ну, получается еще один модный банк. Я тогда еще не понимал некоторых европейских особенностей; понял только тогда, когда переехал.

Q: переезжал ли всей семьей сразу?


Всей семьей сразу. Мы подумали, что, если я поеду один и что-то буду там искать, это будет сложнее. Плюс, я очень рад, что мы переехали вместе, потому что у жены английский гораздо лучше моего; общаться с разными state agents после переезда это очень болезненное дело, я и сейчас их не всегда понимаю по телефону. Очень благодарен своей жене за то, что эту часть она взяла на себя.

Q: ощущалось ли отношение к мигрантам со стороны местных, были ли какие-то сложности?


Никаких. Вообще, я в Лондоне самих британцев вижу довольно редко. Лендлорды, естественно, британцы, но приехавших очень много. Все относятся спокойно.

Возвращаюсь к банкам. Когда я приехал в Лондон и окончательно подписал здесь бумажки, то понял (что логично), что нужно получить местный банковский счет для зарплаты. Дальше началась достаточно интересная история. Когда приходишь в банк, они говорят: нужен не просто адрес проживания, а proof of address. Обычно это какой-нибудь utility bill счет за воду, или council tax, или другой документ, в котором написано твое имя, фамилия и адрес проживания. Договор аренды тоже годится. Понятно, что в первый месяц я жил в Airbnb, и такого подтверждения не было. Получается, что, чтобы куда-то заселиться, надо настроить direct debit с банковского счета: то есть, чтобы заселиться, нужен счет, но для того, чтобы сделать счет, нужно заселиться! Об этом все говорят вначале, почему-то; хотя, если копнуть поглубже, есть еще контракт с работодателем то есть, в банк можно предоставить бумагу от работодателя о том, что ты трудоустроен как permanent employee (должны быть фамилия, имя, слово permanent и адрес), то такая бумага их устроит, и можно будет открыть счет.

У меня в России были счета в большом количестве банков около 6 (что интересно, Рокетбанка среди них не было). Здесь моей первой мыслью было то, что следует открыть модный финтех, и это должен быть не только Revolut; а ещё открыть счет в каком-нибудь старом, всем известном, надежном банке (вроде Сбера). На тот момент основными, шумными конкурентами Revolut были Monzo и N26; соответственно, в первые пару дней я скачал их приложения и начал оформление. Что характерно, предоставление proof of address у них происходит проще все делается в мобильном приложении. Для Monzo процесс занял минут 15; анкета, фото, фото с паспортом. Через еще минут 15 пришло оповещение о прохождении верификации личности и одобрении предоставления услуг. С N26 было чуть сложнее. Анкета была менее удобна и заполнялась дольше, оповещение пришло на следующий день. Про Revolut по понятным причинам не буду говорить (но в целом, там как у Monzo).

Параллельно с этими нео-банками я пошел в Barclays один из крупных старых банков. Отделение нашлось недалеко от работы. Я пришел и сказал о том, что хочу открыть счет; у меня сразу спросили нужные документы, включая PoA. А потом сказали: теперь надо записаться на appointment, в той очереди. Очередь была небольшая, но я сначала не понял, что за appointment. Мне сказали, что все первоначальные документы у меня в норме; а потом оказалось, что ближайший appointment в этом отделении банка через три недели, но вы можете попытать удачи в других отделениях. Это при том, что appointment это даже еще не открытие счета; придя на appointment в их офис, вы заполняете анкету, а потом они делают проверку ту же самую, вроде бы, которую в Monzo сделали за 20 минут (и в N26 за день). И только после этого еще через неделю или две можно будет, наконец, открыть счет. А если хочется чуть побыстрее, то придется побегать по всему Лондону в поисках отделения, в котором очереди нет, чтобы получить appointment не через три недели. Правда, нашелся товарищ, который помог мне это сделать. Но после этой истории я понял, что Сбербанк, Альфа и даже ненавистный ВТБ это просто верх удобства и инженерной мысли.

На момент appointment мне уже пришла карточка Monzo он считается нормальным банком; тогда у Revolut еще не было лицензии в Великобритании. Я подумал: раз уже есть Monzo, не буду торопиться с Barclays открою счет через несколько месяцев. И не стал ездить на другой конец Лондона за карточкой Barclays. Через несколько месяцев я попробовал получить карточку Barclays снова; дату appointment назначили через две недели. Хорошо. Я пришел через две недели и забыл загранпаспорт (при себе оказался только residents permit). Но я все равно постоял в очереди 40 минут несмотря на то, что пришел точно по назначению с тем, чтобы услышать: извини, без загранпаспорта нельзя. Дальше мне сказали, что я могу прийти с паспортом на следующий день и пройти без очереди. Я пришел; процесс заполнения анкеты растянулся минут на 40, после чего мне сказали: все замечательно, карточка придет через 2 недели. Я подождал месяц карточка не пришла. Пошел в то же отделение Barclays, спросил, что происходит меня отправили в очередную очередь. Я подождал 10 минут; человек сказал мне, что вроде бы все, что нужно, было заполнено, что он видит то, что карточка мне не пришла, и что теперь мне надо идти и спрашивать другого человека, который освободиться через 20 минут. Через 20 минут мне сказали, что тот человек будет занят еще полчаса. После этого я решил, что счет в Barclays мне не очень-то и нужен.

Эта история открыла мне глаза на причину того, почему всякие стартапы вроде Monza, Starling Bank, N26, Revolut, Vivid Money (который поехал из России в Германию) не просто имеют право на жизнь у самой жизни есть желание, чтобы они росли и развивались.
Счет в N26 я недоверифицировал дизайн карточки у них мне не понравился. Я себе открыл American Express; если честно, это самая используемая мною карточка. Они сейчас и платежная система, и банк, и у них самые большие бонусы. Мне нравится их кобрендинговая программа с British Airways; товарищ мне показал, что с ее помощью можно дешево покупать билеты Москва-Лондон. Я пока не пробовал пандемия как-то не способствует трате баллов. Я еще открыл счет в HSBC: они работали гораздо лучше, чем Barclays. Проволочки, конечно, тоже были они сильно тормозили с верификацией личности. Но я уже выучил к тому моменту правило: когда большая компания тупит пиши в твиттер. Я написал: HSBC, я понял, почему у Revolut так много клиентов вы месяц не можете провести верификацию. На следующий день произошло чудо: мне позвонили и сказали, что можно получать карточку. Люблю твиттер.

Про банковскую лицензию. Есть такое мнение: нельзя хранить деньги в Revolut, потому что это как бы не банк, и в случае чего они могут оказаться утеряны. Я не буду рассматривать все аспекты, но здесь есть свой вариант российского АСВ (Агентства по страхованию вкладов, которое страхует все вклады до 1.4 млн. руб.). Здесь страхуются все вклады до 85 тысяч фунтов это примерно 8.5 миллионов рублей. В этом плане все вклады в банках сохраняются. Есть законодательство я могу дать ссылку на статью на gov.uk касаемо e-money; оно гласит, что любое electronic money institution обязано сохранять ваши деньги. Кстати, я технически-продуктово работаю как раз рядом с этим проектом. По факту, все деньги (e-money), которые вы видите на своем счету Revolut, содержатся на счетах в банках. Есть специальные распоряжения, есть риск-модели; средства у Revolut распределяются по разным счетам в крупных и надежных банках. На случай, если что-то глобальное случится, все защищено. Это не отменяет других факторов и личного мнения, но проблемы со страхованием вкладов в принципе нет.

Собственно, вот история того, почему я люблю Revolut как продукт (и подобные ему продукты) и считаю, что это крутая история.
Немного больше про сам Revolut и о том, почему именно Revolut. Мне очень нравится одна история, связанная с ним одна ценность, которая у нас не прописана открыто в списке ценностей. Я даже не уверен, считает ли senior management это нашей ценностью, но для меня Revolut открывает границы. Это первое позиционирование Revolut, и это моя личная история: я себе открыл границу в другую страну с помощью этой компании. Когда в декабре 2018 года в Сочи был Финополис, и там была сессия с зампред ЦБ Скоробогатовой, и с Тиньковым, и с Верхошинским из Альфа-банка то есть, с большими людьми из разных банков Revolut говорил, что мы хотим запускаться в России. И на этой сессии также присутствовал наш CEO/основатель Николай Сторонский. Эпатажный Олег Тиньков заявил, что Revolut в России уже не нужен его банк запустил 30 валют с хорошими rates. Они у них действительно были крутые, в каких-то местах лучше наших (например, пара фунт/рубль). Это было круто, конечно. Но после этого, сколько мы ни проверяли, у Revolut всегда были лучшие рейты. Поэтому значение нашей карточки как карты путешественника, то, что мы предлагаем вам тратить деньги в любой валюте без скрытых комиссий и с минимальными spreads при тратах это про Revolut. И это очень круто это одна из тех ценностей, которые важны для меня.
Второй момент это то, что Revolut закрепляет курс на момент авторизации. Те, кто чуть лучше осведомлены про карточные транзакции, знают, что, когда вы осуществляете платеж, он проходит в два этапа: первый авторизация (когда вы прикладываете карту), второй когда уже банки между собой общаются, перекидывают сообщения и приходит presentment. Некоторые банки я не уверен, какие именно, но я это наблюдал делают так, что, когда вы прикладываете карту в другой валюте, вам указывается сумма с одним курсом списания, а потом, в фоновом режиме, трата происходит с другим курсом. Revolut так не делает: курс перевода всегда закрепляется на момент авторизации. Сколько вы увидели в сообщении, столько и спишется.

Открытие границ для сотрудников это не только моя личная история. Несколько раз, неофициально, я слышал такую мечту среди сотрудников Revolut: надо открыть сеть офисов по всей Европе, чтобы можно было приезжать и работать где угодно, откуда угодно. Это и простые командировки: чтобы сотрудники из Москвы и сотрудники из Лондона могли спокойно ехать в командировку в другой город, если это оправдано; это и простота работы из дома. Это круто, это очень важно, и меня это сильно цепляет. Правда, здесь есть и побочные эффекты; полтора года назад я был в команде из пяти человек это была отличная команда. Все находились в разных городах: в Москве, Питере, Кракове, Лондоне, Нью-Йорке. Сейчас у меня в команде есть один человек из Торонто и иногда бывает очень неудобно; особенно, если он задеплоит что-нибудь в свой вечер, в а лондонское утро он спит. С другой стороны, свобода перемещения и открытость помогла во время эпидемии: когда надо было пойти и сесть работать дома, все просто так и сделали. Сейчас офис превращается во внутренний коворкинг: надо работать из дома вы работаете из дома; надо пойти в офис вы в специальном приложении говорите, что будете в офисе, буду сидеть за конкретным столом. Это также часть отслеживания эпидемии. Сейчас, правда, в Великобритании новое распоряжения правительства, и всем опять рекомендовано сидеть дома но это уже не влияет на наш процесс принципиально.

Я считаю, что с командой важно встречаться лично, конечно. Хотя моя команда разбита по трем городам Москва, Лондон и Торонто и большую часть работы, до 80-90%, можно просто делать удаленно, и для этого не обязательно встречаться лично. Но налаживать контакты, проводить тимбилдинг очень важно.
Параллельно с этим важно настраивать рабочий контекст. Здесь у всех по-разному; моя история в том, что, когда мы только переехали, мы снимали квартиру поменьше, и единственным столом в ней был обеденный стол. Я за обеденным столом очень не люблю работать. Сейчас мы переехали в Терест-хаус: он чуть побольше, чуть подороже и дальше от центра зато сейчас я сижу в комнате 1.70*2.5 метра, и тут четко помещается нормальное рабочее место. Мы переехали после окончания первого локдауна; я очень рад, что теперь в доме есть специальное место для работы из дома.

Q: знаю, что в Сбере очень много программистов; какой штат в Revolut?


Я не знаю точных цифр; знаю, что всего сотрудников в Revolut точно больше 1000, если не больше 2000. Разработчиков конкретно, основных бэкендеров порядка 100-200, наверно. На разработку ставится большой акцент. Еще одна основная ценность Revolut (которая мне также важна): все, что можно автоматизировать, нужно автоматизировать. Людской труд должен минимизироваться (хотя это не мешает разработчикам иногда писать круды), поэтому на разработчиков ставится очень значительный акцент. Но точных цифр я не знаю.
() Да, бэкендеров в районе 200 человек, а всего разработчиков около 400-500.

Вернусь к работе из дома и карантину. Возникает вопрос: если так удобно работать из дома, или просто издалека, то зачем вообще перевозить людей в Лондон? Я не знаю всей мотивации Revolut; могу повторить, что личный контакт важен, и от этой идеи никто не отказывается. Когда люди делают бизнес, непосредственно следят за продуктом, когда можно подойти к соседнему столу и что-то уточнить это важно. Это было важной частью моей мотивации к переезду в Лондон, и она сохраняется. При этом Revolut взрослеет; какие-то процессы все еще остаются на коленке, но какие-то закрепляются. Процесс релокации усложнился; теперь с полуслова CTO она может и не получиться. Мы постепенно перестаем быть стартапом и становимся большой серьезной компанией.

Q: про культуру Revolut пишут много плохого.


Я не буду комментировать кучу статей, которые пишутся, но хочу отметить два важных пункта. Во-первых, жалуются в принципе одни и те же люди. Пока я учился в школе, ВУЗе, жаловались на то, как все сложно, одни и те же люди. Мне было нормально как в школе с углубленным изучением английского, так и в научно-инженерном лицее, так и на физтехе (безусловно, это крутой ВУЗ, но сложность учебы все равно вопрос отношения, хотя я и не был очень крутым студентом). То же и с Revolut. Жалуются один и те же люди. Те, кто пришел в Revolut и жалуется на плохую культуру, будут жаловаться и за пределами Revolut.
Второй вопрос про личные границы и личные истории. Когда я собеседовался, я задавал вопрос про work-life balance. И мне ответили очень важной фразой: если ты не хочешь перерабатывать, то тебя никто не заставит. В мои 2.5 года работы здесь это только подтверждалось. Здесь работают люди, которые повзрослели и знают, что у них есть личные границы. Например, у меня есть ребенок и семья, и я в 17.30 встаю из-за стола и иду забирать ребенка из сада: это моя граница, и никто не заставляет меня ее переходить. Конечно, кто-то перерабатывает и работает по 12 часов в день, включая выходные; я думаю, это их собственный выбор или у них слишком продавленные границы, и их легко склонить к переработке.
Вопросы переработки и work-life balance они не столько про Revolut, сколько про личные границы. Revolut не самая агрессивная среда, в которой я работал, но достаточно агрессивная; если вы будете прогибаться возможно, будете перерабатывать.

Я хотел упомянуть тему продуктовой разработки. У меня не уникальная, хотя и интересная ситуация; я формально инженер, моя должность на бумаге числится как backend software engineer. Во внутренних системах я числюсь как product owner, хотя сам себя я считаю скорее product developer не в плане написания кода, а в плане того, что я развиваю продукт, и мне интересно не строить. Мне очень нравится фраза, которую говорил Саша Морозов мой начальник с предыдущего места: Есть программисты, а есть разработчики. То есть, программисты это те, кто пишет код, в разработчики предлагают решения. Я благодарен Саше за очень большое количество мудростей, в том числе за эту, и я полностью согласен с этим утверждением. Крутое решение по разработке иногда приходит без единой строчки кода. Google Spreadsheet позволил не написать огромное количество кода.
В этом моя позиция. Я сам имею опыт в Java; кто-то спрашивает, как я пришел в Java: я изначально в школе занимался ею, в том числе на олимпиадах. У меня были дипломы по программированию и алгоритмам, математике и физике. Я просто перевел хобби в работу. Программирование мне интересно с точки зрения решения задач: это очень крутая автоматизация, это очень крутая история. Само по себе написание кода, масштабирование, Kafka, Postgres, шардирование я верю, что это все круто, но я туда не полезу, пока не столкнусь с бизнес-задачей, которую решает та же Kafka. Этот подход характеризует меня, и не только меня; некая тенденция выделения продуктовых разработчиков есть в отрасли, и она важна. Это не будущее; это просто выделенная область.

Q: пытаюсь сейчас в программирование, но гуманитарий. Тяжеловато идет по книгам.


Я не верю в гуманитариев и технарей. Хотите в чем-то разобраться берете и разбираетесь. А если интересно гуманитарно читать книги и учить языки берете и учите. Просто делайте то, к чему стремитесь.
Я сам принял такое решение потому, что запланировал семью, и в Москве зарабатывать программированием было проще, чем в любимой мною отрасли образования.



Что было ранее


  1. Илона Папава, Senior Software Engineer в Facebook как попасть на стажировку, получить оффер и все о работе в компании
  2. Борис Янгель, ML-инженер Яндекса как не пополнить ряды стремных специалистов, если ты Data Scientist
  3. Александр Калошин, СEO LastBackend как запустить стартап, выйти на рынок Китая и получить 15 млн инвестиций.
  4. Наталья Теплухина, Vue.js core team member, GoogleDevExpret как пройти собеседование в GitLab, попасть в команду разработчиков Vue и стать Staff-engineer.
  5. Ашот Оганесян, основатель и технический директор компании DeviceLock кто ворует и зарабатывает на ваших персональных данных.
  6. Сания Галимова, маркетолог RUVDS как жить и работать с психиатрическим диагнозом. Часть 1. Часть 2.
  7. Илья Кашлаков, руководитель фронтенд-отдела Яндекс.Денег как стать тимлидом фронтендеров и как жить после этого.
  8. Влада Рау, Senior Digital Analyst в McKinsey Digital Labs как попасть на стажировку в Google, уйти в консалтинг и переехать в Лондон.
  9. Ричард Левелорд Грей, создатель игр Duke Nukem 3D, SiN, Blood про личную жизнь, любимые игры и о Москве.
  10. Вячеслав Дреер, гейм-дизайнер и продюсер игр с 12-летним стажем про игры, их жизненный цикл и монетизацию
  11. Андрей, технический директор GameAcademy как видеоигры помогают прокачивать реальные навыки и найти работу мечты.
  12. Александр Высоцкий, ведущий PHP-разработчик Badoo как создаются Highload проекты на PHP в Badoo.
  13. Андрей Евсюков, заместитель CTO в Delivery Club про найм 50 синьоров за 43 дня и о том, как оптимизировать фреймворк найма
  14. Джон Ромеро, создатель игр Doom, Quake и Wolfenstein 3D байки о том, как создавался DOOM
  15. Паша Жовнер, создатель тамагочи для хакеров Flipper Zero о своем проекте и другой деятельности
  16. Татьяна Ландо, лингвист-аналитик в Google как научить Google-ассистента человеческому поведению
  17. Путь от джуна до исполнительного директора в Сбербанке. Интервью с Алексеем Левановым
  18. Как Data Science продает вам рекламу? Интервью с инженером Unity



Подробнее..

Анонс зачем программистам психотерапия и как устроен алгоритм подбора идеального терапевта

14.10.2020 12:12:47 | Автор: admin


СЕГОДНЯ, 14 октября, в 20:00 в наших соцсетях выступит главный евангелист mental health в нашей IT-тусовке создатель языка Kotlin и основатель стартапа Alter Андрей Бреслав.



Учитывая, какой большой отклик мы получили от Хабра во время нашего последнего разговора о ментальном здоровье, мы решили раскрыть тему с практической стороны. Андрей расскажет о том, зачем программистам нужна психотерапия, как найти своего терапевта и как создавался сервис.

Кроме того, он ответит на ваши вопросы: вы можете задать любой вопрос о ментальном здоровье, психотерапии и работе в IT-командах анонимно через эту форму или нажав на кнопку.



О чем расскажет Андрей, кроме ответов на вопросы


  • Как ты пришел к идее сервиса? Почему из огромного беклога задач ты решил делать именно Alter?
  • Что такое супервизия?
  • Главные объективные параметры, по которым надо подбирать психотерапевта, которому можно доверять? (образование, личная терапия, супервизия)
  • Что значит безопасная психотерапия? Может ли психотерапевт навредить? Как?
  • Тревожные звоночки во время сеанса: как понять, что вы попали к вредителю?
  • Как писалась платформа для Alter, какие сейчас есть важные задачи по улучшению
  • Нужна ли психотерапия здоровым людям? В каких случаях?
  • Рядовому программисту желательно ходить на психотерапию? Может ли это как-то помочь в работе? А тимлиду?
  • Как вы проверяете психотерапевтов на пригодность и на безопасность?
  • Вы создали тест на качество психотерапевта совместно с Психологическим институтом РАО. Как это происходило? Как вы поняли, что тест достаточно хорош?
  • Как работает алгоритм самого Alter?
  • Есть ли недовольные клиенты? Что им обычно не нравится?
  • Как вы привлекаете психотерапевтов? Не сказывется ли на качестве специалистов то, что все сильные профессионалы и так загружены заказами и маркетплесы нужны в основном новичкам, которые еще не смогли или так и не смогли наработать свою базу клиентов?
  • Как понять, что тебе не подходит? Школа или сам психотерапевт?
  • Как вам удается соперничать с главным конкурентом сарафанным радио?
  • Есть ли у вас открытые вакансии в Alter?


Как не пропустить эфир?



Выбирайте платформу, которая вам нравится



Нажмите кнопку Напомнить. Так как ютуб самая популярная платформа среди наших эфиров, вставляем трансляцию.



До встречи в эфире!

Подробнее..

Зачем программистам психотерапия и как устроен алгоритм подбора идеального терапевта

24.10.2020 12:06:33 | Автор: admin
Четырнадцатого октября прошёл прямой эфир с главным евангелистом mental health в нашей IT-тусовке создатель языка Kotlin и основатель стартапа Alter Андреем Бреславом.
Делимся с вами расшифровкой и записью интервью



Привет, я Андрей Бреслав, очень рад всех видеть виртуально.

Андрей один из родителей языка Котлин. Кроме того, Андрей активно занимается просветительской деятельностью. Я бы его назвала евангелистом ментального здоровья. Андрей много про это рассказывает в личных разговорах, и это было крайне полезно лично для меня, я ему очень благодарна. Он создал сервис Альтер для поиска подходящего психотерапевта, поэтому мы попросили его сегодня рассказать про психотерапию: насколько это нужно в целом, и программистам в частности. Также Андрей расскажет про то, как работает сервис, и ответит на вопросы.
Я предлагаю для начала рассмотреть анонимные вопросы с Хабра.



Q: профилактика и предупреждение таблетками Пирацетам, Семакс стоит это делать?


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

Q: как найти работу, которая тебе интересна, когда у тебя есть СДВГ недостаток планирования, наркоманская зависимость от новизны, потребность большей, интенсивной новизны? Над поисками себя я уже нервно смеюсь, потому что знаю себя любимого вдоль и поперек. Перепробовала многое, сливаюсь с проектов через полгода ввиду смертельной скуки и потери смысла.


Очень сложный вопрос. Сложно отвечать лично тому, кто его задавал, потому что я не знаю обстоятельств. Многое зависит от того, диагностирован ли действительно СДВГ или это просто ощущение; наблюдается ли человек у психиатра, постоянное это состояние или нет; что пробовали, кроме поиска себя. В принципе, понятно, что СДВГ это серьезное отличие от эквилибриума, у человека могут быть сложности с вниманием, сложно удерживать внимание на одном и том же долго. Этим можно управлять: я знаю людей с СДВГ, которые успешно делают долгие проекты и справляются. Психотерапия может помочь, как минимум, как тренировка управления своим состоянием. В некоторых случаях может помочь медикаментозная поддержка, но я не уверен насчет постоянно поддержки знаю только о ситуативных таблетках, которые психиатр может назначить. Случаев из России я не знаю, поэтому не могу сказать, что именно может назначить российский психиатр.

В любом случае, можно адаптироваться другими способами, и психотерапия может помочь найти эти способы. Если проекты больше полугода невозможны можно работать в тех сферах, где проекты короче полугода, получать результаты и быть довольными собой. Есть много способов адаптации. Я не слышал, чтобы СДВГ можно было вылечить, поэтому адаптация так или иначе необходима. В этом помогает психотерапия способ подобрать себе занятие и, возможно, медикаментозная терапия, но тут я не специалист.

А что это за проекты, которые можно сделать за полгода? Мне тоже трудно заканчивать вещи, и я часто бросаю на полпути, и для меня единственный выход ломать себя об колено и продолжать работать в выбранном направлении.


Совершенно определенно, что у людей, которые занимаются разного рода фрилансом, многие проекты недлинные. Если человек занимался бы фрилансом и вел длинные проекты, то он вел бы 2-3 проекта большую часть жизни. Так не происходит, проекты намного короче. Еще в разного рода агентствах бывает много коротких проектов. Это зависит от специальности; даже если человек программист, у него в разных сферах может быть разная специфика. Во всяком аутсорсе можно переходить с проекта на проект, и, если научиться быстро адаптироваться это будет суперспособность. Особенно, если достаточно смелости и задора для пробивания стен например, если есть сложная область, в которой либо очень запущенная сфера, либо все боятся подступиться к новому и неизвестному. Это бывает отличное место для того, чтобы сдвинуть поезд с места, полгода поработать, передать и идти дальше. Можно быть невероятно ценным человеком, который умеет все стартовать. Очень крутая функция. Такие люди нужны.

Q: расскажите про Альтер, про сервис, про то, как появилась идея сервиса; почему выбрали именно Альтер из бэклога идей?


Что такое Альтер? Это сервис, который осуществляет навигацию в мире психотерапии. Мы вкладываем много сил и внимания в поиск хороших психотерапевтов, в чьей компетенции мы были бы уверены, и собираем их на одной платформе. То есть, мы потратили существенное время и наукоемкие ресурсы, поговорили со специалистами, которые изучают научную психотерапию, и вместе с ними выработали методику отбора психотерапевтов. Уже очень многих провели через эту методику: сейчас на нашей платформе более 400 зарегистрированных психотерапевтов это менее 30% из тех, кто проходил отбор. Сейчас доля успешно проходящих отбор снижается: видимо, многих крутых терапевтов мы уже нашли.

То есть, у нас на платформе есть четыре сотни тщательно отобранных терапевтов, которых мы по-разному проверили и которые соответствуют высоким стандартам. Вы приходите к нам на сайт, заполняете анкету, и мы помогаем вам выбрать специалиста из нашей базы для работы с вашим запросом. То есть, по анкете мы стараемся сформулировать, к какой области относится запрос (крутого ИИ у нас пока нет, но со временем, может быть, будет): разные терапевты работают с разными вещами. Мы предлагаем вам на выбор 5 человек. Если 5 мало можно посмотреть каталог и выбрать кого угодно. На сайте можно записаться на сессию, оплатить, а дальше вы приходите в кабинет, либо созваниваетесь с терапевтом напрямую. Так или иначе, вы сможете проходить терапию, через нас дальше записываться и оплачивать. Все достаточно хорошо автоматизировано и удобно.

Вот такая конструкция. То есть, мы помогаем людям найти терапевта, гарантируем то, что он профессиональный, и сопровождаем в процессе терапии. Мы также отслеживаем ваш прогресс, качество терапии, помогаем порефлексировать, как терапия идет, все ли хорошо; будем еще вкладываться в это, со временем.

А как это работает? Как можно понять, насколько эффективна терапия? Есть это ощущение, когда выходишь от терапевта все, теперь во всем разобрались, все хорошо но оно проходит.


Во-первых, это ощущение есть не у всех. И если его нет, то уже надо задуматься; может быть, это нормально, может нет. Как минимум, стоит регулярно задумываться о том, как идет терапия: где я был месяц назад, где я сейчас; это полезная практика, в любом случае. Есть еще различные опросники, другие психометрические способы отслеживания своего состояния. Мы их будем постепенно внедрять, а пока мы просто спрашиваем каждого клиента. Даем возможность сказать, если что-то идет не так, что-то не нравится, где-то буксование. Постепенно будем улучшаться в этом направлении.

Q: Часто произносится слово супервизия, когда говорят про безопасность психотерапии. Расскажи, что такое супервизия.


Это когда психотерапевт приходит к другому, специально подготовленному психотерапевту-супервизору, и анонимизированно обсуждает свои случаи работы с клиентами. Получает обратную связь, улучшается. То есть, супервизор единственный человек, с которым терапевт может обсуждать свою конфиденциальную работу. Хорошие терапевты проходят супервизию постоянно, это одно из условий работы на Альтере; это не значит, что на каждую сессию терапии приходится сессия супервизии, но для улучшения психотерапевтической практики она необходима. Это действительно очень важно для безопасности терапии; для того, чтобы психотерапевт не терял связь с реальностью. Мы видим некоторых публичных, так сказать, психотерапевтов, которые ушли куда-то в сторону комплекса Бога и считают, что только они умеют все делать правильно. Супервизия помогает избежать этого, давая взгляд со стороны.
Кроме этого, существует интервизия: встреча нескольких терапевтов в равных позициях с обсуждением анонимизированных случаев. Это более бюджетный вариант супервизии; работа супервизора, конечно, оплачивается самим терапевтом.

Q: Расскажи про безопасную психотерапию и про то, как терапевт может навредить.


Это очень широкая тема. Тут, скорее, важно сказать о том, какие есть деструктивные вещи. Одна из них это любого рода двойные отношения. Существенный аспект психотерапии это так называемые терапевтические отношения; идея в том, что клиент и терапевт взаимодействуют друг с другом только по вопросам терапии, у них нет никаких интересов к жизни друг друга за ее пределами. Это очень важно. Это значит, что не страшно обидеть терапевта, что у него нет скрытых интересов или неосознанных мотиваций. Можно представить дичайший случай; например, что ваш терапевт это ваша мама. Она очень заинтересована в том, какой будет результат терапии; она физически не может действовать в интересах клиента, у неё сильный собственный интерес, который замещает ваш интерес.

Это экстремальный пример двойных отношений. Бывает так, что, например, вы придумали замечательный общий проект со своим терапевтом и делаете его, продолжая при этом терапию. Это плохая идея, это тоже вторичные интересы. Если вдруг возникают романтические или сексуальные отношения с терапевтом это вообще катастрофа, терапевту так делать ни в коем случае нельзя. Если что-то подобное случается то есть, если между клиентом и психотерапевтом возникают отношения то инструкция точно предусматривает карантинный период. Это не очень здоровая ситуация, которая считается небезопасной для клиента. Сложный вопрос, по какой причине клиент влюбился.

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

А это разве не помогает эффективнее работать? Больше точек зрения больше информации о ситуации, можно во всем разобраться.


Дело в том, что терапевту нужна, в первую очередь, не информация. Терапия не работает за счет того, что терапевт все понимает в деталях про вашу жизнь; работаете на терапии вы сами. Позиция терапевта в том, что он находится на вашей стороне, это очень важно. У него не может быть своего мнения о том, хорошо или плохо вы сделали, правду или неправду вы говорите. Его задача относиться к вам безоценочно, с безусловным принятием. Любая посторонняя информация о вас, которую он узнает, усложняет это дело. Поэтому терапевты не добавляют клиентов в друзья в соцсетях, или вообще не ведут соцсетей, или закрывают свои страницы чтобы избегать двойных отношений. Всегда, когда терапевт узнает о вас то, что вы не собирались ему говорить, это усложняет ему работу.

Q: Что сохраняет тайну клиента? То есть, допустим, ты пришел к психотерапевту, что-то ему рассказал. А он пошел, рассказал своим друзьям. Или позвонил твоей маме и тоже рассказал, потому что это подруга твоей мамы. У меня был именно такой опыт в 10 классе: мама мне сказала вот, у меня есть подружка, офигенный психотерапевт. А потом, после сессии, оказалось, что она все рассказала маме. То есть, я уже тогда понимала, что так нельзя делать, но что в таком случае все-таки делать? Если ты подозреваешь, что твой психотерапевт куда-то что-то сообщает, что можно с ним за это сделать?


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

Q: Очень кратко: как это доказывается?


Тут все как всегда, как в любых такого рода вещах. Мы соберем информацию, какую можем, будем принимать решение на базе этой информации, поговорим со всеми, с кем можно поговорить. И, конечно, если два клиента рассказывают подобное независимо друг от друга, остается мало сомнений. Даже если клиент один мы относимся к этому очень внимательно, пробуем разобраться.

Q: Расскажи про тревожные звоночки во время сеанса или переписки до него, которые сигнализируют о том, что ты попал к непрофессиональному терапевту, который не будет соблюдать этику или может навредить. Куда нужно смотреть?


Это достаточно сложно. Клиенту без специальной подготовки будет сложновато отличить. Я разговаривал неформально со своими знакомыми; только из того, что человек говорит, сложно понять, нормальный терапевт или нет. Если сомневаетесь, можно просто спросить нас мы ответим.

Из того, что можно заметить в процессе терапии? Естественно, если терапевт вас оскорбляет, или пристает с какими-то сексуальными действиями, или применяет какое-то насилие все это полная катастрофа, так не должно быть ни с какой точки зрения. Дальше есть такие вопросы, которые в разных школах по-разному трактуются, но, в основном, терапевты не дают советов. Хороший терапевт не скажет вам, как поступать. Конечно, если вы сами попросили совета, тут может быть сложнее, но если вы в явном виде не просили он не должен его давать. Опять же, надо помнить, как вы договаривались; если вы начали беседу с того, что вам нужен совет, и через 20 минут вам дали совет, это может быть нормально.

Другая важная вещь реакция на обратную связь. Это не точный определитель; в принципе, хорошим тоном считается запрашивать обратную связь в конце сессии явно: как прошла сессия, было ли вам комфортно, надо ли что-то улучшить. И, в любом случае запрашивал он связь или нет если вы даете обратную связь, вы можете судить по реакции. Если он на нее не реагирует это проблема. Если он как-то реагирует, но ничего не меняется это можно интерпретировать по-разному; это не обязательно значит, что он непрофессионален, но тогда вы должны для себя решить, нужна ли вам терапия в таком виде, или нет.

Q: Нужна ли психотерапия здоровым людям без установленных психиатрических диагнозов?


Допустим, у вас нет диагностированных расстройств. Нужна ли вам терапия? Ответ да, если вы хотите что-то изменить в своей жизни. Допустим, если вас не устраивает ваше фоновое настроение; если вам часто бывает грустно это не значит, что у вас клиническая депрессия, но психотерапия может с этим помочь. Или в случае, когда вы видите, что попадаете в повторяющиеся ситуации, которые вас не устраивают. Допустим, у вас последние 6 лет повторялась одна и та же история по работе, в разных местах, с разными людьми и вы не хотите, чтобы она повторилась снова. Или та же ситуация, но в семье. Или какая-то реакция, которую вы хотите поменять. Или вы просто хотите разобраться в себе и определить, чем хотите дальше заниматься в жизни. Или прояснить что-то. Или вы плохо умеете отдыхать, хотите научиться отдыхать лучше. Примеров можно придумать еще много, и все это нормальные поводы обратиться к психотерапевту и поработать над конкретным вопросом. Вы можете просто чувствовать, что что-то не так, и это тоже нормальный повод пойти к терапевту чтобы он помог разобраться в том, что именно не так. Это важно. Если из этого получится запрос на психотерапию вы продолжите дальше работать с терапевтом.

Q: Замечал ли ты, что с программистами и другими членами команды, которые занимаются психотерапией, работать, выстраивать отношения и доводить проекты до конца гораздо проще? Или гораздо сложнее. То есть, существует ли корреляция? И, если ты хочешь продвигаться в карьере по работе, следует ли (надо ли, обязательно ли) ходить на психотерапию?


Мне кажется, что тут два или три разных вопроса.

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

Обязательно ли это точно необязательно. Огромное количество людей сделало прекрасные карьеры без терапии. Может ли это помочь может, по многим направлениям. Мне нравится идея психотерапии развития когда я прихожу не за тем, чтобы у меня не болело, а за тем, чтобы что-нибудь у меня лучше работало, чтобы я развивался. В таком случае, конечно, может выясниться, что что-то на самом деле было не так, и это что-то все время мешало и забирало силы, а я не замечал. А может и не быть такого. В любом случае, внутреннее развитие это лучший способ сделать карьеру. А психотерапия это один из самых эффективных методов развития.

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

Можно разбирать рабочие ситуации, можно просто уделять внимание себе. У менеджера очень велик соблазн уделять внимание другим, но в психотерапии надо уделять внимание именно себе, это такое место. Опять же, у каждого свое; можно просто развивать рефлексию это хорошо, с плохо рефлексирующим менеджером тяжело работать. Все начинается с себя, мы других людей понимаем через себя. Вся эмпатия начинается в эмпатии к себе: я про себя либо знаю, либо могу представить какие-либо вещи. Естественно, все люди разные, и я не могу переживать все, что переживают другие люди, но я могу представить. И через это происходит эмпатия к другим людям, сопереживание. И, чем лучше вы способны понимать, чувствовать себя, соприкасаться со своими эмоциями что нравится, не нравится, как вы устали, как здорово поработали, что угодно тем лучше вы будете понимать других, тем проще будет эмпатийно вести себя. Эмпатийное поведение это ответ на огромное количество вопросов коммуникации.

Q: Как вы проверяете психотерапевтов на профпригодность?


Подробно по памяти я не вспомню; можно зайти к нам на сайт, там есть описание отбора. По сути: во-первых, мы смотрим на документы об образовании, смотрим подтверждение того, что человек ходит на супервизию, ходил на личную терапию; даем большой опросник по всевозможным знаниям и навыкам терапии, по которым можно сделать приблизительную оценку. Часть терапевтов идет на интервью со специалистами, которые умеют разбирать в диалоге кейсы и оценивать уровень профессионализма.

Q: Насчет алгоритма Альтера. Я знаю, что, если я хочу попасть на психотерапию, ничего не зная и не понимая, то я смогу прийти к вам, пройти тест, мне подскажут нужную школу терапии и доступных конкретных специалистов. Мне интересно как это работает?


У нас есть научные данные о том, какие школы в каких случаях лучше работают и, соответственно, у каких из наших специалистов какие специализации. Мы по вашим ответам в анкете умеем определять, какие специализации для вас релевантны. И дальше мы делаем так, чтобы вам достались те специалисты, которые будут работать с вашим запросом лучше всего. Вот так все и работает. Более подробно рассказывать не буду это наше ноу-хау.

Q: У вас на сайте только психологи, или есть психотерапевты?


Объясню вкратце. Человек, который называется психотерапевтом, не всегда имеет медицинское образование и подготовку по психотерапии. У нас на сайте работают только люди, которые получили такую подготовку. Часть из них имеет медицинское образование, часть нет; для каждого из них на сайте полностью приведена квалификация. Тех, кто не получил медицинское образование, принято называть психологами, а тех, кто получил психотерапевтами, и у нас есть и те, и другие, и все они умеют проводить психотерапию.

Q: Часто ли добавляются новые специалисты?


Часто, по нескольку десятков каждый месяц. Это только те, кто успешно проходит отбор то есть, поток постоянный.

Q: Что, если алгоритм показывает, что мне подходит только три психотерапевта?


Случается, что запрос у клиента такой, на который в нашей базе есть только три специалиста. Так бывает. Или может быть так, что все остальные специалисты полностью загружены, и принимать новых клиентов могут только трое. Или из-за того, что многие ушли в отпуск (например, в августе). Но, по нашей статистике, очень небольшой процент людей получает менее 5 вариантов.

Q: Сколько надо выбирать психотерапевта? Допустим, надо попробовать 3-4-5 специалистов сколько это занимает времени и специалистов, в среднем?


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

А как понять, что школа или терапевт не подходят?


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

Q: Есть ли отзывы и рейтинг?


Хороший вопрос. Отзывов на работу конкретных терапевтов у нас нет, есть только отзывы на работу Альтера. Спрашивать у клиента отзывы на работу терапевта это неэтично. Если терапевт заинтересован в том, чтобы вы оставили хороший отзыв, то это влияет на его работу, поэтому не надо соблазнять терапевтов такими вещами.

Q: На Альтере только проверенные методики? В чем риск новых школ и направлений терапии?


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

Конечно, есть кто-то не озаботился проверкой того, работает ли определенный метод или нет, это другое дело; но это просто подозрительно такие люди почему-то считают, что они все правильно делают, не имея на то основания. То есть, у них есть впечатление того, что после терапии клиентам становится лучше, и они считают, что этого достаточно видимо, думая, что они полностью объективны и не способны ошибаться. Я бы к такому человек не пошел.

Q: Вы сами следите за эффективностью работы специалистов? Если кто-то никому не нравится, то его выгонят?


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

Q: Как вы привлекаете психотерапевтов? У нас привыкли искать терапевта по сарафанному радио: когда хочешь найти кого-то, кому можно доверять, ты спрашиваешь у своих друзей и у их друзей, и в итоге попадаешь к незнакомому человеку но люди этому доверяют. И, если специалист действительно хороший, то он, вероятно, загружен заказами и все время у него уже расписано. И не происходит ли так, что к вам приходят терапевты, которым не хватает клиентов?


Важное замечание: если терапевт хороший, то у него все-таки не все время расписано, потому что клиенты со временем получают результаты и заканчивают терапию. Это должно происходить регулярно. Если никто не завершает терапию, то что-то здесь не так.
Надо признать, что в некоторых случаях человеку требуется постоянное сопровождение в течение нескольких лет. Это особенность некоторых специализаций например, работа с людьми, которые ухаживают за паллиативными больными. Если человек болеет годами, и это никогда не кончится, то тому, кто ухаживает, может быть нужна постоянная поддержка. Хотя и тогда в некоторых случаях хватает конечного количества сессий. В любом случае, клиентов для такой особенной специализации не так много, и обычно терапевты регулярно расстаются с клиентами, закончив терапию.

То есть, у хорошего психотерапевта есть определенная цикличность?


Да. Но это тоже зависит от специализации и метода. В классическом психоанализе все очень долго проходят терапию, в других школах есть краткосрочные методы терапии за 10-15-20 сессий. Причем эти школы не лучше одна другой, они работают на разные вещи.
Получается ли так, что к нам приходят терапевты, которым не хватает клиентов? Скажем так: те, к кому уже стоит очередь пришедших по сарафанному радио, к нам приходят редко. Они у нас есть, конечно; они все время перегружены, как-то управляют своим календарем в ручном режиме. Но, в то же время, есть множество хороших терапевтов, которые постоянно ищут клиентов. Это нормально.

Q: Как писалась платформа, какие задачи решались в первую очередь?


Альтер это стартап. Относительно молодой, начинался он достаточно медленно все были парттайм. Платформа писалась на коленке (правой). Сейчас она написана на Django, а фронтенд на ReactJS. Мы довольно долго просуществовали в таком состоянии, когда в платформу было вложено 3 месяца работы одного моего знакомого он написал первую версию. Я ее поддерживал длительное время в одиночку, потом кого-то привлек помогать, потом на фуллтайм. Сейчас я, наконец, перестал быть руководителем команды разработки: мы нашли лида. Команда теперь будет расти, потому что скорость развития продукта сейчас ограничивается скоростью разработки, и ее важно ускорить. У нас на днях один человек выходит, мы будем искать еще людей на бэкенд, фулстек, фронтенд, чтобы развивать продукт. Видно, что мы можем сделать много чего лучше, но нужно больше рук. Будем развивать команду.

Q: Когда Альтер перестанет считаться стартапом?


Наверно, когда мы перестанем думать об инвестициях. Мне кажется, из всех определений стартапа разумно использовать определение стартапа как команды, которая собирается расти в 10 раз (а потом, возможно, еще в 10 раз). Наша команда собирается так расти, и мы думаем привлекать инвестиции для этого. Раз в 4-5 мы вырастем сами; мы уже в плюсе, нет необходимости найти деньги завтра, чтобы они не кончились. Мы уже в прибыли, но вся прибыль вкладывается в рост команды. Для быстрого рывка вперед понадобятся инвестиции.

Q: В среднем, сколько обычно длится курс по одному обращению на портале?


Я не уверен. Среднее количество сессий на клиента с учетом всех клиентов около 5, но эта цифра бесполезна; правильнее учитывать только тех клиентов, у которых было более двух сессий. По ним должно быть около 7, если я правильно помню. Эта цифра уже ближе к реальности; хотя я знаю, что у нас есть и такие клиенты, которые ходили 100 раз (буквально). Есть люди, которые ходят на 10, 12, 7, 5 сессий. По-разному.

Как ты думаешь, за эти 10 сессий они решают проблему?


-Мы знаем отзывы тех клиентов, которые решили проблему. Некоторые клиенты ничего не сказали. Конкретно не могу сказать не знаю сам, это конфиденциальная информация. Но мне кажется, что, в целом, репутация сервиса позитивная. Люди рекомендуют нас знакомым, и это хороший знак. Многим сервис пригодился.

Q: Кого вы хайрите?


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

Q: Если вам требуются разработчики на Django куда написать по поводу сотрудничества?


Можно мне в Telegram. Abreslav.
-Или мне на Хабре, я вас свяжу. Андрей, если вы не против, я напишу все ваши вакансии с расшифровкой.
-Хорошо, я могу точно сказать, какие вакансии открыты.

Мы уже больше 3 лет делаем Альтер. Это начиналось как некая безумная идея было непонятно, как я буду делать какой-то бизнес, работать с людьми. А сейчас ощущения полностью другие. Я уверен в том, что мы делаем полезное дело, есть много свидетельств тому, что мы помогаем людям. Приходит по тысяче клиентов в месяц, мы проводим по пять тысяч сессий в месяц, и понятно, что это полезно. Это очень круто. Ясно, что мы еще много всего улучшим; нет такого ощущения, будто мы все закончили и можно прекратить работу, раз система действует. Мы сделаем очень много чего лучше ради этого мы улучшаем команду и улучшаемся сами. В этом смысле все очень оптимистично. Я рад, что мой первый опыт попытки что-то сделать в гуманитарной сфере и начать новый бизнес идет так позитивно. Я счастлив, что мы встретились с Олей Китаиной сооснователем Alter, и с остальными ребятами, которые с нами работают.



Что было ранее


  1. Илона Папава, Senior Software Engineer в Facebook как попасть на стажировку, получить оффер и все о работе в компании
  2. Борис Янгель, ML-инженер Яндекса как не пополнить ряды стремных специалистов, если ты Data Scientist
  3. Александр Калошин, СEO LastBackend как запустить стартап, выйти на рынок Китая и получить 15 млн инвестиций.
  4. Наталья Теплухина, Vue.js core team member, GoogleDevExpret как пройти собеседование в GitLab, попасть в команду разработчиков Vue и стать Staff-engineer.
  5. Ашот Оганесян, основатель и технический директор компании DeviceLock кто ворует и зарабатывает на ваших персональных данных.
  6. Сания Галимова, маркетолог RUVDS как жить и работать с психиатрическим диагнозом. Часть 1. Часть 2.
  7. Илья Кашлаков, руководитель фронтенд-отдела Яндекс.Денег как стать тимлидом фронтендеров и как жить после этого.
  8. Влада Рау, Senior Digital Analyst в McKinsey Digital Labs как попасть на стажировку в Google, уйти в консалтинг и переехать в Лондон.
  9. Ричард Левелорд Грей, создатель игр Duke Nukem 3D, SiN, Blood про личную жизнь, любимые игры и о Москве.
  10. Вячеслав Дреер, гейм-дизайнер и продюсер игр с 12-летним стажем про игры, их жизненный цикл и монетизацию
  11. Андрей, технический директор GameAcademy как видеоигры помогают прокачивать реальные навыки и найти работу мечты.
  12. Александр Высоцкий, ведущий PHP-разработчик Badoo как создаются Highload проекты на PHP в Badoo.
  13. Андрей Евсюков, заместитель CTO в Delivery Club про найм 50 синьоров за 43 дня и о том, как оптимизировать фреймворк найма
  14. Джон Ромеро, создатель игр Doom, Quake и Wolfenstein 3D байки о том, как создавался DOOM
  15. Паша Жовнер, создатель тамагочи для хакеров Flipper Zero о своем проекте и другой деятельности
  16. Татьяна Ландо, лингвист-аналитик в Google как научить Google-ассистента человеческому поведению
  17. Путь от джуна до исполнительного директора в Сбербанке. Интервью с Алексеем Левановым
  18. Как Data Science продает вам рекламу? Интервью с инженером Unity
  19. Как я переехал в Лондон c Revolut
  20. Завтрак с легендарным геймдизайнером Американом МакГи: о новой Алисе, России и депрессии
  21. Как организовать IT-конференцию и не сойти с ума




Подробнее..

Huawei получил от Трампа люлей But show must go on?

05.10.2020 12:23:18 | Автор: admin
Просто хочешь ты знать, где и что происходит (с) Кино



Недавно волею судеб (подарили) я стал обладателем смартфона Huawei P40 Lite: красивый такой, зелененький. После люлей от Трампа за шпионаж, смартфоны Huawei поставляется без сервисов Гугл. Магазин приложений от Гугл также недоступен. Зато есть собственный магазин Huawei AppGallery, который продвигается, в том числе, и на Хабре.

Есть мнение, что Гугл активно следит за пользователями в Инете. Да и про китайские смартфоны такие разговоры идут. Поэтому я, было, обрадовался одним шпионом меньше. Но Huawei, похоже, решил поработать за двоих


Дисклеймер. Статья отражает моё личное мнение и не несет в себе цель оскорбить кого-либо, нанести финансовый урон, осудить чей-то выбор, призывать к выбору чего-либо, а также раздуть холивар.

Сначала я заметил, что Инет-трафик расходуется непонятно куда. Кроме того, на смартфоне обнаружилась куча приложений, которые мне были совершенно не нужны. Часть я удалил, но вот большая часть таких непонятных приложений оказались бессмертными и очень болтливыми. Возможно, очень по родине скучали, вот и пользовались любым случаем поболтать с ней За мой счет.

Началась переписка с поддержкой Huawei. Всего мы обменялись не менее чем 20 письмами.
Вот первое.

4 Aug 2020 19:28:47 +0800
Subject: Русская служба почты [Interaction ID: a10459b2-4aa3-4d2f-9f6c-****]
1. Нет возможности удалить ряд ненужных мне приложений... 2. Ряд приложений, например, HMS, MS Keyboard, несмотря на запрет выхода в Интернет в настройках, постоянно производят такие попытки и расходуют трафик
Ответ: Системные приложения невозможно удалить, но их можно отключить. После отключения приложение перестанет потреблять системные ресурсы, и его значок пропадает с рабочего экрана. Отключить можно те приложения, которые невозможно удалить.


К письму прилагались скриншоты, иллюстрирующие проблему.
Скриншоты


И таких болтливых приложений оказалось ух как много. Обратите внимание, что передача данных запрещена, а трафик чуть-чуть идет.

Естественно, что ответ меня совершенно не устроил последовало второе письмо в поддержку.

Thu, 6 Aug 2020 21:04:56 +0300
Subject: Re: Русская служба почты [InteractionID:c625324c-c468-4f70-adb8-****]
К сожалению, меня совершенно не устраивает содержание полученного ответа.
Полагаю, что мой запрос следует передать более компетентному сотруднику.
Все ненужные мне приложения, которые можно было удалить или отключить описанными в ответе способами, я удалил или отключил.
Я спрашивал про приложения (часть из них я привел в предыдущем запросе), которые такими способами не удаляются и не отключаются. Очевидно, что они системными не являются.
Кроме того, в ответе совершенно проигнорирована вторая часть вопроса - про приложения, которые выходят в Интернет несмотря на установленный в настройках запрет. Причем этот расход трафика видно даже средствами телефона, не говоря уже про внешние программы контроля трафика. Мне следует считать такие приложения шпионскими (не удаляются, не отключаются, не обращают внимания на запрет)?
Ответ: Для предоставления корректного решения по Вашему вопросу, пожалуйста, предоставьте следующие данные:
1. Серийный номер (можно скриншот);
2. Номер сборки (можно скриншот);
3. Более точное описание ситуации;
4. Видео записи экрана возникающей ошибки;
5. Номер сборки приложений (можно скриншот).
Как только мы получим запрошенные данные, в кратчайший срок предоставим решение.

А дальше началась традиционная для поддержек история замотать пользователя бесплодной перепиской, чтобы отстал.

8 Aug 2020 11:53:51 +0300
Subject: Re: Re: Русская служба почты [InteractionI D:7f69d238-fad7-4193-bc04-****]
Ответ: К сложению, по предоставленному Вами серийному номеру идентифицировать устройство не удалось, пожалуйста, предоставьте корректный серийный номер или с Вашего разрешения укажите IMEI. Также, укажите версию всех приложений, которые Вы хотите удалить.

И так несколько раз. Кстати, может кто-то знает, зачем им этот серийный номер?

14 Aug 2020 19:16:27 +0300
Subject: Re: Re: Re: Русская служба почты [InteractionID:09c0f17f-87a9-4f3d-889a-****]
1. Серийный номер ЕРНUТ2040200****
Сборка 10.0.1.167 (с10е2r2р1)
Проблемные приложения :
Беспроводная проекция 10.0.1.302

AppAssistant 10.3.0.300
Караоке 10.0.1.331
Медицинская карта 10.0.1.302
Музыка 12.11.5.329
Облако 1.0.0.300
Поддержка 10.0.5.504
Рабочий экран Huawei 10.0.28.300
Редактор видео 10.0.2.340
Центр QuickApp 2.5.2.301
Цифровой баланс 10.0.1.413
AppAdvisor 10.3.0.301
App Assistant 10.3.0.300
FIDO UAF ASM 10.0.1.303
FIDO UAF Client 10.0.1.301
HUAWEI Видео 8.3.90.313
HUAWEI Assistant 20.0.7.317
HUAWEI HiAi 20.0.6.302
HUAWEI Share 2 шт 10.0.1.304 + 10.0.1.545
Ответ: К сожалению, по предоставленному Вами серийному номеру идентифицировать устройство не удалось, пожалуйста, предоставьте корректный серийный номер.

Понял, что мне морочат голову послал скриншот серийного номера. Тут им уже некуда было деваться

Ответ: К сожалению, для корректной работы телефона некоторые предустановленные приложения, в том числе системные приложения Android и основные приложения Huawei, невозможно удалить.
Рекомендуется не пытаться удалить предустановленные приложения, удаление данных приложений может привести к сбою в работе системы Вашего устройства.
Также данным приложениям необходим доступ в интернет для корректной работы и загрузки обновлений. Штатными средствами данные приложения удалить невозможно.

Очень содержательный ответ
Заметил, что на слово spyware поддержка реагирует очень живо. Решил слегка попедалировать

17 Aug 2020 21:29:38 +0300
Subject: Re: [InteractionID:378a7693-1346-4606-91a9-****]
Уважаемые дамы и господа.
С большим разочарованием прочитал ваше письмо. Я ведь просил передать мое обращение квалифицированному специалисту... Я очень надеюсь, что в компании Huawei такие имеются.
Полученные ответы либо банальны, либо неправдоподобны.
1. Напоминаю, что обращение началось с того, что штатными средствами невозможно удалить ряд приложений, которые заведомо не являются ни системными, ни основными. Например, приложение Мед. книжка или Караоке или Редактор видео. И вы мне после длительной переписки сообщаете, что штатными средствами эти приложения нельзя удалить!? Я это знал до начала переписки!
2. Если бы вы внимательно прочитали переписку, то заметили бы, что данным приложениям я запретил выход в интернет с помощью дополнительного софта. Телефон и прочие приложения при этом продолжают работать - никаких сбоев нет.
Кроме того, телефон работает и при отсутствии интернета.
Поэтому заявление о том, что данным приложениям необходим выход в интернет, даже при явном запрете в настройках телефона, выглядит неправдоподобным.
Именно такая позиция Huawei и ведет к распространению мнения о том, что смартфоны этой марки набиты "шпионским" софтом.
Ответ: Для решение данной проблемы выполните следующие действия:
Настройки > Приложения > Приложения > выберите приложение > Права > отключите все права для приложения > вернитесь на шаг назад и нажмите кнопку "Удалить"
Если данные действа Вам не помогли, для предоставления корректного решения по Вашему вопросу, пожалуйста, предоставьте следующие данные:
1. Видеозапись экрана (каким образом и какие приложения вы пытаетесь удалить)
2. Название ресурса, откуда были установлены приложения.
4. Скриншот ошибки; (если она есть)
5. Номер версии приложений (Настройки Приложения Приложения - Название приложения - Версия).
Как только получим данную информацию от Вас, мы постараемся в кратчайшие сроки предоставить Вам решение.

Естественно, эти действия не помогли. Например, приложения Караоке и Медицинская карта, видимо, настолько важные, что ни удалить, ни отключить их нельзя!

Скриншоты приложений




Переписка продолжилась

26 Aug 2020 12:58:05 +0300
Subject: Re: Re: [InteractionID:e8c6ff84-2ca4-4abe-9600-****]
Представленные скриншоты свидетельствуют, что приложения, которым я запретил выход в Интернет (см. переключатели внизу скриншотов - они выключены) продолжают выходить в интернет и расходовать трафик. На мой взгляд это свидетельствует о шпионаже.
Мне не понятно, почему я не могу удалить предустановленные, но ненужные мне приложения. И почему Хуавей настаивает, что удаление таких приложений приведёт к негативным последствиям.
Также Хуавей старательно обходит вопрос о том, почему приложение Обновление ПО, не смотря на выставленные запреты на обращение в Интернет, скачало 1.5 Гб данных. Хуавей считает, что лучше меня знает на что расходовать трафик?
Ответ: Приложение Обновление ПО не может загружать обновления программного обеспечения автоматически при помощи мобильной передачи данных. Единственная возможность загружать обновления автоматически для данного приложения это при помощи Wi-Fi. Для того, чтобы включить или выключить данную функцию, пожалуйста, перейдите в приложение Настройки - Система - Обновление ПО, нажмите на значок шестеренки.
В любом случае, Вы можете отключить передачу данных для данного приложения. Для этого, пожалуйста, перейдите в приложение Диспетчер телефона - Статистика трафика - Доступ в сеть и отключите передачу данных для приложения Обновление ПО.
Если предложенные инструкции Вам не помогли, трафик все равно расходуется, пожалуйста, направьте скриншоты, подтверждающие данную ситуацию. Как только мы получим от Вас ответ, мы свяжемся с Вами в ближайшее время.
Пожалуйста, проверьте Ваше устройство на вирусы. Для этого, перейдите в приложение Диспетчер телефона - Сканирование на вирусы и произведите сканирование телефона на вирусы. Если это не поможет, и данная ситуация вызвана заражением устройства вирусом, я советую Вам сделать сброс устройства до заводских настроек.

Запрет


Послал им и скриншоты, и видео. А вирусов, естественно, не оказалось.

Ответ: К сожалению, видеозаписи которое Вы предоставили, не открываются.
Предоставьте, пожалуйста, видеозаписи в другом источнике. Для загрузки видео мы рекомендуем воспользоваться такими ресурсами как Яндекс, Google.
Вероятнее всего Вы скачали вирус со стороннего сайта, а в данном случае Вам необходимо выполнить сброс до заводских настроек без резервной копии.
Если Вы уже выполняли сброс до заводских настроек, то в данном случае обратитесь в сервисный центр.

Попытки замотать ситуацию продолжились. Теперь они не могут просмотреть видео, которое снято встроенными средствами смартфона Huawei! И традиционно у вас вирус.
Ну и на всякий случай, если клиент еще не понял, то: все в сад сервисный центр.

Видео


Клиент решил идти до конца Типа, не понял.

5 Sep 2020 18:56:56 +0300
Subject: Re: [InteractionID:b04c9c48-1231-4aa7-adf9-****]
Не стоит слать мне недостоверную информацию.
1. Ни встроенный антивирус, ни сторонний антивирус ничего не находит - об этом я уже сообщал.
2. Странный какой-то вирус - шлет информацию на сервер Huawei compute.hwclouds-dns.com
На всякий случай вот информация об IP адресах, куда идут непрерывные обращения софта Хуавей - в высланном ранее видео это прекрасно видно

Whois IP 203.205.255.226% Information related to '203.205.192.0 - 203.205.255.255'% Abuse contact for '203.205.192.0 - 203.205.255.255' is 'email@cnnic.cn'descr:     Shenzhen Tencent Computer Systems Company Limiteddescr:     Tencent Building, Kejizhongyi Avenue,Hi-techPark,descr:     Nanshan District, Shenzhencountry:    CNperson:     Dreams Ruanaddress:    Tencent Building, Kejizhongyi Avenue, Hi-tech Park,Nanshan District,Shenzhencountry:    CNphone:     +86-755-86013388-84520fax-no:     +86-755-86013030e-mail:     email@tencent.com

Whois IP 159.138.203.215% Information related to '159.138.192.0 - 159.138.207.255'% Abuse contact for '159.138.192.0 - 159.138.207.255' is 'email@huawei.com'inetnum:    159.138.192.0 - 159.138.207.255netname:   Huawei-RU-CLOUDSdescr:     Huawei Russia Cloudscountry:    RUrole:      HUAWEI INTERNATIONAL PTE LTD administratoraddress:    15A Changi Business Park Central 1 Eightrium #03-03/04, Singapore 486035country:    SGphone:     +8618476637035e-mail:     email@huawei.com

Зажатая в угол поддержка Huawei решила слиться.

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

Еще скриншоты


Обратите внимание на интенсивность попыток пообщаться с родным Китаем И номерное приложение (с именем 10157 см. скриншот выше) прорезалось: тоже неудаляемое и, наверно, крайне мне необходимое.

Полагаю, что ситуация с Huawei всем понятна мало им Трамп дал Стоило, на мой взгляд, еще добавить за наглость.

Ну а теперь чем закончилась эта история. На xda-developers 1 и xda-developers 2 можно найти достаточно большой список пакетов, которые стоит удалить со смартфонов Huawei. Что-то и на 4pda есть, но меньше. Затем вооружаемся утилитой adb и делаем spyware Huawei чика-чику. Аккуратно, по одному пакету.

На всякий случай привожу собранную информацию: красные пакеты удалять не стоит; зеленые удаляются без проблем (но сам проверял не все). Остальные пакеты по желанию. Может кому-то эта информация пригодится
Естественно, что замечания и исправления приветствуются.

Результат: теперь попытки пообщаться с родиной смартфон делает раз в 15-20 минут. Впрочем, не только с родиной: еще добавился какой-то Раском из Питера. Видимо Huawei понял, что телефон с переданным им серийным номером находится в РФ.

159.138.192.0 - 159.138.207.255 Huawei-RU-CLOUDS 15A Changi Business Park Central 1 Eightrium # 03-03 / 04, Сингапур185.5.160.128 - 185.5.160.255 РАСКОМ-ИНЕТ г. Санкт-Петербург, г. Боровая, д. 57


Ну и в заключение.
  1. Владельцы Huawei (и, highly likely, владельцы других смартфонов)! Ваш друг он не только Ваш друг: КДПВ в начале статьи не просто так. Используйте No root firewall или аналоги.
  2. Всех призываю поделиться в комментариях своим опытом по блокировке и/или удалению ненужных приложений, в том числе и системных. Особенно если они порождают непонятный трафик.

По совету поддержки обратился со своими проблемами в сервис центр Huawei. В ответ тишина...
Подробнее..

Перевод Отпечаток браузера что это, как работает, нарушает ли закон и как защититься. Часть 2

14.10.2020 18:14:52 | Автор: admin
image

От Selectel: это вторая часть перевода статьи про отпечатки браузера (тут можно прочитать первую). Сегодня поговорим о законности сбора сторонними сервисами и сайтами отпечатков браузеров разных пользователей и о том, как можно защититься от сбора информации.

Так что насчет законности сбора отпечатков браузеров?


Мы детально изучили эту тему, но не смогли найти конкретных законов (речь о законодательстве США прим. ред). Если вы можете указать статьи законов, которые регулируют сбор отпечатков браузеров в вашей стране, дайте нам знать, пожалуйста.

Зато в Европейском Союзе действуют законы и директивы (в частности, GDPR и ePrivacy Directive), которые регулируют использование отпечатков браузеров. Это вполне законно, но только в том случае, если организация может доказать необходимость выполнения такой работы.

Кроме того, для использования информации требуется согласие пользователя. Правда, есть два исключения из этого правила:

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

Скорее всего, похожие законы действуют и в других странах. Так что ключевой момент здесь в том, что сервис или сайт нуждаются в согласии пользователя для работы с отпечатками браузеров.

Но есть проблема не всегда вопрос явный. Чаще всего пользователю показывают лишь баннер Я согласен с условиями использования. Да, на баннере всегда есть ссылка на сами условия. Но кто их читает?

Так что обычно пользователь сам дает разрешение на сбор отпечатков браузера и анализ этой информации, когда кликает по кнопке согласен.

Тест отпечатка своего браузера


Окей, выше мы обсудили, какие данные могут собираться. Но что насчет конкретной ситуации собственного браузера?

Для того чтобы понять, какую информацию можно с его помощью собрать, проще всего воспользоваться ресурсом Device Info. Он покажет, что может получить сторонний наблюдатель с вашего браузера.


Видите этот список слева? Это далеко не все, остальная часть списка появится по мере прокрутки страницы. Город и регион на скрине не отображаются из-за использования VPN авторами.

Есть и еще несколько сайтов, которые помогают провести тест отпечатка браузера. Это Panopticlick от EFF и AmIUnique, open-source сайт.

Что такое энтропия отпечатка браузера?


Это оценка уникальности отпечатка вашего браузера. Чем выше значение энтропии, тем выше уникальность браузера.

Измеряется энтропия отпечатка браузера в битах. Проверить этот показатель можно на сайте Panopticlick.

Насколько точны эти тесты?


В целом, им можно доверять, поскольку собирают они ровно те же данные, что и сторонние ресурсы. Это если оценивать сбор информации по пунктам.

Если же говорить об оценке уникальности, то здесь не все так же хорошо, и вот почему:

  • Сайты для тестирования не учитывают рандомные отпечатки, которые можно получить, например, при помощи Brave Nightly.
  • У сайтов наподобие Panopticlick и AmIUnique огромные архивы данных, в которых содержится информация о старых и устаревших браузерах, пользователи которых проходили проверку. Так что если вы проходите тест с новым браузером, скорее всего, получите высокую оценку уникальности своего отпечатка, несмотря на то, что сотни других пользователей работают с тем же браузером той же версии, что и вы.
  • Наконец, они не учитывают разрешение экрана или изменения размера окна браузера. Например, шрифт может быть слишком велик или мал или же из-за цвета текст сложно читать. Какой бы ни была причина, тесты этого не учитывают.

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

Как защититься от сбора отпечатков браузера (простые методы)


Сразу же стоит сказать, что полностью блокировать формирование и сбор отпечатка браузера не получится это базовая технология. Если хотите оградить себя на 100%, нужно просто не пользоваться интернетом.

Но количество информации, которая собирается сторонними сервисами и ресурсами, можно снизить. Здесь помогут такие инструменты.

Браузер Firefox с модифицированными настройками

Этот браузер неплох в вопросе защиты пользовательских данных. Недавно разработчики защитили пользователей Firefox от сбора отпечатков третьей стороной.

Но уровень защиты можно повысить. Для этого требуется зайти в настройки браузера, путем ввода в адресной строке about:config. Затем выбираем и меняем следующие опции:

  • webgl.disabled выбираем true.
  • geo.enabled выбираем false.
  • privacy.resistFingerprinting выбираем true. Эта опция дает базовый уровень защиты против сбора отпечатков браузера. Но наиболее эффективна она при выборе и других опций из списка.
  • privacy.firstparty.isolate меняем на true. Эта опция позволяет блокировать cookies от first-party доменов.
  • media.peerconnection.enabled необязательная опция, но, если вы работаете с VPN, ее стоит выбрать. Она дает возможность предотвратить утечку WebRTC и демонстрацию своего IP.

Браузер Brave

Еще один браузер, дружественный к пользователю и дающий серьезную защиту персональных данных. Браузер блокирует разного рода трекеры, использует HTTPS везде, где можно, и блокирует скрипты.

Кроме того, Brave дает возможность блокировать большую часть инструментов для сбора отпечатков браузера.


Мы использовали Panopticlick для оценки уровня энтропии. По сравнению с Opera получилось 16.31 бит вместо 17.89. Разница не огромная, но она все же есть.

Пользователи Brave предложили массу способов защиты от сбора отпечатков браузера. Подробностей настолько много, что в рамках одной статьи их не перечислить. Все детали доступны на Github проекта.

Специализированные расширения для браузера

Расширения щепетильная тема, поскольку они порой повышают уникальность отпечатка браузера. Использовать их или нет выбор пользователя.

Вот что можно рекомендовать:

  • Chameleon модификация значений user-agent. Можно установить периодичность раз в 10 минут, например.
  • Trace защита от разных вариантов сбора отпечатков.
  • User-Agent Switcher делает примерно то же, что и Chameleon.
  • Canvasblocker защита от сбора цифровых отпечатков с canvas.

Используйте лучше одно расширение, а не сразу все.

Tor браузер без Tor Network

На Хабре не нужно объяснять, что такое Tor браузер. По умолчанию он предлагает ряд инструментов для защиты персональных данных:

  • HTTPS везде и всюду.
  • NoScript.
  • Блокирование WebGl.
  • Блокирование canvas image extraction.
  • Изменение версии ОС.
  • Блокирование информации о часовом поясе и настройках языка.
  • Все прочие функции по блокированию инструментов слежки.

Но вот сеть Tor не впечатляет настолько, насколько сам браузер. Вот почему:

  • Работает она медленно. Все потому, что серверов около 6 тыс., а вот пользователей порядка 2 млн.
  • Многие сайты блокируют трафик Tor например, Netflix.
  • Бывают утечки персональной информации, одна из самых серьезных случилась в 2017 году.
  • У Tor странные взаимоотношения с правительством США их можно назвать тесным сотрудничеством. Кроме того, правительство финансово поддерживает Tor.
  • Можно подключиться к ноде злоумышленника.

В общем, есть возможность использовать Tor браузер без сети Tor. Сделать это не так просто, но способ вполне доступный. Задача создать два файла, которые отключат сеть Tor.

Лучше всего это делать в Notepad++. Открываем его и добавляем в первую вкладку такие строки:

pref(general.config.filename, firefox.cfg);
pref(general.config.obscure_value, 0);



Затем идем в Edit EOL Conversion, выбираем Unix (LF) и сохраняем файл как autoconfig.js в директорию Tor Browser/defaults/pref.

Потом открываем новую вкладку и копируем эти строки:

//
lockPref(network.proxy.type, 0);
lockPref(network.proxy.socks_remote_dns, false);
lockPref(extensions.torlauncher.start_tor, false);



Название файла firefox.cfg, его нужно сохранить в Tor Browser/Browser.

Теперь все готово. После запуска браузер покажет ошибку, но на это можно не обращать внимания.


И да, отключение сети никак не повлияет на отпечаток браузера. Panopticlick показывает уровень энтропии в 10.3 бита, это гораздо меньше, чем с браузером Brave (было 16,31 бит).

Файлы, о которых говорится выше, можно загрузить отсюда.

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

Подробнее..

Думай как инженер 4 способа находить нестандартные решения

16.10.2020 16:14:58 | Автор: admin

В работе и быту нам часто приходится сталкиваться с проблемами, которые заводят в тупик, хотя кажется, что их решение лежит где-то на поверхности. Эх, мне бы сейчас чужие мозги, думаете вы. К счастью, операция необязательна, достаточно использовать МФО, РВС, детский язык и маленьких человечков! Не переживайте, это научно подкрепленные методы, которые заставляют мозг работать иначе. Вместе с ведущимителеграм-канала Креативность 101разбираемся с феноменом инерции мышления и преодолеваем психологические барьеры.

Эта и другие статьи раньше всего выходят в блоге на нашем сайте. Приятного чтения.


Предисловие


Попробуйте быстро ответить на вопросы: Чему равно два в квадрате? А четыре в квадрате? А пять в квадрате? А угол в квадрате?

Удалось ли вам так же быстро ответить на последний вопрос, как и на предыдущие три? Вероятно, вы не сразу переключились с возведения чисел во вторую степень на градусы углов в равностороннем прямоугольнике. А ведь если бы последний вопрос стоял отдельно (Чему равен угол в квадрате?), то ответ на него последовал бы куда быстрее. Это пример инерции мышления когда мы мыслим по накатанной и нам сложно переключиться на новую информацию.

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

Например, некоторых старых конструкторов нефтезаводов сложно переубедить, что сейчас можно использовать трубы новых марок с другой толщиной стенок, потому что то, как они делали раньше, работало. Однако новые технологии объективно работают лучше.

Инерция мышления с точки зрения работы мозга


Физиолог Иван Павлов ввел понятие динамического стереотипа. Грубо говоря, это значит, что произошло действие, которое повлекло за собой череду реакций в мозгу: одни центры возбудились, другие были подавлены, и все это в определенной последовательности и взаимодействии сформировало стойкую привычку или стереотип. С точки зрения выживания или инстинкта самосохранения, то, что уже когда-то сработало, лучше, чем то, что только может сработать. Поэтому мозг будет воспроизводить стереотипные действия, лишь бы не оказаться в пугающей неизвестности и потенциальной опасности даже если эти действия уже не приводят к изначальному положительному эффекту.

Нарушение привычного образа действия приводит к сильному стрессу. Есть даже таблицы стрессовых событий и относительных баллов, которыми они измеряются. К ним относятся, например: смена досуга (34 балла), и развлекательная поездка (33), и изменение условий труда (43) или смена профессии (50). Поэтому сложно просто так взять и начать что-то делать по-другому мозг избегает лишнего стресса.

Так что же можно сделать, чтобы ослабить инерцию мышления? Генрих Альтшуллер (советский писатель-фантаст, изобретатель, автортеории решения изобретательских задач (ТРИЗ)и теории развития творческой личностиеще в середине прошлого века заметил, что инженеры, увлеченные научной фантастикой, изобретают смелее, не боятся дерзких и необычных идей при решении задач с помощью ТРИЗ. То есть преодолеть инерцию мышления им помогают фантазия и воображение. Позже были выделены специальные операторы гашения инерции мышления, которые, среди прочего, помогают развивать творческое воображение. Рассмотрим некоторые из них.



1. Метод фокальных объектов (МФО)


Один из инструментов это метод фокальных объектов (МФО). Представьте себя с волшебной палочкой в руках, которая позволяет переносить свойства одного предмета на другой. Используйте свойства или признаки случайно выбранных объектов для совершенствования своего объекта путем переноса на него выбранных характеристик.

Как использовать такой метод:


  1. Ставим цель (для чего?).
  2. Выбираем объект, который будем совершенствовать.
  3. Выбираем любые другие слова (можно взять словарь, ткнуть пальцем в любое слово это будет идеальным словом, и лучше таких слов выбрать несколько).
  4. Определяем и выбираем их свойства.
  5. Применяем свойства к фокальному объекту.

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

Что можно сделать при помощи МФО?


  • Преодолеть инерцию мышления;
  • Развить творческое мышление, фантазию и воображение (соединяйте несоединимое);
  • Получить в результате применения метода направление совершенствования (оригинальные модификации, неожиданные потенциальные свойства объекта например, книги стали водонепроницаемыми, чтобы дети смогли с ними купаться);
  • Выявить новые сферы применения объекта (например, винную бутылку сплющили, и она стала тарелкой в ресторане);
  • Создать необычные заголовки статей, сюжеты произведений, цепляющую и эффективную рекламу;
  • Развить речь, воображение у детей дошкольного возраста (А давай представим, что ложка была бы не прочная, а как тарелка хрупкая? Такие ложки есть? А если она была бы прозрачной, как стакан? А если бы она была большой или маленькой? Или пушистой?).



2. Детский язык или Попробуй объяснить ребенку


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

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

Как использовать детский язык?


  1. Кратко и четко, заменив термины простыми детскими, функциональными понятиями, изложить содержание трудной, длительно неразрешаемой, актуальной управленческой или технической проблемы.
  2. Кратко описать общую обстановку, акцентировать внимание на нежелательном эффекте.
  3. Нарисовать условную схему.

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

Если данную проблему пытаться объяснить ребёнку, выйдет следующее: висит пустой котелок, его нужно подогревать, но часть тепла уходит вверх, не коснувшись самого котелка, да и сам котелок быстро остывает, потому что сверху большое отверстие, через которое это тепло уходит. И если тепло уходит вверх, то что можно сделать, чтобы тепло сохранялись в пустом котелке? Перевернуть! Теперь тепло не уйдёт дальше, чем дно котелка. Задача решена.



3. Метод маленьких человечков (моделирование маленькими человечками)


Следующий способ уйти от стереотипности мышления и мыслить через ассоциации это использовать маленьких человечков (почувствовать себя фараоном с армией рабов).

Суть во-первых, выявить место проблемы и изобразить его в виде маленьких человечков, отображающих то, что там происходит. Во-вторых, изобразить то, что требуется сделать.

Как использовать?


  1. Определяем то, что надо изменить (улучшить, исправить, устранить ошибку, доделать).
  2. Пишем, что будет Идеальным конечным результатом (ИКР).
  3. Рисуем зону и маленьких человечков, которые выполняют задачу.
  4. Видим, что они делают, и решаем проблему без них.

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

Пример: решение задачи скопившегося снега в водосточных трубах. Многократно оттаивая и замерзая, снег превращается в ледяную пробку, а потом при потеплении падает вниз, ломая трубу. Получается, что ледяная пробка не должна падать вниз. ИКР пробка сама не падает вниз, пока не растает.

Рисуем человечков в трубе (много человечков), которые держат пробку. На что похоже? На цепь! Пока пробка висит на цепи, она не упадёт бомбой вниз и не сломает трубу, а будет стекать постепенно.

Методом маленьких человечков пользуются в разных областях, не только технических. В логистике, медицине, школьном образовании. С его помощью можно объяснять сложные процессы, его используют в корпоративных обучениях, где в качестве маленьких человечков выступают сами сотрудники.

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

Если зашли в тупик в решение вопроса, применяйте этот метод, заставьте работать много маленьких человечков.



4. Оператор РВС (размер, время, стоимость)


И последний на сегодня способ приглушить инерцию мышления это стать оператором размера, времени и стоимости и представить себя человеком, меняющим реальность. Оператор РВС не решит вашу задачу, но с его помощью можно получить несколько необычных направлений решения. Суть его заключается в том, чтобы мысленно:

  • Увеличивать размеры объекта до бесконечности, а затем уменьшать до минимума;
  • Увеличивать время действия на объект до бесконечности, а затем сокращать до минимума;
  • Увеличивать стоимость объекта до бесконечности, а потом уменьшать до минимума.

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

Если представить, что времени бесконечно много, то провод сам может обрасти панцирем-трубой. Если же времени только секунда, то можно запустить ракету, выпущенную в трубу, на конце которой шнур пролетает в трубе.

Со стоимостью так же: представляем, что денег бесконечно много, и тогда можно запустить нанороботов, которые протащат провод или даже сконструируют его прямо там. Ну, а если денег почти нет, будем пользоваться подручными средствами.

А вот как работает оператор РВС в более бытовом ключе, например, в организации работы дома:

Размер. Что, если бы ваше рабочее место было огромным? Как бы вы организовали его? Например, отодвинули всё мешающее и отвлекающее как можно дальше. А если вы представите ваше рабочее место настолько маленьким, что вам бы пришлось работать стоя?

Время. Увеличиваем время того, что вам нужно сделать в течение недели до года. Как теперь организовать работу? А если есть только секунда? Что нужно сделать прямо сейчас?

Стоимость. У вас есть миллион, чтобы справиться с рядовой задачей. Как бы вы его потратили? Возможно, что-то делегировали? А если денег нет совсем? Может, самое время что-то освоить и сделать самому?

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

А вот еще один способ, на этот раз как сэкономить промокод HABR дает дополнительную скидку 10%, которая суммируется со скидкой на баннере.

image




Рекомендуемые статьи


Подробнее..

Бразильские дальнобойщики и русские радиопираты изучаем спутники SATCOM

07.10.2020 14:10:47 | Автор: admin

2009 год. В журнале Хакер выходит статья Хакерское радио: спутники армии США на службе пиратов, повествующая о спутниковом радиопиратстве в Бразилии. Сегодня мы вновь поднимем эту тему и посмотрим, изменилось ли что-то за 11 лет?

Когда речь заходит о спутниках SATCOM, мы сразу оговоримся, что речь пойдет о спутниковой группировке ВМС США Navy Fleet Satellite Communication (FLTSATCOM). Началось все с корпорации Thompson Ramo Wooldridge Inc., ныне известной как TRW.Inc, руководившей разработкой первой межконтинентальной баллистической ракеты США. Планировалось, что группировка будет состоять из 8 спутников, обеспечивающих связью самолеты, корабли, подводные лодки и наземные станции с военным командованием.

Что представляли собой спутники


Источник: Государственный университет Колорадо

Каждый из первых 6 спутников весил почти 2 тонны, а если быть точным, то 1884 кг. 7-ой и 8-ой спутники несли на себе дополнительную нагрузку в виде экспериментальных EHF-транспондеров, поэтому их стартовый вес составлял 2310 кг. Основной полезной нагрузкой было 12 транспондеров, работающих в частотном диапазоне UHF/SHF uplink и UHF downlink.

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

Первый спутник этой группировки был запущен в 1978 году, а последний в 1989 году. 25 марта 1993 года на замену стареющей FLTSATCOM пришла группировка UFO (UHF Follow-On). Она обеспечивала вдвое больше каналов связи при меньшем размере спутника и могла подключаться к системе Milsat, эксплуатирующейся ВВС США. Спустя 19 лет на смену UFO пришла еще более совершенная система MUOS (Mobile User Objective System).

Проблемы FLTSATCOM


Вывод двух из восьми спутников на орбиту сопровождали неудачи. Один спутник (FLTSATCOM-5), предназначенный для резервирования, был сильно поврежден при запуске, поэтому хоть и был доставлен на корректную орбиту, но не функционировал. Следующий за ним FLTSATCOM-6 вообще до своей орбиты не добрался на 51-ой секунде полета в ракету-носитель Atlas-G Centaur-D1AR попала молния.

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

Источник изображения: capcomespace.net
Ключевой же проблемой FLTSATCOM стала безопасность. Которой по факту не было. Спутники работали в режиме обычного репитера с разнесенными частотами. Это значило, что любой человек, имея антенну и трансивер на соответствующий диапазон, а также зная частоты входа, может спокойно использовать репитер в собственных целях.

О том, что такой трюк срабатывает, стало известно еще в начале 90-х годов, после чего спутники FLTSATCOM стали опорной базой для радиопиратов многих стран мира. Но больше всего было радиопиратов из Южной Америки (чаще всего в эфир выходят из Бразилии). Обусловлено это тем, что телекоммуникации очень слабо развиты. Только в центральных районах работает 3G и ШПД по технологии ADSL2+.

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

Оборудование и DIY


Что нужно для связи через спутники FLTSATCOM? В первую очередь трансивер. Подойдет даже маломощная портативка на соответствующий диапазон и антенна с правой круговой поляризацией. Бразильские умельцы брали обычную VHF-шарманку и путем создания простейшего удвоителя частоты делали ее пригодной для работы на UHF-частотах спутников. С антеннами все еще проще. Водопроводная пластиковая труба, несколько кусков кабеля и разъем все, что нужно для создания антенны, которая будет эффективно работать как на прием, так и на передачу.
Обратите внимание: в России диапазон, используемый FLTSATCOM, не является любительским. Выход в эфир на этих частотах является правонарушением и наказывается согласно действующему законодательству.
Прослушивать же любые радиочастоты не является противозаконным, поэтому услышать в эфире бразильское Ol amiga можно абсолютно без каких-либо последствий. Частотный план транспондеров не секрет, и его легко найти на просторах интернета.

Для приема можно использовать любой радиоприемник на диапазон 200-300 Mhz. Подойдет как дешевый китайский RTL-SDR, так и почти любой радиосканнер. Антенну я собирал на скорую руку по инструкции на unicaster.ru из того, что было под рукой:

  • полипропиленовой трубки,
  • пары переходников,
  • пластиковых стяжек,
  • саморезов,
  • кусков кабеля с разным сопротивлением,
  • самой дешевой строительной рулетки,
  • синей изоленты (ну куда ж без нее, родимой).


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


На Youtube тема SATCOM в последний год стала широко популярной, а предприимчивые китайские компании, такие как QYT и ZASTONE, стали выпускать трансиверы на этот диапазон, пользуясь тем, что в Китае он считается любительским. Поистине народную шарманку Baofeng UV-5R, судя по обилию видеороликов, также можно перепрошить для поддержки требуемых частот. Для более качественной работы с SATCOM лучше взять что-то из ассортимента Motorola.

Практическое применение очевидно. В условиях, когда мобильная связь по тем или иным причинам ограничена или полностью недоступна, а до ближайших радиостанций далеко, использование спутниковых репитеров наиболее дешевый и доступный способ связи с внешним миром. К тому же вполне можно использовать такие протоколы, как APRS, чтобы транслировать GPS-координаты и текстовые сообщения, HF-FAX или SSTV для передачи изображений.

Подробнее..

Меняем аккумулятор на iPhone 6s Plus и дарим ему вторую жизнь

19.10.2020 16:12:07 | Автор: admin
Состоялся анонс iPhone 12, но мой 4-х летний iPhone 6s Plus продолжает все так же упорно трудится и не сдает завоеванных позиций. Единственная и главная образовавшаяся проблема это очень сильно снизившееся время работы от одной зарядки. Ясно, что за это время емкость аккумулятора упала, но ко всему прочему он мог произвольно выключится зимой в мороз при достаточно большом остававшемся заряде и включенном режиме экономия энергии. Плюс вызвал сомнение тот факт, что встроенный в iOS показатель Состояние Аккумулятора пару последних лет застыл на отметке 82%. Проверка с помощью CoconutBattery показала, что никаких 82% там нет, 82% это просто произвольно выбранное значение компанией Apple для того, чтобы не смущать пользователей. Реальная емкость была чуть более 70% и поэтому было решено заменить АКБ.



Вот такая батарея была заказана на Aliexpress и потом получена. Примерный ценник $13 за АКБ с емкостью увеличенной до 3500 mAh (у заводского емкость 2750 mAh). Вместе с батареей прислали и набор отверток для самостоятельной замены.



Далее с помощью двух инструкций портала ifixit 1 и 2, и прямых рук была проведена замена. Сама процедура там подробно описана и не является сложной. Фото процесса, к сожалению, не осталось, общее затраченное время около часа. Единственный момент, который может приходится во время замены это тонкий двухсторонний 3M скотч (шириной около 1мм), для того чтобы пройтись по периметру при обратной сборке. Но в принципе, если телефон до этого не разбирался или такого скотча нет, то ничего страшного, просто у меня он был. Емкость полученная в итоге после замены:


Зарядка показала, что емкость реальная (батарея не была разряжена не в ноль)


Цель абсолютно оправдала потраченные средства и теперь старожил iPhone 6s Plus, работает также долго как когда-то новый.

P.S. Фото заводской батареи

Подробнее..

Как начать понимать на слух английский? Подружиться с умными колонками

01.10.2020 10:13:11 | Автор: admin
На Хабре было много статей о том, как выучить английский язык. Это еще одна, однако здесь будут именно лайфхаки для того, чтобы прокачать навык понимания на слух, или аудирования. Причем мой подход претендует на уникальность в рамках Хабра. Навык аудирования исторически очень плохо развит в СНГ, но всё ускоряющаяся глобализация приводит к тому, что он становится понемногу востребован даже среди технических специалистов, от которых раньше требовалось уровень английского: чтение технической документации.



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



Зачем айтишнику английский объяснять, я думаю, не надо, да и большинство айтишников в состоянии читать техническую литературу (кто еще со словарем, кто уже без). Совсем другой вопрос, когда дело заходит об устной речи десятки акцентов носителей не делают жизнь проще, у многих людей наблюдаются проблемы с дикцией, и так далее. Да, некоторые из вас уже смотрят фильмы или сериалы в оригинале, но в фильмах снимаются актёры, и редкого человека возьмут в актёры, если у него проблемы с дикцией. Но даже начав смотреть фильмы в оригинале, сколько из вас подключают английские, или, реже, русские субтитры и читают фильмы годами, не сильно продвигаясь в понимании на слух?

Моя основная идея состоит в использовании умных колонок. Они изначально лишены графического интерфейса, и ваше взаимодействие будет ограничено голосовым интерфейсом. Вы будете потихоньку тренировать ваше произношение и гораздо активнее ваше понимание на слух.

В качестве двух базовых вариантов рассмотрим две колонки-шайбы: Amazon Echo Dot и Google Home Mini. Я специально взял эксперимента ради самые дешевые колонки, но их оказалось достаточно, чтобы прокачать около 20 квадратных метров зала, в котором я обычно нахожусь. Для любителей погромче можно рассмотреть более мощные и дорогие варианты, но с точки зрения программных возможностей в интересующем нас ключе они все одинаковые внутри одного вендора.

Некоторые говорят, правило 10 000 часов работает, другие говорят, что нет, но независимо от мнений, все сходятся в том, что без практики закрепление любых навыков идёт очень слабо.

Итак, что же умеют делать умные колонки?

Начнём с описания основных возможностей Google Home Mini.
1. Читать новости.
Для Google Home Mini можно попросить прочитать некие случайные новости, которые попадут под фильтр. Есть два варианта, первый, просто просим колонку в виде диалога:
- Okay Google, tell me news.
- Here is the latest news...
- Okay Google, tell me financial news
- Here is the latest business news...
- Okay Google, tell me any news about PS5
- Here is the latest news from the Verge...
I also sent the article and two others to your phone (у меня Android).

Другой вариант настроить Routine (например, на будильник) и там указать список предпочитаемых источников. Вот мой неполный
cписок источников
Reuters TV
CNN News briefing
DW Newsbrief
The New York Times Briefing
BBC Global News
WSJ What's News
Bloomberg First World
Al Jazeera
CNET
Engadget
IGN

2. Воспроизводить подкасты
-Okay Google, play TED Talks Daily podcast (легко понимать на слух)
-OG, play The Daily podcast (легко понимать на слух)
-OG, play Planet Money podcast (легко понимать на слух)
-Okay Google, play Freakonomics podcast (интересный, про экономику, но высокий темп речи)
-Okay Google, play This American Life podcast (высокий темп речи)

их так же можно использовать в Routines.
Больше подкастов можно найти в Google, по простому запросу most popular podcasts
3. Прогноз погоды.
-OK G, tell me the weather forecast for today.
-OK G, tell me the speed of the wind for today. (одна из тех вещей, на которую Алиса до сих пор не дает правильного ответа - скорость ветра и его направление)
-OK G, tell me the weather forecast in Moscow for tomorrow.

4. Курсы валют
-OK G, tell me the exchange rate 1 us dollar to Russian rubles
-One us dollar is approx 78.5 Russian rubles

5. Таймеры и будильники
-OK G, set a timer in 5 minutes.
-OK G, set a timer named Wow in 5 minutes.

-OK G, set an alarm for tomorrow 8 o'clock.

6. Напоминания. Здесь вы сможете вовсю потренировать своё произношение
-OK G, set a reminder
-what's the reminder
-...
-Got it. When you want to be reminded
-...
-OK, and what's time?

7. Можно попросить включить музыку (очень удобно, если у вас есть подписка на YT Music) или музыку с TuneIn. Музыкальный провайдер может быть изменен (по умолчанию YT Music). Здесь тоже имеет значение, то, что и как вы говорите :) Иначе будет включать совсем непохожие вещи.
-OK G, play Solopiano Radio.
-OK, there is Whisperings: Solopiano Radio from TuneIn

8. Шутки. Не знаю, но мне кажется, что они совсем не смешные. Когда-то я изучал английский на сервисах вроде Lingua Leo, и там подборка шуток мне казалась более удачной.
-OK G, tell me a joke


9. Сказки.
-OK G, tell me a fairy tale.
-OK, there is Beauty and the Beast retelling from StoryNory from Google Audio Books.


Больше вариантов для взаимодействия с Google колонкой можно найти здесь:
support.google.com/googlenest/answer/7130274

Amazon Echo: Alexa
1. Воспроизводит предзаписанные новости. Умеет начитывать новости из ряда источников. Но источников гораздо меньше, по сравнению с Google Assistant
- Alexa, tell me the latest news
- Anton, what's you haven't heard today ...

Источников новостей гораздо меньше. После выбора предпочитаемого, остальные автоматом не будут учитываться, если не попросить отдельно. Должен отметить, что новости у Alexa имеют формат т.н. Radio News, специально сформированный для Alexa. Очень часто встречаются новости в формате диалогов с приглашенными гостями.

2. Воспроизводит подкасты
-Alexa, play TED Talks Daily podcast (легко понимать на слух)


3. Прогноз погоды
-Alexa, what's is the weather forecast for tomorrow?

Первый раз она вас шокирует имперской системой мер. Решается просто:
-Alexa, could you use a metric system for weather forecast?

Но теперь она будет вам говорить скорость ветра в километрах в час. Немного непривычно.
Offtopic: кто-нибудь знает, это норма для прогноза погоды в англоговорящих странах, мерять скорость ветра в километрах в час?)
4. Умеет в курсы валют
-Alexa, tell me the exchange rate 1 us dollar to Russian rubles
-This might answer to your question: one us dollar is about 77 Russian rubles and 60 kopeks.


5. В таймеры и будильники
-Alexa, set a timer in 5 minutes

Если включенных таймеров несколько, она может предложить назвать как-нибудь новый таймер.
-Alexa, do I have any timers?
-You have two timers...

-Alexa, set an alarm for tomorrow 8 o'clock.


6. Напоминания.
-Alexa, set a reminder.
...
-What's the reminder for?
...
-When I should remind you?
...
-Ok, I will remind you tomorrow at 10 a.m.


7. Включить музыку.
-Alexa, play Rock music from 90s
-Alexa, play Solopiano radio


8. Пошутить
- Alexa, tell me a joke


9. К сожалению, сказки Alexa рассказывает только при наличии платной (дорогой) подписки Audible Premium. Кстати, одни и те же сказки по-разному начитаны (и из разных текстов) в Audible и StoryNory from Google Playbooks.

Из списка видно, что функциональность колонок примерно одинаковая. Кстати, голос колонки Amazon можно поменять. Можно выбрать один из нескольких акцентов американский, английский, австралийский и так далее.

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

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

Последнее, что я хотел бы упомянуть, так это технику shadowing, или, говоря старым и немодным языком, обычного повторения за кем-то в режиме эха. Если я слышу что-то интересное, то повторяю за диктором или за цифровым помощником. Так, пассивный запас слов и оборотов превращается во вполне активный. Если вы, как и я, не часто общаетесь на английском языке, то эта техника вполне себе сносная замена разговорной практики.

Для прокачки аудирования мне больше понравилась колонка от Google. Потому что она высылает новости, которые прочитала вслух, на телефон и можно посмотреть те слова, что на слух распарсить не удалось. Также подкупает возможность слушать сказки бесплатно. В свою очередь, у Alexa прямо в приложение-компаньон встроен мастер по созданию навыков из заготовок (blueprints). Там их довольно много, но из тех, что мне запомнились, это различные Q&A шаблоны, шаблоны для навыков с памятными датами (Alexa, how many dayes left before my vacation?), шаблоны для навыков с расписаниями (Alexa, whose turn to walk the dog?).

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

Буду рад, если мой опыт окажется полезным для кого-то еще.
Подробнее..

Перевод Переменные CSS курс молодого бойца

13.10.2020 16:15:52 | Автор: admin

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

Основная цель статьи: я хочу иметь место, где лежит все, что я знаю о переменных CSS, чтобы узнать и понять больше. Здесь вы прочитаете обо всем, что должны знать о переменных CSS, включая примеры применения в коде. Вы готовы? Тогда погружаемся.



Введение


Переменные CSS это значения, определенные в документе CSS с целью переиспользования и уменьшения количества избыточных значений CSS. Простой пример:



.section { border: 2px solid #235ad1;}.section-title { color: #235ad1;}.section-title::before { content: ""; display: inline-block; width: 20px; height: 20px; background-color: #235ad1;}


В этом фрагменте #235ad1 встречается трижды. Представьте, что в большом проекте есть разные файлы CSS и вас попросили изменить какой-то цвет. Лучшее, что вы можете сделать использовать поиск и замену.

Такое лучше сделать с помощью переменных CSS. Посмотрим, как определять их. Вначале пишется двойной дефис. Определим переменную в :root (то есть в элементе HTML):

:root { --color-primary: #235ad1;}.section { border: 2px solid var(--color-primary);}.section-title { color: var(--color-primary);}.section-title::before { /* Other styles */ background-color: var(--color-primary);}


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

Именование переменных


Именование CSS не так уж отличается от именования переменных в языках программирования. Корректное имя переменной может содержать латинские буквы и цифры, подчеркивания, тире. Важно упомянуть, что переменные CSS чувствительны к регистру.

/* Valid names */:root {--primary-color: #222;--_primary-color: #222;--12-primary-color: #222;--primay-color-12: #222;}/* Invalid names */:root {--primary color: #222; /* Spacings are not allowed */--primary$%#%$#}


Область видимости


Что полезно в переменных CSS, так это то, что мы можем указывать область видимости. Принцип аналогичен тому, что и в языках программирования. Возьмем JavaScript, например:

let element = "cool";function cool() { let otherElement = "Not cool"; console.log(element);}


Переменная element глобальная, поэтому доступна внутри функции cool(). Однако переменная otherElement доступна только в функции cool(). Применим этот принцип к переменным CSS.

:root { --primary-color: #235ad1;}.section-title { --primary-color: d12374; color: var(--primary-color);}


Переменная --primary-color глобальна и может быть доступна из любого элемента документа. Переопределяя ее в рамках блока объявления .section-title, ее новое значение работает только там. Визуальный пример показывает лучше:



Мы имеем --primary-color, используемую для цвета заголовка раздела. Мы можем настроить цвет для избранных авторов и последнего раздела статьи, когда переопределяем их. То же применимо к переменной --unit. Вот CSS для рисунка выше:

/* Global variables */:root { --primary-color: #235ad1; --unit: 1rem;}/* Section title default color and spacing */.section-title { color: var(--primary-color); margin-bottom: var(--unit);}/* Overrding the section title color */.featured-authors .section-title { --primary-color: #d16823;}/* Overrding the section title color & spacing */.latest-articles .section-title { --primary-color: #d12374; --unit: 2rem;}


Резервные значения


Резервное значение не означает, что мы обеспечиваем значение для браузера, который не поддерживает CSS. Эту возможность мы можем использовать с помощью переменных CSS. Посмотрите на пример:

.section-title { color: var(--primary-color, #222);}


Обратите внимание: функция var() имеет несколько значений. Второй вариант #222 работает только тогда, когда переменная --primary-color по какой-то причине не определена. Мало того, мы можем вложить var() в другую var().

.section-title { color: var(--primary-color, var(--black, #222));}


Эта особенность полезна, когда значение зависит от определенного действия. Резервное значение важно предоставить, когда у переменной нет значения.

Примеры использования


Управление размером компонента





Обычное дело иметь несколько размеров кнопки в дизайн-системе: маленький, средний и большой. Размеры проще описать с помощью переменной CSS.

.button { --unit: 1rem; padding: var(--unit);}.button--small { --unit: 0.5rem;}.button--large { --unit: 1.5rem;}


Изменяя значение --unit внутри области видимости компонента кнопки мы создаем разные варианты кнопки.

Переменные CSS и цвета HSL


HSL английская аббревиатура: оттенок, насыщенность, яркость.



:root { --primary-h: 221; --primary-s: 71%; --primary-b: 48%;}.button { background-color: hsl(var(--primary-h), var(--primary-s), var(--primary-b)); transition: background-color 0.3s ease-out;}/* Making the background darker */.button:hover { --primary-b: 33%;}


Обратите внимание, как темнеет кнопка с уменьшением значения переменной --primary-b.

Если хочется узнать больше о цветах в CSS, я написал о них подробную статью .

Пропорциональное изменение размера


Если вы работали с Photoshop, Sketch, Figma или Adobe XD, то у вас может возникнуть идея удерживать клавишу Shift для пропорционального изменения размера элемента. В CSS нельзя сделать такое напрямую, но есть обходной путь с применением переменных CSS.



Предположим, есть иконка, которая должна быть квадратной. Я определил переменную --size и использовал ее как для ширины, так и для высоты.

.icon { --size: 22px; width: var(--size); height: var(--size);}


Вот оно! Теперь вы можете имитировать эффект Shift, изменяя только значение переменной --size. Вы можете узнать больше об этом здесь.

CSS Grid


Переменные CSS могут быть крайне полезны для сеток.



.wrapper { --item-width: 300px; display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--item-width), 1fr)); grid-gap: 1rem;}.wrapper-2 { --item-width: 500px;}


Благодаря этому мы можем создать полную сеточную систему, гибкую, простую в обслуживании и переиспользуемую. Тот же принцип применим к свойству grid-gap.

.wrapper { --item-width: 300px; --gap: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--item-width), 1fr));}.wrapper.gap-1 { --gap: 16px;}




Сохранение наполненных значений


Градиенты CSS


Под наполненными значениями я имею в виду, например, градиент. Когда у вас есть используемые в системе градиент или фон, их можно сохранить в переменной CSS.

:root { --primary-gradient: linear-gradient(150deg, #235ad1, #23d1a8);}.element { background-image: var(--primary-gradient);}


Или сохранить одно значение. Возьмем, к примеру, угол наклона:

.element { --angle: 150deg; background-image: linear-gradient(var(--angle), #235ad1, #23d1a8);}.element.inverted { --angle: -150deg;}




Положение фона


Возможно включить значения в переменную. Это полезно, когда элемент позиционируется в зависимости от контекста.



.table { --size: 50px; --pos: left center; background: #ccc linear-gradient(#000, #000) no-repeat; background-size: var(--size) var(--size); background-position: var(--pos);}


Переключение между темным и светлым режимами


Темный и светлый режимы сейчас востребованы для веб-сайтов как никогда. С помощью переменных CSS мы можем хранить две их версии и переключаться между ними в зависимости от предпочтений пользователя или системных настроек.



:root { --text-color: #434343; --border-color: #d2d2d2; --main-bg-color: #fff; --action-bg-color: #f9f7f7;}/* A class added to the <html> element*/.dark-mode { --text-color: #e9e9e9; --border-color: #434343; --main-bg-color: #434343; --action-bg-color: #363636;}


Your browser does not support HTML5 video.


Установка значения по умолчанию


Иногда нужно установить переменную CSS с помощью JavaScript . Например, нужно получить высоту расширяемого компонента. Я узнал об этой технике из статьи Майкла Шарнагла.

Переменная --details-height-open пуста. Она добавляется к определенному элементу HTML. Он будет содержать пиксельное значение. Когда по какой-то причине Javascript не работает, важно указать правильное значение по умолчанию или резервное значение.

.section.is-active { max-height: var(--details-height-open, auto);}


Значение auto это резервное значение на случай сбоя JavaScript и отсутствия переменной CSS --details-height-open.

Управление шириной враппера





Враппер веб-сайта может иметь несколько вариантов. Может быть, вам нужна небольшая обертка для страницы, но большая для другой. В таком случае полезны переменные CSS.

.wrapper { --size: 1140px; max-width: var(--size);}.wrapper--small { --size: 800px;}


Встроенные стили


Переменные CSS со встроенными стилями открывают множество возможностей, о которых вы, возможно, не знали. Об этом я написал статью, но здесь я упомяну некоторые интересные варианты применения. Возможно, такой подход не идеален для реально работающих веб-сайтов, но он может быть полезен при создании прототипов и в тестировании различных идей.

Элементы динамической сетки


Добавляем переменную --item-width внутри атрибута style и все. Такой подход помогает, например, в создании прототипов сеток.

<div class="wrapper" style="--item-width: 250px;"> <div></div> <div></div> <div></div></div>


.wrapper { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--item-width), 1fr)); grid-gap: 1rem;}


Демо

Аватары пользователей





Полезный вариант применения определение размеров элементов. Допустим, нужно четыре разных размера аватара пользователя с возможностью контроля размера с помощью только одной переменной.

<img src="user.jpg" alt="" class="c-avatar" style="--size: 1" /><img src="user.jpg" alt="" class="c-avatar" style="--size: 2" /><img src="user.jpg" alt="" class="c-avatar" style="--size: 3" /><img src="user.jpg" alt="" class="c-avatar" style="--size: 4" />

.c-avatar { display: inline-block; width: calc(var(--size, 1) * 30px); height: calc(var(--size, 1) * 30px);}


Проанализируем CSS выше:

  • Во-первых, у нас есть var(--size, 1). Я добавил резервное значение на случай, если оно не добавлено в атрибут style.
  • Минимальный размер аватара 30*30 пикселей.


Медиа-запросы


Комбинирование переменных CSS и медиа-запросов очень полезно в настройке переменных, применяемых на всем веб-сайте. Самый простой пример, о котором я думаю, изменение значения отступов.

:root { --gutter: 8px;}@media (min-width: 800px) { :root {  --gutter: 16px; }}


Любой элемент с --gutter, изменит отступ в зависимости от размера области просмотра. Разве это не здорово?

Наследование


Да, переменные CSS наследуются. Если в родительском элементе определена переменная, дочерние элементы наследуют ее. Пример:

<div class="parent"> <p class="child"></p></div>


.parent { --size: 20px;}.child { font-size: var(--size);}


Элемент .child будет иметь доступ к переменной --size в результате наследования ее от своего родителя. Интересно, правда? Как извлечь из этого пользу? Что ж, вот пример из жизни.



У нас есть группа действий с такими требованиями:

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


<div class="actions"> <div class="actions__item"></div> <div class="actions__item"></div> <div class="actions__item"></div></div>


.actions { --size: 50px; display: flex; gap: calc(var(--size) / 5);}.actions--m { --size: 70px;}.actions__item { width: var(--size); height: var(--size);}


Обратите внимание, как --size используется для свойства зазора flexbox. Это означает, что интервал может быть динамическим и будет зависеть от переменной --size.

Другой полезный пример наследование переменных CSS для настройки анимации. Ниже вы видите пример из этой статьи Сандрины Перейры в блоге CSS Tricks.

@keyframes breath { from {  transform: scale(var(--scaleStart)); } to {  transform: scale(var(--scaleEnd)); }}.walk { --scaleStart: 0.3; --scaleEnd: 1.7; animation: breath 2s alternate;}.run { --scaleStart: 0.8; --scaleEnd: 1.2; animation: breath 0.5s alternate;}


При таком подходе не нужно определять @keyframes дважды. Значения наследуются из .walk и .run.

Как работает валидация переменных CSS


Когда переменная CSS внутри функции var() невалидна, браузер заменяет ее начальным или унаследованным значением в зависимости от свойства.

:root { --main-color: 16px;}.section-title { color: var(--main-color);}


Я использовал 16 пикселей это значение свойства цвета. Значение неправильное. Поскольку свойство цвета наследуются, вот, что сделает браузер:

  • Свойство наследуемо?


  • Если да, есть ли у родителя это свойство?


  • Да: значение наследуется
  • Нет: устанавливается по умолчанию


  • Если нет, устанавливается начальное значение


Диаграмма показывает работу браузера:



Некорректное вычисленное значение


Вышеупомянутое технически называется некорректное вычисленное значение. Это происходит, когда var() ссылается на переменную CSS ее начальным значением или использует допустимую переменную CSS с недопустимым значением свойства.

Посмотрим на пример, о котором я узнал из этой статьи пользователя Lea Verou.

.section-title { top: 10px; top: clamp(5px, var(--offset), 20px);}


Когда браузер не поддерживает функцию clamp(), будет ли top: 10px работать как резервное значение. Короткий ответ нет. Причина в том, что когда браузер обнаружил невалидное значение, он уже отбросил другие значения. Это означает, что top: 10px будет игнорироваться

Согласно спецификации CSS:

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

То есть когда вы хотите использовать не распространенную функцию CSS и в ней есть переменная CSS, работайте с @supports. Вот как Леа Веру использовала эту технику в своей статье:

@supports (top: max(1em, 1px)) { #toc {  top: max(0em, 11rem  var(--scrolltop) * 1px); }}


Интересные находки


URL как значение


Возможно, вы не можете контролировать все ресурсы на веб-странице. Некоторые из них должны размещаться в интернете. В этом случае вы можете сохранить URL-адрес ссылки в переменной CSS.

:root { --main-bg: url(http://personeltest.ru/aways/example.com/cool-image.jpg);}.section { background: var(--main-bg);}


Можно задаться вопросом: можно ли интерполировать CSS-переменные с помощью url(). Посмотрим на пример:

:root { --main-bg: https://example.com/cool-image.jpg;}.section { background: url(var(--main-bg));}


Это невозможно: var(--main-bg) рассматривается как сам URL, который недопустим. К тому моменту, когда браузер вычислит это значение, оно уже не будет действительным и не будет работать, как ожидалось.

Хранение нескольких значений


Полезно то, что возможно хранить несколько значений независимо от значения переменной. Если они невалидны, то это должно сработать. Посмотрим на пример:



:root { --main-color: 35, 90, 209;}.section-title { color: rgba(var(--main-color), 0.75);}


В этом примере у нас есть функция rgba(). Значения RGB хранятся в переменной CSS, разделенной запятой. Это может обеспечить гибкость в случае, когда вы хотите настроить прозрачность в зависимости от элемента.

Единственный недостаток невозможно настроить значение rgba с помощью палитры цветов DevTools. Если это важно для вашего варианта применения или проекта, то вам, возможно, придется пересмотреть использование rgba, как описано выше.

Другой пример применение этого свойства со свойством background.

:root { --bg: linear-gradient(#000, #000) center/50px;}.section { background: var(--bg);}.section--unique { background: var(--bg) no-repeat;}


У нас есть два раздела. Один из них требует, чтобы фон не повторялся по осям X и Y.

Анимация переменных внутри правила @keyframes


Если вы читали спецификацию для переменных, вы могли прочитать термин animation-tainted испорченная анимация. Идея в том, что при использовании CSS-переменной внутри правила @keyframes она не может работать в анимации.

<div class="box"></div>

.box { width: 50px; height: 50px; background: #222; --offset: 0; transform: translateX(var(--offset)); animation: moveBox 1s infinite alternate;}@keyframes moveBox { 0% {  --offset: 0; } 50% {  --offset: 50px; } 100% {  --offset: 100px; }}


Анимация не будет работать гладко. Прямоугольник анимируется только на значениях (0, 50px, 100px). Согласно спецификации CSS:

Любое пользовательское свойство в правиле @keyframes анимируется. Это влияет на то, как оно обрабатывается при обращении к нему через функцию var() в свойстве анимации. Когда хочется, чтобы вышеприведенная анимация работала, мы должны анимировать по-старому. То есть нужно заменить переменную фактическим свойством CSS.

@keyframes moveBox { 0% {  transform: translateX(0); } 50% {  transform: translateX(50px); } 100% {  transform: translateX(100px); }}




Обновление: 9 октября 2020 года


Данни Винтер указал, что можно анимировать CSS-переменные внутри ключевых кадров, регистрируя их с помощью @property. Сейчас это поддерживается в браузерах Chromium.

@property --offset { syntax: "<length-percentage>"; inherits: true; initial-value: 0px;}




Расчеты


Возможно, вы не знаете, что с переменными CSS можно выполнять вычисления. Рассмотрим следующий пример, который я объяснял ранее.

.c-avatar { display: inline-block; width: calc(var(--size, 1) * 30px); height: calc(var(--size, 1) * 30px);}


У нас могут быть вариации аватара. Я установил значение по умолчанию в 1, поэтому размер по умолчанию равен (30px * 30px). Обратите внимание на различные вариации классов и на то, как изменение значения --size приводит к изменению размера аватара.

.c-avatar--small { --size: 2;}.c-avatar--medium { --size: 3;}.c-avatar--large { --size: 4;}


В DevTools есть несколько полезных трюков, чтобы облегчить нам работу с переменными CSS. Давайте исследуем их!

Возможность увидеть значение цвета


Разве не полезно видеть визуальный индикатор для значения цвета или фона, когда вы используете переменную CSS? Chrome и Edge показывают цвет.



Вычисленные значения


Чтобы увидеть вычисленное значение, наведите указатель мыши или кликните в зависимости от браузера.



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

Автозавершение переменных CSS


В большом проекте трудно запомнить все имена переменных. Но можно ввести --, какие-то символы и получить список с переменными CSS на странице. Это работает в Chrome, Firefox и Edge.

Отключение переменной


Когда вам нужно отключить переменную CSS от всех использующих ее элементов, это можно сделать, сняв флажок с элемента, для которого она определена. Смотрите рисунок ниже:



Заключение


Я счастлив, что у меня наконец-то есть для них отдельная страница. Я надеюсь, что вы нашли это полезным, и если да, пожалуйста, поделитесь информацией. Спасибо за чтение!

Я пишу электронную книгу


Рад сообщить вам, что пишу электронную книгу об отладке CSS.



Если вам интересно, перейдите на debuggingcss.com и подпишитесь на обновления о книге.

image




Читать еще


Подробнее..

Один день удаленного тимлида на бэкенде

13.10.2020 16:15:52 | Автор: admin

Привет, Хабр! Я - бэкенд разработчик на удаленке из Максилекта. Сейчас я работаю на внутреннем проекте компании, который мы реализуем совместно с зарубежным партнером. На собственных проектах с высокими нагрузками и ограниченными серверными ресурсами бывает всякое. Иногда у нас идет размеренная работа, а в другой момент мы целый день горим в пожарах на продакшене. Но в отличие от многих других проектов, здесь есть свобода выбора архитектуры, а вся ответственность за принятые технические решения на тебе. Каждое твое улучшение может привести к тому, что для обработки входящего трафика потребуется на один сервер больше или, наоборот, на один меньше. Это и воодушевляет, и влияет на всю твою работу, вплоть до распорядка дня. Продолжая рассказ своего коллеги с фронта, в этой статье я расскажу, как выглядит мой рабочий день.

Мое рабочее местоМое рабочее место

Вряд ли мое расписание можно назвать стандартным. Я - тимлид, но не вижу себя в будущем управленцем. В свое время я уже руководил Java-разработкой в одном из офисов крупного телекома, но понял, что мне интереснее программировать. Больше всего на свете мне нравится решать технические задачи. И согласился на статус тимлида в Максилекте я только потому, что в этом качестве можно сильнее влиять на принятие технических решений. Рядовой разработчик, конечно, может высказывать мнение, но конечный выбор будет не за ним. В этом смысле у него связаны руки. А тимлид обладает большей свободой действий, и мне это нравится. Наблюдая, как развивается наш проект, я захотел решить накопившиеся проблемы - люблю делать хорошие системы.

Я уже упомянул, что не планирую развиваться дальше на управляющем поприще. Чем дальше ты идешь, тем меньше времени тратишь на то, что наиболее интересно. А я не вижу себя ни в какой другой роли. Да и на рынке труда в статусе сениор-разработчика из региона чувствую себя более уверенно: даже в Краснодаре в офисе можно быстро найти работу, не говоря уже о множестве предложений на удаленке. Руководителям в этом смысле сложнее. Так что я выполняю задачи тимлида, но стараюсь сохранить максимальную связь с разработкой.

7:00

Я - жаворонок, просыпаюсь вместе с солнцем часов в 6 или 7 утра.

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

10:00

В 10 утра мы проводим дейли с командой. Мы собираемся максимум на 15 минут. Если такая встреча затягивается, участники начинают отвлекаться, поэтому я сознательно останавливаю все затягивающиеся обсуждения. Под такие темы лучше запланировать отдельную встречу, позвав на нее только тех, кого этот вопрос касается непосредственно. Людей в команде много, у всех разный профиль, так что это сильно экономит время.

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

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

10:15

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

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

Мы живем двухнедельными спринтами. Релизы выпускаются по понедельникам раз в две недели. И в первые дни каждого спринта у нас идет планирование предстоящих задач. Обычно я ставлю его на утро, пока у всех еще голова свежая.

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

13:00

Я не особо требователен к условиям работы и графику жизни. У меня нет жесткого обеденного времени или ритуала, который я бы использовал, чтобы разгрузить голову. Но летом в обеденное время мы с женой иногда гуляем по побережью Азовского моря. У нас есть небольшая квартирка на берегу, куда мы приезжаем летом. Иногда в середине дня мы идем по берегу обедать в столовую - получается отличная прогулка. Зимой я работаю из Краснодара, там таких возможностей нет.

14:00

В течение всего рабочего процесса я остаюсь на связи с командой упомянутого партнера. Как и со своей командой, созваниваемся мы только по срочным вопросам, например по проблемам на продакшене. Допустим, резко падает количество кликов по сравнению с предыдущими днями. В этой ситуации я подключаюсь и смотрю, что же там происходило. Чтобы лишний раз не дергать свою команду, разработчиков и тестировщиков я к общению с партнером не подключаю. Если требуется их помощь, формулирую просьбу в виде готовой задачи.

Хотя больше всего я люблю решать технические задачи, в статусе тимлида я очень редко сижу и что-то программирую. Обычно весь день занимаюсь решением разного рода вопросов - от установки конкретных версий на тестовый стенд, до внедрения новых технологий. Это огромный спектр задач. К примеру, начали мы вводить testcontainers - подключили библиотеку. Локально у разработчиков все работает, а с GitLab возникли проблемы (когда мы пушим наш код в GitLab, он тоже гоняет тесты, и там они не заработали). Разработчик сам не смог решить проблему из-за отсутствия доступа к конфигурации GitLab, так что тут пришлось подключиться мне. У меня доступа тоже не было, но с помощью коллег вопрос решили. И такие задачи заполняют почти целый день.

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

17:00

Как я уже говорил, мы живем двухнедельными спринтами, выпускаясь в понедельник. В пятницу вечером в конце спринта я создаю встречу на команду - мы проводим ретро, подводим итоги прошедших двух недель. Итоги каждого ретро у нас отражены в Confluence. Естественно, проблемы, которые подсвечиваются на этих встречах, мы стараемся по мере возможностей решать.

19:00

У меня нет привычного для многих жесткого окончания рабочего дня. Я знаю, что принципы разграничения работы и отдыха хорошо бы иметь, но я привык жить именно так. Если есть интересная задача - я работаю. Такое расписание у меня с первых курсов Университета, когда я одновременно и учился, и работал. Вечер, а также субботу и воскресенье, я воспринимаю, как хорошее время, чтобы привести свои дела в порядок.

22:00

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

Автор статьи: Андрей Буров, Максилект.

P.S. Мы публикуем наши статьи на нескольких площадках Рунета. Подписывайтесь на наши страницы в VK, FB, Instagram или Telegram-канал, чтобы узнавать обо всех наших публикациях и других новостях компании Maxilect.

Подробнее..

Перевод Система рекомендаций фильмов с GUI на Python

14.10.2020 18:14:52 | Автор: admin

Без опыта я никому не нужен! Где взять опыт? часто думают люди, осваивающие новую для себя сферу или изучающие новый язык программирования. Решение есть делать пет-проекты. Представленный под катом проект системы рекомендации фильмов не претендует на сложность и точность аналогичных систем от энтерпрайз-контор, но может стать практическим стартом для новичка, которому интересны системы рекомендации в целом. Этот пост также подойдет для демонстрации как использовать Python-библиотеку EasyGUI на практике.

Важное предупреждение: если вы крепкий миддл либо сеньор, то проект может показаться вам простым. Однако не стоит спешить опускать палец вниз и забывать про тех, кто не так опытен, и кому пост может быть полезен, ведь все мы когда-то были джунами.



Начало работы


В этой статье я расскажу, как создать базовую систему рекомендаций фильмов со встроенным графическим пользовательским интерфейсом. Прежде всего нам нужны данные. Чтобы получить хорошее представление о том, насколько хорошо система рекомендаций работает на самом деле, нам понадобится довольно большой набор данных. Используем MovieLens на 25M, который вы можете скачать здесь. Набор данных состоит из шести файлов .csv и файла readme, объясняющих набор данных. Не стесняйтесь взглянуть на него, если хотите. Мы будем использовать только эти три файла:

movies.csv; ratings.csv; tags.csv

Также потребуется несколько библиотек Python:

  1. NumPy
  2. Pandas
  3. Progress (pip install progress)
  4. Fuzzywuzzy (pip install fuzzywuzzy & pip install python-Levenshtein)
  5. EasyGUI

Вероятно, все они могут быть установлены через pip. Точные команды будут зависеть от ОС. Кроме того, должна работать любая IDE Python (см. материал по ним вот тут). Я пользуюсь Geany, легкой IDE для Raspbian. Посмотрим на набор данных:


movies.csv

Выше показан файл movies.csv с тремя столбцами данных, а именно: movieId, title и genres идентификатор фильма, название и жанр. Все очень удобно и просто. Будем работать со всеми тремя.

Ниже мы видим tags.csv. Здесь используются только столбцы movieId и tag, связывающие тег со столбцом movieId, которые также есть в файлах movies.csv и rating.csv.


tags.csv

И последний, но не менее важный файл: rating.csv. От этого парня мы возьмем столбцы movieId и rating.


ratings.csv

Отлично, теперь давайте запустим IDE и начнем. Импортируем библиотеки, как показано ниже. Pandas и NumPy хорошо известны в области Data Science. Fuzzywuzzy, EasyGUI и библиотека Progress менее известны^ судя по тому, что мне удалось собрать, однако вы, возможно, знакомы с ними. Я добавлю в код много комментариев, чтобы все было понятно. Посмотрите:



Программа в основном состоит из набора функций, кроме начальной загрузки набора данных и настройки дисплея для gui, в который будет подаваться массив NumPy. Без настройки отображения в строке 12, когда список рекомендуемых фильмов из системы слишком длинный, мы получим урезанное и бесполезное изображение.

Есть разные способы сортировки значений на дисплее, например, цикл по массиву и добавление каждой строки к переменной, инициализированной в пустой список, однако этот метод мы будем использовать именно в строке 12.

Строки 16, 17, 33 и 35 это, в основном, индикатор прогресса из библиотеки Progress. Цикл выполняется только один раз. Загрузка набора данных в мою систему занимает около 30 секунд, поэтому мы используем индикатор прогресса, чтобы показать, что набор данных загружается после запуска программы, как показано ниже. После этого нам не придется загружать его снова во время навигации по графическому интерфейсу.



Загрузка набора данных и главное меню графического интерфейса пользователя.

Внутри цикла, набор данных загружается во фреймы Pandas и данные немного изменяются для удобства. Начнем со слияния фильма и рейтингового фрейма в один фрейм. В столбце рейтинга есть несколько значений NaN, и мы будем иметь дело с этим, заполняя его средним рейтингом, вычисленным во всей колонке рейтингов. Поскольку некоторые фильмы имеют оценки с сотен площадок, мы хотим получить средний рейтинг каждого фильма и сгруппировать фильмы по movieId, который связан с названием фильма. Теперь, когда с данными проще работать, пришло время создавать функции.

Первая функция называется which_way(). Эта функция вызывает главное меню графического интерфейса пользователя и предлагает сделать выбор. Ищите фильмы по жанру или по тегу. Пользователь, конечно, тоже может нажать кнопку отмены и вообще не искать фильмы, это полностью его дело.


which_way()

Внутри функции мы определяем параметры для EasyGUI chiocebox, который отображается пользователю. Строка параметра, которую вводит пользователь, возвращается и сохраняется в переменной fieldValues. После условный оператор направляет пользователя к следующей функции или окну на основе выбора.

Если пользователь нажимает отмену, программа завершается. Но если пользователь нажимает поиск фильмов по жанру или поиск фильмов по тегу, то будут вызваны функции genre_entry() или tag_entry() и появится что-то, известное как EasyGUI multenterbox.



Из названия понятно, что это поле ввода может принимать несколько входных значений, когда необходимо. Обе функции genre_entry() и tag_entry() очень похожи, поэтому я объясню только одну из них, но в исходный код включу обе. Давай посмотрим на tag_entry().



После передачи параметров отображения multenterbox вызывается другая функция, которая проверяет ввод данных пользователем. Пользовательский ввод возвращается функцией field_check. Давайте взглянем на нее:



Иногда пользователи оставляют значение в поле пустым, возможно, по ошибке. Чтобы контролировать такое поведение, а также сделать графический интерфейс более надежным, нам нужны такие функции. Я нашел эту конкретную функцию на странице документации EasyGUI. По сути, пока вы вводите пустое поле, вам сообщат, что это поле является обязательным, и вы застрянете в цикле.



Как только пользователь что-то вводит, текст (строка) сохраняется в переменной fieldValues, а код работает со строки 114 в функции tag_entry. Пользовательский ввод из поля EasyGUI multenter возвращается в виде списка. При нажатии кнопки отмены возвращается Нет. Чтобы использовать этот ввод и в других функциях, нам нужно объявить переменную как глобальную.

Теперь мы нарезаем список пользовательского ввода из multenterbox, и сохраняем как переменную user_input_2. Нас интересует только возвращаемый текст, если пользователь не нажимает кнопку отмены, отсюда и условный оператор:

if fieldValues != None:

Если пользователь был достаточно любезен, чтобы ввести какой-то текст, мы переходим к функции Similarity_test2(), которая в основном содержит базовые аспекты этой системы рекомендаций, в качестве альтернативы пользователь возвращается в главное меню. Similarity_test1() и Similarity_test2() очень похожи, так же как genre_entry и tag_entry. Я буду рассматривать здесь только Similarity_test2(). Давайте посмотрим на это:



Как мы видим, она принимает один параметр, переменнаую user_input_2 из функции tag_entry(). Помните тот фрейм данных, который мы создали в строке 19 из файла tags.csv? Сначала мы хотим собрать все уникальные теги из столбца тегов и сохранить их в переменной.

Существует множество способов применения библиотеки Fuzzywuzzy в зависимости от ваших задач. Мы будем работать так: output = process.extract(query, choices)

Можно передать дополнительный параметр тип счетчика. Мы просто будем использовать синтаксис по умолчанию. По сути Fuzzywuzzy работает с расстоянием Левенштейна для вычисления различий между последовательностями и возвращает оценку в пределах 100%.

Функция process.extract(query, choices) возвращает список оценок, где каждая строка и ее оценка заключена в скобки, например (строка 95) в качестве элементов списка.

После перебора всего списка тегов и поиска совпадений с переменной user_input_2, мы перебираем список оценок и вырезаем только совпадения выше 90% и сохраняем их в переменной final_2. Мы объявляем его глобальным, чтобы использовать в следующей функции. Если fuzzywuzzy не нашел для нас соответствия, вернется []. Если совпадение по условию не найдено, просим пользователя повторить попытку, вернувшись к функции tag_entry(). В качестве альтернативы, когда у нас есть совпадения более чем на 90%, мы можем использовать их в функции tag(), как показано ниже:



tag()

Теперь, когда у нас есть совпадения более 90%, перебираем их в цикле и просматриваем каждую строку столбца tag фрейма данных df_tags, чтобы увидеть, какие теги соответствуют строкам из Fuzzywuzzy. Теперь сохраняем все совпадения тегов вместе с идентификатором movieId в переменной final_1. Чтобы очистить добавленные данные, мы отрезаем первый элемент и сбрасываем индекс фрейма данных. Теперь можно удалить столбец с именем index и все дубликаты из столбца movieId. Чтобы фильмы с наивысшим рейтингом отображались первыми в порядке убывания, отсортируем фрейм данных и удалим фильмы с рейтингом меньше 2,5/5,0.

Теперь мы можем вставить новую строку во фрейм данных прямо вверху и дублировать имена столбцов над ними. Это делается только для отображения EasyGUI. Элементу codebox не очень нравится фрейм данных pandas, поэтому нужно изменить формат фрейма.

Преобразуем каждый столбец фрейма в список, а затем повторно соберем его с помощью numpy. Да, мы просто убираем скобки и переходим к окну codebox для отображения списка. Это всё! Давайте найдем фильм по тегу: hacker и посмотрим, что покажут рекомендации.



Программа работает. Не стесняйтесь экспериментировать с ней и, пожалуйста, дайте мне знать, если я где-то ошибся!

Исходный код проекта
# импорт библиотекfrom fuzzywuzzy import fuzz from fuzzywuzzy import processfrom progress.bar import IncrementalBarfrom easygui import *import easygui as guiimport pandas as pdimport numpy as npimport sys# максимальное увеличение размера массива отображения numpy для отображения easygui np.set_printoptions(threshold=sys.maxsize)# фрейм данных относительно большой, начальная загрузка займет около 30 секунд# в зависимости от вашего компьютера, поэтому здесь уместна индикация загрузкиprogress_bar = IncrementalBar('Loading Movie Database...', max=1)for i in range(1):    # чтение файлов csv    df_tags = pd.read_csv("tags.csv", usecols = [1,2])    df_movies = pd.read_csv("movies.csv")    df_ratings = pd.read_csv("ratings.csv", usecols = [1,2])        # объединение столбцов из отдельных фреймов данных в новый фрейм    df_1 = pd.merge(df_movies ,df_ratings, on='movieId', how='outer')    # заполнение значений NaN средним рейтингом    df_1['rating'] = df_1['rating'].fillna(df_1['rating'].mean())     # группирование строк df по среднему рейтингу фильма    df_1 = pd.DataFrame(df_1.groupby('movieId')['rating'].mean().reset_index().round(1))    # добавление столбцов title и genres в df    df_1['title'] = df_movies['title']    df_1['genres'] = df_movies['genres']        progress_bar.next()    # заполнение индикатора загрузки при успешной загрузке progress_bar.finish()def which_way():    '''    Эта функция, которая выполняется при запуске программы.     Работает как перекресток, вы выбираете поиск фильмов по    тегу или по жанру. По выбору пользователь переходит к следующему окну.    '''    # определение параметров easygui choicebox    msg = "Choose an option:"    title = "Main Menu"    choices = ["Search recommended movies by genre:","Search recommended movies by tag:"]    fieldValues = choicebox(msg,title, choices)        # переменная fieldValues - это пользовательский ввод, который возвращается из графического интерфейса    # условный оператор, направляющий пользователя к следующему интерфейсу на основе ввода    if fieldValues == "Search recommended movies by genre:":        genre_entry()        elif fieldValues == "Search recommended movies by tag:":        tag_entry()def field_check(msg, title, fieldNames):    '''    Эта функция проверяет отсутствие вводимых пользователем значений в multenterbox    и возвращает пользовательский ввод как переменную fieldValues.        Параметры:        msg, title и fieldnames графического интерфейса multienterbox        '''        fieldValues = multenterbox(msg, title, fieldNames)        # Цикл с условием, чтобы проверить,    # что поля ввода не пусты    while 1:        if fieldValues is None: break        errmsg = ""        for i in range(len(fieldNames)):            if fieldValues[i].strip() == "":                errmsg += ('"%s" is a required field.\n\n' % fieldNames[i])        if errmsg == "":            break # если пустых полей не найдено, перейти к следующему блоку кода        # cохранить пользовательский ввода в виде списка в переменной fieldValues        fieldValues = multenterbox(errmsg, title, fieldNames, fieldValues)        return fieldValuesdef tag_entry():    '''     Эта функция определяет параметры easygui multenterbox и вызывает    field_check, если пользователь вводил значнеие,    вызывает тест на подобие; если совпадение не найдено, пользователь возвращается    в окно ввода    '''        # определение параметров easygui multenterbox    msg = "Enter movie tag for example: world war 2 | brad pitt | documentary \nIf tag not found you will be returned to this window"    title = 'Search by tag'                            fieldNames = ["Tag"]        # вызов field_check() для проверки отсутствия пользовательского ввода и    # сохранения вода как переменной fieldValues    fieldValues = field_check(msg, title, fieldNames)        # Если пользователь ввел значение, сохраняем его в fieldValues[0]    if fieldValues != None:        global user_input_2        user_input_2 = fieldValues[0]                # здесь мы вызываем функцию, которая в основном проверяет строку        # на схожесть с другими строками. Когда пользователь нажимает кнопку отмены, он возвращается в главное меню         similarity_test2(user_input_2)    else:        which_way()def tag():    '''    Эта функция добавляет все совпадающие по тегам фильмы во фрейм данных pandas,    изменяет фрейм данных для правильного отображения easygui, отбросив некоторые    столбцы, сбрасывая индекс df, объединяя фреймы и сортируя элементы так,    чтобы показывались фильмы с рейтингом >= 2.5. Она также преобразует столбцы df в списки    и приводит их в порядок в массиве numpy для отображения easygui.      '''        # добавление тегов найденных фильмов как объекта фрейма    final_1 = []    for i in final_2:        final_1.append(df_tags.loc[df_tags['tag'].isin(i)])        # сброс индекса df, удаление столбца индекса, а также повторяющихся записей    lst = final_1[0]    lst = lst.reset_index()    lst.drop('index', axis=1, inplace=True)    lst = lst.drop_duplicates(subset='movieId')# слияние movieId с названиями и жанрами + удаление тега и идентификатора фильма    df = pd.merge(lst, df_1, on='movieId', how='left')    df.drop('tag', axis=1, inplace=True)    df.drop('movieId', axis=1, inplace=True)# сортировка фильмов по рейтингам, отображение только фильмов с рейтингом выше или равным 2,5    data = df.sort_values(by='rating', ascending=False)    data = data[data['rating'] >= 2.5]    heading = [] # добавление названий столбцов как первой строки фрейма данных для отображения easygui    heading.insert(0, {'rating': 'Rating', 'title': '----------Title',     'genres': '----------Genre'})    data = pd.concat([pd.DataFrame(heading), data], ignore_index=True, sort=True)        # преобразование столбцов фрейма данных в списки    rating = data['rating'].tolist()    title = data['title'].tolist()    genres = data['genres'].tolist()        # составление массива numpy из списков столбцов dataframe для отображения easygui    data = np.concatenate([np.array(i)[:,None] for i in [rating,title,genres]], axis=1)    data = str(data).replace('[','').replace(']','')        # отображение фильмов пользователю    gui.codebox(msg='Movies filtered by tag returned from database:',    text=(data),title='Movies')        which_way()def genre_entry():    '''     Эта функция определяет параметры easygui multenterbox    и вызывает field_check, если пользователь что-то вводил,    вызывается тест на подобие. Если совпадение не найдено, пользователь возвращается    в то же окно      '''    # определение параметров easygui multenterbox    msg = "Enter movie genre for example: mystery | action comedy | war \nIf genre not found you will be returned to this window"    title = "Search by genre"    fieldNames = ["Genre"]        # вызов field_check() для проверки отсутствия пользовательского ввода и    # сохранения ввода в fieldValues.    fieldValues = field_check(msg, title, fieldNames)        # Если пользовательский ввод не пуст, сохраняет его в переменной user_input    if fieldValues != None:        global user_input        user_input = fieldValues[0]            # здесь мы вызываем функцию, которая в основном проверяет строку    # на подобие с другими строками. Если пользователь нажмет кнопку отмена, то он вернется в главное меню         similarity_test1(user_input)    else:        which_way()def genre():    '''    Эта функция добавляет все соответствующие жанру фильмы во фрейм pandas,    изменяет фрейм для правильного отображения easygui, отбросив некоторые    столбцы, сбрасывает индекс df, объединеняет фреймы и сортирует фильмы для отображения    только фильмов с рейтингом >= 2.5. Она также преобразует столбцы конечного df в списки    и приводит их в порядок в массиве numpy для отображения easygui.    '''        # добавление соответствующих жанру фильмов во фрейм.    final_1 = []    for i in final:        final_1.append(df_movies.loc[df_movies['genres'].isin(i)])        # сброс индекса df, удаление индекса столбцов и дубликатов записей    lst = final_1[0]    lst = lst.reset_index()    lst.drop('index', axis=1, inplace=True)    lst.drop('title', axis=1, inplace=True)    lst.drop('genres', axis=1, inplace=True)    lst = lst.drop_duplicates(subset='movieId')        # объединение идентификатора фильма с названием, рейтингом и жанром + удаление индекса, названия и жанра    df = pd.merge(lst, df_1, on='movieId', how='left')        # сортировка по рейтингу, отображение только фильмов с рейтингом выше или равным 2,5    data = df.sort_values(by='rating', ascending=False)    data.drop('movieId', axis=1, inplace=True)    data = data[data['rating'] >= 2.5]    heading = [] # add column names as first dataframe row for easygui display    heading.insert(0, {'rating': 'Rating', 'title': '----------Title',     'genres': '----------Genre'})    data = pd.concat([pd.DataFrame(heading), data], ignore_index=True, sort=True)        # преобразование столбцов фрейма данных в списки    rating = data['rating'].tolist()    title = data['title'].tolist()    genres = data['genres'].tolist()        # составление массива numpy из списков столбцов фрейма для отображения easygui    data = np.concatenate([np.array(i)[:,None] for i in [rating,title,genres]], axis=1)    data = str(data).replace('[','').replace(']','')        # отображение фильмов пользователю    gui.codebox(msg='Movies filtered by genre returned from database:',    text=(data),title='Movies')        which_way()def similarity_test1(user_input):    '''    Эта функция проверяет схожесть строк путем сопоставления пользовательского ввода    для жанров фильмов, совпадения > 90% сохраняется в переменной, которая    затем передается функции жанра для сопоставления с базой данных и    возврата в окно ввода, если совпадение не найдено    '''    # сохранение жанров фильмов в качестве тестовой базы и пользовательского ввода для тестирования     genre_list = df_movies['genres'].unique()    query = user_input    choices = genre_list     # here fuzzywuzzy does its magic to test for similarity    output = process.extract(query, choices)        # сохранение совпадений в переменной и их передача следующей функции    global final    final = [i for i in output if i[1] > 90]        # если совпадений > 90%  не найдено, вернуть пользователя в окно жанра    if final == []:        genre_entry()    else:        genre()def similarity_test2(user_input_2):    '''    Эта функция проверяет схожесть строк путем сопоставления пользовательского ввода    в теги фильмов, совпадение > 90% сохраняется в переменной, которая    затем передается в функцию тега для сопоставления базы данных и    возврата в окно ввода, если совпадение не найдено    '''    # сохранение тега фильма в качестве тестовой базы и пользовательского ввода для тестирования    tag_list = df_tags['tag'].unique()    query = user_input_2    choices = tag_list     # here fuzzywuzzy does its magic to test for similarity    output = process.extract(query, choices)        # сохранение возвращенных совпадений в переменной и их передача следующей функции    global final_2    final_2 = [i for i in output if i[1] > 90]        #если совпадение> 90% не найдено, возврат в окно ввода    if final_2 == []:        tag_entry()    else:        tag()if __name__ == '__main__':    which_way()



image

Получить востребованную профессию с нуля или Level Up по навыкам и зарплате, можно, пройдя наши онлайн-курсы.



Читать еще


Подробнее..

Перевод Как построить диаграмму на Python

16.10.2020 16:14:58 | Автор: admin

Каждый, кому хоть раз приходилось строить диаграммы в draw.io или Google Diagrams, помнит всю утомительность и медлительность этого процесса. Сегодня делимся с вами материалом, в котором шаг за шагом показывается, как можно строить красивые архитектурные диаграммы с помощью Python. Главное удобство встроенные узлы для обозначения сервисов и языков программирования. Только код и никакой мыши.



Предисловие


На этой неделе я наткнулся на ценную библиотеку Python. Эта библиотека называется Diagrams. С помощью этой библиотеки, достаточно быстро создаются красивые диаграммы, какие я мог бы сделать неуклюже вставляя изображения в draw.io или Google Diagrams. Я тратил бы часы, чтобы все правильно выровнять. В дополнение к этому изнурительному труду, когда мне позже нужно было обновить диаграммы, я поднимал и перемещал более половины компонентов ради нескольких изменений в архитектуре. После дальнейшего изучения библиотеки я смог увидеть, что она в состоянии облегчить задачу.

Начало работы


Нам нужен Python 3.6 или выше. Также нужна GraphViz: она визуализирует диаграммы. В репозитории Github есть довольно приличный раздел Начало работы. Мне для начала работы нужно было выполнить такую команду:

pip install diagrams


Код находится здесь.

Типы компонентов


Библиотека диаграмм предоставляет компоненты от различных поставщиков. Вероятно, что-то из этого списка соответствует вашим задачам.

  • AWS/GCP/Azure предоставляют официальные ресурсы облачных сервисов для диаграммы. Моя команда в основном работает в GCP, и я потратил бы часы на создание этих диаграмм вручную, прежде чем наткнуться на эту библиотеку, поэтому я был немного взволнован, когда обнаружил, что узлы у меня под рукой.
  • Универсальные и локальные эти узлы, скорее всего, будут использоваться вместе в случае, если вы хотите проиллюстрировать технологии в облаке независимо от него. Например, предоставление архитектуре компонента Beam поверх отображения Google DataFlow.
  • Фреймворки эти компоненты полезны, когда вы хотите показать язык программирования.
  • SaaS коллекция узлов SaaS, которые можно использовать, когда вы хотите показать, что ваша архитектуре есть уведомления вроде Slack.

Элементы диаграмм


  • Узлы это абстрактное понятие, представляющее собой единый компонент системы.
  • Кластеры позволяют организовать узлы в группы (или кластеры).
  • Ребра отображают связь между узлами.


Первая диаграмма


Теперь, когда вы знаете основные понятия, давайте построим очень простую диаграмму с кодом в том порядке, в котором мы узнали эти понятия. Диаграмма будет описывать простой веб-сайт с балансировкой нагрузки на AWS с базой данных PostgreSQL и кэшем Redis, чтобы показать разнообразие сервисов.

1. Рабочая область диаграммы


Опишем пустую диаграмму с меткой:

from diagrams import Diagramwith Diagram("Simple Website Diagram") as diag:    passdiag # This will illustrate the diagram if you are using a Google Colab or Jypiter notebook.


Код находится здесь.

2. Добавление узлов


Теперь, когда у нас есть рабочее пространство, пришло время добавить узлы веб-сайта. Добавляемые узлы имеют разных поставщиков, это AWS и OnPrem. Скорее всего, если бы вы делали это по-настоящему, вы бы придерживались AWS, поскольку у них есть такие предложения, как RDS и ElastiCache, которые, вероятно, есть в ваших проектах.

from diagrams import Diagram, Clusterfrom diagrams.aws.compute import EC2from diagrams.aws.network import ELBfrom diagrams.aws.network import Route53from diagrams.onprem.database import PostgreSQL # Would typically use RDS from aws.databasefrom diagrams.onprem.inmemory import Redis # Would typically use ElastiCache from aws.databasewith Diagram("Simple Website Diagram") as diag:    dns = Route53("dns")    load_balancer = ELB("Load Balancer")    database = PostgreSQL("User Database")    cache = Redis("Cache")    svc_group = [EC2("Webserver 1"),                 EC2("Webserver 2"),                 EC2("Webserver 3")]diag # This will illustrate the diagram if you are using a Google Colab or Jypiter notebook.

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


Код находится здесь.

3. Группировка узлов (необязательно)


В этом примере мы просто сгруппируем веб-серверы с балансировкой нагрузки. В большом количестве созданных мной диаграмм это не всегда было необходимо, но по мере роста архитектуры группировка узлов в кластеры обычно повышает читабельность. Как видите, что нам просто нужно переместить узлы в область создаваемого кластера.

from diagrams import Diagram, Clusterfrom diagrams.aws.compute import EC2from diagrams.aws.network import ELBfrom diagrams.aws.network import Route53from diagrams.onprem.database import PostgreSQL # Would typically use RDS from aws.databasefrom diagrams.onprem.inmemory import Redis # Would typically use ElastiCache from aws.databasewith Diagram("Simple Website Diagram") as diag:    dns = Route53("dns")    load_balancer = ELB("Load Balancer")    database = PostgreSQL("User Database")    cache = Redis("Cache")    with Cluster("Webserver Cluster"):        svc_group = [EC2("Webserver 1"),                    EC2("Webserver 2"),                    EC2("Webserver 3")]diag # This will illustrate the diagram if you are using a Google Colab or Jypiter notebook.

На рисунке видно, что диаграмма это по-прежнему просто список узлов, но теперь мы сгруппировали соответствующие узлы в логические группировки.


Код находится здесь.

4. Единое целое из компонентов


Здесь мы не будем связывать узлы, организованные для использования в архитектуре. Эта задача обычно занимала у меня больше всего времени, когда нужно было обновить или настроить архитектуру. Смотрите ниже. Мы всего лишь определяем поток к каждому узлу с помощью двойных стрелок, и все готово! Здесь мы связываем узлы без меток, но если вы посмотрите на документацию, то применение меток к вашим связям, то увидите, что это просто.

from diagrams import Diagram, Clusterfrom diagrams.aws.compute import EC2from diagrams.aws.network import ELBfrom diagrams.aws.network import Route53from diagrams.onprem.database import PostgreSQL # Would typically use RDS from aws.databasefrom diagrams.onprem.inmemory import Redis # Would typically use ElastiCache from aws.databasewith Diagram("Simple Website Diagram", direction='LR') as diag: # It's LR by default, but you have a few options with the orientation    dns = Route53("dns")    load_balancer = ELB("Load Balancer")    database = PostgreSQL("User Database")    cache = Redis("Cache")    with Cluster("Webserver Cluster"):        svc_group = [EC2("Webserver 1"),                    EC2("Webserver 2"),                    EC2("Webserver 3")]    dns >> load_balancer >> svc_group    svc_group >> cache    svc_group >> databasediag # This will illustrate the diagram if you are using a Google Colab or Jypiter notebook.

Итоговое изображение можно увидеть ниже, и теперь вы видите логическую связь между узлами диаграммы. Направление связи можно развернуть, изменив порядок узлов. В дополнение к настройке потока вы можете изменить и другие вещи: объект edge содержит три атрибута: метку, цвет и стиль. Я не буду описывать здесь, как это делается. Если вам интересно, ссылка на документацию есть в конце этой статьи, эти атрибуты отражают соответствующие атрибуты GraphViz, что облегчает работу, если вы работали с ребрами graphviz.


Код находится здесь.

Заключение


У этого рабочего процесса большой потенциал, когда речь заходит о возможностях автоматизации и экономия времени при общем обслуживании архитектурной диаграммы. Сэкономленное благодаря этому инструменту время подталкивает использовать этот подход в будущем. Конечно, я буду скучать по усилиям, связанным с ручной настройкой диаграммы, тщательным выравниванием компонентов и стрелок с каждой итерацией моей архитектуры.


А вот еще один лайфхак, но уже не на Python промокод HABR дает дополнительную скидку 10%, которая суммируется со скидкой на баннере.

image




Читать еще


Подробнее..

Перевод Быстрое развертывание любого приложения вместе с Waypoint

19.10.2020 18:20:51 | Автор: admin

К публикуемым в нашем блоге авторским статьям и переводным материалам про лайфхаки/интересные находки мы решили добавить разбор нового проекта. Waypoint опенсорсный проект, предоставляющий разработчикам последовательный рабочий процесс сборки, развертывания и релиза приложений на любой платформе. Waypoint позволяет разработчикам провести свои приложения от разработки до производственной среды в одном файле и развертывать приложения с помощью одной команды: waypoint up. Waypoint из коробки поддерживает Kubernetes, HashiCorp Nomad, Amazon ECS, Google Cloud Run, экземпляры контейнеров Azure, Docker, Buildpacks и не только. Читайте дальше, чтобы увидеть небольшой пример, узнать больше о функциях Waypoint и о проблемах, которые решает инструмент.



Waypoint полностью расширяем и основан на системе плагинов, позволяющей работать с любым инструментом или платформой. После развертывания Waypoint предоставляет логирование и многое другое для проверки и отладки любых развертываний. Это программное обеспечение, которое вы самостоятельно загружаете и размещаете для управления развертыванием приложений, работающих на вашей инфраструктуре или платформах. Далее сам основатель HashiCorp расскажет о Waypoint подробнее.

Упрощение развертывания


Waypoint был создан нами по одной простой причине: разработчики хотят просто развертывать приложения. У HashiCorp есть возможность работать со всеми типами организаций и отдельных лиц нашего сообщества, что ставит нас перед проблемами, с которыми сталкиваются разработчики при развертывании приложений и в разрезе доступности для пользователей. Мы общаемся с десятками отдельных пользователей каждый день через GitHub Issues, дискуссионные форумы, электронную почту и т.д. Каждую неделю мы встречаемся более чем с 500 компаниями, чтобы обсудить их текущие разработки и операционные проблемы.

Благодаря взаимодействию мы увидели, что разработчики, особенно в организациях среднего и крупного размера, завалены сложностью: контейнеры, планировщики, файлы YAML, бессерверность и не только это. Сложность сделала приложения лучше во многих аспектах, но стоимость, которую видно по кривой обучения, требуется, чтобы просто развернуть первое приложение.

Другая проблема, которую мы увидели, зависит от приложения, ведь инструменты часто самые разные: Docker и kubectl для Kubernetes, HashiCorp Packer и Terraform для виртуальных машин, свои инструменты у каждой бессерверной платформы и т.д. Эта фрагментация снова создает проблему обучения отдельного человека. Для команд это уже проблемы последовательности и сложности.

С помощью Waypoint мы стремимся решить эти две проблемы. Waypoint предоставляет одну простую команду для развертывания любого приложения: waypoint up. Рабочий процесс одинаков для любой платформы: Kubernetes, Nomad, EC2, Google Cloud Run и еще более десятка других будет поддерживаться к моменту запуска. Waypoint расширяется с помощью плагинов для любой логики сборки, развертывания и релиза. Разработчики просто хотят развертывать приложения. Waypoint просто делает это.

Функциональность


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

  • waypoint up: единственная команда для сборки, развертывания и релиза приложения. Waypoint использует файл конфигурации, хранящийся вместе с кодом приложения, для определения того, как будет работать. Подробнее о жизненном цикле приложения Waypoint рассказывается в документации Waypoint.
  • URL-адреса развертывания и приложения: Разворачиваемые с помощью Waypoint приложения получают общедоступный URL waypoint.run с действующим сертификатом TLS, который генерируется Let's Encrypt. Используйте этот адрес, чтобы быстро просмотреть развернутые приложения и поделиться ими с лругими людьми.
  • Выполнение команд: выполняйте команды в контексте развертывания через waypoint exec. Вы можете использовать exec для открытия оболочки в вашем приложении, а через нее выполнять отладку, миграцию и другие задачи. Здесь можно узнать больше о команде waypoint exec.
  • Логи: Waypoint предоставляет доступ к моментальному снимку журналов вашего приложения в режиме реального времени. Эти журналы полезны, когда вам нужно отладить поведение развивающегося приложения. Однако они не заменяют комплексные решения для логирования, такие как Datadog или Splunk. Логи агрегируются и доступны через CLI и веб-интерфейс. Здесь можно узнать больше о логах.
  • Веб-интерфейс: в дополнение к простому и мощному CLI, в Waypoint есть веб-интерфейс, позволяющий просматривать сборки, развертывания и релизы проектов и приложений. Сегодня веб-интерфейс можно только читать. Мы непрерывно разрабатываем его и расширим функциональность в будущем. Более того, в графическом интерфейсе будут подсказки о том, как использовать интерфейс командной строки
  • Плагины: логика сборки, развертывания и выпуска полностью расширяема с помощью плагинов. Waypoint поставляется с более чем десятком встроенных плагинов, и любой желающий может расширить функциональность Waypoint, написав свой собственный плагин.


Пример рабочего процесса


Покажем на примере различные особенности Waypoint. Пропущены некоторые шаги настройки, поэтому, если вы хотите попробовать полный пример самостоятельно, пожалуйста, ознакомьтесь с нашими руководствами по началу работы. В этом примере мы развернем приложение в Kubernetes. Создадим рядом с приложением файл waypoint.hcl. Этот файл описывает все этапы жизненного цикла приложения.

project = "HashiCorp Waypoint"app "waypoint-up" {    build {        use "docker" {}        registry {            use "docker" {                image = "hashicorp/wpmini"                tag = gitrefpretty()            }         }              }    deploy {        use "kubernetes" {            probe_path="/"            service_port=80        }     }    release {        use "kubernetes" {            load_balancer=true            port=80         }     }}

Сборка, развертывание, релиз


Файл конфигурации Waypoint описывает три основных этапа жизненного цикла приложения: сборку, развертывание и релиз.

  • Сборка берет исходный код приложения и конвертирует в артефакт. Процесс сборки может включать опциональную конфигурацию реестра для отправки собранного артефакта в реестр таким образом, чтобы он был доступен платформам развертывания. Например, на этом этапе исходный код конвертируется в образ Docker, EC2 AMI и т.д.

  • Развертывание берет собранный на предыдущем этапе артефакт и помещает его на целевую платформу развертывания, делая развертывание доступным по URL или через другие внутренние методы

Релиз активирует развертывание и открывает его основному трафику. В будущем мы добавим в Waypoint поддержку продвижения приложений между средами, откат развертываний и релизов и постепенное перемещение трафика между серверами после релиза.

Поднимаем Waypoint


Команда waypoint up выполняет сборку, развертывание и релиз приложения. В конце выводится один или несколько адресов, по которым доступно приложение. Неважно, какое это приложение и для какой платформы, вы всегда можете ввести в терминал waypoint up для развертывания.



Можно выполнять этапы жизненного цикла отдельно друг от друга. Это полезно при взаимодействии с Github Actions и инструментами CI/CD, подобными CricleCI и Jenkins. Узнать больше об автоматизации рабочего процесса приложения с помощью Waypoint можно здесь.

Адреса приложения и развертывания


Развернутые с помощью Waypoint приложения получают общедоступный URL вида waypoint.run с действительным сертификатом TLS, автоматически сгенерированным Let's Encrypt. Используйте этот адрес, чтобы быстро посмотреть развернутые приложения и поделиться ими. Мы предоставляем этот URL через бесплатный общедоступный сервис компании HashiCorp. Функция необязательна и может быть отключена. В примере выше наш URL recently-pleasant-duck--v1.waypoint.run. Обратите внимание, что этот адрес уже не работает, приложение выполнялось только для этого поста в блоге. Вы можете посмотреть определенную версию развертывания по ссылке вида recently-pleasant-duck--vN.waypoint.run, где N номер версии развертывания. Эта функция очень полезна, чтобы поделиться предрелизной версией вашего приложения с вашей командой.



Логирование в Waypoint


Waypoint дает доступ к моментальному снимку логов приложения в режиме реального времени. Эти логи полезны, когда нужно отладить поведение развивающегося приложения. Однако они не заменяют комплексные решения для логирования. Логи агрегируются и доступны для просмотра через интерфейс командной строки и веб-интерфейс. Эта функция логов работает вне зависимости от платформы. Используете ли вы Kubernetes, EC2, Google Cloud Run или другую платформу, вы можете согласовано просматривать логи. С помощью пользовательского интерфейса можно просматривать логи нескольких развернутых на разных платформах приложений.



Waypoint exec


Вы можете выполнять команды в контексте развернутого приложения с помощью команды waypoint exec. Эта функция позволяет открывать оболочку, запускать скрипты и делать все, что вы хотите делать с вашими развертываниями. Как и логирование, waypoint exec работает на всех поддерживаемых Waypoint платформах.



Другие возможности


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

Waypoint и существующие приложения


Если у вас уже есть приложение и рабочий процесс развертывания, вы можете почувствовать сомнение в том, сможете ли использовать. Мы не ждем, что команды разработки немедленно перестроят и с нуля перестроят свой рабочий процесс для Waypoint. Но у нас есть плагин docker pull и возможность локального выполнения, позволяющая адаптировать Waypoint для приложения с уже настроенным рабочим процессом. Кроме того, у нас есть документация, которая описывает интеграцию Waypoint в другие CI: CircleCI или Jenkins. Эта функция позволяет просмотреть историю развертывания в интерфейсе Waypoint, выполнять команду exec, логирование, конфигурацию приложения и не только это. Приложив немного усилий, вы получаете преимущества Waypoint, пока обдумываете, хотите ли перейти на более управляемый плагин. Когда у вас много приложений, этот подход позволяет сочетать рабочие процессы и сравнивать их.

Полная расширяемость плагинами


Логика жизненного цикла полностью расширяемая. Waypoint работает на той же системе плагинов, что и Terraform. мы полагаем, что написать плагин для Waypoint так же просто (если не проще), чем для Terraform. В Waypoint встроено более десятка плагинов с самого начала. Мы надеемся и ожидаем, что со временем, с помощью сообщества открытого ПО, это число резко возрастет. У Terraform при запуске было около 6 провайдеров. Сегодня у Terraform 300 провайдеров. Мы верим, что такое возможно и для развертывания приложений. Если вам интересно написать плагин, пожалуйста, прочитайте наше руководство для авторов плагинов и посмотрите исходный код встроенных плагинов Waypoint 0.1 на Github.

Ссылки проекта
  • Попробуйте Waypoint, посетив страницу начала работы, чтобы посмотреть демонстрацию быстрого старта или выполнить инструкции, которые ссылаются на примеры приложений NodeJS, Python, Ruby, Java и многих других языках, фреймворках и облачных платформах.
  • Дайте нам обратную связь. Waypoint как проект все еще находится на ранней стадии, и мы хотели бы обратиться к сообществу за обратной связью через дискуссионный форум HashiCorp. Вы также можете посетить страницу сообщества и узнать, как внести свой вклад в проект.
  • Напишите плагин. Мы будем рады вашей помощи в продолжении улучшения Waypoint. Если у вас есть идея плагина Waypoint, опубликуйте ее на GitHub или предложите ее на форуме Waypoint в HashiCorp.
  • Поделитесь своим приложением. Если вы развернули приложение с помощью Waypoint, сделайте снимок экрана, где оно работает, с URL-адресом Waypoint, и опубликуйте в Twitter с тегом #WaypointUp HashiCorp. Если вы хотите, чтобы другие люди увидели работу приложения, поделитесь URL Waypoint. Мы выделим приложения сообщества в ближайшие недели.


Специально для хабровчан мы сделали промокод HABR, дающий дополнительную скидку 10% к скидке указанной на баннере.

image




Рекомендуемые статьи


Подробнее..

Перевод Fastcore недооцененная но полезная библиотека Python

21.10.2020 16:06:58 | Автор: admin

Недавно я начал оттачивать владение языком программирования Python. Я хотел изучить продвинутые паттерны, идиомы и методы программирования. Начал я с чтения книг по продвинутому Python, но информация, похоже, не откладывалась в голове без применения навыков. Хотелось иметь возможность задавать вопросы эксперту, пока учусь, а такую возможность трудно найти! Тогда ко мне и пришла идея: что, если я найду проект с открытым и достаточно продвинутым кодом и напишу документацию и тесты? Я сделал ставку, что это заставит меня изучать все очень глубоко, а поддерживающие проект люди оценит мою работу и будут готовы ответить на мои вопросы.



Предыстория


Поиском такого проекта и написанием документации с тестами к нему я занимался целый месяц и такое обучение было самым эффективным из всех, что я пробовал. Я обнаружил, что написание документации заставило меня глубоко понять не только то, что делает код, но и то, почему код работает именно так, как он работает, а также исследовать крайние случаи во время написания тестов. Самое главное, что я мог задавать вопросы, когда застрял, а люди были готовы посвятить мне дополнительное время, зная, что их разъяснения служило тому, чтобы сделать код доступнее! Оказывается, выбранная мной библиотека, fastcore одна из самых увлекательных в Python, с которыми я работал. Ее цели и задачи действительно уникальны.

fastcore это основа многих проектов fast.ai. Самое главное: fastcore расширяет Python, стремясь к устранению шаблонного кода и добавлению полезной функциональности для общих задач. В этом посте я выделю некоторые из моих любимых инструментов fastcore вместо того, чтобы делиться тем, что я узнал о языке. Моя задача вызвать интерес к этой библиотеке, и, надеюсь, мотивировать вас к ознакомлению с документацией после прочтения статьи.

Чем интересна fastcore?


  1. Ознакомление с идеями из других языков прямо в Python: Я постоянно слышу, что полезно изучать другие языки, чтобы стать лучшим программистом. Мне было трудно изучать другие языки с практической точки зрения, потому что я не мог применять их на работе. Fastcore расширяет Python, чтобы включить в него паттерны из разных языков: Julia, Ruby и Haskell. Теперь, когда я понимаю эти инструменты, у меня появилась мотивация изучать другие языки.
  2. Новый набор прагматичных инструментов: fastcore включает в себя утилиты, позволяющие писать более лаконичный выразительный код и, возможно, решать новые задачи.
  3. Изучение Python: fastcore расширяет Python, в этом процессе проявляются многие продвинутые понятия. Для мотивированных людей это прекрасный способ увидеть многое о внутренней работе языка.


Пройдемся по fastcore ураганом


Вот некоторые привлекшие мое внимание вещи, которые возможно сделать с помощью fastcore.

Делаем kwargs прозрачными


Я немного поеживаюсь каждый раз, когда вижу функцию с аргументом kwargs. Это потому, что kwargs означает обфускацию API. Мне нужно прочитать исходный код, чтобы понять, какие параметры допустимы. Посмотрим на пример ниже:

def baz(a, b=2, c =3, d=4): return a + b + cdef foo(c, a, **kwargs):    return c + baz(a, **kwargs)inspect.signature(foo)

<Signature (c, a, **kwargs)>

Без чтения исходного кода может быть трудно узнать, что foo также принимает дополнительные параметрыb и d. Это можно исправить с помощью delegates:

def baz(a, b=2, c =3, d=4): return a + b + c@delegates(baz) # this decorator will pass down keyword arguments from bazdef foo(c, a, **kwargs):    return c + baz(a, **kwargs)inspect.signature(foo)

<Signature (c, a, b=2, d=4)>

Поведение этого декоратора настраивается. Например, вы можете передать аргументы и сохранить при этом kwargs:

@delegates(baz, keep=True)def foo(c, a, **kwargs):    return c + baz(a, **kwargs)inspect.signature(foo)

<Signature (c, a, b=2, d=4, **kwargs)>

Аргументы можно исключать. Например, ниже мы исключаем из делегирования аргумент d:

def basefoo(a, b=2, c =3, d=4): pass@delegates(basefoo, but= ['d']) # exclude `d`def foo(c, a, **kwargs): passinspect.signature(foo)

<Signature (c, a, b=2)>

Возможно делегирование между классами:

class BaseFoo:    def __init__(self, e, c=2): pass@delegates()# since no argument was passsed here we delegate to the superclassclass Foo(BaseFoo):    def __init__(self, a, b=1, **kwargs): super().__init__(**kwargs)inspect.signature(Foo)

<Signature (a, b=1, c=2)>

Для получения дополнительной информации прочтите документацию о delegates.

Избегаем шаблонного кода при установке атрибутов экземпляра


Вы когда-нибудь задумывались, можно ли избежать шаблонного кода, связанного с установкой атрибутов в __init__?

class Test:    def __init__(self, a, b ,c):         self.a, self.b, self.c = a, b, c

Ой! Это было больно. Посмотрите на все эти повторяющиеся имена переменных. Неужели действительно нужно повторять всё это при определении класса? Уже нет! Посмотрите на store_attr:

class Test:    def __init__(self, a, b, c):         store_attr()t = Test(5,4,3)assert t.b == 4

Вы также можете исключить определенные атрибуты:

class Test:    def __init__(self, a, b, c):         store_attr(but=['c'])t = Test(5,4,3)assert t.b == 4assert not hasattr(t, 'c')

Есть гораздо больше способов настройки и использования store_attr, чем я показываю. Ознакомьтесь с документацией для получения более подробной информации.

P.S. Вы можете подумать, что классы данных тоже позволяют избежать такого шаблонного кода. Хотя в некоторых случаях это верно, store_attr более гибок. 1

Например, store_attr не полагается на наследование, а это значит, что вы не застрянете, используя множественное наследование, когда применяете его со своими собственными классами. Кроме того, в отличие от классов данных, store_attr не требует python 3.7 или выше. Вы можете использовать store_attr в любой момент в жизненном цикле объекта и в любом месте вашего класса, чтобы настроить поведение в том, как и когда хранятся переменные. Подробности здесь.

Избегаем бойлерплейта подклассов


Одна вещь, которую я ненавижу в python связанный с подклассами шаблонный код __super__ ().__init__ (). Например:

class ParentClass:    def __init__(self): self.some_attr = 'hello'class ChildClass(ParentClass):    def __init__(self):        super().__init__()cc = ChildClass()assert cc.some_attr == 'hello' # only accessible b/c you used super

Мы можем избежать такого кода, используя метакласс PrePostInitMeta. Как? Определив новый класс под названием NewParent обертку вокруг ParentClass:

class NewParent(ParentClass, metaclass=PrePostInitMeta):    def __pre_init__(self, *args, **kwargs): super().__init__()class ChildClass(NewParent):    def __init__(self):passsc = ChildClass()assert sc.some_attr == 'hello' 

Диспетчеризация типа


Диспетчеризация типа или множественная диспетчеризация позволяет изменить поведение функции в зависимости от типов получаемых входных данных. Это характерная особенность некоторых языков программирования, таких как Julia. Вот концептуальный пример того, как работает множественная диспетчеризация в Julia. В зависимости от типов входных данных x и y возвращаются разные значения:

collide_with(x::Asteroid, y::Asteroid) = ... # deal with asteroid hitting asteroidcollide_with(x::Asteroid, y::Spaceship) = ... # deal with asteroid hitting spaceshipcollide_with(x::Spaceship, y::Asteroid) = ... # deal with spaceship hitting asteroidcollide_with(x::Spaceship, y::Spaceship) = ... # deal with spaceship hitting spaceship

Диспетчеризация типа может быть особенно полезна в Data Science, где возможно разрешить различные типы ввода (т.е. массивы numpy и фреймы данных Pandas) в обрабатывающей данные функции. Типовая диспетчеризация позволяет иметь общий API у выполняющих похожие задачи функций. К сожалению, Python не поддерживает такую функциональность из коробки. К счастью, у нас есть декоратор @typedispatch. Этот декоратор полагается на подсказки типа, чтобы маршрутизировать входные данные к правильной версии функции:

@typedispatchdef f(x:str, y:str): return f'{x}{y}'@typedispatchdef f(x:np.ndarray): return x.sum()@typedispatchdef f(x:int, y:int): return x+y

Ниже показывается диспетчеризации типа при работе для функции f:

f('Hello ', 'World!')

'Hello World!'

f(2,3)

5

f(np.array([5,5,5,5]))

20

У этой функциональности есть ограничения (также как у других способов использования этой функции) и о них вы можете прочитать здесь. В процессе изучения типовой диспетчеризации я также нашел библиотеку Python под названием multipledispatch, написанную Mathhew Rocklin создателем Dask.

После применения этой функции я теперь мотивирован изучать такие языки, как Julia, чтобы обнаружить, каких еще парадигм мне может не хватать.

Лучшая версия functools.partial


functools.partial отличная утилита, создающая функции из других функций и позволяющая устанавливать значения по умолчанию. Возьмем, к примеру, функцию, которая фильтрует список таким образом, чтобы он содержал значения больше либо равное val:

test_input = [1,2,3,4,5,6]def f(arr, val):     "Filter a list to remove any values that are less than val."    return [x for x in arr if x >= val]f(test_input, 3)

[3, 4, 5, 6]

Из этой функции вы можете создать новую функцию с помощью partial, которая устанавливает значение по умолчанию: 5:

filter5 = partial(f, val=5)filter5(test_input)

[5, 6]

Одна из проблем с partial заключается в том, что она удаляет исходную строку документации и заменяет ее общей строкой документации:

filter5.__doc__

'partial(func, *args, **keywords) - new function with partial application\n    of the given arguments and keywords.\n'


fastcore.utils.partialler исправляет это и обеспечивает сохранение строки документации таким образом, чтобы новый API был прозрачным:

filter5 = partialler(f, val=5)filter5.__doc__

'Filter a list to remove any values that are less than val.'

Композиция функций


Распространенный в функциональных языках программирования метод композиция функций, когда вы связываете несколько функций вместе, чтобы достичь определенного результата. Это особенно полезно в различных преобразований данных. Рассмотрим игрушечный пример, где у меня три функции: первая удаляет элементы списка меньше 5 (из предыдущего раздела), вторая добавляет 2 к каждому числу, третья суммирует все числа:

def add(arr, val): return [x + val for x in arr]def arrsum(arr): return sum(arr)# See the previous section on partialleradd2 = partialler(add, val=2)transform = compose(filter5, add2, arrsum)transform([1,2,3,4,5,6])

15

Почему это полезно? Вы можете подумать, что я могу сделать то же самое вот так:

arrsum(add2(filter5([1,2,3,4,5,6])))

Все верно! Однако, композиция дает удобный интерфейс на случай, когда вы захотите сделать что-то такое:

def fit(x, transforms:list):    "fit a model after performing transformations"    x = compose(*transforms)(x)    y = [np.mean(x)] * len(x) # its a dumb model.  Don't judge me    return y# filters out elements < 5, adds 2, then predicts the meanfit(x=[1,2,3,4,5,6], transforms=[filter5, add2])

[7.5, 7.5]

Более подробную информацию о compose читайте в документации.

__repr__, но полезнее


В Python __repr__ помогает получить информацию об объекте для логирования и отладки. Ниже приведено то, что вы получите по умолчанию, когда определите новый класс. Примечание: мы используем store_attr, который обсуждался выше.

class Test:    def __init__(self, a, b=2, c=3): store_attr() # `store_attr` was discussed previouslyTest(1)

<__main__.Test at 0x7ffcd766cee0>

Мы можем использовать basic_repr, чтобы быстро получить более разумное значение по умолчанию:

class Test:    def __init__(self, a, b=2, c=3): store_attr()     __repr__ = basic_repr('a,b,c')Test(2)

Test(a=2, b=2, c=3)

Обезьяньи патчи через декоратор


Это может быть удобно для обезьяньих патчей с помощью декоратора, что особенно полезно, когда вы хотите пропатчить импортируемую внешнюю библиотеку. Мы можем использовать декоратор @patch из fastcore.foundation вместе с подсказками типа примерно так:

class MyClass(int): pass  @patchdef func(self:MyClass, a): return self+amc = MyClass(3)

Теперь в MyClass есть дополнительный метод под названием func:

mc.func(10)

13

Я еще не убедил вас? Тогда покажу вам еще один пример такого патча в следующем разделе.

pathlib.Path


Увидев эти расширения в pathlib.path, вы больше никогда не будете работать с vanilla pathlib! В pathlib добавлен ряд дополнительных методов, таких как:

  • Path.readlines: то же, что with open ('somefile', 'r') as f: f.readlines ()
  • Path.read: то же, что with open ('somefile', 'r') as f: f.read ()
  • Path.save: сохраняет файл как pickle
  • Path.load: загружает файл pickle
  • Path.ls: показывает содержимое пути в виде списка.
  • и так далее.

Подробнее об этом здесь. Вот демонстрация ls:

from fastcore.utils import *from pathlib import Pathp = Path('.')p.ls() # you don't get this with vanilla Pathlib.Path!!

(#7) [Path('2020-09-01-fastcore.ipynb'),Path('README.md'),Path('fastcore_imgs'),Path('2020-02-20-test.ipynb'),Path('.ipynb_checkpoints'),Path('2020-02-21-introducing-fastpages.ipynb'),Path('my_icons')]

Подождите! Что здесь происходит? Мы только что импортировали pathlib.Path почему мы получили новую функциональность? Потому, что импортировали модуль fastcore.utils, который патчит pathlib.Path с помощью упомянутого выше декоратора @patch. Чтобы довести дело до конца и показать, чем полезен @patch, я пойду дальше и прямо сейчас добавлю еще один метод в Path:

@patchdef fun(self:Path): return "This is fun!"p.fun()

'This is fun!'

Волшебно, правда? Вот почему я пишу об этом!

Еще более лаконичный способ написать лямбду


Self с заглавной буквы S это еще более лаконичный способ написания вызывающих методы объекта лямбд. Например, создадим лямбду для получения суммы массива Numpy:

arr=np.array([5,4,3,2,1])f = lambda a: a.sum()assert f(arr) == 15

Вы можете таким же образом использовать Self:

f = Self.sum()assert f(arr) == 15

Давайте создадим лямбду, которая будет делать группировку и возвращать максимальный элемент фрейма данных Pandas:

import pandas as pddf=pd.DataFrame({'Some Column': ['a', 'a', 'b', 'b', ],                  'Another Column': [5, 7, 50, 70]})f = Self.groupby('Some Column').mean()f(df)

Another Column
Some Column
a 6
b 60

Подробнее о Self читайте в документации.

Функции блокнота


Они просты, но удобны и позволяют узнать, выполняется ли код в блокноте Jupyter, Colab или через оболочку IPython:

from fastcore.imports import in_notebook, in_colab, in_ipythonin_notebook(), in_colab(), in_ipython()

(True, False, True)

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

Замена стандартного списка


Вы можете быть довольно счастливы со стандартным list в Python. Это одна из тех ситуаций, когда вы не знаете, что вам нужен список лучше, пока кто-то не покажет его вам. L как раз такой список с большим количеством доработок.

Лучший способ описать L сделать вид, что у list и numpy родился милый ребенок. Определите список (посмотрите на приятный __repr__, показывающий длину списка!)

L(1,2,3)

(#3) [1,2,3]

Перемешайте список:

p = L.range(20).shuffle()p

(#20) [8,7,5,12,14,16,2,15,19,6...]

Индекс [прим.перев. скорее позиция position] в списке:

p[2,4,6]

(#3) [5,14,2]

L имеет разумные умолчания, например, вот добавление элемента в список:

1 + L(2,3,4)

(#4) [1,2,3,4]

L может гораздо больше. Читайте документацию, чтобы узнать больше.

Но подождите Это еще не всё!


Есть еще кое-что, что я хотел бы показать вам, но это никак не вписываются в пост. Вот список некоторых любимых вещей, которые я не показывал в этом посте:

Утилиты


Раздел Utilites содержит множество шорткатов для выполнения общих задач или предоставляет дополнительный интерфейс к стандартному интерфейсу.

  • mk_class: быстро добавляет кучу атрибутов в класс
  • wrap_class: добавление новых методов в класс с помощью простого декоратора
  • groupby: похоже на groupby из Scala
  • merge: слияние словарей
  • fasttuple: кортеж на стероидах
  • Infinite Lists: полезно для увеличения размеров массивов и тестирования
  • chunked: упаковка и организация элементов

Многопроцессорная обработка


Раздел Многопроцессорная обработка расширяет соответствующую библиотеку Python, предлагая такие возможности:

  • Шкала прогресса
  • Возможность сделать паузу, чтобы смягчить состояние гонки с помощью внешних сервисов
  • Пакетная обработка для каждого воркера, если у вас нет векторизованных операций для выполнения в блоках (chunk)

Прокачивать себя в Python стало проще, ведь специально для хабравчан мы сделали промокод HABR, дающий дополнительную скидку 10% к скидке указанной на баннере.

image




Рекомендуемые статьи


Подробнее..

Перевод Использование ИИ для сверхсжатия изображений

20.10.2020 16:06:30 | Автор: admin

Управляемые данными алгоритмы, такие как нейронные сети, взяли мир штурмом. Их развитие вызвано несколькими причинами, в том числе дешевым и мощным оборудованием и огромным объемом данных. Нейронные сети в настоящее время находятся в авангарде во всем, что касается когнитивных задач, таких как распознавание изображений, понимание естественного языка и т.д. Но они не должны ограничиваться такими задачами. В этом материале рассказывается о способе сжатия изображений с помощью нейронных сетей, при помощи остаточного обучения. Представленный в статье подход работает быстрее и лучше стандартных кодеков. Схемы, уравнения и, конечно, таблица с тестами под катом.



Эта статья основана на этой работе. Предполагается, что вы знакомы с нейронными сетями и их понятиями свертка и функция потерь.

Что такое сжатие изображений и какое оно бывает?


Сжатие изображений это процесс преобразования изображения таким образом, чтобы оно занимало меньше места. Простое хранение изображений заняло бы много места, поэтому существуют кодеки, такие как JPEG и PNG, которые нацелены на уменьшение размера исходного изображения.

Как известно, существует два типа сжатия изображений: без потерь и с потерями. Как следует из названий, при сжатии без потерь можно получить данные исходного изображения, а при сжатии с потерями некоторые данные теряются во время сжатия. например, JPG это алгоритмы с потерями [прим. перев. в основном, не будем также забывать о JPEG без потерь], а PNG алгоритм без потерь.


Сравнение сжатия без потерь и с потерями

Обратите внимание, что на изображении справа много блочных артефактов. Это потерянная информация. Соседние пиксели похожих цветов сжимаются как одна область для экономии места, но при этом теряется информация о фактических пикселях. Конечно, алгоритмы, применяемые в кодеках JPEG, PNG и т.д., намного сложнее, но это хороший интуитивный пример сжатия с потерями. Сжатие без потерь это хорошо, но сжатые без потерь файлы занимают много места на диске. Есть более эффективные способы сжатия изображений без потери большого количества информации, но они довольно медленные, и многие применяют итеративные подходы. Это означает, что их нельзя запускать параллельно на нескольких ядрах центрального или графического процессора. Такое ограничение делает их совершенно непрактичными в повседневном использовании.

Ввод сверточной нейронной сети


Если что-то нужно вычислить и вычисления могут быть приближёнными, добавьте нейронную сеть. Авторы использовали довольно стандартную сверточную нейронную сеть для улучшения сжатия изображений. Представленный метод не только работает наравне с лучшими решениями (если не лучше), он также может использовать параллельные вычисления, что приводит к резкому увеличению скорости. Причина в том, что сверточные нейронные сети (CNN) очень хороши в извлечении пространственной информации из изображений, которые затем представляются в форме компактнее (например, сохраняются только важные биты изображения). Авторы хотели использовать эту возможность CNN, чтобы лучше представлять изображения.

Архитектура


Авторы предложили двойную сеть. Первая сеть принимает на вход изображение и генерирует компактное представление (ComCNN). Выходные данные этой сети затем обрабатываются стандартным кодеком (например, JPEG). После обработки кодеком изображение передается во вторую сеть, которая исправляет изображение из кодека в попытке вернуть исходное изображение. Авторы назвали эту сеть реконструирующей CNN (RecCNN). Подобно GAN обе сети обучаются итеративно.


ComCNN Компактное представление передается стандартному кодеку


RecCNN. Выходные данные ComCNN масштабируются с увеличением и передаются в RecCNN, которая попытается изучить остаток

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


Сквозной фреймворк сжатия изображений. Co(.) представляет собой алгоритм сжатия изображений. Авторы применяли JPEG, JPEG2000 и BPG

Что такое остаток?


Остаток можно рассматривать как шаг постобработки для улучшения декодируемого кодеком изображения. Обладающая большим количеством информации о мире нейронная сеть может принимать когнитивные решения о том, что исправлять. Эта идея основана на остаточном обучении, прочитать подробности о котором вы можете здесь.

Функции потерь


Две функции потерь используются потому, что у нас две нейронные сети. Первая из них, ComCNN, помечена как L1 и определяется так:


Функция потерь для ComCNN

Объяснение


Это уравнение может показаться сложным, но на самом деле это стандартная (среднеквадратичная ошибка) MSE. || означает норму вектора, который они заключают.


Уравнение 1.1

Cr обозначает выходные данные ComCNN. обозначает обучаемость параметров ComCNN, XK это входное изображение


Уравнение 1.2

Re() означает RecCNN. Это уравнение просто передает значение уравнения 1.1 В RecCNN. обозначает обучаемые параметры RecCNN (шляпка сверху означает, что параметры фиксированы).

Интуитивное определение


Уравнение 1.0 заставит ComCNN изменить свои веса таким образом, чтобы после воссоздания с помощью RecCNN окончательное изображение выглядело как можно более похожим на входное изображение. Вторая функция потерь RecCNN определяется так:


Уравнение 2.0

Объяснение


Снова функция может выглядеть сложной, но это по большей части стандартная функция потерь нейронной сети (MSE).


Уравнение 2.1

Co() означает вывод кодека, x со шляпкой сверху означает вывод ComCNN. 2 это обучаемые параметры RecCNN, res() представляет собой просто остаточный вывод RecCNN. Стоит отметить, что RecCNN обучается на разнице между Co() и входным изображением, но не на входном изображении.

Интуитивное определение


Уравнение 2.0 заставит RecCNN изменить свои веса так, чтобы выходные данные выглядели как можно более похожими на входное изображение.

Схема обучения


Модели обучаются итеративно, подобно GAN. Веса первой модели фиксируются, пока веса второй модели обновляются, затем веса второй модели фиксируются, пока первая модель обучается.

Тесты


Авторы сравнили свой метод с существующими методами, включая простые кодеки. Их метод работает лучше других, сохраняя при этом высокую скорость на соответствующем оборудовании. Кроме того, авторы попытались использовать только одну из двух сетей и отметили падение производительности.


Сравнение индекса структурного сходства (SSIM). Высокие значения указывают на лучшее сходство с оригиналом. Жирным шрифтом выделен результат работы авторов

Заключение


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

Изучать нейронные сети стало проще, ведь специально для хабравчан мы сделали промокод HABR, дающий дополнительную скидку 10% к скидке указанной на баннере.

image




Рекомендуемые статьи


Подробнее..

AnLinux простой способ установить Linux-окружение на Android-телефон без рута

08.10.2020 20:11:18 | Автор: admin


Любой телефон или планшет, работающий на Android, это устройство, которое управляется ОС Linux. Да, очень модифицированной ОС, но все же основа Android ядро Linux. Но, к сожалению, для большинства телефонов опция снести Android и поставить дистрибутив по своему вкусу недоступна.

Поэтому, если хочется Linux на телефоне, приходится покупать специализированные гаджеты вроде PinePhone, о котором мы уже писали в одной из статей. Но есть еще один способполучить Linux-окружение практически на любом смартфоне, причем без root-доступа. Поможет в этом инсталлятор, который называется AnLinux.

Что такое AnLinux?


Это специализированное ПО, которое дает возможность использовать Linux на телефоне при помощи монтирования образа, содержащего root-файловую систему любого из дистрибутивов, включая Ubuntu, Kali, Fedora, CentOS, OpenSuse, Arch, Alpine и многих других. Инсталлятор использует PRoot для эмуляции root-доступа.

PRoot перехватывает все выполняемые пользователем вызовы, которые требуют в обычной ситуации root-доступа, и обеспечивает их работоспособность в обычных условиях. В PRoot используется системный вызов ptrace для отладки ПО, который помогает достичь цели. С PRoot все это можно сделать как с chroot, но без root-прав. Кроме того, PRoot предоставляет фейковый доступ пользователю для пседвофайловой системы.

AnLinux небольшая программа. Но этого достаточно, ведь единственное ее предназначение установка образов систем и запуск скриптов, поднимающих пользовательское окружение. Когда все сделано, пользователь получает вместо смартфона Linux-ПК, причем Android продолжает работать на фоне. Подключаемся к устройству при помощи VNC-вьювера или терминала, и можно работать.

Конечно, это не идеальный вариант завести Linux на смартфоне, но он вполне рабочий.

С чего начать?


Основное Android-смартфон с версией ОС не ниже Lollipop. Кроме того, пойдет и 32-битное или 64-битное ARM или x86-устройство. Кроме того, потребуется солидный объем свободного файлового пространства. Для этого можно использовать карту памяти или просто устройство с большим объемом внутренней памяти.

Кроме того, потребуется:

  • AnLinux (вот ссылка на Google Play).
  • Termux (снова понадобится Google Play).
  • VNC Client (VNC Viewer хороший вариант).
  • Bluetooth-клавиатура (опционально).
  • Bluetooth-мышь (опционально).
  • HDMI кабель для мобильного телефона (опционально).

Termux и VNC нужны для получения доступа к своему компьютеру на Linux. Последние три элемента требуются лишь для того, чтобы обеспечить комфортную работу с телефоном и установщиком. HDMI-кабель нужен только в том случае, если пользователю удобнее работать с большим экраном, а не вглядываться в дисплей телефона.

Что же, приступим




Как только установлен Termux, получаем полноценную консоль. Да, рута нет (если телефон не рутован), но ничего страшного. Следующий шаг установка образа для дистрибутива Linux.

Теперь нужно открыть AnLinux и затем выбрать Dashboard из меню. Всего есть три кнопки, но выбрать можно лишь одну, первую. После этого появляется меню выбора дистрибутива. Можно выбрать даже не один, а несколько, но в этом случае понадобится большой объем свободного файлового пространства.

После выбора дистрибутива активируются две другие кнопки. Вторая позволяет загрузить в буфер обмена команды, необходимые для загрузки и установки Linux. Обычно это pkg, wget команды и скрипт для их выполнения.



Третья кнопка запускает Termux, так что команды можно вставлять в консоль. Как только все сделано, запускается скрипт, позволяющий загрузить окружение дистрибутива. Для вызова дистрибутива нужно каждый раз запускать скрипт, но установку проводим только один раз.

А что с графической оболочкой?


Если она нужна, то следует лишь выбрать меню для десктопного окружения и использовать больше кнопок появится не три, а больше. Кроме самого дистрибутива, нужно выбрать еще и оболочку, например, Xfce4, Mate, LXQt или LXDE. В целом, ничего сложного.

Потом кроме скрипта, который запускает дистрибутив, потребуется еще один он активирует сервер VNC. В целом, весь процесс простой и понятный, он вряд ли способен вызвать затруднения.

После запуска сервера VNC подключаемся со стороны клиента, воспользовавшись вьювером. Требуется знать порт и localhost. Все это сообщает скрипт. Если все сделано правильно, то пользователь получает доступ к своей виртуальной Linux-системе. Производительность современных телефонов на высоте, так что особых проблем не будет. Конечно, вряд ли смартфон сможет полностью заменить десктоп, но, в целом, все это работает.

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

Подробнее..

Из песочницы Проблемы со сном и их решения личный опыт длиной в 15 лет

30.09.2020 22:05:00 | Автор: admin


Так сложилось, что уже около полутора десятков лет на разнообразные стрессы мой организм реагирует, лишая меня достаточного количества и качества сна. А спать я люблю, и люблю быть бодрой и выспавшейся! Поэтому все эти годы я неустанно борюсь за свой сон и использую все способы его улучшения, о которых узнаю, и которые оказываются мне доступны. Этот текст подборка лайфхаков для улучшения сна, но в первую очередь это мой личный опыт. Надеюсь, он будет полезен тем, кто, как и я, любит хорошо спать, но порой имеет с этим проблемы.

Чтобы вы поняли масштаб проблемы. Это определение бессонницы из Википедии:

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

Так вот, ВСЕ из перечисленных проблем в разные годы своей жизни мне довелось почувствовать на себе и почувствовать не однажды.



Были периоды, когда мне каждый вечер долго не удавалось уснуть. Я проводила бесконечные часы в постели, изнывая от желания спать и невозможности это сделать. В другие моменты жизни я просыпалась несколько раз за ночь, спала неглубоко, в итоге вставала совершенно невыспавшейся. Через несколько лет начались регулярные утренние пробуждения: что-то заставляло меня проснуться в 4-5 утра, и уснуть назад не получалось. Разные проблемы со сном длятся у меня от нескольких недель до нескольких месяцев и могут повторяться.

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

Вот они с комментариями о моём личном опыте их использования.

1. Сну помогает темнота




Учёные неоднократно высказывались по этому поводу, и Хабр об этом писал (например, тут http://personeltest.ru/aways/habr.com/ru/company/mailru/blog/230987/). В темноте спится лучше, чем при свете, каким бы незначительным этот свет ни был со всей уверенностью подтверждаю. Хорошо купить шторы блэкаут, выключить все ночники и убрать с глаз долой любую технику со светящимися индикаторами. Но самое действенное и простое средство маска для сна. Сначала она может немного мешать, но потом привыкаешь и эффект не заставляет себя ждать.

2. Сну помогает тишина


Ещё одна прописная истина, и совет, который, по моему опыту, работает. Самый простой и адекватный способ добиться тишины во время сна для конкретно взятого человека в условиях квартиры в мегаполисе беруши. Существуют разные модели берушей из разных материалов, и, вероятно, стоит попробовать несколько, чтобы подобрать лучше всего для вас подходящие. Мне больше всего подошли мягкие силиконовые: они принимают форму ушного прохода, почти не ощущаются, редко выпадают из ушей и хорошо нейтрализуют звуки. Например, такие.

3. Перед сном лучше избавить себя от источников света в синей части спектра




Это тоже подтверждено исследованиями и вы наверняка об этом читали (например, тут есть подробности). Свет синей части спектра мешает выработке мелатонина, гормона, в том числе регулирующего сон. Такой свет источает непосредственно солнце, люминесцентные лампы дневного света, а также экраны наших гаджетов. Что делать с лампами и солнцем, примерно понятно (поможет та же маска). А вот если вы, как и я, и многие другие современные люди, любите посмотреть или почитать что-то в телефоне или планшете перед сном, включите специальный вечерний режим. Если в вашем гаджете такого нет, скачайте одну из программ (обычно их можно найти по словам фильтр синего света).
Мой опыт: это работает! Если не забыть про этот режим, читая с экрана в постели перед сном, довольно быстро начинаешь клевать носом, и гаджет можно выключать, чтобы наконец уснуть.
Бонус: утром синий свет, наоборот, помогает быстрее проснуться. Так что чтение спросонья новостей с экрана телефона вполне может быть полезным.

4. Мелатонин


К слову о мелатонине. Этот гормон, регулирующий физиологические часы, наш организм вырабатывает самостоятельно, но если есть проблемы с засыпанием, можно принимать его дополнительно. Исследования показывают https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4273450/, что принятый перед отходом ко сну мелатонин помогает уснуть и улучшает общее качество сна.

Мой опыт: мелатонин лучше всего работает, если у вас проблемы именно с засыпанием, то есть, вы долго не можете уснуть вечером. Если же вы склонны к необоснованно ранним пробуждениям, он может не помочь (так было со мной). Я принимала мелатонин разных марок, и по соотношению цена-качество остановилась на Мелаксене. https://xn--80ajbtdem4a.xn--p1ai/ Учтите: если вы принимаете мелатонин для лучшего засыпания, от любых (в том числе не содержащих синий спектр) источников света себя перед сном надо оградить. Иначе таблетка может не сработать.

И ещё: у мелатонина есть противопоказания. В их числе тяжёлые болезни почек, печёночная недостаточность, аутоимунные болезни, беременность и период грудного вскармливания и др. Если есть сомнения, лучше посоветоваться с врачом.

5. Магний



(Так выглядит магний)

Магний в нашем организме участвует в выполнении множества разных функций, от нормализации давления до регулировки уровня сахара в крови. В том числе его задача помогать регулировать активность ЦНС. Если магния недостаточно, это может привести к тревожности, раздражительности и другим проблемам, в том числе к нарушениям сна. Соответственно, приём магния при его недостатке может эти проблемы в том числе и со сном решить.

Чтобы узнать, есть ли у вас недостаток магния, лучше сдать кровь на анализ, а результаты показать врачу, чтобы подобрать нужный препарат и дозу. Часто магний назначают с витамином В6, вместе они работают лучше (многие препараты объединяют оба компонента). Лично мне подобный препарат (Магне-В6 magneb6.ru) помогает в периоды беспокойного неровного сна и периоды частых ночных и ранних утренних пробуждений.

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

Но переизбыток магния тоже вреден! И самая частая причина этого переизбытка бесконтрольный приём БАДов с магнием. В общем, лучше сделать анализ и посоветоваться с врачом.

6. Пустырник, валерианка &Co



(А это пустырник)

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

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

Из комплексных, имеющих несколько экстрактов разных трав в составе, препаратов, мне лучше всего помог NightMix.

В его составе иван-чай (успокаивает и уравновешивает), валериана (имеет седативный эффект), лаванда (помогает засыпанию), женьшень (нормализует биологические часы). Я использовала препарат как точечно, в вечера, когда не могла уснуть, так и курсами, если нарушения сна становились регулярными. Учтите: если нервная система сильно расшаталась и со сном уже серьёзные проблемы, улучшение от NightMix может прийти не в первую же ночь, а на третью-четвертую. Получив результат, лучше не останавливаться, а пропить курс в течение 1-2 месяцев.

Плюс лаванда, герань и жасмин помогают мне лично в виде ароматерапии. Этот способ подойдёт, если вы в принципе приветствуете довольно заметные источники ароматов в доме. То, что подействует на улучшение вашего сна, стоит определить опытным путём. Подобным образом работают ароматы лаванды, сандала, розы, хмеля, герани, мелиссы, нероли, жасмина, майорана, ромашки, бергамота, валерианы, пассифлоры, ветивера, пачули, бензоина, петитгрейна и др.

7. Голова в холоде + ноги в тепле




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

Мой опыт: это работает! Особенно носки, и особенно когда в квартире холодно. Согретые ноги помогают уснуть быстрее и спать лучше.

8. Хорошие постельные принадлежности


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

Мой опыт: в комфортных условиях проблемы со сном появляются реже и уходят быстрее.

9. Режим и физические нагрузки


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

Мой опыт: в периоды, когда я занимаюсь физкультурой и много хожу, вероятность возникновения проявлений бессонницы ниже, чем в те моменты жизни, когда я большую часть дня провожу, не поднимая головы от ноутбука.

10. Ритуалы перед сном




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

11. Достижение большего внутреннего спокойствия




И здорового пофигизма! Лично для меня главный триггер проявлений бессонницы это реакция моей психики на всякие проблемы, стрессы и так далее. Что с этим делать? Тренировать внутренний дзен. Если тревожность достигает таких масштабов, что мешает не только спокойно спать, но и жить, лучше пойти на психотерапию. Если такой возможности нет, делитесь своими переживаниями и мыслями о них с чутким и внимательным другом. Если нет такого друга, попробуйте помочь себе самостоятельно: письменными техниками, техниками телесного расслабления, арт-терапией, медитацией способов много, ищите свой. Мой опыт: уже даже то, что ты что-то делаешь для себя, пытаясь решить проблему чрезмерной тревожности, несколько снимает эту тревожность. Каждый новый способ может помочь достижению цели меньше или больше, и в итоге положение вещей так или иначе улучшается.
Подробнее..

Использование Always on display как альтернатива светодиодному индикатору в телефонах Samsung

01.10.2020 12:15:50 | Автор: admin
Всем доброго времени суток!
После того, как разбился мой старый Galaxy s7 пришлось купить новый самсунг. При покупке я не придал значения, что в новом аппарате нет светодиодного индикатора, а его отсутствие показало мне, как я к нему привык. С другой стороны, во всех новых самсунгах есть режим постоянно включенного экрана, которым большинство людей практически не пользуется. Я решил совместить свою потребность с самсунговской фичей. Способ не требует наличия Root или ADB-хак.

image

В чем суть

Включать и выключать Always on display при наличии уведомлений и отключать его после их очистки.

Инструменты

Для воплощения идеи в жизнь я решил использовать приложение Macrodroid. Для меня это уже очень давно любимое приложение для автоматизации различных действий.

Реализация

Первый макрос нужен для включения Always on display:
  • Добавляем триггер Уведомление в разделе События устройства, выбираем Получено уведомление. Здесь же сразу можно выбрать те приложения, при получении от которых вы хотите включения этого режима
  • Добавляем действие Настройка системы в разделе Настройка устройства. Выбираем System. В поле Ключ настройки пишем aod_mode, а в поле значение 1
  • Добавляем любое название для макроса и сохраняем

Должно получиться так:

image
Второй макрос, соответственно, для выключения Always on display:
  • Добавляем триггер Уведомление в разделе События устройства, выбираем Уведомление очищено. Выбрать приложения, которые должны выключать режим надо те же, что и в первом макросе
  • Добавляем действие Настройка системы в разделе Настройка устройства. Выбираем System. В поле Ключ настройки пишем aod_mode, а в поле значение уже пишем 0
  • Добавляем любое название для макроса и сохраняем


Выглядит так:

image

Важно: режим Always on display должен быть изначально включен в настройках телефона.

Для меня этого вполне достаточно. Теперь, при новом уведомлении включается режим Always on display и я могу видеть наличие уведомлений. Это оказалось даже гораздо более удобным, чем светодиодный индикатор, так как экран горит постоянно и не надо всматриваться в лампочку.

Каждый может добавить в макросы ограничения или действия по своему вкусу и сделать этот режим еще более гибким.

Надеюсь эта статья будет кому-нибудь полезной.
Всем хорошего настроения!
Подробнее..

Категории

Последние комментарии

© 2006-2020, personeltest.ru