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

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

Перевод Как попасть в состояние потока?

18.06.2021 20:15:41 | Автор: admin
Для меня попадание в состояние потока является единственным способом продуктивной работы над сложными программными проектами. И я полагаю, что разработчик может так организовать свою жизнь, чтобы как можно сильнее удлинить время, которое он каждый день может проводить в этом состоянии. Тут я хочу рассказать о том, что лично я пытаюсь делать для того, чтобы чаще попадать в состояние потока.



Сон


image

Сон это самый важный фактор среди тех, что влияют на мою продуктивность. Если бы мне пришлось выбирать между хорошим ночным отдыхом и другими пунктами моего списка я выбрал бы сон. У меня есть жёсткое правило не пить кофе после 16:00. Если я делаю себе кофе в 15:45, а потом забываю о нём до 16:05, я убираю его в холодильник и оставляю на следующий день. Незначительный рост эффективности вечерней работы не стоит серьёзного ухудшения моей продуктивности на следующий день.

В те дни, когда я перевозбуждён, мне обычно помогает успокоиться приём 0,3-0,9 мг мелатонина. Я, кроме того, считаю, что спать лучше в прохладной комнате. Мне кажется, что оптимальным вариантом является температура в 16-18C.

Кофе


image

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

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

Качество воздуха


image

Можно очень сильно улучшить продуктивность, понизив уровень CO2 в воздухе рабочей комнаты. Под очень сильным улучшением я понимаю что-то в районе 20% или больше. Было одно исследование, где изучали воздействие уровня CO2 на когнитивную деятельность людей. Одна группа работала в помещении с уровнем CO2 в 1000 ppm, вторая с уровнем CO2 в 600 ppm. Для справки на открытом воздухе уровень CO2 составляет 400 ppm. Люди, работавшие в комнате с более высокой концентрацией CO2, набрали в когнитивных тестах примерно на 20% меньше баллов, чем люди, которые дышали воздухом с более низким содержанием CO2.

Я, пока не обзавёлся монитором качества воздуха, считал, что уровень CO2 в моей рабочей комнате достаточно низок, так как я часто проветривал эту комнату. А оказалось, что уровень CO2 в моей комнате составляет примерно 1200 ppm, что даже выше, чем в неблагополучной комнате вышеописанного исследования! Для того чтобы это исправить, я почти всегда, когда работаю, держу окно приоткрытым. Это позволяет поддерживать уровень CO2 в моей комнате примерно на отметке в 450 ppm.

Физические упражнения


image

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

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

Работа в одиночестве


image

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

Удаление игр


image

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

Блокировка сайтов


image

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

Составление плана работ на день


image

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

Музыка


image

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

Питание


image

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

Выбор правильной задачи


image

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

Как вы относитесь к состоянию потока?


Подробнее..

Перевод Как чрезмерный комфорт делает людей несчастными

28.05.2021 10:14:13 | Автор: admin

Регулярное преодоление трудностей секрет более счастливой жизни?

Журналист Майкл Эстер месяц провел за Полярным кругом, выслеживая стадо оленей для статьи в национальном журнале.

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

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

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

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

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

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

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

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

* * *

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

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

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

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

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

Авторы исследования 2013г., опубликованного в журнале Social Psychological and Personality Science, опросили почти 15000человек на тему жизненных неприятностей (развод, смерть близких ит.п.). Выяснилось, что в среднем, чем больше трудностей пережил человек, тем в большей степени он ценит маленькие радости такое умение авторы исследования назвали умением наслаждаться.

Забавно, пишут авторы, что умение наслаждаться может не развиваться из-за положительных жизненных обстоятельств.

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

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

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

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

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

* * *

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

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

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

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


О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимается локализацией игр, приложений и сайтов на 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаем рекламные и обучающие видеоролики для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Подробнее..

Чем поживиться айтишнику на барахолке?

28.05.2021 10:14:13 | Автор: admin


Приезжая в Питер, нужно обязательно посетить Эрмитаж, Русский музей и блошиный рынок на Уделке. Я бываю там не менее пары раз в год и хожу в это уникальное место, как в музей. Там можно найти не просто всё, а вообще всё, даже то, чего искать не собирался. Антикварную посуду и копаные старинные монеты, советские документы и виниловые пластинки, самовары и пионерские горны, а еще кучу всевозможного барахла, которое слегка помятые граждане продают прямо с разложенных на земле клеёнок.

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




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



Среди стареньких видях форм-фактора PCI и AGP, а также разбросанных тут и там модулей памяти иногда попадаются почти целые устройства. Например, вот за этот очаровательный Acer Aspire 5030 на AMD Turion 64 продавец попросил 1000 рублей, но ноут оказался без блока питания, нижней крышки и со снятым кулером. Потому покупать его я отказался. Цена тут же упала до 700 рублей, но я остался непреклонен.



Нетбук Samsung выглядит так, словно по нему долго топтался Камаз. Без аккумулятора и винта продавец оценил его в 500 рублей, материнку отдавал за полтиник.



Поблизости обнаружилась целая коробка роутеров выбирай на любой вкус: от 50 до 150 рублей. Работоспособность, ясное дело, величина неизвестная.



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



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



Планшет Samsung Galaxy Tab 3 с треснутым экраном, 300 рублей. Включать, по словам продавца, не пробовали. Когда, повертев в руках, я положил его на место, владелец вкрадчиво спросил: Что, дорого? А за сколько возьмешь?.



Материнка ASUS P5GDC-V на 915-м чипсете с каким-то камнем на борту, по уверениям хозяина, исправная. Стольник. Платы серии P5 у ASUS вообще практически вечные, так что на ее базе вполне можно собрать какую-нибудь пишущую машинку. За дополнительный стольник продавец предложил выбрать из обувной коробки для нее какой-нибудь оперативки там была представлена целая куча россыпью.



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



Системник в сборе от несуществующей уже ныне фирмы Кей. Характеристики неизвестны. Степень исправности неизвестна. Населена вирусами. Цена? Триста (шутка про тракториста). В принципе, один блок питания там стоит примерно столько же. Если он работает, конечно.



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



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



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



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



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

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

Так я отреставрировал несколько старых ноутбуков родом из 90-х (включая великолепный Apple PowerBook), классическую букашку БК 0010-01 А еще исполнил детскую мечту приобрел на рынке и привел в порядок редкую игру от завода Электроника, родственницу знаменитой Ну, погоди!. Правда, в моей Электронике с романтическим названием Тайны океана главным героем выступает не Волк с корзинкой, собирающий куриные яйца, а осьминог, который ловит водолазов.



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



Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

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

06.06.2021 16:09:40 | Автор: admin

Еще недавно профиль типа Т-слот (T-slot) был не самым популярным, но после того, как его стали применять в конструкции многих моделей 3D-принтеров, он появился везде и всюду. Теперь он используется для сборки тех же 3D-принтеров, лазерных резаков, станков с ЧПУ.

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

Почему профиль удобен?



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

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

Типы профилей и их особенности


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


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


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


Крепление к профилю


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


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


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

Соединение профилей между собой


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


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

В простейшем случае нужно просто соединить профиль при помощи линейного соединителя полоски металла, которая вставляется в прорезь (слот).

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

Аксессуары


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

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

Где достать профиль?


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

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

Немного о 3D-печати креплений


Кронштейны и крепления можно печатать на принтере, о чем говорилось выше. Если есть достаточное количество пластика, можно распечатать и сам профиль. Т-гайки, о которых говорилось выше, тоже можно печатать.


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

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

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

Подробнее..

Wi-Fi Интернет в соседнюю комнату

14.06.2021 14:06:00 | Автор: admin

Когда мы купили квартиру и делали в ней ремонт, телефоны были еще кнопочными, а Wi-Fi роутеры если и существовали, то в качестве диковинки. Предполагалось, что интернет будет подключен через витую пару к компу, а сам комп будет стоять на балконе, потому что балкон будет теплым и в нем будет кабинет. Квартира была без отделки, и поэтому мы решили сделать умный ход чтобы не тащить провода под плинтусами от коридора до балкона (как обходить двери?) мы заложили гофру в бетонный пол и протащили кабель напрямки. И нет, штробить бетон не пришлось, потому как он и так был снят для монтажа теплого водяного пола. Первые пару лет я даже гордился таким решением. Еще бы! Никаких дыр в стенах, никаких уродских кабель-каналов и интернет где нужно! Но года через 2-3 начали появляться всякие гаджеты, мы купили Wi-Fi роутер и тут появилась проблема.

Схема 1. Часть плана квартирыСхема 1. Часть плана квартиры

На схеме роутер отмечен синим крестиком.

Если в кабинете и в соседней комнате все было шикарно, то на кухне (она же зал, где диван и все часто тусят) сигнала почти не было. Мешала несущая кирпичная стена. Для решения вопроса я рассматривал 3 варианта:

1. Купить новый мощный роутер, который будет пробивать все преграды. За и против:

+ Изящное решение: не надо ничего сверлить и переделывать глобально.

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

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

2. Купить повторители.

+ Опять же не надо ничего вскрывать и сверлить и нет минусов предыдущего пункта.

- Учитывая схему нашей квартиры и расположение розеток нужно минимум 2 повторителя, чтобы обойти стену.

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

3. Продырявить стену рядом с роутером и поставить в зале свой роутер.

+ Надежный сигнал

+ Опрятный внешний вид

- Непонятно как это реализовывать и возможно ли это вообще?

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

Роутер D-Link DIR-615Роутер D-Link DIR-615

Зачем ему две антенны? Вот бы взять одну и протащить в соседнюю комнату? Я позвонил в магазин, торгующий железом и спросил:

-Подскажите, у роутера такого-то есть 2 антенны, они обе равноценные? Каждая и передает и принимает? Или одна только передает, а другая только принимает сигнал?

-ХЗ, вежливо ответил продавец и порекомендовал звякнуть производителю.

Я так и сделал.

- ХЗ, вежливо ответил производитель.

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

Тогда я решил рискнуть и купил удлинитель. Вот такой:

Удлинитель антенны роутераУдлинитель антенны роутера

Сначала поэкспериментировал так. Выкрутил одну антенну из роутера совсем, а вторую прикрутил через удлинитель и отнес на максимальное расстояние от роутера. Работает! Также проверил другое гнездо роутера работает! После этого пробурил отверстие. Сверлил на уровне около 4 см над полом, предварительно сняв плинтуса.

Схема 2. Синяя полоса рядом с крестиком показывает место прокладки кабеля.Схема 2. Синяя полоса рядом с крестиком показывает место прокладки кабеля.

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

Решение оказалось идеальным. Обе антенны, как выяснилось опытным путем, равноценны.

В зале антенна просто торчит на проводе (он довольно жесткий) в неприметном месте.

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

Кстати упомяну еще один лайф-хак запитать роутер через таймер в розетку. Вот такой:

Таймер за 300 р.Таймер за 300 р.

Зачем?

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

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

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

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

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

Подробнее..

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

15.06.2021 00:15:33 | Автор: admin

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

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

Все можно построить из профиля


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


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


С их помощью крепить профиль можно под любым углом 30, 45 или 60 градусов изготовить подобное несложно. Пример нестандартного пластикового соединения показан выше.

Нестандартный не означает сложный


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


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

Пример: сложные углы без проблем


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


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

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

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




Небольшая хитрость: замена т-образной гайки, вставки и чего угодно


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

Альтернатива использование обычных гаек вместо Т-образных. Стандартные гайки совместимы не со всеми разновидностями профиля, а лишь с Misumi 3 Series. Компания Misumi предлагает и специализированные гайки, которые стоят около 9 долларов за 100 штук. В то же время обычные M3 стоят примерно 0,88 доллара за 100 штук. Их мы и будем использовать, решив попутно парочку проблем.


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

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


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





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

Подробнее..

Перевод Карманная книга по TypeScript. Часть 1. Основы

29.05.2021 16:20:40 | Автор: admin

С сегодняшнего дня мы начинаем серию публикаций адаптированного и дополненного перевода "Карманной книги по TypeScript".


Каждое значение в JavaScript при выполнении над ним каких-либо операций ведет себя определенным образом. Это может звучать несколько абстрактно, но, в качестве примера, попробуем выполнить некоторые операции над переменной message:


// Получаем доступ к свойству `toLowerCase`// и вызываем егоmessage.toLowerCase()// Вызываем `message`message()

На первой строке мы получаем доступ к свойству toLowerCase и вызываем его. На второй строке мы пытаемся вызвать message.


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


  • Является ли переменная message вызываемой?


  • Имеет ли она свойство toLowerCase?


  • Если имеет, является ли toLowerCase вызываемым?


  • Если оба этих значения являются вызываемыми, то что они возвращают?



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


Допустим, message была определена следующим образом:


const message = 'Hello World'

Как вы, наверное, догадались, при запуске message.toLowerCase() мы получим ту же строку, только в нижнем регистре.


Что насчет второй строки кода? Если вы знакомы с JS, то знаете, что в этом случае будет выброшено исключение:


TypeError: message is not a function// Ошибка типа: message  это не функция

Было бы здорово, если бы мы имели возможность избегать подобных ошибок.


При запуске нашего кода, способ, с помощью которого движок JS определяет, что делать, заключается в выяснении типа (type) значения каким поведением и возможностями он обладает. На это намекает TypeError она говорит, что строка 'Hello World' не может вызываться как функция.


Для некоторых значений, таких как примитивы string и number, мы можем определить их тип во время выполнения кода (runtime) с помощью оператора typeof. Но для других значений, таких как функции, соответствующий механизм для определения типов во время выполнения отсутствует. Например, рассмотрим следующую функцию:


function fn(x) {return x.flip()}

Читая этот код, мы можем сделать вывод, что функция будет работать только в случае передачи ей объекта с вызываемым свойством flip, но JS не обладает этой информацией. Единственным способом определить, что делает fn с определенным значением, в чистом JS является вызов этой функции. Такой вид поведения затрудняет предсказание поведения кода во время его написания.


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


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


Проверка статических типов


Вернемся к TypeError, которую мы получили, пытаясь вызвать string как функцию. Никто не любит получать ошибки или баги (bugs) при выполнении кода.


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


const message = 'Hello!'message()// This expression is not callable. Type 'String' has no call signatures. Данное выражение не является вызываемым. Тип 'String' не обладает сигнатурами вызова

При использовании TS, мы получаем ошибку перед выполнением кода (на этапе компиляции).


Ошибки, не являющиеся исключениями


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


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


const user = {name: 'John',age: 30}user.location // undefined

В TS это, как и ожидается, приводит к ошибке:


const user = {name: 'John',age: 30}user.location// Property 'location' does not exist on type '{ name: string; age: number; }'. Свойства 'location' не существует в типе...

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


Например:


  • опечатки

const announcement = Hello World!;// Как быстро вы заметите опечатку?announcement.toLocaleLowercase();announcement.toLocalLowerCase();// Вероятно, мы хотели написать этоannouncement.toLocaleLowerCase();

  • функции, которые не были вызваны

function flipCoin() {// Должно было быть `Math.random()`return Math.random < 0.5;// Operator '<' cannot be applied to types '() => number' and 'number'. Оператор '<' не может быть применен к типам...}

  • или логические ошибки

const value = Math.random() < 0.5 ? a : b;if (value !== a) {// ...} else if (value === b) {// This condition will always return 'false' since the types 'a' and 'b' have no overlap. Данное условие будет всегда возвращать 'false', поскольку типы 'a' и 'b' не пересекаются// Упс, недостижимый участок кода}

Типы, интегрированные в среду разработки


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


tsc, компилятор TS


Для начала установим tsc:


yarn global add tsc# илиnpm i -g tsc

Создадим файл hello.ts:


// Приветствуем всех собравшихсяconsole.log('Hello World!')

И скомпилируем (преобразуем) его в JS:


tsc hello.ts

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


Теперь попробуем вызвать ошибку. Перепишем hello.ts:


function greet(person, date) {console.log(`Hello, ${person}! Today is ${date}.`)}greet('John')

Если мы снова запустим tsc hello.ts, то получим ошибку:


Expected 2 arguments, but got 1. Ожидалось 2 аргумента, а получен 1

TS сообщает нам о том, что мы забыли передать аргумент в функцию greet, и он прав.


Компиляция с ошибками


Вы могли заметить, что после компиляции кода, содержащего ошибку, файл hello.js все равно обновился. Это объясняется тем, что TS считает вас умнее себя. Это также не мешает работающему JS-коду, при наличии некоторых ошибок, связанных с типами, благополучно работать дальше при постепенном переносе проекта на TS. Однако, если вы хотите, чтобы TS был более строгим, то можете указать флаг --noEmitOnError. Попробуйте снова изменить hello.ts и скомпилировать его с помощью такой команды:


tsc --noEmitOnError hello.ts

Вы увидите, что hello.js больше не обновляется.


Явные типы


Давайте отредактируем код и сообщим TS, что person это string, а date объект Date. Мы также вызовем метод toDateString() на date:


function greet(person: string, date: Date) {console.log(`Hello, ${person}! Today is ${date.toDateString().}`)}

То, что мы сделали, называется добавлением аннотаций типа (type annotations) к person и date для описания того, с какими типами значений может вызываться greet.


После этого TS будет сообщать нам о неправильных вызовах функции, например:


function greet(person: string, date: Date) {console.log(`Hello, ${person}! Today is ${date.toDateString()}.`);}greet('John', Date());// Argument of type 'string' is not assignable to parameter of type 'Date'. Аргумент типа 'string' не может быть присвоен параметру типа 'Date'

Вызов Date() возвращает строку. Для того, чтобы получить объект Date, следует вызвать new Date():


greet('John', new Date());

Во многих случаях нам не нужно явно аннотировать типы, поскольку TS умеет предполагать (infer) тип или делать вывод относительно типа на основе значения:


const msg = 'Hello!'// const msg: string

Удаление типов


Давайте скомпилируем функцию greet в JS с помощью tsc. Вот что мы получаем:


use strict;function greet(person, date) {console.log(Hello  + person + ! Today is  + date.toDateString() + .);}greet(John, new Date());

Обратите внимание на две вещи:


  1. Наши параметры person и date больше не имеют аннотаций типа.


  2. Наша шаблонная строка строка, в которой используются обратные кавычки (символ ```) была преобразована в обычную строку с конкатенациями (+).



Что касается первого пункта, то все дело в том, что аннотации типа не являются частью JS (или ECMAScript, если быть точнее), поэтому для того, чтобы преобразованный JS мог выполняться в браузере, они полностью удаляются из кода, как и любые другие специфичные для TS вещи.


Понижение уровня кода


Процесс, который часто называют понижением уровня кода (downleveling), состоит в преобразовании кода в код более старой версии, например, JS-кода, соответствующего спецификации ECMAScript 2015 (ES6), в код, соответствующий спецификации ECMAScript 3 (ES3). Шаблонные литералы (или шаблонные строки) были представлены в ES6, а TS по умолчанию преобразует код в ES3, поэтому наша шаблонная строка превратилась в обычную строку с объединениями. Для изменения спецификации, которой должен соответствовать компилируемый код, используется флаг --target. Например, команда tsc --target es2015 hello.ts оставит нашу строку неизменной.


Строгость


Строгость проверок, выполняемых TS, определяется несколькими флагами. Флаг --strict или настройка "strict": true в tsconfig.json включает максимальную строгость. Двумя другими главными настройками, определяющими строгость проверок, являются noImplicitAny и strictNullChecks.


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


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





Облачные серверы от Маклауд быстрые и безопасные.


Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!


Подробнее..

Перевод Карманная книга по TypeScript. Часть 2. Типы на каждый день

30.05.2021 10:22:52 | Автор: admin

image


Мы продолжаем серию публикаций адаптированного и дополненного перевода "Карманной книги по TypeScript".

Другие части:



Примитивы: string, number и boolean


В JS часто используется 3 примитива: string, number и boolean. Каждый из них имеет соответствующий тип в TS:


  • string представляет строковые значения, например, 'Hello World'
  • number предназначен для чисел, например, 42. JS не различает целые числа и числа с плавающей точкой (или запятой), поэтому не существует таких типов, как int или float только number
  • boolean предназначен для двух значений: true и false

Обратите внимание: типы String, Number и Boolean (начинающиеся с большой буквы) являются легальными и ссылаются на специальные встроенные типы, которые, однако, редко используются в коде. Для типов всегда следует использовать string, number или boolean.


Массивы


Для определения типа массива [1, 2, 3] можно использовать синтаксис number[]; такой синтаксис подходит для любого типа (например, string[] это массив строк и т.д.). Также можно встретить Array<number>, что означает тоже самое. Такой синтаксис, обычно, используется для определения общих типов или дженериков (generics).


Обратите внимание: [number] это другой тип, кортеж (tuple).


any


TS предоставляет специальный тип any, который может использоваться для отключения проверки типов:


let obj: any = { x: 0 }// Ни одна из строк ниже не приведет к возникновению ошибки на этапе компиляции// Использование `any` отключает проверку типов// Использование `any` означает, что вы знакомы со средой выполнения кода лучше, чем `TS`obj.foo()obj()obj.bar = 100obj = 'hello'const n: number = obj

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


noImplicitAny


При отсутствии определения типа и когда TS не может предположить его на основании контекста, неявным типом значение становится any.


Обычно, мы хотим этого избежать, поскольку any является небезопасным с точки зрения системы типов. Установка флага noImplicitAny позволяет квалифицировать любое неявное any как ошибку.


Аннотации типа для переменных


При объявлении переменной с помощью const, let или var опционально можно определить ее тип:


const myName: string = 'John'

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


// В аннотации типа нет необходимости - `myName` будет иметь тип `string`const myName = 'John'

Функции


В JS функции, в основном, используются для работы с данными. TS позволяет определять типы как для входных (input), так и для выходных (output) значений функции.


Аннотации типа параметров


При определении функции можно указать, какие типы параметров она принимает:


function greet(name: string) { console.log(`Hello, ${name.toUpperCase()}!`)}

Вот что произойдет при попытке вызвать функцию с неправильным аргументом:


greet(42)// Argument of type 'number' is not assignable to parameter of type 'string'. Аргумент типа 'number' не может быть присвоен параметру типа 'string'

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


Аннотация типа возвращаемого значения


Также можно аннотировать тип возвращаемого функцией значения:


function getFavouriteNumber(): number { return 26}

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


Анонимные функции


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


Вот пример:


// Аннотации типа отсутствуют, но это не мешает `TS` обнаруживать ошибкиconst names = ['Alice', 'Bob', 'John']// Определение типов на основе контекста вызова функцииnames.forEach(function (s) { console.log(s.toUppercase()) // Property 'toUppercase' does not exist on type 'string'. Did you mean 'toUpperCase'? Свойства 'toUppercase' не существует в типе 'string'. Вы имели ввиду 'toUpperCase'?})// Определение типов на основе контекста также работает для стрелочных функцийnames.forEach((s) => { console.log(s.toUppercase()) // Property 'toUppercase' does not exist on type 'string'. Did you mean 'toUpperCase'?})

Несмотря на отсутствие аннотации типа для s, TS использует типы функции forEach, а также предполагаемый тип массива для определения типа s. Этот процесс называется определением типа на основе контекста (contextual typing).


Типы объекта


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


function printCoords(pt: { x: number, y: number }) { console.log(`Значение координаты 'x': ${pt.x}`) console.log(`Значение координаты 'y': ${pt.y}`)}printCoords({ x: 3, y: 7 })

Для разделения свойств можно использовать , или ;. Тип свойства является опциональным. Свойство без явно определенного типа будет иметь тип any.


Опциональные свойства


Для определения свойства в качестве опционального используется символ ? после названия свойства:


function printName(obj: { first: string, last?: string }) { // ...}// Обе функции скомпилируются без ошибокprintName({ first: 'John' })printName({ first: 'Jane', last: 'Air' })

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


function printName(obj: { first: string, last?: string }) { // Ошибка - приложение может сломаться, если аргумент `last` не будет передан в функцию console.log(obj.last.toUpperCase()) // Object is possibly 'undefined'. Потенциальным значением объекта является 'undefined' if (obj.last !== undefined) {   // Теперь все в порядке   console.log(obj.last.toUpperCase()) } // Безопасная альтернатива, использующая современный синтаксис `JS` - оператор опциональной последовательности (`?.`) console.log(obj.last?.toUpperCase())}

Объединения (unions)


Обратите внимание: в литературе, посвященной TS, union, обычно, переводится как объединение, но фактически речь идет об альтернативных типах, объединенных в один тип.


Определение объединения


Объединение это тип, сформированный из 2 и более типов, представляющий значение, которое может иметь один из этих типов. Типы, входящие в объединение, называются членами (members) объединения.


Реализуем функцию, которая может оперировать строками или числами:


function printId(id: number | string) { console.log(`Ваш ID: ${id}`)}// OKprintId(101)// OKprintId('202')// ОшибкаprintId({ myID: 22342 })// Argument of type '{ myID: number }' is not assignable to parameter of type 'string | number'. Type '{ myID: number }' is not assignable to type 'number'. Аргумент типа '{ myID: number }' не может быть присвоен параметру типа 'string | number'. Тип '{ myID: number }' не может быть присвоен типу 'number'

Работа с объединениями


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


function printId(id: number | string) { console.log(id.toUpperCase()) // Property 'toUpperCase' does not exist on type 'string | number'. Property 'toUpperCase' does not exist on type 'number'.}

Решение данной проблемы заключается в сужении (narrowing) объединения. Например, TS знает, что только для string оператор typeof возвращает 'string':


function printId(id: number | string) { if (typeof id === 'string') {   // В этой ветке `id` имеет тип 'string'   console.log(id.toUpperCase()) } else {   // А здесь `id` имеет тип 'number'   console.log(id) }}

Другой способ заключается в использовании функции, такой как Array.isArray:


function welcomePeople(x: string[] | string) { if (Array.isArray(x)) {   // Здесь `x` - это 'string[]'   console.log('Привет, ' + x.join(' и ')) } else {   // Здесь `x` - 'string'   console.log('Добро пожаловать, одинокий странник ' + x) }}

В некоторых случаях все члены объединения будут иметь общие методы. Например, и массивы, и строки имеют метод slice. Если каждый член объединения имеет общее свойство, необходимость в сужении отсутствует:


function getFirstThree(x: number[] | string ) { return x.slice(0, 3)}

Синонимы типов (type aliases)


Что если мы хотим использовать один и тот же тип в нескольких местах? Для этого используются синонимы типов:


type Point = { x: number y: number}// В точности тоже самое, что в приведенном выше примереfunction printCoords(pt: Point) { console.log(`Значение координаты 'x': ${pt.x}`) console.log(`Значение координаты 'y': ${pt.y}`)}printCoords({ x: 3, y: 7 })

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


type ID = number | string

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


type UserInputSanitizedString = stringfunction sanitizeInput(str: string): UserInputSanitizedString { return sanitize(str)}// Создаем "обезвреженный" инпутlet userInput = sanitizeInput(getInput())// По-прежнему имеем возможность изменять значение переменнойuserInput = 'new input'

Интерфейсы


Определение интерфейса это другой способ определения типа объекта:


interface Point { x: number y: number}function printCoords(pt: Point) { console.log(`Значение координаты 'x': ${pt.x}`) console.log(`Значение координаты 'y': ${pt.y}`)}printCoords({ x: 3, y: 7 })

TS иногда называют структурно типизированной системой типов (structurally typed type system) TS заботит лишь соблюдение структуры значения, передаваемого в функцию printCoords, т.е. содержит ли данное значение ожидаемые свойства.


Разница между синонимами типов и интерфейсами


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


Пример расширения интерфейса:


interface Animal { name: string}interface Bear extends Animal { honey: boolean}const bear = getBear()bear.namebear.honey

Пример расширения типа с помощью пересечения (intersection):


type Animal { name: string}type Bear = Animal & { honey: boolean}const bear = getBear()bear.namebear.honey

Пример добавления новых полей в существующий интерфейс:


interface Window { title: string}interface Window { ts: TypeScriptAPI}const src = 'const a = 'Hello World''window.ts.transpileModule(src, {})

Тип не может быть изменен после создания:


type Window = { title: string}type Window = { ts: TypeScriptAPI}// Ошибка: повторяющийся идентификатор 'Window'.

Общее правило: используйте interface до тех пор, пока вам не понадобятся возможности type.


Утверждение типа (type assertion)


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


Например, когда мы используем document.getElementById, TS знает лишь то, что данный метод возвращает какой-то HTMLElement, но мы знаем, например, что будет возвращен HTMLCanvasElement. В этой ситуации мы можем использовать утверждение типа для определения более конкретного типа:


const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement

Для утверждения типа можно использовать другой синтаксис (е в TSX-файлах):


const myCanvas = <HTMLCanvasElement>document.getElementById('main_canvas')

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


const x = 'hello' as number// Conversion of type 'string' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.// Преобразование типа 'string' в тип 'number' может быть ошибкой, поскольку эти типы не перекрываются. Если это было сделано намерено, то выражение сначала следует преобразовать в 'unknown'

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


const a = (expr as any) as T

Литеральные типы (literal types)


В дополнение к общим типам string и number, мы можем ссылаться на конкретные строки и числа, находящиеся на определенных позициях.


Вот как TS создает типы для литералов:


let changingString = 'Hello World'changingString = 'Ol Mundo'// Поскольку `changingString` может представлять любую строку, вот// как TS описывает ее в системе типовchangingString // let changingString: stringconst constantString = 'Hello World'// Поскольку `constantString` может представлять только указанную строку, она// имеет такое литеральное представление типаconstantString // const constantString: 'Hello World'

Сами по себе литеральные типы особой ценности не представляют:


let x: 'hello' = 'hello'// OKx = 'hello'// ...x = 'howdy'// Type '"howdy"' is not assignable to type '"hello"'.

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


function printText(s: string, alignment: 'left' | 'right' | 'center') { // ...}printText('Hello World', 'left')printText("G'day, mate", "centre")// Argument of type '"centre"' is not assignable to parameter of type '"left" | "right" | "center"'.

Числовые литеральные типы работают похожим образом:


function compare(a: string, b: string): -1 | 0 | 1 { return a === b ? 0 : a > b ? 1 : -1}

Разумеется, мы можем комбинировать литералы с нелитеральными типами:


interface Options { width: number}function configure(x: Options | 'auto') { // ...}configure({ width: 100 })configure('auto')configure('automatic')// Argument of type '"automatic"' is not assignable to parameter of type 'Options | "auto"'.

Предположения типов литералов


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


const obj = { counter: 0 }if (someCondition) { obj.counter = 1}

TS не будет считать присвоение значения 1 полю, которое раньше имело значение 0, ошибкой. Это объясняется тем, что TS считает, что типом obj.counter является number, а не 0.


Тоже самое справедливо и в отношении строк:


const req = { url: 'https://example.com', method: 'GET' }handleRequest(req.url, req.method)// Argument of type 'string' is not assignable to parameter of type '"GET" | "POST"'.

В приведенном примере предположительный типом req.method является string, а не 'GET'. Поскольку код может быть вычислен между созданием req и вызовом функции handleRequest, которая может присвоить req.method новое значение, например, GUESS, TS считает, что данный код содержит ошибку.


Существует 2 способа решить эту проблему.


  1. Можно утвердить тип на каждой позиции:

// Изменение 1const req = { url: 'https://example.com', method: 'GET' as 'GET' }// Изменение 2handleRequest(req.url, req.method as 'GET')

  1. Для преобразования объекта в литерал можно использовать as const:

const req = { url: 'https://example.com', method: 'GET' } as consthandleRequest(req.url, req.method)

null и undefined


В JS существует два примитивных значения, сигнализирующих об отсутствии значения: null и undefined. TS имеет соответствующие типы. То, как эти типы обрабатываются, зависит от настройки strictNullChecks (см. часть 1).


Оператор утверждения ненулевого значения (non-null assertion operator)


TS предоставляет специальный синтаксис для удаления null и undefined из типа без необходимости выполнения явной проверки. Указание ! после выражения означает, что данное выражение не может быть нулевым, т.е. иметь значение null или undefined:


function liveDangerously(x?: number | undefined) { // Ошибки не возникает console.log(x!.toFixed())}

Перечисления (enums)


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


Редко используемые примитивы


bigint


Данный примитив используется для представления очень больших целых чисел BigInt:


// Создание `bigint` с помощью функции `BigInt`const oneHundred: bigint = BigInt(100)// Создание `bigint` с помощью литерального синтаксисаconst anotherHundred: bigint = 100n

Подробнее о BigInt можно почитать здесь.


symbol


Данный примитив используется для создания глобально уникальных ссылок с помощью функции Symbol():


const firstName = Symbol('name')const secondName = Symbol('name')if (firstName === secondName) { // This condition will always return 'false' since the types 'typeof firstName' and 'typeof secondName' have no overlap. // Символы `firstName` и `lastName` никогда не будут равными}

Подробнее о символах можно почитать здесь.




Облачные серверы от Маклауд идеально подходят для разработки на TypeScript.


Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!


Подробнее..

Перевод Карманная книга по TypeScript. Часть 4. Подробнее о функциях

08.06.2021 10:08:20 | Автор: admin

image


Я продолжаю серию публикаций адаптированного и дополненного перевода "Карманной книги по TypeScript".

Другие части:



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


Тип функции в форме выражения (function type expressions)


Простейшим способом описания типа функции является выражение. Такие типы похожи на стрелочные функции:


function greeter(fn: (a: string) => void) { fn('Hello, World')}function printToConsole(s: string) { console.log(s)}greeter(printToConsole)

Выражение (a: string) => void означает "функция с одним параметром a типа string, которая ничего не возвращает". Как и в случае с определением функции, если тип параметра не указан, он будет иметь значение any.


Обратите внимание: название параметра является обязательным. Тип функции (string) => void означает "функция с параметром string типа any"!


Разумеется, для типа функции можно использовать синоним:


type GreetFn = (a: string) => voidfunction greeter(fn: GreetFn) { // ...}

Сигнатуры вызова (call signatures)


В JS функции, кроме того, что являются вызываемыми (callable), могут иметь свойства. Однако, тип-выражение не позволяет определять свойства функции. Для описания вызываемой сущности (entity), обладающей некоторыми свойствами, можно использовать сигнатуру вызова (call signature) в объектном типе:


type DescFn = { description: string (someArg: number): boolean}function doSomething(fn: DescFn) { console.log(`Значением, возвращаемым ${fn.description} является ${fn(6)}`)}

Обратите внимание: данный синтаксис немного отличается от типа-выражения функции между параметрами и возвращаемым значением используется : вместо =>.


Сигнатуры конструктора (construct signatures)


Как известно, функции могут вызываться с ключевым словом new. TS считает такие функции конструкторами, поскольку они, как правило, используются для создания объектов. Для определения типов таких функций используется сигнатура конструктора:


type SomeConstructor = { new (s: string): SomeObject}function fn(ctor: SomeConstructor) { return new ctor('Hello!')}

Некоторые объекты, такие, например, как объект Date, могут вызываться как с, так и без new. Сигнатуры вызова и конструктора можно использовать совместно:


interface CallOrConstruct { new (s: string): Date (n?: number): number}

Общие функции или функции-дженерики (generic functions)


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


function firstElement(arr: any[]) { return arr[0]}

Функция делают свою работу, но, к сожалению, типом возвращаемого значения является any. Было бы лучше, если бы функция возвращала тип элемента массива.


В TS общие типы или дженерики (generics) используются для описания связи между двумя значениями. Это делается с помощью определения параметра Type в сигнатуре функции:


function firstElement<Type>(arr: Type[]): Type { return arr[0]}

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


// `s` имеет тип `string`const s = firstElement(['a', 'b', 'c'])// `n` имеет тип `number`const n = firstElement([1, 2, 3])

Предположение типа (inference)


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


function map<Input, Output>(arr: Input[], func: (arg: Input) => Output): Output[] { return arr.map(func)}// Типом `n` является `string`,// а типом `parsed` - `number[]`const parsed = map(['1', '2', '3'], (n) => parseInt(n))

Обратите внимание, что в приведенном примере TS может сделать вывод относительно типа Input на основе переданного string[], а относительно типа Output на основе возвращаемого number.


Ограничения (constraints)


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


Реализуем функцию, возвращающую самое длинное из двух значений. Для этого нам потребуется свойство length, которое будет числом. Мы ограничим параметр типа типом number с помощью ключевого слова extends:


function longest<Type extends { length: number }>(a: Type, b: Type) { if (a.length >= b.length) {   return a } else {   return b }}// Типом `longerArr` является `number[]`const longerArr = longest([1, 2], [1, 2, 3])// Типом `longerStr` является `string`const longerStr = longest('alice', 'bob')// Ошибка! У чисел нет свойства `length`const notOK = longest(10, 100)// Argument of type 'number' is not assignable to parameter of type '{ length: number }'.// Аргумент типа 'number' не может быть присвоен параметру типа '{ length: number; }'

Мы позволяем TS предполагать тип значения, возвращаемого из функции longest.


Поскольку мы свели Type к { length: number }, то получили доступ к свойству length параметров a и b. Без ограничения типа у нас бы не было такого доступа, потому что значения этих свойств могли бы иметь другой тип без длины.


Типы longerArr и longerStr были выведены на основе аргументов. Запомните, дженерики определяют связь между двумя и более значениями одного типа!


Наконец, как мы и ожидали, вызов longest(10, 100) отклоняется, поскольку тип number не имеет свойства length.


Работа с ограниченными значениями


Вот пример распространенной ошибки, возникающей при работе с ограничениями дженериков:


function minLength<Type extends { length: number }>( obj: Type, min: number): Type { if (obj.length >= min) {   return obj } else {   return { length: min } }}// Type '{ length: number; }' is not assignable to type 'Type'. '{ length: number; }' is assignable to the constraint of type 'Type', but 'Type' could be instantiated with a different subtype of constraint '{ length: number; }'.// Тип '{ length: number; }' не может быть присвоен типу 'Type'. '{ length: number; }' может присваиваться ограничению типа 'Type', но 'Type' может быть инстанцирован с другим подтипом ограничения '{ length: number; }'

На первый взгляд может показаться, что все в порядке Type сведен к { length: number }, и функция возвращает либо Type, либо значение, совпадающее с ограничением. Проблема состоит в том, что функция может вернуть объект, идентичный тому, который ей передается, а не просто объект, совпадающий с ограничением. Если бы во время компиляции не возникло ошибки, мы могли бы написать что-то вроде этого:


// `arr` получает значение `{ length: 6 }`const arr = minLength([1, 2, 3], 6)// и ломает приложение, поскольку массивы// имеют метод `slice`, но не возвращаемый объект!console.log(arr.slice(0))

Определение типа аргументов


Обычно, TS делает правильные выводы относительно типов аргументов в вызове дженерика, но так бывает не всегда. Допустим, мы реализовали такую функцию для объединения двух массивов:


function combine<Type>(arr1: Type[], arr2: Type[]): Type[] { return arr1.concat(arr2)}

При обычном вызове данной функции с несовпадающими по типу массивами возникает ошибка:


const arr = combine([1, 2, 3], ['привет'])// Type 'string' is not assignable to type 'number'.

Однако, мы можем вручную определить Type, и тогда все будет в порядке:


const arr = combine<string | number>([1, 2, 3], ['привет'])

Руководство по написанию хороших функций-дженериков


Используйте параметры типа без ограничений


Рассмотрим две похожие функции:


function firstElement1<Type>(arr: Type[]) { return arr[0]}function firstElement2<Type extends any[]>(arr: Type) { return arr[0]}// a: number (хорошо)const a = fisrtElement1([1, 2, 3])// b: any (плохо)const b = fisrtElement2([1, 2, 3])

Предполагаемым типом значения, возвращаемого функцией firstElement1 является Type, а значения, возвращаемого функцией firstElement2 any. Это объясняется тем, что TS разрешает (resolve) выражение arr[0] с помощью ограничения типа вместо того, чтобы ждать разрешения элемента после вызова функции.


Правило: по-возможности, используйте параметры типа без ограничений.


Используйте минимальное количество параметров типа


Вот еще одна парочка похожих функций:


function filter1<Type>(arr: Type[], func: (arg: Type) => boolean): Type[] { return arr.filter(func)}function filter2<Type, Func extends (arg: Type) => boolean>( arr: Type[], func: Func): Type[] { return arr.filter(func)}

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


Правило: всегда используйте минимальное количество параметров типа.


Параметры типа должны указываться дважды


Иногда мы забываем, что функция не обязательно должна быть дженериком:


function greet<Str extends string>(s: Str) { console.log(`Привет, ${s}!`)}greet('народ')

Вот упрощенная версия данной функции:


function greet(s: string) { console.log(`Привет, ${s}!`)}

Запомните, параметры типа предназначены для связывания типов нескольких значений.


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


Опциональные параметры (optional parameters)


Функции в JS могут принимать произвольное количество аргументов. Например, метод toFixed принимает опциональное количество цифр после запятой:


function fn(n: number) { console.log(n.toFixed()) // 0 аргументов console.log(n.toFixed(3)) // 1 аргумент}

Мы можем смоделировать это в TS, пометив параметр как опциональный с помощью ?:


function f(x?: number) { // ...}f() // OKf(10) // OK

Несмотря на то, что тип параметра определен как number, параметр x на самом деле имеет тип number | undefined, поскольку неопределенные параметры в JS получают значение undefined.


Мы также можем указать "дефолтный" параметр (параметр по умолчанию):


function f(x = 10) { // ...}

Теперь в теле функции f параметр x будет иметь тип number, поскольку любой аргумент со значением undefined будет заменен на 10. Обратите внимание: явная передача undefined означает "отсутствующий" аргумент.


declare function f(x?: number): void// OKf()f(10)f(undefined)

Опциональные параметры в функциях обратного вызова


При написании функций, вызывающих "колбеки", легко допустить такую ошибку:


function myForEach(arr: any[], callback: (arg: any, index?: number) => void) { for (let i = 0; i < arr.length; i++) {   callback(arr[i], i) }}

Указав index?, мы хотим, чтобы оба этих вызова были легальными:


myForEach([1, 2, 3], (a) => console.log(a))myForEach([1, 2, 3], (a, i) => console.log(a, i))

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


function myForEach(arr: any[], callback: (arg: any, index?: number) => void) { for (let i = 0; i < arr.length; i++) {   callback(arr[i]) }}

Поэтому попытка вызова такой функции приводит к ошибке:


myForEach([1, 2, 3], (a, i) => { console.log(i.toFixed()) // Object is possibly 'undefined'. // Возможным значением объекта является 'undefined'})

В JS при вызове функции с большим (ударение на первый слог) количеством аргументов, чем указано в определении фукнции, дополнительные параметры просто игнорируются. TS ведет себя аналогичным образом. Функции с меньшим количеством параметров (одного типа) могут заменять функции с большим количеством параметров.


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


Перегрузка функции (function overload)


Некоторые функции могут вызываться с разным количеством аргументов. Например, мы можем написать функцию, возвращающую Date, которая принимает время в мс (timestamp, один аргумент) или день/месяц/год (три аргумента).


В TS такую функцию можно реализовать с помощью сигнатур перегрузки (overload signatures). Для этого перед телом функции указывается несколько ее сигнатур:


function makeDate(timestamp: number): Datefunction makeDate(d: number, m: number, y: number): Datefunction makeDate(dOrTimestamp: number, m?: number, y?: number): Date { if (m !== undefined && y !== undefined) {   return new Date(y, m, dOrTimestamp) } else {   return new Date(dOrTimestamp) }}const d1 = makeDate(12345678)const d2 = makeDate(5, 5, 5)const d3 = makeDate(1, 3)// No overload expects 2 arguments, but overloads do exist that expect either 1 or 3 arguments.// Нет перегрузки, принимающей 2 аргумента, но существуют перегрузки, ожидающие получения 1 или 3 аргумента

В приведенном примере мы реализовали две перегрузки: одну, принимающую один аргумент, и вторую, принимающую три аргумента. Первые две сигнатуры называются сигнатурами перегрузки.


Затем мы реализовали функцию с совместимой сигнатурой (compatible signature). Функции имеют сигнатуру реализации (implementation signature), но эта сигнатура не может вызываться напрямую. Несмотря на то, что мы написали функцию с двумя опциональными параметрами после обязательного, она не может вызываться с двумя параметрами!


Сигнатуры перегрузки и сигнатура реализации


Предположим, что у нас имеется такой код:


function fn(x: string): voidfunction fn() { // ...}// Мы ожидаем, что функция может вызываться без аргументовfn()// Expected 1 arguments, but got 0.// Ожидалось получение 1 аргумента, а получено 0

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


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


function fn(x: boolean): void// Неправильный тип аргументаfunction fn(x: string): void// This overload signature is not compatible with its implementation signature.// Данная сигнатура перегрузки не совместима с сигнатурой ее реализацииfunction(x: boolean) {}

function fn(x: string): string// Неправильный тип возвращаемого значенияfunction(x: number): boolean// This overload signature is not compatible with its implementation signature.function fn(x: string | number) { return 'упс'}

Правила реализации хороших перегрузок функции


Рассмотрим функцию, возвращающую длину строки или массива:


function len(s: string): numberfunction len(arr: any[]): numberfunction len(x: any) { return x.length}

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


len('') // OKlen([0]) // OKlen(Math.random() > 0.5 ? 'привет' : [0])/*No overload matches this call. Overload 1 of 2, '(s: string): number', gave the following error.   Argument of type 'number[] | "привет"' is not assignable to parameter of type 'string'.     Type 'number[]' is not assignable to type 'string'. Overload 2 of 2, '(arr: any[]): number', gave the following error.   Argument of type 'number[] | "привет"' is not assignable to parameter of type 'any[]'.     Type 'string' is not assignable to type 'any[]'.*//*Ни одна из перегрузок не совпадает с вызовом. Перегрузка 1 из 2, '(s: string): number', возвращает следующую ошибку.   Аргумент типа 'number[] | "привет"' не может быть присвоен параметру типа 'string'.     Тип 'number[]' не может быть присвоен типу 'string'. Перегрузка 2 из 2, '(arr: any[]): number', возвращает следующую ошибку.   Аргумент типа 'number[] | "привет"' не может быть присвоен типу 'any[]'.     Тип 'string' не может быть присвоен типу 'any[]'.*/

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


function len(x: any[] | string) { return x.length}

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


Правило: по-возможности используйте объединения вместо перегрузок функции.


Определение this в функциях


Рассмотрим пример:


const user = { id: 123, admin: false, becomeAdmin: function() {   this.admin = true }}

TS "понимает", что значением this функции user.becomeAdmin является внешний объект user. В большинстве случаев этого достаточно, но порой нам требуется больше контроля над тем, что представляет собой this. Спецификация JS определяет, что мы не можем использовать this в качестве названия параметра. TS использует это синтаксическое пространство (syntax space), позволяя определять тип this в теле функции:


const db = getDB()const admins = db.filterUsers(function() { return this.admin})

Обратите внимание: в данном случае мы не можем использовать стрелочную функцию.


const db = getDB()const admins = db.filterUsers(() => this.admin)// The containing arrow function captures the global value of 'this'. Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.// Стрелочная функция перехватывает глобальное значение 'this'. Неявным типом элемента является 'any', поскольку тип 'typeof globalThis' не имеет сигнатуры индекса

Другие типы, о которых следует знать


void


void представляет значение, возвращаемое функцией, которая ничего не возвращает. Если в теле функции отсутствует оператор return или после этого оператора не указано возвращаемого значения, предполагаемым типом возвращаемого такой функцией значения будет void:


// Предполагаемым типом является `void`function noop() { return}

В JS функция, которая ничего не возвращает, "неявно" возвращает undefined. Однако, в TS void и undefined это разные вещи.


Обратите внимание: void это не тоже самое, что undefined.


object


Специальный тип object представляет значение, которое не является примитивом (string, number, boolean, symbol, null, undefined). object отличается от типа пустого объекта ({}), а также от глобального типа Object. Скорее всего, вам никогда не потребуется использовать Object.


Правило: object это не Object. Всегда используйте object!


Обратите внимание: в JS функции это объекты: они имеют свойства, Object.prototype в цепочке прототипов, являются instanceof Object, мы можем вызывать на них Object.keys и т.д. По этой причине в TS типом функций является object.


unknown


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


function f1(a: any) { a.b() // OK}function f2(a: unknown) { a.b() // Object is of type 'unknown'. // Типом объекта является 'unknown'}

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


function safeParse(s: string): unknown { return JSON.parse(s)}const obj = safeParse(someRandomString)

never


Некоторые функции никогда не возвращают значений:


function fail(msg: string): never { throw new Error(msg)}

Тип never представляет значение, которого не существует. Чаще всего, это означает, что функция выбрасывает исключение или останавливает выполнение программы.


never также появляется, когда TS определяет, что в объединении больше ничего не осталось:


function fn(x: string | number) { if (typeof x === 'string') {   // ... } else if (typeof x === 'number') {   // ... } else {   x // типом `x` является `never`! }}

Function


Глобальный тип Function описывает такие свойства как bind, call, apply и другие, характерные для функций в JS. Он также имеет специальное свойство, позволяющее вызывать значения типа Function такие вызовы возвращают any:


function doSomething(f: Function) { f(1, 2, 3)}

Такой вызов функции называется нетипизированным и его лучше избегать из-за небезопасного возвращаемого типа any.


Если имеется необходимость принимать произвольную функцию без ее последующего вызова, лучше предпочесть более безопасный тип () => void.


Оставшиеся параметры и аргументы


Оставшиеся параметры (rest parameters)


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


Оставшиеся параметры указываются после других параметров с помощью ...:


function multiply(n: number, ...m: number[]) { return m.map((x) => n * x)}// `a` получает значение [10, 20, 30, 40]const a = multiply(10, 1, 2, 3, 4)

В TS неявным типом таких параметров является any[], а не any. Любая аннотация типа для них должна иметь вид Array<T> или T[], или являться кортежем.


Оставшиеся аргументы (rest arguments)


Синтаксис распространения (синонимы: расширение, распаковка) (spread syntax) позволяет передавать произвольное количество элементов массива. Например, метод массива push принимает любое количество аргументов:


const arr1 = [1, 2, 3]const arr2 = [4, 5, 6]arr1.push(...arr2)

Обратите внимание: TS не считает массивы иммутабельными. Это может привести к неожиданному поведению:


// Предполагаемым типом `args` является `number[]` - массив с 0 или более чисел// а не конкретно с 2 числамиconst args = [8, 5]const angle = Math.atan2(...args)// Expected 2 arguments, but got 0 or more.// Ожидалось получение 2 аргументов, а получено 0 или более

Самым простым решением данной проблемы является использование const:


// Предполагаемым типом является кортеж, состоящий из 2 элементовconst args = [8, 5] as const// OKconst angle = Math.atan2(...args)

Деструктуризация параметров (parameter destructuring)


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


function sum({ a, b, c }) { console.log(a + b + c)}sum({ a: 10, b: 3, c: 9 })

Аннотация типа для объекта указывается после деструктуризации:


function sum({ a, b, c }: { a: number, b: number, c: number }) { console.log(a + b + c)}

Для краткости можно использовать именованный тип:


type ABC = { a: number, b: number, c: number }function sum({ a, b, c }: ABC) { console.log(a + b + c)}

Возможность присвоения функций переменным


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


Контекстуальная типизация (contextual typing), основанная на void, не запрещает функции что-либо возвращать. Другими словами, функция, типом возвращаемого значения которой является void type vf = () => void, может возвращать любое значение, но это значение будет игнорироваться.


Все приведенные ниже реализации типа () => void являются валидными:


type voidFn = () => voidconst f1: voidFn = () => { return true}const f2: voidFn = () => trueconst f3: voidFn = function() { return true}

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


const v1 = f1()const v2 = f2()const v3 = f3()

Поэтому следующий код является валидным, несмотря на то, что Array.prototype.push возвращает число, а Array.prototype.forEach ожидает получить функцию с типом возвращаемого значения void:


const src = [1, 2, 3]const dst = [0]src.forEach((el) => dist.push(el))

Существует один специальный случай, о котором следует помнить: когда литеральное определение функции имеет тип возвращаемого значения void, функция не должна ничего возвращать:


function f2(): void { // Ошибка return true}const f3 = function(): void { // Ошибка return true}



Облачные серверы от Маклауд быстрые и безопасные.


Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!


Подробнее..

Перевод Карманная книга по TypeScript. Часть 5. Объектные типы

10.06.2021 12:09:47 | Автор: admin

image


Доброго времени суток, друзья! Мы продолжаем серию публикаций адаптированного и дополненного перевода "Карманной книги по TypeScript".

Другие части:



В JS обычным способом группировки и передачи данных являются объекты. В TS они представлены объектными типами (object types).


Как мы видели ранее, они могут быть анонимными:


function greet(person: { name: string, age: number }) { return `Привет, ${person.name}!`}

или именоваться с помощью интерфейсов (interfaces):


interface Person { name: string age: number}function greet(person: Person) { return `Привет, ${person.name}!`}

или синонимов типа (type aliases):


type Person { name: string age: number}function greet(person: Person) { return `Привет, ${person.name}!`}

Во всех приведенных примерах наша функция принимает объект, который содержит свойство name (значение которого должно быть типа string) и age (значение которого должно быть типа number).


Модификаторы свойств (property modifiers)


Каждое свойство в объектном типе может определять несколько вещей: сам тип, то, является ли свойство опциональным, и может ли оно изменяться.


Опциональные свойства (optional properties)


Свойства могут быть помечены как опциональные (необязательные) путем добавления вопросительного знака (?) после их названий:


interface PaintOptions { shape: Shape xPos?: number yPos?: number}function paintShape(opts: PaintOptions) { // ...}const shape = getShape()paintShape({ shape })paintShape({ shape, xPos: 100 })paintShape({ shape, yPos: 100 })paintShape({ shape, xPos: 100, yPos: 100 })

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


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


function paintShape(opts: PaintOptions) { let xPos = opts.xPos               // (property) PaintOptions.xPos?: number | undefined let yPos = opts.yPos               // (property) PaintOptions.yPos?: number | undefined // ...}

В JS при доступе к несуществующему свойству возвращается undefined. Добавим обработку этого значения:


function paintShape(opts: PaintOptions) { let xPos = opts.xPos === undefined ? 0 : opts.xPos   // let xPos: number let yPos = opts.yPos === undefined ? 0 : opts.yPos   // let yPos: number // ...}

Теперь все в порядке. Но для определения "дефолтных" значений (значений по умолчанию) параметров в JS существует специальный синтаксис:


function paintShape({ shape, xPos = 0, yPos = 0 }: PaintOptions) { console.log('x coordinate at', xPos)                               // var xPos: number console.log('y coordinate at', yPos)                               // var yPos: number // ...}

В данном случае мы деструктурировали параметр painShape и указали значения по умолчанию для xPos и yPos. Теперь они присутствуют в теле функции painShape, но являются опциональными при ее вызове.


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


function draw({ shape: Shape, xPos: number = 100 /*...*/ }) { render(shape) // Cannot find name 'shape'. Did you mean 'Shape'? // Невозможно найти 'shape'. Возможно, вы имели ввиду 'Shape' render(xPos) // Cannot find name 'xPos'. // Невозможно найти 'xPos'}

shape: Shape означает "возьми значение свойства shape и присвой его локальной переменной Shape". Аналогично xPos: number создает переменную number, значение которой основано на параметре xPos.


Свойства, доступные только для чтения (readonly properties)


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


interface SomeType { readonly prop: string}function doSomething(obj: SomeType) { // Мы может читать (извлекать значения) из 'obj.prop'. console.log(`prop has the value '${obj.prop}'.`) // Но не можем изменять значение данного свойства obj.prop = 'hello' // Cannot assign to 'prop' because it is a read-only property. // Невозможно присвоить значение 'prop', поскольку оно является доступным только для чтения}

Использование модификатора readonly не делает саму переменную иммутабельной (неизменяемой), это лишь запрещает присваивать ей другие значения:


interface Home { readonly resident: { name: string, age: number }}function visitForBirthday(home: Home) { // Мы можем читать и обновлять свойства 'home.resident'. console.log(`С Днем рождения, ${home.resident.name}!`) home.resident.age++}function evict(home: Home) { // Но мы не можем изменять значение свойства 'resident' home.resident = { // Cannot assign to 'resident' because it is a read-only property.   name: 'Victor the Evictor',   age: 42, }}

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


interface Person { name: string age: number}interface ReadonlyPerson { readonly name: string readonly age: number}let writablePerson: Person = { name: 'John Smith', age: 42}// работаетlet readonlyPerson: ReadonlyPerson = writablePersonconsole.log(readonlyPerson.age) // 42writablePerson.age++console.log(readonlyPerson.age) // 43

Сигнатуры индекса (index signatures)


Иногда мы не знаем названий всех свойств типа, но знаем форму значений.


В таких случаях мы можем использовать индексы для описания типов возможных значений, например:


interface StringArray { [index: number]: string}const myArray: StringArray = getStringArray()const secondItem = myArray[1]   // const secondItem: string

В приведенном примере у нас имеется интерфейс StringArray, содержащий сигнатуру индекса. Данная сигнатура указывает на то, что при индексации StringArray с помощью number возвращается string.


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


Несмотря на поддержку обоих типов индексаторов (indexers), тип, возвращаемый из числового индексатора, должен быть подтипом типа, возвращаемого строковым индексатором. Это объясняется тем, что при индексации с помощью number, JS преобразует его в string перед индексацией объекта. Это означает, что индексация с помощью 100 (number) эквивалента индексации с помощью "100" (string), поэтому они должны быть согласованными между собой.


interface Animal { name: string}interface Dog extends Animal { breed: string}// Ошибка: индексация с помощью числовой строки может привести к созданию другого типа Animal!interface NotOkay { [x: number]: Animal // Numeric index type 'Animal' is not assignable to string index type 'Dog'. // Числовой индекс типа 'Animal' не может быть присвоен строковому индексу типа 'Dog' [x: string]: Dog}

В то время, как сигнатуры строкового индекса являются хорошим способом для описания паттерна "словарь", они предопределяют совпадение всех свойств их возвращаемым типам. Это объясняется тем, что строковый индекс определяет возможность доступа к obj.property с помощью obj['property']. В следующем примере тип name не совпадает с типом строкового индекса, поэтому во время проверки возникает ошибка:


interface NumberDictionary { [index: string]: number length: number // ok name: string // Property 'name' of type 'string' is not assignable to string index type 'number'.}

Тем не менее, свойства с разными типами являются валидными в случае, когда сигнатура индекса это объединение типов (union):


interface NumberOrStringDictionary { [index: string]: number | string length: number // ok, `length` - это число name: string // ok, `name` - это строка}

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


interface ReadonlyStringArray { readonly [index: number]: string}let myArray: ReadonlyStringArray = getReadOnlyStringArray()myArray[2] = 'John'// Index signature in type 'ReadonlyStringArray' only permits reading.// Сигнатура индекса в типе 'ReadonlyStringArray' допускает только чтение

Расширение типов (extending types)


Что если мы хотим определить тип, который является более конкретной версией другого типа? Например, у нас может быть тип BasicAddress, описывающий поля, необходимые для отправки писем и посылок в США:


interface BasicAddress { name?: string street: string city: string country: string postalCode: string}

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


interface AddressWithUnit { name?: string unit: string street: string city: string country: string postalCode: string}

Неужели не существует более простого способа добавления дополнительных полей? На самом деле, мы можем просто расширить BasicAddress, добавив к нему новые поля, которые являются уникальными для AddressWithUnit:


interface BasicAddress { name?: string street: string city: string country: string postalCode: string}interface AddressWithUnit extends BasicAddress { unit: string}

Ключевое слово extends позволяет копировать членов именованных типов в другие типы. Оно также указывает на связь между типами.


Интерфейсы также могут расширяться с помощью нескольких типов одновременно:


interface Colorful { color: string}interface Circle { radius: number}interface ColorfulCircle extends Colorful, Circle {}const cc: ColorfulCircle = { color: 'red', radius: 42}

Пересечение типов (intersection types)


interface позволяет создавать новые типы на основе других посредством их расширения. TS также предоставляет другую конструкцию, которая называется пересечением типов или пересекающимися типами и позволяет комбинировать существующие объектные типы. Пересечение типов определяется с помощью оператора &:


interface Colorful { color: string}interface Circle { radius: number}type ColorfulCircle = Colorful & Circle

Пересечение типов Colorful и Circle приводит к возникновению типа, включающего все поля Colorful и Circle:


function draw(circle: Colorful & Circle) { console.log(`Цвет круга: ${circle.color}`) console.log(`Радиус круга: ${circle.radius}`)}// OKdraw({ color: 'blue', radius: 42 })// опечаткаdraw({ color: 'red', raidus: 42 })/*Argument of type '{ color: string, raidus: number }' is not assignable to parameter of type 'Colorful & Circle'. Object literal may only specify known properties, but 'raidus' does not exist in type 'Colorful & Circle'. Did you mean to write 'radius'?*//*Аргумент типа '{ color: string, raidus: number }' не может быть присвоен параметру с типом 'Colorful & Circle'. С помощью литерала объекта могут определяться только известные свойства, а свойства с названием 'raidus' не существует в типе 'Colorful & Circle'. Возможно, вы имели ввиду 'radius'*/

Интерфейс или пересечение типов?


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


Общие объектные типы (generic object types)


Предположим, что у нас имеется тип Box, который может содержать любое значение:


interface Box { contents: any}

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


interface Box { contents: unknown}let x: Box { contents: 'привет, народ'}// мы можем проверить `x.contents`if (typeof x.contents === 'string') { console.log(x.contents.toLowerCase())}// или можем использовать утверждение типаconsole.log((x.contents as string).toLowerCase())

Более безопасным способом будет определение различных типов Box для каждого типа contents:


interface NumberBox { contents: number}interface StringBox { contents: string}interface BooleanBox { contents: boolean}

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


function setContents(box: StringBox, newContents: string): voidfunction setContents(box: NumberBox, newContents: number): voidfunction setContents(box: BooleanBox, newContents: boolean): voidfunction setContents(box: { contents: any }, newContents: any) { box.contents = newContents}

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


Для решения данной проблемы мы можем создать общий (generic) тип Box, в котором объявляется параметр типа (type parameter):


interface Box<Type> { contents: Type}

Затем, при ссылке на Box, мы должны определить аргумент типа (type argument) вместо Type:


let box: Box<string>

По сути, Box это шаблон для настоящего типа, в котором Type будет заменен на конкретный тип. Когда TS видит Box<string>, он заменяет все вхождения Type в Box<Type> на string и заканчивает свою работу чем-то вроде { contents: string }. Другими словами, Box<string> работает также, как рассмотренный ранее StringBox.


interface Box<Type> { contents: Type}interface StringBox { contents: string}let boxA: Box<string> = { contents: 'привет' }boxA.contents     // (property) Box<string>.contents: stringlet boxB: StringBox = { contents: 'народ' }boxB.contents     // (property) StringBox.contents: string

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


interface Box<Type> { contents: Type}interface Apple { // ....}// Тоже самое, что '{ contents: Apple }'.type AppleBox = Box<Apple>

Это также означает, что нам не нужны перегрузки функции. Вместо них мы можем использовать общую функцию (generic function):


function setContents<Type>(box: Box<Type>, newContents: Type) { box.contents = newContents}

Синонимы типов также могут быть общими. Вот как мы можем определить общий тип (generic type) Box:


type Box<Type> = { contents: Type}

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


type OrNull<Type> = Type | nulltype OneOrMany<Type> = Type | Type[]type OneOrManyOrNull<Type> = OrNull<OneOrMany<Type>>         // type OneOrManyOrNull<Type> = OneOrMany<Type> | nulltype OneOrManyOrNullStrings = OneOrManyOrNull<string>         // type OneOrManyOrNullStrings = OneOrMany<string> | null

Тип Array


Синтаксис number[] или string[] это сокращения для Array<number> и Array<string>, соответственно:


function doSomething(value: Array<string>) { // ...}let myArray: string[] = ['hello', 'world']// оба варианта являются рабочими!doSomething(myArray)doSomething(new Array('hello', 'world'))

Array сам по себе является общим типом:


interface Array<Type> { /**  *  Получает или устанавливает длину массива  */ length: number /**  * Удаляет последний элемент массива и возвращает его  */ pop(): Type | undefined /**  * Добавляет новые элементы в конец массива и возвращает новую длину массива  */ push(...items: Type[]): number // ...}

Современный JS также предоставляет другие общие структуры данных, такие как Map<K, V>, Set<T> и Promise<T>. Указанные структуры могут работать с любым набором типов.


Тип ReadonlyArray


ReadonlyArray это специальный тип, описывающий массив, который не должен изменяться.


function doStuff(values: ReadonlyArray<string>) { // Мы можем читать из `values`... const copy = values.slice() console.log(`Первым значением является ${values[0]}`) // но не можем их изменять values.push('Привет!') // Property 'push' does not exist on type 'readonly string[]'. // Свойства с названием 'push' не существует в типе 'readonly string[]'}

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


В отличие от Array, ReadonlyArray не может использоваться как конструктор:


new ReadonlyArray('red', 'green', 'blue')// 'ReadonlyArray' only refers to a type, but is being used as a value here.// 'ReadonlyArray' всего лишь указывает на тип, поэтому не может использовать в качестве значения

Однако, мы можем присваивать массиву, доступному только для чтения, обычные массивы:


const roArray: ReadonlyArray<string> = ['red', 'green', 'blue']

Для определения массива, доступного только для чтения, также существует сокращенный синтаксис, который выглядит как readonly Type[]:


function doStuff(values: readonly string[]) { // Мы можем читать из `values`... const copy = values.slice() console.log(`The first value is ${values[0]}`) // но не можем их изменять values.push('hello!') // Property 'push' does not exist on type 'readonly string[]'.}

В отличие от модификатора свойств readonly, присваивание между Array и ReadonlyArray является однонаправленным (т.е. только обычный массив может быть присвоен доступному только для чтения массиву):


let x: readonly string[] = []let y: string[] = []x = yy = x// The type 'readonly string[]' is 'readonly' and cannot be assigned to the mutable type 'string[]'.// Тип 'readonly string[]' является доступным только для чтения и не может быть присвоен изменяемому типу 'string[]'

Кортеж (tuple)


Кортеж это еще одна разновидность типа Array с фиксированным количеством элементов определенных типов.


type StrNumPair = [string, number]

StrNumPair это кортеж string и number. StrNumPair описывает массив, первый элемент которого (элемент под индексом 0) имеет тип string, а второй (элемент под индексом 1) number.


function doSomething(pair: [string, number]) { const a = pair[0]     // const a: string const b = pair[1]     // const b: number // ...}doSomething(['hello', 42])

Если мы попытаемся получить элемент по индексу, превосходящему количество элементов, то получим ошибку:


function doSomething(pair: [string, number]) { // ... const c = pair[2] // Tuple type '[string, number]' of length '2' has no element at index '2'. // Кортеж '[string, number]' длиной в 2 элемента не имеет элемента под индексом '2'}

Кортежи можно деструктурировать:


function doSomething(stringHash: [string, number]) { const [inputString, hash] = stringHash console.log(inputString)               // const inputString: string console.log(hash)           // const hash: number}

Рассматриваемый кортеж является эквивалентом такой версии типа Array:


interface StringNumberPair { // Конкретные свойства length: 2 0: string 1: number // Другие поля 'Array<string | number>' slice(start?: number, end?: number): Array<string | number>}

Элементы кортежа могут быть опциональными (?). Такие элементы указываются в самом конце и влияют на тип свойства length:


type Either2dOr3d = [number, number, number?]function setCoords(coord: Either2dOr3d) { const [x, y, z] = coord           // const z: number | undefined console.log(`   Переданы координаты в ${coord.length} направлениях `)                               // (property) length: 2 | 3}

Кортежи также могут содержать оставшиеся элементы (т.е. элементы, оставшиеся не использованными, rest elements), которые должны быть массивом или кортежем:


type StringNumberBooleans = [string, number, ...boolean[]]type StringBooleansNumber = [string, ...boolean[], number]type BooleansStringNumber = [...boolean[], string, number]

...boolean[] означает любое количество элементов типа boolean.


Такие кортежи не имеют определенной длины (length) они имеют лишь набор известных элементов на конкретных позициях:


const a: StringNumberBooleans = ['hello', 1]const b: StringNumberBooleans = ['beautiful', 2, true]const c: StringNumberBooleans = ['world', 3, true, false, true, false, true]

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


function readButtonInput(...args: [string, number, ...boolean[]]) { const [name, version, ...input] = args // ...}

является эквивалентом следующего:


function readButtonInput(name: string, version: number, ...input: boolean[]) { // ...}

Кортежи, доступные только для чтения (readonly tuple types)


Кортежи, доступные только для чтения, также определяются с помощью модификатора readonly:


function doSomething(pair: readonly [string, number]) { // ...}

Попытка перезаписи элемента такого кортежа приведет к ошибке:


function doSomething(pair: readonly [string, number]) { pair[0] = 'Привет!' // Cannot assign to '0' because it is a read-only property.}

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


let point = [3, 4] as constfunction distanceFromOrigin([x, y]: [number, number]) { return Math.sqrt(x ** 2 + y ** 2)}distanceFromOrigin(point)/*Argument of type 'readonly [3, 4]' is not assignable to parameter of type '[number, number]'. The type 'readonly [3, 4]' is 'readonly' and cannot be assigned to the mutable type '[number, number]'.*/

В приведенном примере distanceFromOrigin не изменяет элементы переданного массива, но ожидает получения изменяемого кортежа. Поскольку предполагаемым типом point является readonly [3, 4], он несовместим с [number, number], поскольку такой тип не может гарантировать иммутабельности элементов point.




Облачные серверы от Маклауд быстрые и безопасные.


Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!


Подробнее..

Перевод Всегда старайтесь быть незаменимым

10.06.2021 18:12:02 | Автор: admin
Есть хорошая жизненная философия, которой можно придерживаться на рабочем месте, это постоянно быть готовым увольняться (always be quitting). Это не значит думать о том, чтобы уйти с работы. Но вести себя так, как будто вы можете уйти в кратчайшие сроки. Парадоксально, но это сделает вас лучшим инженером и откроет возможности для роста.

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

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

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


  1. Задокументируйте свои знания. Каждый раз, когда кто-то задает вам вопрос, он подчеркивает пробел в документации. Воспользуйтесь возможностью записать ответ (в документе, баг-репорте, комментарии к коду где угодно), чтобы следующий человек не нуждался в ВАС.
  2. Задокументируйте свои долгосрочные планы. Люди должны знать, что происходит в ваших проектах и/или команде, просматривая эти планы, а не полагаясь на то, что вы расскажете им в режиме реального времени. Планируйте на несколько месяцев вперед, чтобы, если вы уйдете, ваши сверстники не потерялись с первого дня.
  3. Документируйте свои встречи. Ведите (публичные, внутри команды) заметки обо всех встречах, которые вы посещаете, перечисляя, кто там был, что обсуждалось, и любые выводы. Обратитесь к этим примечаниям из проектной документации. Тому, кто придет на ваше место это понадобится, чтобы наверстать упущенное.
  4. Приводите других на собрания. Если это не встреча 1 на 1 и вы единственный человек из вашей команды, присутствующий на собрании, привлеките кого-нибудь другого. Различные точки зрения полезны, но что более важно, вы избегаете становиться единственной точкой соприкосновения.
  5. Прокачивайте людей рядом с вами. Цель состоит в том, чтобы они были независимыми (что обычно считается старшинством(seniority) на типичной инженерной лестнице). Ознакомьте их с планами и технологиями и убедитесь, что они знают, как использовать документацию.
  6. Подберите человека себе на замену и обучите его. В том же духе, что и при обучение других, чтобы переключиться ролями, вам нужно будет найти замену себе. Определите, кто может заменить вас, и активно и постоянно тренируйте их.
  7. Дайте власть людям. Верьте, что они поступят правильно. Если вы занимаете руководящую должность, не делайте так, чтобы люди приходили к вам за разрешением. Пусть они сами делают свой выбор. Направляйте их таким образом, чтобы их выбор основывался на правильных данных.
  8. Не делайте себя ключевым звеном. Создайте списки рассылки или другие формы общения, которые могут вместить других людей, а затем расширьте эти группы. (Исключение составляют случаи, когда руководству нужны имена для подотчетности.)
  9. Делегируйте. Как только вы дадите власть другим, включите их в группы и собрания и задокументируете свои знания, они будут готовы принять от вас работу. Делегируйте работу, которая может заставить их расти, и сосредоточьтесь на том, что можете делать только вы.
  10. Учитесь непрерывно. Воспользуйтесь шансом расширить свои знания в любой области, которая вас интересует, и продолжайте получать удовольствие. Бонус для вас, если эта область совпадает с вашим будущим проектом.


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

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

Нехорошее Кароси. Как не умереть от переработок?

05.06.2021 16:05:21 | Автор: admin


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

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

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

Сколько же надо вкалывать, чтобы гарантированно загнуться в самые сжатые сроки? Эксперты ВОЗ считают, что рабочее время продолжительностью 55 и более часов в неделю увеличивает риск инсульта на 35%, а вероятность получить бонус в виде хронических заболеваний сердечно-сосудистой системы возрастает в этом случае на 17%. Международная Организация Труда при ООН (International Labour Organization) дополняет эту грустную математику собственными данными: большинство умерших от переработок это мужчины среднего возраста, при этом смерть часто наступала значительно позже периода повышенных нагрузок иногда спустя десятилетия. Иными словами, чрезмерные переработки имеют отложенные негативные последствия. Пока человек молод, организм может переносить повышенные нагрузки относительно легко, но накопленное нервное напряжение и недостаток сна и не могут сказаться позже когда ты этого совсем не ждешь.



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

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



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

Здесь уместно рассказать историю моего приятеля, тридцатидвухлетнего программиста-фрилансера, которая произошла с ним в июне 2019 года. По его собственным словам, работа в течение года распределяется у него крайне неравномерно: бывают периоды относительного затишья, а иногда приходится не вылезать из отладки сутками, чтобы сдать проект вовремя. В такие моменты отсыпаться приходится урывками, пока что-то собирается или тестируется, а по завершении аврала отходняк может длиться неделю и больше в этот период он вообще неспособен к продуктивному труду. В ту злополучную ночь родственники были на даче. Мой приятель проснулся под утро от острой сдавливающей боли в груди, усиливающейся при дыхании. Слопав все имеющиеся в аптечке обезболивающие и допив остатки бабушкиного корвалола, он попытался уснуть не получилось. К рассвету боль поутихла, но временами возвращалась, то стихая, то накатывая волнами. Ко второй половине дня он все-таки решился отправиться в близлежащую платную клинику, чтобы быстренько сделать кардиограмму. Доктор, изучив ленту, позвала заведующую, и они некоторое время вдумчиво осматривали зигзаги самописца вдвоем, после чего поинтересовались его самочувствием и куда-то убежали. Ну что, я пойду?, спросил мой приятель у оставшейся в кабинете медсестры, когда ему надоело валяться с обнаженным торсом на кушетке. Куда ж вы пойдете с инфарктом?, удивилась она. Мы вам уже скорую вызвали, ждите!. Так мой товарищ познал все прелести кардиологического отделения одной из отечественных больниц. Теперь кушает прописанные врачами таблетки, не пьет ничего крепче кефира, за которым ходит по-скандинавски с лыжными палками, и старается соблюдать режим дня.

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



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

Босс приходит ближе к обеду? Тебя как сотрудника это не должно волновать. Важно другое когда босс соизволил уйти домой. Никто не уходит из офиса раньше босса, это почти закон. Ну если ты не хочешь уволиться, конечно. Ты можешь уже не работать, не делать ничего полезного, в тикток залипать, но сидеть в офисе обязан. Макс выходила в зал сотрудников в 21:00 и смотрела, кто на месте, а кто свалил. Причём опоздать утром на работу нельзя в офисах и на фабриках обычно стоит система контроля. В итоге люди работают реально с 9 утра до 9 вечера. И опять же, не видят в этом ничего странного, ну везде же так. Плюс, не забываем что в коммерческих компаниях в Китае 6 рабочих дней в неделю. По сути твоя работа это и есть твоя жизнь.


На китайском смерть от чрезмерных рабочих нагрузок называется голаосы, и тоже является проблемой, о которой, правда, говорят меньше, чем в Японии. В среднем в китайских IT- и интернет-компаниях рабочая неделя включает 72 часа (с 9 до 21 часа с понедельника по субботу включительно), но многие фирмы оплачивают сотрудникам расходы на такси и питание, если они работают сверхурочно. Не скопититься при таком графике, пожалуй, действительно сложно, но китайцы к этому адаптировались и не считают подобный режим чем-то необычным.

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

В той же Японии, где придумали термин кароси, еще в 1988 году было посчитано, что рабочая неделя в коммерческом секторе составляет в среднем 60 часов. С данным явлением начали активно бороться, но это не помогло: в 2001 году от переработок умерло 143 японца, в другие годы этот показатель был меньше, но практически никогда не опускался до нулевой отметки. Если верить Википедии, Каждый пятый японец-мужчина в возрасте от 30 до 50 лет работает больше 60 часов в неделю, не включая неучтённое время и рабочее общение, и в среднем на общение с семьёй у него остаётся не больше получаса в день. Крупные корпорации пытаются ломать подобные традиции: например, в Toyota действует специальная автоматическая почтовая рассылка, которая каждый вечер, в 19 часов, напоминает сотрудникам об окончании рабочего дня. В Nissan офисному персоналу, желающему работать больше 8 часов вдень, предлагают частично удаленный график.



В Европейских странах, как и в России, трудовое законодательство ограничивает максимально допустимый объем рабочего времени. Один из самых гуманных графиков принят во Франции: там рабочая неделя длится 35 часов. В Дании и Норвегии принята пятидневка, но трудовой день длится минимум 6,5 часов, таким образом, в неделю получается 32,5 часа. В Нидерландах минимальная рабочая нагрузка ограничена на законодательном уровне тридцатью часами (с возможностью иметь до трех выходных в неделю), но этот минимум, судя по всему, соблюдают очень немногие. В большинстве остальных европейских государств, как и в России, действует 40-часовая рабочая неделя. Но это если ты работаешь на дядю. Если же ты трудишься на себя, то вполне можешь повторить подвиг японцев и китайцев, которые пашут, пока их не вынесут вперед валенками.

Чтобы не окароситься раньше времени, лично я принял для себя несколько простых правил, позволяющих чередовать рабочую нагрузку и отдых. Соблюдать их получается далеко не всегда, но я стараюсь. Вот они:
  • В 20.00 я выключаю рабочий телефон. Что бы там ни стряслось: хоть пожар, хоть наводнение, хоть выпадение метеоритных осадков, заказчики и клиенты подождут до следующего утра.
  • Четвертая заповедь в книге Бытия гласит: чти день субботний. Я чту еще и воскресный. Выходные для семьи, отдыха и сна, работа идет лесом.
  • Отпуск. Минимум две недели в году. Без телефона, ноутбука и планшета, желательно, где-нибудь на море или в горах, насколько это возможно в нынешних условиях повсеместных ограничений. Пермодически о работе нужно забывать и полностью переключать мозг в режим vacation.
  • Спорт. Если в 8 вечера удалось закончить работу, лучше выехать на велосипеде в парк, чем втыкать до вечера в инсту. Зимой велик можно заменить лыжами и бассейном.
  • Сон не менее 8 часов в сутки. Надо встать пораньше раньше и ложись. Невыспавшийся я все равно не смогу продуктивно работать, потому подремать часик днем тоже неплохая идея, чтобы потом со свежей головой взяться за решение текущих задач.
  • Не более 4 чашек кофе в день. Когда-то в офисе IT-компании, где я трудился, боссы поставили бесплатные кофе-машины. Я начал пить кофе ведрами и основательно посадил сердце, получив в нагрузку проблемы с давлением. Все хорошо в меру.

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



Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Альтернативный способ заполнения спиральной матрицы

31.05.2021 18:12:13 | Автор: admin

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

Собственно алгоритм заполнения был тривиален, циклы, в общей сложности состоящие из N2 итерации, предполагали прохождение по всем элементам массива в требуемом порядке, при этом увеличивая значение итератора на 1 и заполняя им текущий элемент матрицы. Маршрут начинался с элемента [1, 1], далее продвигается по горизонтали до правого верхнего элемента [1, N], после вниз до нижнего правого угла [N, N], затем до левого нижнего угла [N, 1] и завершал первый круг на столбец ниже отправной точки [2, 1]. В дальнейшем, такое же круговое движение происходило уже в следующем внутреннем круге, и так далее до центра матрицы.

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

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

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

Спустя эти самые 18 лет, перебирая наиболее интересные задачи и пути их решения для обучения уже следующего поколения представителей неординарной профессии программист, меня заинтересовала одна статья на ресурсе Хабр (http://personeltest.ru/aways/habr.com/ru/post/261773), описывающая процесс создания формулы для вычисления количества дней в заданном месяце без использования каких-либо условных операторов, циклов и заранее подготовленных данных.

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

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

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

Итак, задача: разработать алгоритм для вычисления значения элемента спиральной матрицы на основании его координат [i, j] и размера самой матрицы, пользуясь только простыми арифметическими вычислениями. Исключение составляет модуль - абсолютное значение числа.

Условие: никаких условных (прошу прощения за тавтологию) переходов или заготовленных данных в виде массивов, словарей и т.д.

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

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

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

2) Найти связь между, опять же, координатами ячейки и номером кольца, в котором она находится. Составить формулу.

3) Связать между собой два алгоритма для выведения общей формулы вычисления значения элемента массива.

Входные данные: N размер квадратной матрицы (массива).

1 этап. Заполнение внешнего кольца. Для начала попытаемся вывести формулу вычисления значения ячейки для внешнего кольца массива, в котором отсчет начинается с ячейки [1, 1] и двигается по часовой стрелке поворачивая на углах [1, N], [N, N]. Заканчивается на строку ниже начальной точки, т.е. [2, 1].

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

Для наглядного изучения процесса напишем соответствующий скрипт, объявив в нем массив размером 5x5 (назовем его a), элементы которого будем перебирать традиционным способом двумя вложенными циклами от 1 до N. На данном этапе будем работать только с внешним кольцом.

#include <iostream>using namespace std;int main(){    int N = 5;          // задаем размер матрицы    int a[N][N];        // и инициализируем ее    for (int ik = 0; ik < N; ik++)        for (int jk = 0; jk < N; jk++)            a[ik][jk] = 0;          // заполнив для удобства нулями                                          for (int ik = 0; ik < N; ik++){     //назовем его "Основной цикл"        for (int jk = 0; jk < N; jk++){            if (!(ik == 0 || ik == N - 1 || jk == 0 || jk == N - 1))                 continue;      // Временное условие для фильтрации элементов внесшего "кольца"            int i = ik + 1;     // Номера строк и столбцов приводим в удобный            int j = jk + 1;     // в математическом плане вид (от 1 до N)              //  ... здесь будем вставлять основной код вычислений        }       }        for (int ik = 0; ik < N; ik++){          //Блок "Вывод массива"        for (int jk = 0; jk < N; jk++){           printf( "%02d ", a[ik][jk]);// дополняем число ведущими нулями        }        cout << endl;    }      return 0;}

Очевидно, что, по крайней мере, до правого нижнего угла внешнего кольца суммарное значение координат (i + j) увеличивается ровно на 1 с каждым шагом. Однако первый элемент в таком случае равняется 2, E1,2 = 3 и т.д. Поэтому необходимо уменьшить значение суммы (i + j) на один. В результате введем переменную Xs = i + j - 1, которая часто будет использоваться в дальнейших вычислениях. Пишем код:

int Xs = (i + j  1);a[ik][jk] = Xs;

В результате запуска первого скрипта получаем массив:

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

Очевидно a[ik][jk] = Xsнуждается в дополнении, при котором все его значения до [5, 5] останутся неизменными, но после этой точки начнут увеличиваться на 1.

Но для начала постараемся привести в норму вторую часть кольца, которая заполнялась бы с ячейки (i = 5, j = 4) начиная со значения 10. В данном случае это легко сделать, лишь вычитая от общего количества элементов первого кольца увеличенного на два (равняется периметру первого кольца N * 4 - 4 = 16 плюс 2) значение Xs.

То есть a1,2 = 4N 4 + 2 Xs = 4N Xs - 2.

int Xs = i + j - 1;     a[ik][jk] = 4 * N - Xs - 2;

Однако теперь у нас правильно заполнилась только левая и нижняя стороны кольца, а противоположенные элементы нет.

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

1. ai,j = Xs = i + j - 1; действует от [1, 1] до [N, N].

2. ai,j = 4*N 2 - X; действует от [N, N] до [2, 1].

Самым простым решением было бы использование условного перехода, однако это не соответствует нашей начальной установке. Здесь необходимо дополнительно отметить, что из всех стандартных кусочно-заданных функций, как отмечено выше, мы будем использовать только модуль (y = |x|) и формулы собственной разработки.

В этой связи, необходимо привести наше уравнение в вид:

a_1, _2= F _1(switcher) * Xs + F _2 (switcher) * (4 * N Xs - 2);

Здесь функция F1 принимает значение 1 при i, j между [1, 1] [N, N] , в остальных случаях 0. В свою очередь, F2 , наоборот, принимает значение 1 когда ячейка находится в диапазоне [N, N - 1] [2, 1], и 0 между [1, 1] [N, N].

В качестве аргумента функции используется переменная switcher, вычисляемая на основе значении i и j, и опять же, принимающая различные значения в вышеуказанных диапазонах.

Неплохим вариантом выглядит идея получения значений -1, 0 и/или 1 от манипуляций с координатами элемента. Тогда F1 и F2 содержали бы простые арифметические операции.

Итак, мы уже использовали сложение i и j, но оно всегда дает положительное число. Почему бы сейчас не попробовать вычитание?

Заменим в нашем предыдущем листинге значение a[ik][jk].

int Xs = i + j - 1;     a[ik][jk] = j  i;

Наиболее легким вариантом видится целочисленное деление на самого себя, но в таком случае мы столкнемся с ошибкой деления на 0, поскольку а[1][1] и а[N][N] уже содержат 0. В данном случае можно прибавить ко всем значениям N и осуществить целочисленное деление на N. Введенную переменную назовем switcher.

int switcher =  (j - i + N) / N;a[ik][jk] =  switcher; // временно подставим в ячейки switcher

Теперь осталось немногое для завершения данного этапа, а именно создать функции F1 и F2. F1 должна возвращать такое же значение, какое ей передали в качестве аргумента, т.е. F1 (switcher) = switcher. В таком случае F1 (switcher) * Xs работает только для диапазона от [1, 1] до [N, N], в остальных случаях равняется нулю. Вторая часть уравнения, должна действовать наоборот. В таком случае она должна возвращать значение по модулю switcher 1, т.е. F2.(switcher) = |switcher 1|.

Итак, пишем:

a[ik][jk] =  switcher * Xs + abs(switcher - 1) * (4 * N - 2 - Xs);

Проверяем:

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

2 этап. Альтернативная система координат.

Нам удалось заполнить внешнее первое кольцо требуемыми данными. Однако, что произойдет, если мы снимем фильтр, и попытаемся вычислить данные для остальных элементов массива? Для этого необходимо удалить участок кода if (!(ik == 0 || ik == N - 1 || jk == 0 || jk == N - 1)) continue;

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

Очевидно, в ячейке [2, 2] вместо 03 должно находиться число 17, следующее значение после конечного элемента внешнего круга. Небольшое размышление показывает, что необходимо ввести определенный коэффициент, выправляющий значение ячейки в зависимости от глубины залегания кольца в котором он находится. Т.е. требуется вычислить степень удаленности элемента массива от центра (или наоборот) на основании номера строки и номера столбца.

Для этого, введем альтернативную систему координат. Так, обычная нумерация ячеек в матрице начинается с левого верхнего угла и аналогична двухмерной системе координат, с центром в указанном месте. Для тех, кто еще помнит древний Turbo Pascal с синим экраном графики в нем чертились именно таким образом (да и в большинстве современных графических сред разработки ПО принята подобная система координат при работе с визуальными компонентами).

Мы же, перенесем начало координат в центр нашей матрицы следующим образом:

a[ik][jk] =  abs(N / 2 + 1 -  i);

Поскольку нам требуется только расстояние ячейки от центра, мы берем только абсолютные значения.

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

Введем две новые переменные Ic, Jc (c обозначает center).

Ic = abs(i -  N / 2  - 1);Jc = abs(j -  N / 2  - 1);

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

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

a[ik][jk] =  Ic + Jc;

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

a[ik][jk] =  Ic - Jc;

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

a[ik][jk] =  abs(Ic  Jc) + Ic + Jc;

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

Ring = N / 2 -  (abs(Ic  Jc) + Ic + Jc) / 2; a[ik][jk] =  Ring;

Замечательно. Однако, при размере матрицы N = 6 данная формула работает не совсем корректно, так она в качестве центра считает только один элемент (что является справедливым для матриц с нечетной размерностью, как в предыдущих примерах).

N = 6

При четном размере центральный квадрат из четырех элементов должен считаться центром матрицы. Возникает вопрос: как это реализовать? Здесь к нам опять на помощь приходит целочисленное деление и кусочно-заданная функция.

Но для этого вернемся немного назад, к вычислению Ic и Jc. Попробуем запустить наш скрипт при N = 6, и посмотрим значения Ic = |i - N / 2 - 1|.

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

Ic = abs(i - N / 2  - 1) + (i - 1) / (N /2) * ((N-1) % 2);

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

Тоже самое проделываем и Jc.

Jc = abs(j - N / 2  - 1) + (j - 1)/(N /2) * ((N-1) % 2);

В итоге получаем симметричную матрицу уже по вертикали. Теперь проверяем значение Ring для матрицы с размером 6.

 a[ik][jk] =  Ring;

Все работает нормально. Второй этап завершен.

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

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

a[ik][jk] =  switcher * Xs + abs(switcher - 1) * (4 * N - 2 - Xs);

Дальнейший порядок действий представляется следующим образом: привести значения элементов внутренних колец к спиральному виду (т.е. заполнить их начинания с верхнего левого угла по спирали возрастающими значениями от 1), далее вычислить коэффициент прироста, которой обеспечит нормальный переход от одного кольца к нижестоящему (в нашем примере от ячейки [1,2] к ячейке [2,2], при этом меняя значение с 16 на 17)

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

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

Xs = (i Ring) + (j Ring) 1.

Теперь попробуем вывести

a[ik][jk] =  switcher * Xs + abs(switcher - 1) * (4 * N - 2 - Xs);

Как вы могли заметить верхние и правые элементы внутренних колец пришли в требуемое значение. Однако нижние и левые стороны приняли гораздо большие значения, чем ожидалось. Это связано с тем, что выражение 4 * N - 2 - Xs во второй части функции вычисляет значения исходя из размера внешнего кольца, которое нужно уменьшить, заменив на N 2 * Ring. То есть формула будет работать в соответствии с размером текущего кольца.

Итак:

a[ik][jk] =  switcher * (Xs) + abs(switcher - 1) * (4 * (N - 2 * Ring) - 2 - Xs); 

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

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

Coef = N2 (N 2Ring)2

Воспользовавшись правилами разложения квадратов разницы элементов ((ab)2=a22ab+b2), можно сократить до 4Ring(N - Ring).

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

a[ik][jk] =  Coef + switcher * (Xs) + abs(switcher - 1) * (4 * (N - 2 * Ring) - 2 - Xs);

Требуемый результат!

Полный код участка вычисления значений представлены следующим образом:

int switcher =  (j - i + N) / N;int Ic = abs(i - N / 2  - 1) + (i - 1)/(N /2) * ((N-1) % 2);int Jc = abs(j - N / 2  - 1) + (j - 1)/(N /2) * ((N-1) % 2);int Ring = N / 2 - (abs(Ic - Jc) + Ic + Jc) / 2;int Xs = i - Ring + j - Ring - 1;    int Coef =  4 * Ring * (N - Ring);a[ik][jk] =  Coef + switcher * Xs + abs(switcher - 1) * (4 * (N - 2 * Ring) - 2 - Xs);

Можно конечно попробовать развернуть единую формулу, заменив дополнительные переменные выражениями, основанными только на i, j и N, и попытаться сократить ее математическими методами. Но поверьте мне, я пытался, получилось нечто такое невообразимое (на половину страницы), что я решил оставить все как есть.

(PS. Не работает только при N = 1, так как возникает ошибка деления на ноль. Но как говорится, чуть-чуть не считается).

Подробнее..

Работать в цехе, о культуре рабочих

04.06.2021 02:06:03 | Автор: admin

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

Кратко о себе: 2 вышки - 1ая Учитель рисования, 2ая - ИТ + одно средне специальное - художественная обработка металла

В Цехе

Начну с того, что где-то в 2001-2002 я устроился на завод, устраивался 2 раза.

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

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

И что характерно для цеха размером 150-250 м в длину и наверно 250-400 м в ширину + 200..300 работников в цехе (на заводе много цехов, завод и сейчас большой - более 10000 сотрудников, наверно даже больше)

Распорядок дня

Рабочий день официально начинался с 8, а для меня всегда была проблема проснуться.

Что бы попасть на завод надо взять с собой пластиковый пропуск с фото, пройти КПП (Контрольно пропускной пункт), а затем еще +5...8 минут пешком и в цех.

Хотя и начинался рабочий день в 8-00, а по факту, надо было до 8-30 закинуть пропуск в окно, на первом этаже цеха. В окне из оргстекла была щель, и к 8-30 накапливалась груда пропусков, а в 8-30 приходила табельщица, собирала все их, и кто не успел до 8-30 кинуть пропуск - тому ставила опоздание/прогул.

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

Что еще важно, так то, что в 8-45 начальник цеха начинал обход рабочих мест, смотрел, кто вышел, кто нет, есть ли косяки на рабочих местах (грязь например) и иногда спрашивал рабочих, что им нужно для работы.

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

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

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

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

Байка - в Управление говорят раньше, то есть до 80-ых можно было спокойно зайти, охранника на входе не было. Был случай, когда задержали зарплату (или еще что-то) возмущенные труженики пришли в управление, поднялись на 2ой этаж и таки "популярно" объяснили что они думаю о начальстве,, с применением силы, и вот мол после этого появились охранники на входе.

Хоть я и не верю этой байке, но доля правды в ней есть.

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

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

Пол из кафельной плитки размером 40 на 40 см и огрызками плитки-линолиума, или какого то выцветшего зеленого пластика времен СССР, яркие лампы под 3+ метровым потолком.

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

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

Такой чай мог разбудить наверно и мертвеца как меня.

Никто не кидался за работу сразу, типичная поговорка была такой: "Чай не пил, какая сила ?"

Обед

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

Ближе к 16-40 конец дня, время прибраться, пострадать х... и занять очередь за пропуском.

Социалка и плюшки

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

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

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

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

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

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

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

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

Впечатления

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

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

А еще хорошо то, что там есть и простые люди и крутые люди, как например профессор/преподаватель по металлургии, который учил меня как на глаз определять температуру металла между 600 и 650, 700, 750, ... градусов, показывая на своем примере, как в муфельную печь размером с гараж засовывать заготовки и как их закалять в воде или в масле.

Что плохо - если ты молод и ничего не умеешь, то и ЗП маленькая.

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

P.S. А еще я работал и в других местах, как например

  • Технологический отдел, с 350+ технологов, где 75% это женщины - инженеры и интриги это их основная деятельность - 3 года

  • В отделе ИТ при заводе, так же где 200+ человек - еще 3-4 года, админил ORACLE

  • На другом заводе админил ORACLE/MSSQL еще 8-9 лет и "пинал" программистов, за их код.

  • Сейчас работаю сам программистом в банке - и дивлюсь еще больше, какие же программисты бывают альтернативно одаренными

  • А еще и художественная сфера с которой все равно соприкасался, хоть и не работал

  • А еще всякие мелкие халтуры в ИТ, как то дизайн и программирование для "маленьких"... ох...

Подробнее..

Как я перешла в тестирование

10.06.2021 14:04:32 | Автор: admin

10 лет назад далеко не все ВУЗы готовили разработчиков для рынка. Я училась как раз там, где было все хорошо с базой, но плохо с современными технологиями, и по окончании не смогла найти себя в ИТ. Почти 10 лет меня мучил вопрос - а не вернуться ли? Не выйдет ли из меня хорошего тестировщика?

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

ИТ-шник вне ИТ

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

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

Подобранные мной тендеры уходили в соответствующий отдел для проработки. Это и было самым неприятным моментом. Я старалась, но подаст ли компания заявку на подобранные тендеры, зависело уже не от меня. Фактически, я не видела никаких результатов своей работы. Один раз выученных компетенций - общего представления об ИТ - для этой работы было достаточно. Мне не хватало развития.

Все время я думала, что нахожусь не на своем месте. В такие периоды меланхолии я то и дело возвращалась к мыслям о тестировании. Работа в ИТ - это же постоянное самообразование, новые технологии. Как я теперь понимаю, после технического ВУЗа мне не хватало именно этого.

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

Дообучение на тестировщика

Все изменилось, когда я действительно ушла в декрет. У меня появилось время, чтобы изучать новое - я обложилась книгами Савина, Куликова и других, начала проходить бесплатные курсы, смотреть отдельные лекции на YouTube. Пробовала даже читать исследовательские туры Уиттакера в оригинале (у книги нет русского перевода) и Как тестируют в Google. Мне понравилось.

К началу 2020 года, когда ребенок уже подрос, я начала искать работу в тестировании.

Кто знает, как бы все сложилось, если бы не коронавирус. Планируя выйти на работу, я рассчитывала, что с маленьким ребенком будут сидеть мои родители. Но из-за COVID-19 не рискнула перевозить их из деревни в город. Так что выйти на полный день даже на удаленку я уже не могла.

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

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

Первые собеседования в новом статусе

Честно скажу, до последнего меня преследовал синдром самозванца. Несмотря на базу в ИТ из ВУЗа, мне все казалось, что я знаю недостаточно, чтобы претендовать даже на позицию джуна. Ну и возраст уже не тот, чтобы кардинально менять работу. Когда джун приходит после ВУЗа, все на это нормально смотрят. А когда тетя за 30 после декрета? Не поздновато-ли?

Но тут помогло сообщество. Я пообщалась в чатах с теми, кто успешно проходит собеседования, и поняла, что по многим вопросам знаю даже больше. И среди новичков в тестировании полно людей старше меня. Зачем к себе придираться? Найти свое призвание никогда не поздно! Если другие устраиваются на работу, то почему я не могу?

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

Период пандемии дал мне время на то, чтобы лучше присмотреться к собеседованиям. Еще до COVID-19 я успела пройти несколько собеседований, но не получила оффера. Проанализировав свои неудачи, я поняла несколько моментов.

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

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

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

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

Автор: Наталья Шилова, Максилект.

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

Подробнее..

Мой вклад в борьбу человечества со скукой в интернете или зачем я целый год собирал 1500 странных сайтов

28.05.2021 16:10:14 | Автор: admin

Для тех, кто вдруг не осилит мою писанину, в двух словах скажу, что я не просто получил самую большую в интернете коллекцию сайтов на случаи, когда нечем заняться, а разбил их по относительно удобным категориям, типа "сколько есть свободного времени", "полезное-не полезное", "смотреть/слушать/читать" и т.д., чтобы можно было, заскучав, не ковырять, как я, целый год весь интернет наугад, а сразу воспользоваться получившимся решением наhttp://lolsites.tilda.ws/, аналогов которому, насколько я знаю, до сегодняшнего дня не существовало. А вот зачем и как это все было:

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

Примерно для этого я и сел 12 месяцев назад за поиски, разумеется, в интернете, и стал искать занятия именно там. И когда коллекция сайтов для прожигания свободного времени (а иной раз на поиски одного из них могло уйти до двух часов) достигла отметки в 1500 ссылок (сегодня, полный и по-прежнему пополняющийся список можно лицезреть тутhttp://t.me/lolsites) я понял, что на одно только прочтение этого списка уходит полтора-два часа, что напрочь убивает в этом какое-то ни было решение. И тогда попытаться разбить эту кучу на категории.

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

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

На получившемся в итоге сайте (http://lolsites.tilda.ws/) структура выглядит симпатичнее:

Мой вклад в борьбу человечества со скукой в интернете или зачем я целый год собирал 1500 странных сайтов

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

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

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

Подробнее..

Как защититься от синдрома запястного канала?

12.06.2021 10:05:57 | Автор: admin


Наряду с компьютерным зрительным синдромом, о котором мы уже рассказывали ранее, среди IT-специалистов распространен и другой весьма серьезный недуг синдром запястного канала. В чем проявляется данное заболевание и можно ли предотвратить его развитие? Давайте разбираться.

Причины и симптоматика синдрома запястного канала


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

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

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


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


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


Самостоятельная диагностика синдрома запястного канала


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

Тест Тинеля



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

Тест Дуркана



Сдавление запястья в проекции срединного нерва вызывает чувство онемения или боли в IIII и половине IV пальца руки.

Тест Фалена



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

Оппозиционная проба



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

Профилактика синдрома запястного канала


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

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

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




Теперь согните одну руку в локте под 90. Сейчас ваша рука находится в нейтральном положении. Из этого положения вы можете повернуть ее ладонью кверху (то есть, совершить супинацию предплечья) или же книзу (совершить пронацию предплечья). Чтобы запомнить эти названия, можно воспользоваться простым мнемоническим правилом, известным каждому старшекурснику медицинского ВУЗа: СУП несла ПРОлила. Когда вы несете тарелку СУПа, ваша рука СУПинирована, то есть, повернута ладонью кверху. Но если вы совершите ПРОнацию, повернув руку ладонью книзу, то ПРОльете содержимое тарелки.


Когда вы пользуетесь компьютерной мышью, ваше предплечье постоянно находится в состоянии пронации. За пронацию отвечают круглый пронатор плеча (musculus pronator teres) и квадратный пронатор плеча (musculus pronator quadratus). Во время их сокращения локтевая и лучевая кости перекрещиваются, запястный канал сужается, а проходящие через него сухожилия натягиваются и смещаются, сдавливая срединный нерв.


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

1. Кисть и предплечье должны лежать на одной линии как по горизонтали, так и по вертикали.





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


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


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

2. Руки должны находиться в нейтральном положении.


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


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


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

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


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


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


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

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


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


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


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


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


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

3. Выполняйте упражнения для укрепления мышц и сухожилий кисти и предплечья.


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

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



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

1. Сжимание эспандера

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


2. Разведение пальцев с резинкой

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


3. Сгибание кисти с отягощением

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


4. Вращение кистью с отягощением

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


5. Работа с роллером

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


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



Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Как оценить надежность банка 5 работающих способов

12.06.2021 16:15:59 | Автор: admin

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

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

Информационный фон

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

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


Размер и структура активов

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

Что касается структуры, то в первую очередь стоит обращать внимание на наличие высоколиквидных активов, таких как кассовая наличность, остатки на корреспондентских счетах в ЦБ, кредиты и другие платежи в пользу банка сроком не более 30 дней. В надежных банках наибольшую долю обычно занимает кредитный портфель (50-80%), ценные бумаги до 25%, а денежные средства не более 10%. Также нужно учесть размер собственного капитала банка чем он больше, тем устойчивее банк.

Кредитный рейтинг

Еще один способ проверить надежность банка посмотреть его кредитный рейтинг, который присваивается специализированными рейтинговыми агентствами. Рейтинг обозначает вероятность банкротства банка: чем он выше, тем ниже вероятность банкротства. В формировании рейтинга могут участвовать как российские (Национальное рейтинговое агентство, Эксперт РА), так и иностранные агентства (Standard & Poor's, Moodys, Fitch).

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

Объем вкладов и их страхование

Если в структуре пассивов банка вклады физлиц занимают существенно большую долю, чем в среднем по рынку (на 1 января 2021 года 31,6%) это говорит об уязвимости банка в случае массового вывода средств гражданами. Особенно это касается банков без государственного участия.

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

Ставки по депозитам

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

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

Подробнее..

Релокейт-дайджест ОАЭ, Таиланд, Европа. 5 стран, куда можно переехать IT-специалисту

19.06.2021 10:16:36 | Автор: admin


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



ОАЭ


Таинственный мир Эмиратов приоткроет для нас Александр, который жил вОАЭ с2010 по2017год. Александр успел поработать над несколькими проектами, уних ссупругой родился здесь ребенок, ионподелится, как вообще живется вОАЭ.





Что свизой, ВНЖ игражданством


Рабочую визу получить очень просто тут иностранцев больше, чем местных, так что проблем сихоформлением нет. Новот никакого ПМЖ, иужтем более гражданства, нет. Оставаться тут можно только пока работаешь. Это нестрана для иммиграции приезжать стоит ради проектов, изаранее готовиться котъезду.



Особенности страны


Всего11% местных, иони живут припеваючи. Жизнь здесь устроена так, что местные жители получают отгосударства деньги иплюшки. Вразных эмиратах по-разному вДубае, например, дают дом иденьги при заключении брака. Витоге часто местные могут никогда вжизни неработать. Инабольшинство работ имидти просто лень, плюс местных очень мало около11% из10миллионов человек. Поэтому вбольшинстве компаний работают иностранцы, исфера IT неисключение.


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


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


Космические цены. Квартира вне пандемии может стоить 200,000 вмесяц иэто далеко нелакшери-апартаменты. Садик для ребенка может стоить 100150,000 вмесяц. Напродукты, транспорт ипрочее цены тоже высокие.


Адская жара. Купаться тут можно круглый год, недостаток витаминаD местным точно негрозит, атуч идождей практически небывает. Нотем, кто плохо переносит жару, здесь тяжело.+55Свтени вавгусте нетакая ужредкость. Аеще бывают страшные песчаные бури, что песок забивается под одежду, адышать вообще нечем.


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


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



Дания


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





Что свизой, ВНЖ игражданством


Дания входит вШенген, так что туристического въезда нужна Шенгенская виза. Дальше все как вЕвропе есть рабочая иучебная виза, поним можно оформить ВНЖ для себя исемьи. Гражданство получить сложно нужно прожить 9лет исоблюсти еще кучу условий. Так что сюда лучше приезжать наинтересный проект, непланируя оставаться навсегда.



Особенности страны


Перегретый рынок недвижимости встолице. Жилье вКопенгагене стоит баснословных денег, так что лучше жить впригороде там дешевле итише. Аренда квартиры для двоих запросто может обходиться в12,000 крон вмесяц. Ещё надо оставить депозит изаплатить занесколько месяцев вперед всумме выкладываешь около 75,000крон, просто чтобы въехать вквартиру. При переезде изРоссии необходимость заплатить 900 тысяч рублей разом может стать проблемой.


Сложно найти работу.70% вакансий закрываются, непопадая нарынок труда сотрудников часто ищут через знакомых инетворкинг. Поэтому, перефразируя дядю Фёдора, чтобы найти работу вДании, нужно уже работать вДании, идеальный вариант если есть кто-то изместных, кого можно поспрашивать. Якак раз приступаю кпоискам работы, иищу восновном через личные знакомства. Если знакомых нет, можно использовать Linkedin, илично писать тем, кто работает винтересующей вас компании или департаменте.


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


Высокие зарплаты, налоги ицены. Одни изсамых высоких зарплат вЕвропе благодаря профсоюзам иужасно сложная прогрессивная шкала налогов. Мидл может иметь зарплату 50,000 крон вмесяц, анаруки получать 30,000крон. Правда эти 30,000 нетакая ужогромная сумма, например, наеду может уходить 5,000, нааренду больше 10,000. Идругие цены тоже кусаются.


Кстати, из-за сильных профсоюзов тут неработают сервисы типа Uber они немогут обеспечить работникам достаточные условия труда. Так что итакси дорогое.


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


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



<рекламная пауза> Надумали махнуть вДанию или куда-нибудь вЕвропу? Время удачное впандемию спрос наинженеров вырос вовсем мире. Унас втелеграм-боте @g_jobbot ждут тысячи вакансий, втом числе срелокейтом. Или судаленкой как вам больше нравится. </рекламная пауза>




Австрия


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





Что свизой, ВНЖ игражданством


Все как востальной Европе Шенген, рабочая виза, ПМЖ игражданство вперспективе.



Особенности страны


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


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


Умение наслаждаться жизнью. Здесь умеют держать work-life balance в16часов впятницу все пойдут вресторан ибудут сидеть там допонедельника. Минимум переработок инадрыва, все расслаблено испокойно. Отдыхать все тоже умеют: австрийцам нравится хорошая еда, они любят приятно проводить время ипутешествовать.


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


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


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


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


Можно возразить, что какая-нибудь Польша тоже небольшая, аIT-компаний там много. Нотут гораздо выше иналоги, изарплаты, так что открывать филиалы нетак ужвыгодно.


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



Таиланд, Пхукет


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





Что свизой, ВНЖ игражданством


ВТаиланд можно приехать на30дней без визы, вкачестве туриста. Чтобы работать отсюда удаленно можно оформить туристическую визу на60+30дней. Это легко, проблем нет, для зимовки этого хватит. Или чтобы понять, нравитсяли вам вообще Пхукет.


Чтобы остаться наболее долгий срок, нужно:


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

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


Авот право напостоянное жительство игражданство тут получить нельзя. Навсегда неостанешься.



Особенности Пхукета


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


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


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


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


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


Дешевая аренда жилья. Конечно, за100 долларов домик уморя тут неснимешь: эти истории вранье. Номожно арендовать трехкомнатный дом почти уморя за35,000.


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


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


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


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



Венгрия


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





Что свизой, ВНЖ игражданством


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



Особенности страны


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


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


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


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


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

Подробнее..

Перевод Как подружиться со своей интернет-зависимостью практическое руководство

19.06.2021 16:06:42 | Автор: admin

В этом переводе автор подробно описывает 9 правил разумного потребления цифрового контента, которые он успешно протестировал на себе.



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


Возможно, вы злитесь из-за того, что не можете сконцентрироваться. А тут ещё портят настроение эти идиотские новости о том, что кто-то опять пытается разрушить нашу планету. И возможно, вы думаете: Почему вся эта информация приплывает именно ко мне? Почему мне так важно, кто кого лайкнул в соцсетях? Почему мне есть дело до всего этого?


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


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

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


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


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


Обезьяний мозг и дофаминовые кнопки


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


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


Вот что повышает уровень дофамина (хотя это не полный список):


  • Социальное взаимодействие
  • Секс
  • Наказание тех, кто это заслужил
  • Новизна и неожиданность
  • Юмор
  • Владение неопровержимыми доказательствами / чувство собственной правоты

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


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


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


  • Потребность избегать неприятных моментов в реальной жизни, прятаться в безопасном и комфортном виртуальном мире.

  • Неспособность расставить приоритеты и сосредоточиться на важном.

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

  • Снижение мотивации благодаря возможности легко получить вознаграждение через виртуальные удовольствия. И зачем тогда преследовать сложные цели без гарантии получения результата в реальном мире?

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

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

Как я уже писал выше, эту проблему можно решить и вновь научиться:


  • Ясно мыслить
  • Быть более продуктивными и креативными
  • Быть добрее к себе и к другим
  • Привнести в свою жизнь больше покоя и созерцания
  • Снизить беспокойство

Или, проще говоря: вы можете перейти от состояния постоянной рассеянности к состоянию спокойного, ясного мышления.


Итак, сформулируем нашу цель конкретнее.


Между полезно и вкусно


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


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


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


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


9 правил потребления цифрового контента


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


Правило 1: Используйте устройства целенаправленно


Вредные советы: обращайтесь к экрану всякий раз, когда вам что-то нужно. Тревожитесь? Огорчены? Одиноко? Скучно? На экране есть то, что нужно. Жмакайте на экран, как будто это игровой автомат. Будьте обезьянкой на полную катушку!


Полезные советы: будьте осмотрительны при использовании цифровых устройств. Задавайте себе вопросы: Почему я это делаю? Что я хочу здесь найти? Какая у меня цель?


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


Сократите бесцельный просмотр. Это похоже на еду от скуки. Используйте девайс, когда вам это действительно нужно, а потом отложите его.


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


Правило 2: Уберите цифровые устройства из центра вашей вселенной


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


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


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


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


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


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


Правило 3: Разделите контент на Никогда, Иногда и Всегда


Вредные советы: потребляйте нездоровую цифровую пищу:


  • С бесконечным скроллом
  • Вызывающую сильные эмоции
  • Быстро обновляющуюся
  • Крайне незрелую (субреддиты со всякой фигнёй, Twitter, 4chan и так далее)
  • Доступную везде и по запросу

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


Полезные советы: вы то, что вы едите. Это верно как для еды, так и для цифрового контента. Разделите свою информационную диету на Никогда, Иногда и Всегда.


Никогда: абсолютный мусор, который может спровоцировать сбой в вашем мозге. Например, Twitter находится в моём списке запрещённых. Это на 99% помойка. Каждый раз, когда я захожу туда, я через несколько часов выхожу из кроличьей норы. Разочарованный, сердитый и недоумевающий, на что я потратил это время. Для меня Twitter это точно минус.


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


Иногда: разумные послабления. Используйте это как награду. Вы рано встали и хорошо поработали? Отлично, наслаждайтесь Netflix днём. Или сделайте десятиминутный перерыв в Instagram. Нет жёстких правил; вы сами знаете, когда вы действительно это заслужили.


Мой список Иногда также включает Reddit (ТОЛЬКО мотивационные / позитивные субреддиты), Facebook, New York Times, грамотно написанные блоги про бизнес, мотивацию или здоровье. Есть авторы и блоги, которые выдают годный контент. Добавьте их в список рассылки и читайте.


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


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


Помните поговорку с глаз долой из сердца вон? Отпишитесь от плохих субреддитов. Используйте Social Fixer, чтобы заблокировать неприятные ключевые слова / домены из вашей ленты Facebook. Используйте блокировщик URL, чтобы заблокировать Twitter.


Правило 4: Откажитесь от многозадачности


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


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


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


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


Правило 5: Выбирайте живое общение


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


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


Полезные советы: частые и продолжительные социальные связи с людьми из плоти и крови.


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


Позвоните старым друзьям или знакомым и для начала сходите в кафе, чтобы наверстать упущенное. Пригласите кого-нибудь на свидание. Сходите в гости к другу и просто БУДЬТЕ с ним. Не беспокойтесь о том, чтобы зафиксировать это в своей соцсети.


Лично у меня остался аккаунт на Facebook и Reddit, а всё остальное я забросил. И это здорово. Да, я кое-что упускаю, но оставляю свободное пространство для живого общения.


Правило 6: Откажитесь от порно


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


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


Полезные советы: это просто прекратите смотреть порно.


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


А ещё лучше сосредоточьтесь на близости с любимым человеком или работайте над тем, чтобы найти его. В конце концов, посетите /r/nofap или /r/noporn


Правило 7: Не используйте цифровые устройства утром и вечером


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


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


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


Разумеется, телефон и компьютер тоже должны отдыхать в это время. И желательно подальше от кровати


Правило 8: Общайтесь онлайн так же, как в реальности


Вредные советы: позвольте своему внутреннему ребёнку свободно бегать по сети. Люди хулиганят, бесконечно ворчат, ссорятся с незнакомцами, оставляют неприятные комментарии. Что в этом плохого? Это же не вы, а ваш аватар в Интернете так себя ведёт.


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


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


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


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


Правило 9: Становитесь лучше в режиме офлайн


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


Полезные советы: жизнь коротка. Мы все умрём, но смерть это не самое страшное. Страшно угасать медленно. Ваше здоровье, надежды и мечты, вероятно, угаснут раньше, чем ум и тело.


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


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


Сделайте первые шаги


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


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




VPS серверы от Маклауд быстрые и безопасные.


Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!


Подробнее..

Категории

Последние комментарии

© 2006-2021, personeltest.ru