🕸 Что не так с веб-сборкой?
Ее потенциал и перспективы огромны. Что же пошло не так? Почему не все используют WASM? Попробуем ответить на эти вопросы.
Перевод публикуется с сокращениями, автор оригинальной ст…
Ее потенциал и перспективы огромны. Что же пошло не так? Почему не все используют WASM? Попробуем ответить на эти вопросы.
Перевод публикуется с сокращениями, автор оригинальной ст…
Зная эти признаки, вы сможете избежать распространенных среди неопытных программистов ошибок и будете эффективнее строить карьеру разработчика.
Опыт в сфере разработки программног…
Собеседования по программной инженерии часто включают в себя какое-то тестовое задание по программированию, и это не очень хорошо. Объясним, почему.
Перевод публикуется с сокращени…
О, это прекрасное чувство – получать деньги за любимую работу, особенно если речь идет о пассивным доходе. Держите 5 способов подзаработать на досуге.
Перевод публикуется с сокра…
Через несколько часов в Москве пробьют куранты, а нам пора подвести итоги и поздравить читателей с наступающими праздниками.
Уходящий год был непростым, и это не дежурная фраза. Кт…
Рассказываем о сообществах и лидерах мнений, имеющих влияние в сфере больших данных и машинного обучения. Если вы работаете в этой области или только собираетесь осваивать профессию, на них стоит обратить внимание.
Инфлюенсеры – это лидеры мнений. Обычно – пользователи социальных сетей, которые имеют обширную и лояльную аудиторию. Big Data и ML – одни из самых быстро развивающихся сфер в ИТ, поэтому специалистам важно следить за инфлюенсерами и влиятельными сообществами. Ведущие профессионалы отрасли регулярно делятся с широкой аудиторией опытом, а также последними разработками и новостями.
Предлагаем вашему вниманию подборку самых влиятельных сообществ и инфлюенсеров в сфере Big Data и Machine Learning.
Сообщество LinkedIn, в котором собраны не только курсы и офферы для аналитиков Big Data, но и вся актуальная информация от ведущих экспертов области. Сообщества на LinkedIn – одно из лучших мест для энтузиастов данных и начинающих ученых, желающих овладеть искусством работы с большими данными. Активное участие в дискуссиях и собственные публикации дают возможность укрепить знания, найти наставника и расширить сеть профессиональных контактов.
Твиттер-аккаунт одного из самых известных сообществ Data Science, где вы найдете новости о последних технологиях Big Data, машинного обучения, AI, Deep Learning, dataviz, Hadoop, IoT, и BI. Data Science Central объединяет пользователей, которые хотят получить уникальный опыт участия в дискуссиях на темы сбора и интеграции, а также аналитики и визуализации данных. Построенное на инновационной платформе сообщество включает технические форумы и сведения о рыночных тенденциях, а также дает возможности социального взаимодействия и трудоустройства.
В DataDriven работают над проектами на стыке науки о данных и социального воздействия в таких областях, как международное развитие, здравоохранение, образование, исследования и охрана природы, а также общественные услуги. Платформа работает над тем, чтобы предоставить организациям больший доступ к возможностям науки о данных, и привлечь больше ученых-исследователей к решению социальных задач, где их навыки могут иметь значение.
Ronald Van Loon, директор Advertisement – компании, которая предлагает партнерам и клиентам консалтинговые, технологические, информационные и автоматизированные решения. Известный инфлюенсер в сфере Data Science, Ronald публикует статьи и посты на темы больших данных, искусственного интеллекта, автономных автомобилей, аналитики и многого другого.
Kenneth Cukier – редактор данных в The Economist и соавтор книги «Big Data: A Revolution That Will Transform How We Live, Work, and Think», а также популярный спикер и член совета по развитию на основе данных World Economic Forum. Cukier является постоянным гостем на BBC, CNN и NPR. С 2002 по 2004 год он был научным сотрудником Гарвардской школы управления имени Кеннеди. Он также является стипендиатом Оксфордской бизнес-школы, где проводит исследования в области авиации.
Ganapathi Pulipaka – главный Data Scientist в Accenture. Он разработал ряд программ Deep Learning и машинного обучения и продолжает публиковать новые идеи на GitHub и Medium. Советуем подписаться тем, кто заинтересован в математическом моделировании, нейросетях и визуализации данных в TensorFlow.
Kirk Borne является советником и главным специалистом по обработке данных в Booz Allen Hamilton. Kirk – астрофизик и консультант по большим данным, он также специализируется на интеллектуальном анализе данных, машинном обучении и вычислительной астрофизике. Kirk уже более 20 лет участвует в нескольких проектах NASA, включая его астрономический центр и операции с данными космической науки. В своем аккаунте в Твиттер он публикует множество ресурсов по машинному обучению и делится опытом работы.
Dr. Ian Brown – консультант по большим данным и руководитель научных данных для SAS UK&I. За последние десять лет он работал в нескольких секторах, обеспечивая лидерство по темам риска, искусственного интеллекта и машинного обучения. Ian активно публикует посты в Твиттер и рассказывает о проектах в сфере искусственного интеллекта.
Yves Mulkers – стратег данных и основатель популярного цифрового издания 7wData. Как специалист по интеграции, Yves в постах фокусируется на организации данных и возможностях архитектуры данных в организации. Он публикует свое видение проблем бизнес-аналитики и связанных с данными вопросов.
Mike Quindazzi – лидер продаж цифровых альянсов в PWC. Он помогает управлять бизнес-результатами, предлагая консультации по новым технологиям, вроде беспилотных летательных аппаратов, 3D-печати, блокчейна, IoT, больших данных и робототехники. Mike работал с такими брендами, как Microsoft, SAP, Amazon и Oracle, и помог сформировать инновационные подходы к решению их проблем. Он часто публикует свое мнение о развитии сферы больших данных и рассуждения на темы, связанные с AI и машинным обучением.
Evan Kirstel является ведущим технологическим влиятельным лицом в сегменте B2B и соавтором eVira Health, которая предлагает консультации, а также разработку продуктов и стратегий развития бизнеса для сообщества медицинских технологий. Он работал с такими известными брендами, как IBM, Intel и AT&T, среди прочих, чтобы максимизировать их видимость и масштабирование в 5G, blockchain, AI, cloud, IoT, AR, VR, Big Data и analytics.
Marcus Borba – создатель Borba Consulting, консалтинговой и исследовательской фирмы, которая решает сложные информационные задачи компаний с помощью таких инструментов, как аналитика больших данных и бизнес-аналитика. Считающийся одним из ведущих специалистов в области науки о данных и бизнес-аналитики, Marcus также регулярно публикует в своем Твиттере посты на темы нейронных сетей и машинного обучения.
Инфлюенсер и автор книги «The art of thinking like a Data Scientist». Он очень активен и на LinkedIn: прочтите пост «Will AI force Humans to become more Human» и подпишитесь, если хотите стать «Data Science Think Tank».
Michael Fisher – технический евангелист и старший системный аналитик в Whitcraft Group. Он считается ведущим специалистом в области IoT, 5G, VR и FinTech, и пишет о таких областях, как кибербезопасность, консалтинг и архитектура больших данных.
Srivatsan Srinivasan – Chief Data Scientist/Architect в Cognizant. Его опыт в построении сложных аналитических конвейеров, моделей машинного обучения для бизнес-процессов и помощи компаниям в преобразовании пространства данных и аналитики, сможет помочь расширить понимание многих областей больших данных, облаков и искусственного интеллекта. Советуем обратить внимание на его посты в LinkedIn, которые точно будут полезны тем, кто хочет быть в курсе новейших технологий AI и лучших практик в области Data Science.
Nando de Freitas – ученый, который возглавляет команду машинного обучения Google DeepMind. Профессор компьютерных наук Оксфордского университета, Nando de Freitas является специалистом в области машинного обучения с фокусом на нейронные сети, байесовскую оптимизацию и вывод, а также Deep Learning. Как главный ученый в Google DeepMind, он помогает в организации ее миссии – использовать технологии для широкой общественной пользы и научных открытий, обеспечивая при этом безопасность и соблюдение этических норм.
Если вы регулярно читаете учебные публикации по теме Data Science на LinkedIn, скорее всего вы уже знакомы с David Langer. Помимо того, что он является VP of Analytics в Schedulicity, он также известен как инструктор и YouTube-блогер. У него слава одного из самых выдающихся педагогов в области Data Science. David Langer создает образовательный контент для всех заинтересованных в развитии навыков работы с данными.
Основатель и генеральный директор Landing AI, а также основатель Deeplearning.ai. Andrew работал главным научным сотрудником Baidu Research, был профессором Стэнфордского университета, основателем и председателем правления Coursera, поэтому его считают пионером в области онлайн-образования. Он основал проект Google Brain, который разработал крупномасштабные искусственные нейронные сети, в том числе ту, которая научилась распознавать кошек на видео. Andrew специализируется на Deep Learning и часто делает публикации на связанные с машинным обучением темы.
Kristen Kehrer является преподавателем Data Science в UC Berkeley Extension и основателем Data Moves Me. С 2010 года Kristen предлагает инновационные и эффективные решения для машинного обучения в различных отраслях промышленности, включая коммунальное хозяйство, здравоохранение и электронную коммерцию. Kristen является инфлюенсером и наставником, у которого можно многому научиться благодаря ее опыту и знаниям в области SQL и аналитики больших данных.
Без чтения публикаций ведущих специалистов отрасли сложно освоить развивающиеся так быстро профессии. Если же вы только планируете карьеру в этой области, стоит обратить внимание на курс Факультета Аналитики Big Data онлайн-университета GeekBrains. Программа обучения включает основательную математическую и подготовку, изучение основ языка Python и работы с базами данных, а также работу с Hadoop и Apache Spark. Курс ориентирован на применение навыков машинного обучения в бизнесе и построен на основе практической работы над проектами с ведущими специалистами отрасли и личным помощником-куратором. Успешно окончившим его студентам онлайн-университет помогает с трудоустройством.
Начинающие разработчики и даже программисты уровня middle прекрасно владеют современным инструментарием, но часто проваливают собеседования из-за нехватки теоретических познаний. Абстрактные структуры данных и алгоритмы могут стать для соискателя препятствием на пути к работе мечты. Рассказываем, как это исправить.
Нужны ли структуры данных и алгоритмы программисту средней руки – вопрос спорный. Едва ли ему придется самостоятельно разрабатывать быструю сортировку или что-нибудь в этом духе. С другой стороны, теоретический базис необходим любому специалисту для формирования правильного образа мыслей. Работодатели на собеседованиях проверяют не только владение языками программирования и фреймворками, но и насколько хорошо кандидат знаком с вечной классикой. Если он не может отличить FIFO от LIFO или плавает в вопросе о пузырьковой сортировке, путь в профессию закроется. Есть мнение, будто усвоить необходимые знания можно за пару дней с книжкой в руках, но это не так. Материал слишком объемный, чтобы быстро с ним справиться – о подготовке к собеседованию лучше позаботиться заранее.
Программисты уровня junior и middle для рекрутеров ИТ-компаний – темные лошадки. Какой-нибудь senior или team lead гораздо понятнее работодателю, поскольку уже имеет имя, послужной список и большое количество реализованных проектов в портфолио. Чего ждать от новичков или специалиста среднего уровня, никому не известно, а значит и собеседовать их станут основательно – к этому стоит быть готовым. Требования к потенциальным кандидатам разнятся от компании к компании, но некоторые общие принципы выделить можно.
Крупные ИТ-компании не ждут от начинающих разработчиков совершенного владения современными технологическими приемами. Даже программисту middle-уровня на сей счет может быть сделано послабление, но к вопросам наличия у соискателя теоретического базиса гиганты относятся очень серьезно. Список требований обширен и включает весь джентльменский набор из программы профильного вуза. Наличие академических познаний не гарантирует получения места, но их отсутствие точно не даст пройти HR-квест до конца. Как сказал бы математик: теория необходима, но недостаточна для трудоустройства.
Здесь требования попроще, однако блеснуть знаниями на собеседовании стоит. ИТ-компании из сегмента малого и среднего бизнеса активно развиваются и могут очень критично отнестись к способностям разработчика оптимизировать код. Скорее всего вопросы будут касаться неких точечных теоретических областей, в которых заинтересован тот или иной работодатель, но без целостного базиса ответить на них не получится. В переводе на русский язык это означает, что учить опять-таки придется все. Там, где гиганты ведут массовый набор с готовыми скриптами собеседований и последующим отсевом сотрудников на испытательном сроке, игроки среднего размера выбирают лучших кандидатов. Может статься, что пройти их версию квеста по найму будет еще сложнее.
Собеседования в стартапы – всегда лотерея. Слишком они разные, чтобы можно было выделить общий подход к найму. Вопросы об алгоритмах и абстрактных структурах данных могут не возникнуть вовсе или стать главными при отсеве негодных соискателей. Предсказать это не получится, но одна закономерность есть: обычно стартаперы ищут единомышленников. Тут нужно понять, разделяете ли вы идеи проекта, а потом уже думать, какие знания понадобятся для успешного трудоустройства. Учить тем не менее придется, смиритесь. Лишним это точно не будет.
Если вопрос с подвохом может прилететь откуда угодно, потенциальному кандидату в разработчики нужно уметь отбивать все хитрые «подачи». Для этого его теоретические познания в сфере компьютерных наук должны быть достаточно широкими и целостными. Учебная программа выглядит примерно так:
Помимо перечисленного багажа, нужно освоить концепции динамического программирования, научиться решать олимпиадные задачи (некоторые работодатели дают их на собеседованиях), а также иметь представление об основах проектной работы. Стоит овладеть азами комбинаторики и численных методов, хотя это уже математика.
Перечисленные выше темы изучаются в вузах, но уже к старшим курсам ударившиеся в современные технологии студенты забывают о классике. У пришедших в программирование из других профессий специалистов теоретический базис тоже хромает, и это вполне естественно. Заполнить пробелы в знаниях помогают книги. В интернет-магазинах доступны неплохие работы: от модной «Грокаем алгоритмы», которую написал Адитья Бхарагава, до классической «Introduction to Algorithms» издательства MIT Press. Некоторым нравится «The Algorithm Design Manual» Стивена Скиены – выбрать есть из чего, но на изучение теории по книгам у работающих программистов не хватает ни времени, ни мотивации. Это тоже вполне естественно.
Не стоит заниматься ̶с̶а̶м̶о̶л̶е̶ч̶е̶н̶и̶е̶м̶самообучением, когда можно обратиться за помощью к профессионалам. Каждый хорош в своей работе: кто-то умеет писать программы, а кто-то – еще и учить этому других. Если вы хотите получить целостные и системные знания, компания OTUS предлагает IT-специалистам более 60 авторских курсов. Сейчас идет набор на пятимесячную программу онлайн-обучения «Алгоритмы и структуры данных»: вступительное тестирование можно пройти на сайте. Желающим также предлагают посетить бесплатный демо-урок, который пройдет 22 января.
Теоретический базис – фундамент вашей карьеры, а дом без фундамента построить невозможно.
Обучение на собственных ошибках – правильный путь развития развития разработчика. Ошибки совершают абсолютно все новички, рассмотрим самые распространенные из них.
Перевод публикуе…
Предлагаем подробно разобрать, как объединить Flutter c технологиями искусственного интеллекта и рассмотреть, к чему приведет эта интеграция.
Перевод публикуется с сокращениями, ав…
Собрать компактный компьютер для программирования самому или взять готовый? Наш сравнительный обзор поможет выбрать. В него вошли восемнадцать неттопов и комплектующие для системника Mini ATX.
…
В этой статье эксперты SkillFactory опровергают расхожие мифы о профессии программиста и подсказывают, что делать дальше.
В 2020 году все уже должны были узнать, что профессия программиста не так страшна, как кажется. Тем не менее находятся люди, которые считают, будто это не для них. Они даже готовы привести доводы в защиту своих убеждений – и тем самым упускают возможность освоить востребованную профессию.
Мы не будем врать, что за пару недель можно переучиться из художника в программиста. На самом деле секрет не в том, какая оценка по математике у вас была в школе или в каком вузе – гуманитарном или техническом – вы учились.
Программистов отличает способность мыслить алгоритмически. У кого-то есть предрасположенность к такому мышлению, но это не значит, что его нельзя развить самостоятельно или при помощи наставников.
Например, получить профессию разработчика на Python может и новичок. Начать стоит с тренировок мышления и программирования через отработку алгоритмов. Этот навык поможет решать нетривиальные задачи по программированию в будущем.
Курсы по программированию длятся от 6 до 24 месяцев, в зависимости от программы. Учеба в вузе отнимет у вас минимум 4 года, но при этом вы изучаете общеобразовательные предметы, вроде риторики, философии, психологии и этики. Не говоря уже о том, что программы в вузах могут устаревать…
Мы не агитируем вас бросать вуз и отказываться от высшего образования в принципе, но помните, что «вышка» – не единственный способ стать разработчиком. Важно, чтобы преподавателями были действующие эксперты, а программа обучения была ориентирована не только на теорию, но и на выработку практических навыков.
Во-первых, давайте зададимся вопросом: «много времени» – это сколько? 10 часов в неделю – это много или мало? А ведь именно столько времени нужно тратить на обучение новой профессии. Скорее всего эти же 10 часов вы проведете, залипая в ленте Фейсбука или Тиктока.
Во-вторых – со знанием Python сложно остаться без работы. Число вакансий растет с каждым годом: +127% с 2015 года по данным HH.ru. На курсе «Fullstack-разработчик на Python» в SkillFactory вас не только научат программировать, но и помогут найти работу. Начиная с первых недель обучения, ментор поможет определить карьерные цели и не сойти с намеченного пути, а карьерный центр подскажет, как оформить резюме и попасть на собеседования.
Самый неприятный миф в этой статье. Да, сейчас среди программистов мужчин больше, чем женщин, но если бы этот миф был правдой, то мир никогда бы не узнал о Мариссе Майер (экс-директор Yahoo!), Адель Голдберг (разработала язык программирования Smalltalk), Катарине Фейк (основала фотохостинг Flickr) и других крутых женщинах-программистах.
Зависит от ваших возможностей. Можно попробовать пройти бесплатные курсы или посмотреть ролики на YouTube. Платные школы ценятся за системный подход, обратную связь, когда опытный куратор может объяснить непонятные моменты и указать на ошибки, и помощь в трудоустройстве.
В период крупных скидок появляется много соблазнов: хочется купить новый смартфон, хотя предыдущий ещё не устарел, или очередные кроссовки. А можно вложить деньги в своё образование, сделав выгодную инвестицию в будущее.
С 17 по 30 ноября действуют скидки от 50% на все курсы онлайн-школы SkillFactory. Окончив онлайн-программу, вы сможете сразу же начать работать – это самый безопасный способ войти в сферу IT, не тратя несколько лет на учёбу, но при этом получив все базовые знания. Выгодно используя распродажу сейчас, вы инвестируете в своё будущее.
И кажется, что это одна из самых грамотных инвестиций в свое будущее.
Новая версия популярного языка программирования вышла не так давно. Рассмотрим наиболее интересные возможности Python 3.9, на которые стоит обратить внимание как новичкам, так и профессионалам.
Перевод подготовлен совместно с факультетом Python-разработки GeekBrains. Автор оригинального текста Farhad Malik.
Как и большинство поклонников Python, я очень рад изучать и использовать новейшие функции. В этой статье будет представлен обзор возможностей Python 3.9, которые необходимо знать.
Я ознакомился с примечаниями к выпуску, посмотрел обсуждения и составил исчерпывающий гайд о том, что из себя представляют эти функции и как они работают.
Было добавлено несколько новых функций, включая объединение и обновление словарей, строковые методы и внедрение модуля zoneinfo. Также нам представили стабильный и высокопроизводительный парсер.
Давайте разбираться с нововведениями.
Во встроенный класс dict
добавлено два оператора: |
и |=
.
| используется для объединения словарей, |= – для их обновления.
PEP 584
Код:
Объединение: |
>>> a = {‘farhad’: 1, 'blog’: 2, 'python’: 3}
>>> b = {’farhad’: 'malik’, 'topic’: 'python3.9’}
>>> a | b
{’blog’: 2, 'python’: 3, ’farhad’:’malik’, 'topic’: 'python3.9’}
>>> b | a
{’farhad’: 1,’blog’: 2, 'python’: 3, 'topic’:’python3.9’ }
Обновление: |=
>>> a |= b
>>> a
{’blog’: 2, 'python’: 3,’farhad’:’malik’}
В случае конфликта ключей верным будет считаться крайнее правое значение. Это соответствует поведению аналогичных операций dict
.
Как мы видим, добавлены новые операторы |
и |=
.
|
можно рассматривать как оператор +
(сложения) в списках, а |=
– как оператор +=
(расширения).
В Python 3.8 есть несколько способов слияния и обновления словарей.
К примеру, можно использовать first_dict.update(second_dict)
. Проблема этого метода в том, что он изменит first_dict
на месте. Чтобы этого избежать, нужно объявить временную переменную, сохранить в ней first_dict
, а затем выполнить операцию обновления. Но появляется лишняя строка кода, просто чтобы оператор объединения/обновления работал.
Также мы можем применить {**first_dict, **second_dict}
. Сложность этого метода в том, что его трудно обнаружить и сложнее понять смысл кода. Кроме того, исключаются типы mapping и учитывается только тип dict. Например, если first_dict
– это defaultdict
, а second_dict
– это тип dict
, то программа завершится ошибкой.
Этот способ не работает с подклассами dict
, которые содержат функцию _init_
.
Наконец, библиотека collections содержит функцию ChainMap
. Она может принять два словаря, как ChainMap (first_dict, second_dict)
, и вернуть объединенный словарь, но об этой библиотеке знают немногие.
Для получения более подробной информации вы можете ознакомиться с источником.
https://www.python.org/dev/peps/pep-0584
С Python 3.9 можно отказаться от использования LL (1) в пользу более гибкого и стабильного синтаксического анализатора на основе PEG.
PEP: 617
Текущий парсер CPython основан на LL (1). Грамматика основана на LL (1), что позволяет парсить ее с помощью LL (1) анализатора. Парсер LL (1) работает сверху вниз и анализирует входные данные слева направо. Грамматика является контекстно-свободной, поэтому контекст токенов не учитывается.
Python 3.9 предлагает заменить его новым парсером на основе PEG, который снимет ограничения Python грамматики LL (1). Будет удален ряд хаков, существующих в текущем синтаксическом анализаторе. В долгосрочной перспективе это снизит стоимость обслуживания.
Несмотря на то, что синтаксические анализаторы и грамматики LL (1) просты в реализации, ограничения не позволяют им выражать общие конструкции естественным образом для разработчика языка и читателя. Парсер смотрит только на один токен вперед, чтобы различать возможности.
Оператор выбора | упорядоченный. Рассмотрим следующее правило:
rule: A|B|C
Контекстно-свободный парсер грамматики LL (1) будет генерировать конструкции, которые при заданной входной строке определят, нужно ли расширять A, B или C. Анализатор PEG отличается. Он проверит, успешна ли первая переменная, и только в случае провала перейдет ко второй или третьей.
Парсер PEG генерирует ровно одно допустимое дерево для строки. Он определенный, в отличие парсер LL (1).
Синтаксический анализатор PEG также напрямую генерирует узлы AST для правила через грамматические действия. За счет этого удается избежать создания промежуточных шагов.
Парсер PEG был тщательно протестирован. У него отлажена производительность. Поэтому для большинства инструкций он расходует примерно 10% от объема памяти и вычислительных ресурсов текущего анализатора. Все благодаря тому, что не создается промежуточное синтаксическое дерево.
Я опустил некоторые детали, чтобы не усложнять прочтение статьи. Для получения более подробной информации вы можете ознакомиться с источником.
https://www.python.org/dev/peps/pep-0617
К объекту str
добавлено две новых функции.
1. Первая удаляет префикс – str.removeprefix(‘префикс’)
.
2. Вторая удаляет суффикс – str.removesuffix(‘суффикс’)
.
PEP: 616
Код:
'farhad_python'.removeprefix('farhad_')
#возвращает python
'farhad_python'.removesuffix('_python')
#возвращает farhad
Одна из обыденных задач в приложении data science, которое включает в себя манипулирование текстом – удалить префикс/суффикс строк. Добавленные к объекту str
функции можно использовать для удаления ненужных префиксов и суффиксов из строки.
Как мы уже знаем, первая функция удаляет префикс. Это str.removeprefix(‘префикс’)
. Вторая функция удаляет суффикс. Это str.removesuffix(‘суффикс’)
.
Строка – это набор символов, и каждый символ имеет индекс в строке. Индексы можно использовать вместе с :
, чтобы вернуть подмножество строки. Эта функция известна как slice
(срез) строки.
Если мы говорим о функциях, они проверяют, начинается ли строка с префикса (заканчивается ли она суффиксом), и если да, то возвращают строку без префикса или после суффикса, используя функцию среза str [:]
.
Поскольку эти функции являются частью стандартной библиотеки, мы получаем согласованный, менее хрупкий, высокопроизводительный и более наглядный API.
Для получения более подробной информации вы можете ознакомиться с источником.
https://www.python.org/dev/peps/pep-0616
Аннотирование программ стало проще за счет удаления иерархии параллельных типов в Python.
Добавлена поддержка универсального синтаксиса во всех стандартных коллекциях, доступных в модуле набора текста.
Мы можем использовать встроенные типы коллекций list
или dict
в качестве универсальных типов вместо использования typing.List
или typing.Dict
в сигнатуре нашей функции.
Код стал выглядеть чище, а его понимание и объяснение упростилось.
PEP: 585
Несмотря на то, что Python – это язык с динамической типизацией, аннотация типов в программе позволяет проводить самоанализ. Впоследствии аннотацию можно использовать для создания API проверки типов во время выполнения.
Как я говорил ранее, в Python 3.9 добавили поддержку универсального синтаксиса во всех стандартных коллекциях, доступных в модуле набора текста.
Универсальный тип – это обычно контейнер, к примеру list
. Это тип, который можно параметризовать. Параметризованный тип – это пример универсального дженерика с ожидаемыми типами для элементов контейнера типа list [str]
.
Мы можем использовать встроенные типы коллекций list
или dict
в качестве универсальных типов вместо использования typing.List
или typing.Dict
.
Например, мы могли бы управлять проверкой типов среды выполнения Python, аннотируя код:
print_value(input: str):
print(input)
# Мы получим уведомление, если входные данные не являются строкой
Ряд функций статической типизации был постепенно построен поверх существующей среды выполнения Python. Некоторые из них были ограничены существующим синтаксисом и поведением во время выполнения. Поэтому в модуле типизации возникла дублированная иерархия коллекций из-за дженериков.
Например, мы увидим typing.List
, typing.Dictionary
вместе со встроенными list
, dictionary
и т. д. Это позволяет писать код:
def read_blog_tags(tags: list[str]) -> None:
for tag in tags:
print("Tag Name", tag)
Для получения более подробной информации вы можете ознакомиться с источником.
https://www.python.org/dev/peps/pep-0585
Модуль zoneinfo
был создан в качестве поддержки базы данных часовых поясов IANA. Эта поддержка была добавлена в стандартную библиотеку.
PEP: 615
Часовые пояса IANA часто называют tz
или zone info. Существует много часовых поясов IANA с разными путями поиска для указания часового пояса IANA объекта datetime
. Например, мы можем передать имя пути поиска объекту datetime
как Continent/City, чтобы установить его tzinfo
.
dt = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))
Если мы передадим неверный ключ, возникнет ошибка zoneinfo.ZoneInfoNotFoundError
.
Библиотека datetime
используется для создания объекта datetime
и указания его часового пояса, путем установки свойства tzinfo
. Все может обернуться созданием сложных правил часового пояса при использовании базового показателя datetime.tzinfo
.
В большинстве случаев нужно просто установить объект и его часовой пояс: UTC, локальный часовой пояс системы, или часовой пояс IANA.
Можно создать объект zoneinfo.ZoneInfo(key)
, где ключ имеет строковый тип, указывающий путь поиска файла зоны в базе данных часовых поясов системы. Объект zoneinfo.ZoneInfo(key)
может быть создан и установлен как свойство tzinfo
объекта datetime
.
Код:
from zoneinfo import ZoneInfo
from datetime import datetime
dt = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("America/Los_Angeles"))
Для получения более подробной информации вы можете ознакомиться с источником.
https://www.python.org/dev/peps/pep-0615
В concurrent.futures.Executor.shutdown ()
добавлен новый параметр cancel_futures
.
Он отменяет все отложенные фьючерсы, которые не были запущены.
До версии 3.9 процесс ожидал их завершения перед завершением работы исполнителя.
Новый параметр cancel_futures
был добавлен в ThreadPoolExecutor
и ProcessPoolExecutor
. Это работает так: если его значение – True
, все ожидающие фьючерсы отменяются при вызове функции shutdown ()
.
При выполнении shutdown ()
интерпретатор проверяет, не собран ли исполнитель сборщиком мусора. Если он все еще находится в памяти, он получает все ожидающие обработки элементы, а затем отменяет фьючерсы.
Когда не остается незавершенных рабочих элементов, он завершает работу.
Для получения более подробной информации вы можете ознакомиться с источником.
https://bugs.python.org/issue30966
В библиотеку asyncio
и многопроцессорную обработку были внесен ряд улучшений.
Например:
1. Параметр reuse_address
asyncio.loop.create_datagram_endpoint ()
больше не поддерживается из-за серьезных пробелов в безопасности.
2. Добавлены новые сопрограммы: shutdown_default_executor ()
и asyncio.to_thread (). shutdown_default_executor
назначает завершение работы для исполнителя по умолчанию, который ждет завершения ThreadPoolExecutor. asyncio.to_thread ()
в основном используется для запуска функций, связанных с вводом-выводом, в отдельном потоке, чтобы избежать блокировки цикла событий.
Что касается улучшений библиотеки многопроцессорности, в класс multiprocessing.SimpleQueue
был добавлен новый метод close ()
.
Этот метод точно закрывает очередь. Это гарантирует, что очередь будет закрыта и не останется дольше ожидаемого. Помните, что методы get ()
, put ()
, empty ()
не должны вызываться после закрытия очереди.
Для получения более подробной информации вы можете ознакомиться с источником.
https://bugs.python.org/issue30966
Основная проблема импортирования библиотек Python заключалась в несогласованном поведении, когда относительный импорт проходил мимо пакета верхнего уровня.
Встроенная функция __ import __ ()
вызывает ошибку ValueError
, а importlib .__ import __ ()
вызывает ошибку ImportError
.
Теперь это исправили. __Import __ ()
вызывает ImportError
вместо ValueError
.
Для получения более подробной информации вы можете ознакомиться с источником.
https://bugs.python.org/issue37444
Еще одна функция, добавленная в версии 3.9 – random.Random.randbytes ()
. Эта функция может использоваться для генерации случайных байтов.
Можно генерировать случайные числа, но что, если нужно генерировать случайные байты? Раньше разработчикам приходилось для этого проявлять изобретательность. Хотя можно использовать os.getrandom ()
, os.urandom ()
или secrets.token_bytes ()
, но нельзя генерировать псевдослучайные паттерны.
К примеру, чтобы гарантировать, что случайные числа генерируются с ожидаемым поведением и процесс воспроизводится, обычно используется модуль random.Random
.
В результате был введен метод random.Random.randbytes ()
. Он также может генерировать случайные байты контролируемым способом.
Для получения более подробной информации вы можете ознакомиться с источником.
https://bugs.python.org/issue40286
Раньше «» .replace («», s, n)
возвращал пустую строку вместо s
для всех ненулевых n
.
Этот баг сбивал с толку пользователей и приводил к нестабильному поведению приложений.
В Python 3.9 проблема была устранена, и теперь функция замены совместима с "" .replace ("", s)
.
Работает она следующим образом: для заданного максимального аргумента вхождения замены, набор символов из строки заменяется новым набором символов:
string.replace(s, old, new[, maxreplace])
В этом случае возвращается копия строки s со всеми вхождениями старой подстроки, замененной на новую. Если указан необязательный аргумент maxreplace, заменяются первые экземпляры maxreplace.
До этого функция replace имела непоследовательное поведение
"".replace("", "blog", 1)
Возвращает ''
Ожидалось увидеть blog
"".replace("", "|", 1)
Возвращает ''
Ожидалось увидеть |
"".replace("", "prefix")
Но возвращает 'prefix'
Теперь:
“”.replace(“”,s,n) возвращает s вместо пустой строки для всех ненулевых n
В Python 3.9 также был исключен ряд избыточных функций, таких как Py_UNICODE_MATCH
.
Если вы хотите узнать больше об этих улучшениях, прочтите официальное руководство здесь.
Нововведения в популярном языке программирования можно изучить самостоятельно, но придется потратить много времени и сил на поиск и систематизацию информации. Если ваш опыт в профессии еще не так велик, обратите внимание на факультет Python-разработки GeekBrains. Под руководством опытных преподавателей вы получите необходимые знания, а успешно завершившим обучение студентам онлайн-академия поможет с трудоустройством.
Попробуем разобраться, как можно использовать Django, Pandas и Chart.js для быстрого отображения данных в виде различных графиков и диаграмм.
Перевод публикуется с сокращениями, автор оригинальной статьи Shane
Gary.
Эту связку полезно применять для быстрой визуализации одной
таблицы с несколькими различными графиками, а также для создания надежного сайта на Django и Chart.js.
Почему Pandas? Все задачи можно выполнить изнутри Django непосредственно из БД, т. к. правильные запросы к базе всегда будут выгоднее для
продакшена.
Почему Django? Это отличный выбор для проекта, где необходимо
экспортировать данные в одну таблицу. Использование Flask будет более
выигрышным вариантом, если не нужна аутентификация и доступ к данным из
существующей базы.
Почему Chart.js? Если вы хотите развернуть кучу различных
интерактивных диаграмм, изменив несколько переменных – Chart.js сделает это быстрее
других.
Исходные тексты и простой набор данных из туториала вы
найдете по ссылкам.
Все действия в этом проекте будут происходить на сервере с Debian.
pip install django pandas
django-admin startproject django_charts
cd django_charts
python manage.py migrate
python manage.py createsuperuser
python manage.py startapp data
cd data
mkdir templates
cd ..
python manage.py runserver
Дополнительно можете установить себе palettable – цветовую палитру
для Python, однако код будет работать и без нее.
pip install palettable
На основе набора данных мы создадим следующую модель, но она
должна быть изменена под ваши нужды.
from django.db import models
class Purchase(models.Model):
city = models.CharField(max_length=50)
customer_type = models.CharField(max_length=50)
gender = models.CharField(max_length=50)
unit_price = models.FloatField()
quantity = models.IntegerField()
product_line = models.CharField(max_length=50)
tax = models.FloatField()
total = models.FloatField()
date = models.DateField()
time = models.TimeField()
payment = models.CharField(max_length=50)
cogs = models.FloatField()
profit = models.FloatField()
rating = models.FloatField()
Обязательно обновите БД после ее создания:
python manage.py makemigrations
python manage.py migrate
С помощью Pandas и Django сделайте загрузку csv в базу данных для Kaggle:
import pandas as pd
from .models import Purchase
# dataset from https://www.kaggle.com/aungpyaeap/supermarket-sales
# headers changed and invoice number col removed
def csv_to_db():
df = pd.read_csv('supermarket_sales.csv') # use pandas to read the csv
records = df.to_records() # convert to records
# loop through and create a purchase object using django
for record in records:
purchase = Purchase(
city=record[3],
customer_type=record[4],
gender=record[5],
product_line=record[6],
unit_price=record[7],
quantity=record[8],
tax=record[9],
total=record[10],
date=datetime.strptime(record[11], '%m/%d/%Y').date(),
time=record[12],
payment=record[13],
cogs=record[14],
profit=record[16],
rating=record[17],
)
purchase.save()
Импортируйте себе всю эту штуку:
from django.views.generic import TemplateView
from .methods import csv_to_db
class Dashboard(TemplateView):
template_name = 'dashboard.html'
def get_context_data(self, **kwargs):
# get the data from the default method
context = super().get_context_data(**kwargs)
csv_to_db()
Затем создайте пустой файл base/dashboard.html и data/urls.py:
from django.urls import path
from data import views
urlpatterns = [
path('', views.Dashboard.as_view(), name='dashboard')
]
Отредактируйте django_charts/urls.py, чтобы добавить URL для данных:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('data/', include('data.urls')),
]
Обновите список django_charts/settings.py, чтобы включить data
в INSTALLED_APPS:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'data',
]
Убедимся, что можем видеть покупку в админке, добавив это в
data/admin.py:
from django.contrib import admin
from .models import Purchase
admin.site.register(Purchase)
Теперь вы можете перейти на страницу дашборда (127.0.0.1:8000/data/),
а потом проверить в админке (127.0.0.1:8000/admin/data/purchase/), видны ли все
записи. Если вы используете тот же набор данных, их должно быть около 1000.
Есть базовый файл, который мы будем расширять:
{% load static %}
<!doctype html>
<html lang="en">
<head>
<title>
{% block title %}{% endblock %}
</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="shortcut icon" type="image/x-icon" href="{% static 'img/favicon.png' %}">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
</head>
<body>
{% block page_content %}{% endblock %}
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script
src="http://code.jquery.com/jquery-3.5.1.min.js"
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
crossorigin="anonymous">
</script>
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
crossorigin="anonymous">
</script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"
integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI"
crossorigin="anonymous">
</script>
<!-- Chart.JS -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
$(document).ready(function(){
{% block js_scripts %}{% endblock %}
})
</script>
</body>
</html>
Немного модернизируем его:
{% block title %}{% endblock %}
{% block custom_css %}{% endblock %}
{% block page_content %}{% endblock %}
{% block js_scripts %}{% endblock %}
Это даст возможность добавлять
блоки с любой страницы. Обратите внимание, что здесь включен bootstrap CDN,
чтобы использовать popper.js (это опционально). Можно выполнить проект совсем без
bootstrap, но придется отредактировать dashboard.html.
Все написанные сценарии обернуты в $(document).ready
, чтобы не
происходило никаких манипуляций до тех пор, пока страница не будет готова.
Далее рассмотрим страницу с графиками – dashboard.html:
{% extends 'base.html' %}
{% block page_content %}
<div class="container">
<div class="row mb-4 mt-4">
<div class="col"
<div class="card-deck">
{% for chart in charts %}
<div class="card">
<div class="card-body">
<div class="chart-container" style="height:150; width:150">
{{ chart.html|safe }}
</div>
</div>
</div>
{% if forloop.counter|divisibleby:2 %}
<div class="w-100 d-none d-sm-block d-md-none mb-4"><!-- wrap every 2 on sm--></div>
{% endif %}
{% if forloop.counter|divisibleby:3 %}
<div class="w-100 d-none d-md-block d-lg-none mb-4"><!-- wrap every 3 on md--></div>
{% endif %}
{% if forloop.counter|divisibleby:4 %}
<div class="w-100 d-none d-lg-block d-xl-none mb-4"><!-- wrap every 4 on lg--></div>
{% endif %}
{% if forloop.counter|divisibleby:5 %}
<div class="w-100 d-none d-xl-block mb-4"><!-- wrap every 5 on xl--></div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
{% endblock %}
{% block js_scripts %}
{% for chart in charts %}
{{ chart.js|safe }}
{% endfor %}
{% endblock %}
Здесь создается контейнер, строка и колонка, внутри которой
лежит «колода карт», создающая карты одинакового размера.
Колода карт будет пытаться втиснуть все в одну строку.
Счетчики forloop.counters используются для определения размера экрана и
соответствующего обертывания колоды карт, однако на практике вы обнаружите, что Chart.js зачастую игнорирует настройки размера холста.
Чтобы лучше понять происходящее, посмотрим на views.py:
import pandas as pd
import numpy as np
from django.views.generic import TemplateView
from .methods import csv_to_db
from .models import Purchase
from .charts import objects_to_df, Chart
PALETTE = ['#465b65', '#184c9c', '#d33035', '#ffc107', '#28a745', '#6f7f8c', '#6610f2', '#6e9fa5', '#fd7e14', '#e83e8c', '#17a2b8', '#6f42c1' ]
class Dashboard(TemplateView):
template_name = 'dashboard.html'
def get_context_data(self, **kwargs):
# получение данные из метода по умолчанию
context = super().get_context_data(**kwargs)
# поля, которые мы будем использовать
# df_fields = ['city', 'customer_type', 'gender', 'unit_price', 'quantity',
# 'product_line', 'tax', 'total' , 'date', 'time', 'payment',
# 'cogs', 'profit', 'rating']
# поля для исключения
# df_exclude = ['id', 'cogs']
# создание фрейма данных с записями. chart.js не очень хорошо справляется
# с датами во всех ситуациях, поэтому наш метод преобразует их в строки
# и нужно будет определить столбцы дат и нужный формат.
df = objects_to_df(Purchase, date_cols=['%Y-%m', 'date'])
# создание контекста charts для хранения всех графиков
context['charts'] = []
### каждая диаграмма добавляется одинаково поэтому опишем первую
# создадим объект диаграммы с уникальным chart_id и цветовой палитрой
# если не указан chart_id или цветовая палитра, они будут генерироваться рандомно
# тип диаграмм должен быть идентифицирован здесь и отличаться от типа chartjs
city_payment_radar = Chart('radar', chart_id='city_payment_radar', palette=PALETTE)
# создадим сводную таблицу pandas на основе полей и агрегации, которые мы хотим
# стеки используются либо для группировки, либо для укладки определенного столбца
city_payment_radar.from_df(df, values='total', stacks=['payment'], labels=['city'])
# добавим контекст
context['charts'].append(city_payment_radar.get_presentation())
exp_polar = Chart('polarArea', chart_id='polar01', palette=PALETTE)
exp_polar.from_df(df, values='total', labels=['payment'])
context['charts'].append(exp_polar.get_presentation())
exp_doughnut = Chart('doughnut', chart_id='doughnut01', palette=PALETTE)
exp_doughnut.from_df(df, values='total', labels=['city'])
context['charts'].append(exp_doughnut.get_presentation())
exp_bar = Chart('bar', chart_id='bar01', palette=PALETTE)
exp_bar.from_df(df, values='total', labels=['city'])
context['charts'].append(exp_bar.get_presentation())
city_payment = Chart('groupedBar', chart_id='city_payment', palette=PALETTE)
city_payment.from_df(df, values='total', stacks=['payment'], labels=['date'])
context['charts'].append(city_payment.get_presentation())
city_payment_h = Chart('horizontalBar', chart_id='city_payment_h', palette=PALETTE)
city_payment_h.from_df(df, values='total', stacks=['payment'], labels=['city'])
context['charts'].append(city_payment_h.get_presentation())
city_gender_h = Chart('stackedHorizontalBar', chart_id='city_gender_h', palette=PALETTE)
city_gender_h.from_df(df, values='total', stacks=['gender'], labels=['city'])
context['charts'].append(city_gender_h.get_presentation())
city_gender = Chart('stackedBar', chart_id='city_gender', palette=PALETTE)
city_gender.from_df(df, values='total', stacks=['gender'], labels=['city'])
context['charts'].append(city_gender.get_presentation())
return context
Будем использовать TemplateView. Это очень простое view, к которому можно что-то добавить. Единственный метод,
который необходимо расширить – get_context_data, использующийся в Django
для получения данных.
Мы вытаскиваем нужные объекты и создаем фрейм данных. Известно,
что Chart.js не очень хорошо работает с датами –
конвертируем их в строки после создания фрейма. Затем добавляем каждый график в
контекст Chart. Это позволяет перебирать графики в коде HTML, т. к. каждая диаграмма представляет собой словарь, содержащий гипертекст и
js-запись.
И наконец файл data/charts.py. Весь код легко переносится
в другой проект, и вы можете просто поместить его в свой view. Пробежимся по
некоторым функциям, а затем перейдем к классу Chart.
def objects_to_df(model, fields=None, exclude=None, date_cols=None, **kwargs):
"""
Возвращает фрейм данных pandas, содержащий записи в модели
``fields`` это необязательный список имен полей. Если это предусмотрено, вернется только
имя.
``exclude`` это необязательный список имен полей. Если это предусмотрено,
именованные элементы исключатся из возвращаемого dict
``date_cols`` chart.js в настоящее время он не очень хорошо обрабатывает даты, поэтому эти
столбцы должны быть преобразованы в строку.
``kwargs`` можно включить, чтобы ограничить модельный запрос конкретными записями
"""
if not fields:
fields = [field.name for field in model._meta.get_fields()]
if exclude:
fields = [field for field in fields if field not in exclude]
records = model.objects.filter(**kwargs).values_list(*fields)
df = pd.DataFrame(list(records), columns=fields)
if date_cols:
strftime = date_cols.pop(0)
for date_col in date_cols:
df[date_col] = df[date_col].apply(lambda x: x.strftime(strftime))
return df
Эта функция принимает модель Django и возвращает все записи. Можно
включить некоторые фильтры после всех аргументов имени. Например:
objects_to_df(Purchase, fields=None, exclude=['id'], date_cols=['%Y-%m', 'date'], city='Mandalay')
Результат будет ограничен городом Мандалай. Поля include и exclude работают аналогично Django. Если вы ничего
не включаете, будут выведены все поля из модели. Важно отметить, что exclude обрабатываются после include. Таким
образом, если включить и исключить столбец, он не будет отображаться.
def get_options():
"""
Дефолтное значение для всех графиков
"""
return {}
Этот код устанавливает параметры по умолчанию для всех графиков.
def generate_chart_id():
"""
Вернет 8 рандомных сгенерированных символов ascii
"""
return ''.join(random.choice(string.ascii_letters) for i in range(8))
Если вы не хотите утруждать себя маркировкой каждого из них,
данная функция устанавливает случайный ID, используемый JS для изменения элемента HTML. Этот идентификатор также используется для именования функции JS
и переменной, чтобы облегчить отладку.
from palettable.lightbartlein.diverging import BlueDarkRed12_6 as palette # example import
def get_colors():
"""
Цвета из palette.colors или случайным образом сгенерированный список цветов.
Отлично работает с модулем palettable
но не является обязательным и будет вызывать get_random_colors
если palette.colors не задана
"""
try:
return palette.hex_colors
except:
return get_random_colors(6)
get_colors применяется для установки начальных цветов. Если ее
передать в палитру, она будет использоваться в качестве основной. Если ничего
не передавать и не импортировать из palletable, то цвета будут генерироваться случайным образом.
def get_random_colors(num, colors=[]):
while len(colors) < num:
color = "#{:06x}".format(random.randint(0, 0xFFFFFF))
if color not in colors:
colors.append(color)
return colors
get_random_colors используется, если цвета не были переданы или когда их больше, чем значений. Все начинается с переданных цветов, а в процессе они добавляются случайным
образом.
По функциям все. Ниже приведен класс Chart.
@dataclass
class Chart:
"""
Класс в помощь к chart.js.
``datasets`` собственно данные. Содержит данные и варианты их получения.
``labels`` метки для данных.
``chart_id`` уникальный ID диаграммы. Будет сгенерирован рандомно
если таковой не предусмотрен. Это должна быть допустимая JS-переменная.
Не используйте '-'
``palette`` список цветов. Будет сгенерирован, если ни один не указан.
"""
chart_type: str
datasets: List = field(default_factory=list)
labels: List = field(default_factory=list)
chart_id: str = field(default_factory=generate_chart_id)
palette: List = field(default_factory=get_colors)
options: dict = field(default_factory=get_options)
Здесь использовался dataclass – это относительно недавнее
дополнение Python и для быстрых классов оно будет хорошим выбором. Установка
начальных значений помогает гарантировать, что вы не используете изменяемый
объект для экземпляра.
def from_lists(self, values, labels, stacks):
"""
Функция построения графиков из списка
``values`` список датасетов, содержащий одно значение.
``labels`` метки значений.
``stacks`` метки для каждого набора данных в списке значений.
"""
self.datasets = []
# убеждаемся, что у нас правильное количество цветов
if len(self.palette) < len(values):
get_random_colors(num=len(values), colors=self.palette)
# создаем датасет
for i in range(len(stacks)):
self.datasets.append(
{
'label': stacks[i],
'backgroundColor': self.palette[i],
'data': values[i],
}
)
if len(values) == 1:
self.datasets[0]['backgroundColor'] = self.palette
self.labels = labels
from_dataframe помогает использовать несколько
строк кода для манипулирования практически любым фреймом данных, чтобы передавать
все непосредственно в from_lists для Chart.js. Мы применяем метод pivot_table и Pandas, чтобы создать pivot_table
на основе входных данных. Она может выгружать списки, которые нужны для
диаграммы.
def from_df(self, df, values, labels, stacks=None, aggfunc=np.sum, round_values=0, fill_value=0):
"""
Функция построения графиков из датафрейма.
``df`` используемый датафрейм.
``values`` имя колонки со значениями.
``stacks`` имя колонки со stack-ами.
``labels`` имя колонки с метками.
``aggfunc`` функция, агрегирующая значения.
``round_values`` десятичный знак для округления.
``fill_value`` используется если значение пустое.
"""
pivot = pd.pivot_table(
df,
values=values,
index=stacks,
columns=labels,
aggfunc=aggfunc,
fill_value=0
)
pivot = pivot.round(round_values)
values = pivot.values.tolist()
labels = pivot.columns.tolist()
stacks = pivot.index.tolist()
self.from_lists(values, labels, stacks)
Чтобы внедрить код в своем проекте, скопируйте
chart.py и используйте его, как views.py в нашем. Обязательно убедитесь,
что базовый файл HTML импортирует chart.js cdn. Bootstrap – по желанию. Удачи в
обучении и экспериментах!
Весь код из статьи:
@dataclass
class Chart:
chart_type: str
datasets: List = field(default_factory=list)
labels: List = field(default_factory=list)
chart_id: str = field(default_factory=generate_chart_id)
palette: List = field(default_factory=get_colors)
options: dict = field(default_factory=get_options)
def from_lists(self, values, labels, stacks):
self.datasets = []
if len(self.palette) < len(values):
get_random_colors(num=len(values), colors=self.palette)
for i in range(len(stacks)):
self.datasets.append(
{
'label': stacks[i],
'backgroundColor': self.palette[i],
'data': values[i],
}
)
if len(values) == 1:
self.datasets[0]['backgroundColor'] = self.palette
self.labels = labels
def from_df(self, df, values, labels, stacks=None, aggfunc=np.sum, round_values=0, fill_value=0):
pivot = pd.pivot_table(
df,
values=values,
index=stacks,
columns=labels,
aggfunc=aggfunc,
fill_value=0
)
pivot = pivot.round(round_values)
values = pivot.values.tolist()
labels = pivot.columns.tolist()
stacks = pivot.index.tolist()
self.from_lists(values, labels, stacks)
def get_elements(self):
elements = {
'data': {
'labels': self.labels,
'datasets': self.datasets
},
'options': self.options
}
if self.chart_type == 'stackedBar':
elements['type'] = 'bar'
self.options['scales'] = {
'xAxes': [
{'stacked': 'true'}
],
'yAxes': [
{'stacked': 'true'}
]
}
if self.chart_type == 'bar':
elements['type'] = 'bar'
self.options['scales'] = {
'xAxes': [
{
'ticks': {
'beginAtZero': 'true'
}
}
],
'yAxes': [
{
'ticks': {
'beginAtZero': 'true'
}
}
]
}
if self.chart_type == 'groupedBar':
elements['type'] = 'bar'
self.options['scales'] = {
'xAxes': [
{
'ticks': {
'beginAtZero': 'true'
}
}
],
'yAxes': [
{
'ticks': {
'beginAtZero': 'true'
}
}
]
}
if self.chart_type == 'horizontalBar':
elements['type'] = 'horizontalBar'
self.options['scales'] = {
'xAxes': [
{
'ticks': {
'beginAtZero': 'true'
}
}
],
'yAxes': [
{
'ticks': {
'beginAtZero': 'true'
}
}
]
}
if self.chart_type == 'stackedHorizontalBar':
elements['type'] = 'horizontalBar'
self.options['scales'] = {
'xAxes': [
{'stacked': 'true'}
],
'yAxes': [
{'stacked': 'true'}
]
}
if self.chart_type == 'doughnut':
elements['type'] = 'doughnut'
if self.chart_type == 'polarArea':
elements['type'] = 'polarArea'
if self.chart_type == 'radar':
elements['type'] = 'radar'
return elements
def get_html(self):
code = f'<canvas id="{self.chart_id}"></canvas>'
return code
def get_js(self):
code = f"""
var chartElement = document.getElementById('{self.chart_id}').getContext('2d');
var {self.chart_id}Chart = new Chart(chartElement, {self.get_elements()})
"""
return code
def get_presentation(self):
code = {
'html':self.get_html(),
'js': self.get_js(),
}
return code
Дополнительные материалы:
Мы собрали для вас все ближайшие мероприятия для карьерного роста и получения новых знаний в сфере Data Science. На фоне пандемии коронавируса многие из них проходят в онлайн-формате.
В статье «Научиться Data Science онлайн» мы рассказали, как овладеть стать специалистам по анализу данных с нуля. В подготовленной при поддержке Факультета Искусственного интеллекта онлайн-университета GeekBrains публикации мы собрали все ближайшие хакатоны и соревнования, которые помогут освоить навыки Data Scientist на практике.
Когда: c 16 по 18 декабря 2020 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: русский
Самое интересное: хакатон для программистов, химиков, физиков, математиков и инженеров, заинтересованных в новых идеях в сфере биоинформатики и компьютерных симуляций.
Подробнее: https://fit-m.org/hack
Когда: c 21 по 22 декабря 2020 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: русский
Призовой фонд: 100000 рублей
Самое интересное: хакатон для начинающих аналитиков, посвященный комфортной городской среде.
Подробнее: https://hacklife.fun/
Когда: c 4 по 6 декабря 2020 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: английский
Самое интересное: цифровой хакатон открыт для всех уровней квалификации, от новичков до самых опытных разработчиков.
Подробнее: https://organize.mlh.io/participants/events/6046-sharkhacks
Когда: c 4 по 6 декабря 2020 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: английский
Самое интересное: открытый хакатон для всех, кто интересуется STEM – от новичков до опытных хакеров.
Подробнее: https://newyork.techtogether.io/
Когда: c 11 по 13 декабря 2020 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: английский
Самое интересное: хакатон в стиле Шерлока Холмса, во время которого вам предстоит следовать подсказкам для разгадки тайн.
Подробнее:https://organize.mlh.io/participants/events/6047-who-done-it-hacks
Когда: c 12 по 13 декабря 2020 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: английский
Самое интересное: 48-часовой хакатон на темы Data Science, AI, OIT, robotics, blockchain, AR и VR, open innovations.
Подробнее: https://www.hackoff.tech/
Когда: c 16 по 17 января 2021 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: английский
Самое интересное: хакатон, посвященный инновациям, маскам для лица, открытиям, наставничеству, созданию новых технологий и сетей.
Подробнее: https://rosehack.com/
Когда: c 29 по 31 января 2021 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: английский
Самое интересное: хакатон для студентов, заинтересованных в создании чего-то нового. В качества бонуса – возможность пообщаться с профессионалами отрасли и выиграть призы.
Подробнее: http://hoyahacks.georgetown.domains/
Когда: c 5 по 7 февраля 2021 г.
Где: онлайн
Стоимость участия: бесплатно
Язык мероприятия: английский
Самое интересное: хакатон на тему “Building a Data-Driven World” для студентов и специалистов Data Science.
Подробнее: https://hacklytics.io/
Дедлайн для регистрации команд: 31 декабря 2020 г.
Дата окончания: 7 января 2021 г.
Призы: 1 место – $50 000 , 2 место – $30 000, 3 место – $10 000, 4 и 5 место – $5 000. Команды-победители также будут приглашены представить свои модели на семинаре AAAI-2021 по образованию в области искусственного интеллекта (Imaginating Post-COVID Education with AI).
В этом конкурсе ваша задача — создать алгоритмы для “Knowledge Tracing”, моделирования знаний студентов. Цель состоит в том, чтобы точно предсказать, как студенты будут действовать в определенных ситуациях. Для решения задачи нужно будет совместить навыки в области машинного обучения с данными EdNet Riiid.
Подробнее: https://www.kaggle.com/c/riiid-test-answer-prediction
Дедлайн для регистрации команд: 7 января 2021 г.
Дата окончания: 7 января 2021 г.
Призы: 1-5 место – $15 000. Победители соревнования представят свои результаты в NLF, где одна команда сможет выиграть дополнительные 10 000 долларов.
В этом соревновании используется NFL’s Next Gen Stats data, которая включает в себя позицию и скорость каждого игрока на поле. Вам предстоит использовать данные игроков для всех выпадающих пасов регулярного сезона 2018 года. Цель соревнования – определить уникальные и эффективные подходы к измерению защитных стратегий этих игр.
Подробнее: https://www.kaggle.com/c/nfl-big-data-bowl-2021
Дедлайн для регистрации команд: 1 февраля 2021 г.
Дата окончания: 8 февраля 2021 г.
Призы: мерч Kaggle достанется пяти лучшим проектам соревнования.
В этом соревновании-симуляторе вы создадите AI, который сможет играть против других в раундах Rock, Paper, Scissors. Сможете ли вы найти закономерности, чтобы выигрывать чаще? Можно ли значительно превзойти случайного игрока, когда в матчах участвуют неслучайные агенты?
Подробнее: https://www.kaggle.com/c/rock-paper-scissors
Дата окончания: декабрь 2020 г.
Заключительный проект курса “How to win a data science competition”. В конкурсе вы будете работать со сложным набором временных рядов, состоящим из ежедневных данных о продажах 1C Company. Вам предстоит спрогнозировать общий объем продаж для каждого продукта и магазина в следующем месяце.
Подробнее: https://www.kaggle.com/c/competitive-data-science-predict-future-sales/overview
Дедлайн для регистрации команд: 30 декабря 2020 г.
Дата окончания: 30 декабря 2020 г.
Призы: мерч Kaggle достанется трем лучшим проектам соревнования.
С помощью анализа геофизических данных нужно предсказать, когда произойдет следующее извержение. Информация собрана датчиками, установленными в действующих вулканах.
Подробнее: https://www.kaggle.com/c/predict-volcanic-eruptions-ingv-oe
Дата окончания: неизвестно
Это соревнование подходит имеющим опыт программирования на R или Python и знакомым с основами машинного обучения студентам, которые хотят расширить навыки перед участием в соревнованиях с денежными призами. С помощью 79 описывающих характеристики жилых домов в Эймсе (штат Айова, США) переменных участникам нужно предсказать окончательную цену каждого объекта. Практические навыки, которые вы сможете развить: Creative feature engineering и продвинутые методы регрессии, вроде random forest and gradient boosting.
Подробнее: https://www.kaggle.com/c/house-prices-advanced-regression-techniques
Дата окончания: неизвестно
MNIST (“Modified National Institute of Standards and Technology”) — это “hello world” компьютерного зрения. В соревновании нужно правильно идентифицировать цифры из десятков тысяч рукописных изображений. Вам предстоит поэкспериментировать с различными алгоритмами, чтобы лучше понять их работу. Практические навыки, которые вы сможете развить: основы компьютерного зрения, включая простые нейронные сети, а также методы классификации, вроде SVM и K-nearest neighbors.
Подробнее: https://www.kaggle.com/c/digit-recognizer
Дата окончания: неизвестно
Призы: победители получат один из 3 призов “TPU Star” – 20 часов TPU в неделю на Kaggle в течение четырех недель.
GANs – генеративные состязательные сети, которые состоят их двух нейронных сетей: модели генератора и модели дискриминатора. Они будут работать друг против друга, причем генератор попытается обмануть дискриминатор, а дискриминатору нужно точно классифицировать реальные и сгенерированные изображения. Ваша задача – построить GANs, которые генерируют от 7000 до 10 000 изображений в стиле Моне.
Подробнее: https://www.kaggle.com/c/gan-getting-started
Дата окончания: неизвестно
Если у вас есть два предложения, одно может следовать из другого, противоречить ему, или они могут быть не связанными. Natural Language Inferencing (NLI) является одной из проблем NLP, которая заключается в определении связи между парой предложений. Задача соревнования — создать модель NLI, которая присваивает метки, соответствующие влечению, нейтральности и противоречию парам предпосылок и гипотез. Тренировочный и тестовый набор данных включают тексты на пятнадцати различных языках.
Подробнее: https://www.kaggle.com/c/contradictory-my-dear-watson
Дата окончания: 1 марта 2021 г.
Призы: победители будут награждены денежными призами и трофеями, их также пригласят выступить с докладами на EMO 2021.
Соревнование от компании Huawei Technologies Ltd, посвященное оптимизации маршрутизации транспорта.
Подробнее: https://competitions.codalab.org/competitions/27329
Если вы только начинаете свой путь в Data Science, хотите получить диплом и помощь в трудоустройстве, стоит обратить внимание на курс Факультета Искусственного интеллекта онлайн-университета GeekBrains. Он включает основательную математическую подготовку, изучение программирования и статистического анализа, а также работу с базами данных реальных проектов.
Мы отобрали 80 моделей комплектующих, из которых можно собрать десктоп для айтишника под разный бюджет и различные задачи. В статью вошли сборки от бюджетной за 33 тыс. руб. до способной тренировать нейронные сети за 200 тыс. руб.
…
Всерьез задумались о переносе инфраструктуры в облако? Тогда этот материал придется вам кстати. Попробуем разбираться, что это такое и с чем его едят.
Перевод публикуется с сокращениями, автор оригинальной статьи Jimmy
Guerrero.
IntelliJ IDEA – это интегрированная написанная на Java среда разработки (IDE). Создана она компанией JetBrains
и доступна как лицензионное издание сообщества Apache 2, а также в проприетарном
коммерческом формате. Поскольку YugabyteDB совместим с PostgreSQL, большинство
сторонних инструментов и приложений будут работать “из коробки”.
В этом материале вы узнаете как:
Распределенные базы данных SQL пользуются популярностью среди
организаций, заинтересованных в переносе инфраструктуры данных в облако. Это
часто затевается ради уменьшения TCO (Total Cost of Ownership) или избавления
от ограничений горизонтального масштабирования СУБД: Oracle, PostgreSQL, MySQL
и Microsoft SQL Server. Основные характеристики распределенного SQL:
Для получения углубленных знаний о распределенном SQL,
ознакомьтесь с официальной документацией.
YugabyteDB – это
высокопроизводительная распределенная СУБД с открытым исходным кодом, построенная
на масштабируемом и отказоустойчивом дизайне, вдохновленном Google Spanner.
YugabyteDB совместима с PostgreSQL, а также умеет интегрироваться с
проектами GraphQL и поддерживает хранимые процедуры, триггеры, а также UDFs.
Остались вопросы – обратитесь к официальному
форуму.
Полный мануал можно найти по этой ссылке. Предположим, что у вас уже есть запущенный и работающий кластер GKE.
Первое, что нужно сделать – добавить репозиторий:
$ helm repo add yugabytedb https://charts.yugabyte.com
Получим обновления:
$ helm repo update
Создадим пространство имен yb-demo:
$ kubectl create namespace yb-demo
В ответ получим следующее:
namespace/yb-demo created
Теперь установим YugabyteDB и укажем значения для некоторых
ограничений:
$ helm install yb-demo yugabytedb/yugabyte \
--set resource.master.requests.cpu=1,resource.master.requests.memory=1Gi,\
resource.tserver.requests.cpu=1,resource.tserver.requests.memory=1Gi,\
enableLoadBalancer=True --namespace yb-demo --wait
Проверим статус:
$ kubectl get services --namespace yb-demo
Обратите внимание на внешний IP-адрес и порт для сервиса yb-tserver, который мы собираемся использовать для установления
соединения между YugabyteDB и IntelliJ: 35.224.XX.XX:5433.
Следующим шагом является загрузка образца схемы и данных. Вы
можете найти множество примеров совместимых с YugabyteDB баз данных в документации для разработчиков. Для этого туториала будем использовать
образец БД Northwind, содержащий данные о продажах компании “Northwind
Traders”. Это отличная учебная схема для ERP-системы малого бизнеса с
клиентами, заказами, закупками, поставщиками, доставкой и прочим.
Подключитесь к yb-tserver-pod:
$ kubectl exec -n yb-demo -it yb-tserver-0 /bin/bash
Чтобы загрузить файлы схемы и данные, выполните следующие
команды:
$ wget https://raw.githubusercontent.com/yugabyte/yugabyte-db/master/sample/northwind_ddl.sql
$ wget https://raw.githubusercontent.com/yugabyte/yugabyte-db/master/sample/northwind_data.sql
Выйдите из оболочки pod и подключитесь к службе YSQL:
$ exit
$ kubectl exec -n yb-demo -it yb-tserver-0 -- ysqlsh -h yb-tserver-0.yb-tservers.yb-demo
Создайте базу данных и подключитесь к ней:
yugabyte=# CREATE DATABASE northwind;
northwind=# \c northwind;
Теперь можно создать объекты БД и заполнить их данными,
используя файлы, которые мы загрузили в yb-tserver-pod:
northwind=# \i 'northwind_ddl.sql';
northwind=# \i 'northwind_data.sql';
Убедитесь, что таблицы созданы:
northwind-# \d
List of relations
Schema | Name | Type | Owner
-------+------------------------+-------+----------
public | categories | table | yugabyte
public | customer_customer_demo | table | yugabyte
public | customer_demographics | table | yugabyte
public | customers | table | yugabyte
public | employee_territories | table | yugabyte
public | employees | table | yugabyte
public | order_details | table | yugabyte
public | orders | table | yugabyte
public | products | table | yugabyte
public | region | table | yugabyte
public | shippers | table | yugabyte
public | suppliers | table | yugabyte
public | territories | table | yugabyte
public | us_states | table | yugabyte
(14 rows)
Проверьте, что данные присутствуют, выполнив простой SELECT:
northwind=# SELECT count(*) FROM products;
count
-------
77
(1 row)
По умолчанию настроенная YugabyteDB поставляется без пароля для пользователя yugabyte. Изменение выполняется
так же, как и в PostgreSQL:
northwind=# ALTER ROLE yugabyte WITH PASSWORD 'password';
Откройте окно БД (View > Tool Windows > Database):
Добавьте источник данных PostgreSQL. (New (+) > Data Source >
PostgreSQL):
На вкладке General заполните данные для подключения к БД:
Прежде чем нажать кнопку “ОК”, убедитесь, что присутствует
соединение.
Теперь давайте протестируем интеграцию, выполнив следующий
запрос в IntelliJ:
В окне вывода должны увидеть следующий результат:
IntelliJ умеет создавать визуализацию ваших запросов.
Например, можно получить визуализацию последнего запроса, выбрав Explain Plan > Show Visualization.
Примечание: не все функции управления базами данных IntelliJ
поддерживаются с помощью YugabyteDB.
Теперь у вас есть кластер YugabyteDB на три узла и GKE с
образцом базы данных Northwind, которые и дальше можно использовать в тестах на IntelliJ. Дополнительные сведения о взаимодействии с БД с помощью IntelliJ ищите в документации, а для получения информации о сторонних интеграциях с YugabyteDB ознакомьтесь с документацией для разработчиков.
Новые технологические тренды заставляют веб-дизайнеров постоянно совершенствоваться. Чтобы оставаться на вершине, нужно знать только возникшие в отрасли и бурно развивающиеся тренды. Рассказываем, какие приемы лучше всего сработают в 2020 году.
Учитывая тот факт, что технологии ежедневно меняются, неудивительно, что все с ними связанное также развивается быстро. С постоянными обновлениями и новыми трендами, веб-дизайнерам приходится постоянно совершенствоваться, чтобы не отставать.
В конце концов, быть в курсе возникающих или развивающихся тенденций жизненно важно, если хочешь оставаться на вершине горы. Так какие же эти новые тренды? Что сработает лучше всего в 2020?
Из этой статьи вы узнаете о 22 трендах в веб-дизайне 2020 года, благодаря которым ваш веб-сайт будет не просто хорошо смотреться, но также станет интуитивно понятным.
Давайте начнем с самого простого. Использование Hero Images является популярным направлением в веб-разработке. Hero Images – это большие баннеры, расположенные в верхней части главной страницы сайта (или любой другой, но обычно размещают именно на главной), которые могут быть как динамическими, так и статичными.
Ниже приведен пример с официального сайта Samsung с одним из последних трендов веб-дизайна 2020 года:
Hero Images – это отличный способ привлечь потенциальных покупателей, фон в таком случае становится объектом внимания и перестает быть серым.
Они полезны и с точки зрения бизнеса, ведь теперь вы можете показать свой продукт во всей красе, пользователю даже не нужно переходить на страницу товара.
Hero Images в последнее время обрели большую популярность и стали применяться на многих веб-сайтах. Но даже если все сайты будут их использовать, это все еще хороший способ привлечь внимание.
Минимализм сейчас в моде, и это касается не только веб-сайтов, но и остального мира в целом. Чем меньше контента, тем лучше, и чем его больше, тем более беспорядочным он становится.
Когда на веб-сайте много близко расположенных друг к другу настроек и все они собраны в одном месте, невольно начинаешь теряться и закрываешь сайт.
С минималистичным подходом, мы оставляем как можно меньше контента и как можно больше свободного пространства, получая таким образом удовлетворяющую нас веб-страницу без поводов для беспокойства.
Не забывайте, что к Hero Images это не относится, так как свободные пространства комбинируют с изображениями для получения более выразительного эффекта.
Если хотите применить этот подход в веб-дизайне на практике, взгляните на пример от Squarespace:
Несмотря на наличие на главной странице пустого пространства, она по-прежнему смотрится элегантно и привлекательно.
Веб-дизайн направлен на налаживание взаимодействия с пользователем. Если вы в этом преуспеете, то заставите посетителя возвращаться на сайт снова и снова.
Новым трендом стало построение эмоциональной связи с пользователем через веб-дизайн. Для этого примеряются вызывающие яркие эмоции изображения (прямо как эмодзи).
Люди часто называют их “связующими”, и в результате даже не замечают, как втянулись:
Преимущество эмоциональной привязанности состоит в том, что веб-сайт запоминается пользователям, и велика вероятность, что они порекомендуют его своим друзьям.
Интересные идеи дизайна главной страницы и веб-интерфейса в целом применяются везде, где только можно, это касается обратной связи, отзывов, параметров страницы и т.д.
Динамическая прокрутка набирает обороты, и все крупные компании движутся в этом направлении. Причина проста: чем привлекательнее смотрится веб-сайт, тем красивее продукт. С запуском Note 20 в августе этого года, я решил зайти на сайт Samsung, чтобы посмотреть спецификации смартфонов и Galaxy Watch 3.
Я был удивлен тем, как они презентовали свой продукт с использованием динамического скроллинга. То же самое наблюдалось на презентации Apple в сентябре. Взгляните:
С минималистичным дизайном и пустыми пространствами на главной странице, разработчики часто прибегали к использованию монотонного фона для максимального упрощения.
Пользователи от этого устали, и появилась необходимость перемен, что направило тренды в сторону градиента 2.0, где на странице преобладают оттенки нескольких светлых цветов.
Пользователи по всему миру тепло приняли нововведение. Оно позволяет сделать веб-сайт менее скучным и более привлекательным:
Темная тема стала трендом практически в каждом приложении. Она есть в WhatsApp и Skype, Gmail, Facebook, YouTube и во многих других приложениях.
Это стало настолько обыденным, что некоторые компании начали добавлять dark mode в свои последние обновления. Темная тема даже глазам дает отдохнуть! Так почему не применить ее в веб-дизайне?
Веб-дизайнеры также стали работать с темной темой через использование Hero Images, благодаря чему сайт кажется полностью черным.
Для максимального эффекта нужны контрастирующие цвета с оттенком: к примеру, #000000
идеально сочетается с #FFFFFF
или желтым и так далее.
Представленный на скриншоте веб-сайт пояснит, что я имею в виду:
Scroll-generated веб-сайты (прим. переводчика – “основанные на скроллинге”) – один из последних трендов, подхваченных веб-дизайнерами.
Название может показаться схожим с динамическим скроллингом (англ. Dynamic scrolling) и сбить вас с толку, но на деле это разные понятия. Scroll-generated веб-сайт работает следующим образом: элементы сайта зависят от прокрутки и появляются во время скроллинга.
Когда же мы говорим о динамическом скроллинге, то в данном случае весь контент изначально присутствует на странице, и все, что нам нужно, это прокрутить до него.
Чтобы стало более понятно, взгляните на представленный ниже скриншот веб-сайта:
Анимированные курсоры меняют внешний вид указателя на что-то привлекательное.
Помимо изменения размера, формы и внешнего вида курсора, разработчики также реализуют эффект анимации во время движения. С фреймворками и инструментами для веб-разработки 2020 года сделать такое несложно.
Для лучшего понимания взгляните на веб-сайт ниже:
Трехмерный дизайн привлекает человеческий глаз. Пришлось сильно постараться, что перенести 3D на веб-сайты. Элементы трехмерного дизайна требуют большей пропускной способности, нежели 2D, и являются довольно массивными.
Так как в последнее время люди стали использовать более высокоскоростное интернет-соединение, веб-разработчики начали запускать трехмерные веб-сайты. При правильном использовании 3D-дизайн будет смотреться привлекательно и реалистично.
Прекрасный пример веб-сайта на скриншоте ниже:
Навигационный контент может располагаться не только в области специальной панели, но и по всей странице. Обеспечение упрощенной навигации с другими тенденциями веб-дизайна 2020 года делает сайт привлекательным и позволяет пользователю исследовать его целиком, поскольку навигация – уже не просто текст в заголовке.
Для вдохновения взгляните на скриншот сайта Bikebear:
Разработка новых фреймворков и улучшение существующих привело к появлению оснащенных UI/UX красочных веб-сайтов. На фоне таких сайтов, другие стали отставать.
В 2018 году интернет охватила волна модернизации UI и UX. Люди сфокусировались на дизайне настолько, что кто-то построил на этом карьеру. Причина проста: UI отвечает за привлекательность сайта, UX – за удобство для пользователя.
Посетители получают наслаждение от пользования сайтом, а именно этого хочет каждый разработчик. Если вы думаете заняться созданием сайта, стоит позаботиться о хороших UI и UX.
Ниже представлен скриншот с LambdaTest:
Крупные и жирные шрифты на Hero Image ворвались в тренды с прошлого года. Они привлекают внимание и передают вложенный вами посыл. Такие шрифты легко разместить, а чтобы они лучше смотрелись, поработайте над цветовым контрастом и тенью.
Пример того, как применить это на практике, представлен ниже:
Художественные иллюстрации – это скетчи на главной странице сайта. Эти зарисовки больше похожи на работу кистью, и в последнее время пользуются популярностью.
Это один из наиболее популярных трендов 2020 года в веб-дизайне. Такие иллюстрации можно часто наблюдать в различных видео типа TED, музыкальных клипах и т.д. Можно сказать, что они твердо и уверенно идут вперед.
Ниже представлена демонстрация от Lisa Glanz:
Разработчики и дизайнеры помешаны на сетках. Это не новая концепция, если вы хоть немного занимались веб-разработкой. Сетки представляют собой схему разделения чего-либо на части (в буквальном смысле) и размещения различной информации в каждой из них.
Важно отметить, что цвет сетки должен контрастировать с фоном веб-дизайна. Они не должны быть слишком громоздкими, и размещать их нужно только там, где это возможно.
Лучший пример – Pinterest:
Слияние фотографий с графикой – правильное сочетание абстрактного и красочной графики. Фотография – это прекрасный способ передать какой-либо посыл (обычно это такая насущная тема, как феминизм) практически без слов.
Фотографии оказывают необычное влияние на пользователей, и поскольку они отражают актуальные темы, следует подходить к их использованию изобретательно.
В качестве примера для демонстрации я выбрал Wix:
Используемая здесь фотография отражает тематику сайта, а именно свадебные фотосессии. Что по-вашему лучше: сообщение в виде фотографии или пара абзацев на тему свадебных фотосессий?
Часто анимация отображается на сайте через @keyframes и другие фреймворки, вроде anime.js. Суть тренда заключается в использовании анимации через взаимодействие с пользователем.
Такой подход завлекает посетителя и в целом улучшает user experience.
Этот сайт показывает удачный пример запускаемой пользователем анимации:
Плавающие элементы можно рассматривать как дополнение трехмерных компонентов, о которых мы говорили ранее. Элемент “парит в воздухе” – таким образом создаются увлекательные изображения и шаблоны в веб-дизайне.
99designs используем в качестве демонстрации:
Отзывы всегда были неотъемлемой частью покупок, и все мы зачастую прочитаем пару-тройку, выбирая товар. А вы знали, что отзыв клиента о товаре может рассказать целую историю?
Захватывающие истории – лучший способ помочь пользователям почувствовать связь с миром вокруг них. К примеру, отзыв на веб-сайте службы доставки еды стимулирует посетителей проводить больше времени на сайте, так как они пользуются доставкой на протяжении долгого времени.
Истории с графикой могут вывести завлечение читателей на новый уровень.
Сайт, используемый в качестве демонстрации, – Apple:
Все мы используем статистику на своих сайтах, так как это отличный способ завлечь пользователей, но, к сожалению, не каждый пользователь еще и читатель. Посетители часто пропускают часть с текстом и сосредотачиваются на том, ради чего зашли на веб-сайт. Мы в силах это изменить.
Все, что нам нужно, использовать ту же стратегию, что и в презентациях: применение графиков и визуализаций. Примеры визуализации, графики, трехмерной визуализации и т.д. можно найти на просторах интернета.
Это послужит отличным дизайнерским решением, если вы хотите передать большой объем информации в аккуратном и привлекательном виде без размещения текста.
Для демонстрации использован сайт Uber:
Сочетание черного с белым – неизменно актуальная комбинация. И это касается не только веб-сайтов, но и фотографий, эскизов, настенных росписей, наручных часов и т.д. Черно-белые комбинации очень приятны для глаз. Возможно из-за контрастирующих элементов, о которых мы говорили выше. Использование черно-белой цветовой гаммы на сайте (с оттенками черного) – новый тренд в веб-дизайне 2020 года, и похоже, он будет популярным и в будущем.
В качестве примера сайта я использовал Dribbble:
Геометрические формы помогают веб-дизайнерам создавать что-то захватывающее и мощное из обычного изображения.
Геометрия постоянно встречается в природе, поэтому мы подсознательно склонны к геометрическим узорам и формам. Если они сочетаются с подходящими цветами и контрастом, геометрические фигуры будут смотреться привлекательно.
Используемый для демонстрации сайт отражает истинную красоту геометрических фигур и паттернов:
Вы скорее всего понимали, что иллюстрации становятся горячей темой в тенденциях веб-дизайна 2020 года и экспериментировании.
Веб-дизайнеры и пользователи любят в них все. Вы всегда можете поэкспериментировать с иллюстрациями, как, впрочем, и с любым другим из трендов. Более того, вы можете сочетать их с фотографиями, 3D-эффектами и т.д.
Прекрасным примером служит приведенный ниже веб-сайт:
Надеюсь, эта подборка вас вдохновит. Конечно, как веб-разработчик, я могу с уверенностью сказать, что тенденции будут продолжать меняться. Все, что вы видите, будет улучшено в будущем. Точно так же, как я никогда не думал об использовании этих вещей три или четыре года назад, я не могу представить себе то же самое на три или четыре года вперед.
Статья публикуется в переводе. Автор оригинального текста Harish Rajora.
Дизайн и веб-разработка – близнецы-братья. Многие талантливые frontend-программисты начинали свой путь в профессии как дизайнеры. Если вы планируете сменить специализацию или задумываетесь о дополнительных навыках, обратите внимание на курс онлайн-академии GeekBrains. Начав с основ, вы пройдете стажировку в реальной команде и удачно обновите резюме.
Поиск ошибок в софте – удел неудачников. Однообразная работа за еду, война с программистами, нудные задачи для технарей и другие мифы о профессии инженеров Quality Assurance.
Вне индустрии ИТ мало кто представляет, чем занимаются тестировщики. Их считают неквалифицированными разработчиками или любителями нажимать все подряд в надежде случайным образом найти ошибку. На самом деле хороший инженер по обеспечению качества (от англ. Quality Assurance) – важное звено в цепочке создания продукта. Он изучает производственные процессы, продумывает сценарии сбоев и старается определить влияющие на продукт факторы, чтобы правильно описать ситуацию программисту.
Многие считают, будто тестировщику необходимо знать программирование, иметь техническое образование и только ИТ-специалисты могут здесь чего-то добиться.
Чтобы начать, знать программирование необязательно. Вы можете заниматься ручным тестированием без аудита кода. Для моделирования действий пользователя сгодится любая специальность: никто лучше доктора не придумает ситуации для медицинского ПО, а бухгалтер или финансист лучше любого программиста создадут ситуации, когда «оно само».
Старт в профессии доступен всем, а некоторые компании специально нанимают для тестирования людей, которые пришли из других отраслей и знают предметную область.
Самое важное качество тестировщика – внимание. Все остальное можно развивать в процессе работы, поскольку эта профессия – открытое пространство для постоянного роста. Тестировщик должен сочетать способности и жизненный опыт, а здравый смысл, логика и вариативное мышление для него куда важнее знания языка программирования.
Инженер по QA – не стартовая площадка в ИТ с ростом до более важной позиции. Это сложная и самодостаточная профессия, требующая таланта и особого склада ума.
Программист несет ответственность за написанный код, а тестировщик – за весь продукт. Со стороны разработчика он должен понять, можно ли реализовать функциональность. Каким образом это лучше сделать, чтобы приложение было наиболее эффективным, и какие технические трудности ждут команду. Тестировщик должен проявить клиентоориентированность, понять заказчика и будет ли тому удобно работать с ПО
Инженер по QA – это буфер между разработкой и пользователем. Он понимает обе стороны и с каждой говорит на ее языке.
Есть мнение, будто тестировщиков когда-то не взяли в программисты. Разработчики в массе своей их не уважают, пинают почем зря и игнорируют советы.
Конечно это две разные профессии для людей с разными типами мышления и различными взглядами на мир. При этом они дополняют друг друга: каждый обладает ценными качествами и играет в проекте важную роль. У тестировщика нет таких сложных задач и ответственности, как у хорошего программиста. Тем не менее он является одним из главных звеньев цепочки между программистом и пользователем. Тестировщик понимает их обоих и может донести внятно программисту, как именно будет использоваться программа, а пользователю – почему нельзя сделать именно так, как он хочет. Программист мыслит кодом, тестировщик – ситуацией.
Основная задача инженера по QA – убедиться, что создаваемый компанией продукт высокого качества и конечный пользователь получит дружелюбный интерфейс. Его работа состоит не только в нажатии клавиш по инструкции.
В профессии тестировщика приходится много общаться с людьми, собирать информацию у всех участников процесса, анализировать требования, обдумывать сценарии тестирования, проводить сотни разных экспериментов, критиковать решения и аргументировать «почему».
Умение мгновенно перевоплотиться из конечного пользователя в разработчика, а потом в руководителя пользователя, чтобы с различных точек рассмотреть ситуации, предполагает творческий подход, не так ли?
Это творческая работа, где тестировщик – детектив с острым взглядом, хорошей памятью и аналитическим мышлением.
На первой работе с отсутствием опыта скорее всего так и есть. Однако в сфере тестирования растут быстро, и если вы будете активно развиваться и приносить компании хороший результат, повышение и более интересные задачи придут значительно быстрее чем, например, в карьере программиста.
Профессия тестировщика действительно тупиковая ветвь карьеры, если вы освоили ручное тестирование и решили, будто развиваться не нужно.
Для целеустремленных и активных специалистов существует два основных направления роста: перспективная карьера в QA или управление проектами. Тут каждый выбирает для себя: развиваться как профессионал, либо уйти на административную работу.
Везде, где требуется аналитика, управление проектами и обеспечение качества, тестировщик может найти применение своим талантам.
В QA у каждого своя роль, от которой зависит результат. Невозможно ответственность за проект отдать только этапу тестирования.
Неправильно обвинять инженеров по QA, если в приложении остаются баги даже после полного цикла тестирования. Проблема может быть в ограниченных сроках или часто меняющихся требованиях. Также неправильно считать, будто за качество продукта ответственность несет тестировщик. В его обязанности входит поиск проблем и передача информации о них заинтересованным участникам процесса разработки. Они уже принимают решение, что делать дальше – будут баги исправлены или отложены. В данной ситуации поговорка «один в поле не воин» становится как никогда актуальной.
Профессия тестировщика – невероятный симбиоз творчества, техники и жизненных ситуаций. Нужно только правильно все смешать и применить. Не стоит пугаться, если сразу не получится или нет опыта. Этой профессии интересно учиться, а разложить по полочкам все имеющиеся знания поможет факультет тестирования ПО GeekUniversity. Под руководством опытных наставников вы не только изучите азы профессии, но и протестируете веб-приложения на практике, а это уже реальный опыт и первая строчка в резюме.
Каждому разработчику иногда нужно проверить навыки, попробовать себя в сложных задачах, обменяться опытом и пообщаться с коллегами. В этом ему помогут специальные мероприятия.
Для программиста важно постоянно совершенствовать навыки, изучать новое и решать необычные задачи. Курсов и учебников для этого недостаточно – нужно встречаться с себе подобными, делиться опытом и получать знания, общаясь с другими людьми. Если вы только собираетесь изучать Python, стоит ознакомиться с нашими предыдущими публикациями. Имеющие некоторый опыт разработчики могут посетить специальные мероприятия.
В этом году многие из них стали виртуальными на фоне пандемии коронавируса, что может огорчить любителей личного общения с коллегами. С другой стороны, онлайн-формат дает возможности для международного общения, поэтому мы сосредоточимся в основном на зарубежных событиях. Для участия в них необходимо владеть английским языком на достаточно высоком уровне. Если вы предпочитаете общаться с коллегами на русском языке, обратите внимание на российские мероприятия.
На хакатонах (англ. hackathon от hack + marathon) собираются специалисты для совместной работы над проектами. Начинается все с презентаций, сбора идей и формирования команд для их реализации. Затем участники демонстрируют результаты – часто хакатоны проводятся в виде конкурсов.
Организатор: Университет штата Пенсильвания
Дата: 6-8 ноября 2020
Описание: 48 часов творчества, инноваций и развлечений. Приглашаются все, от опытных ветеранов программирования до начинающих хакеров из любой области.
Место проведения: онлайн
Контакты: HackPSU Fall 2020
Тема: программирование python
Призы: будут, но детали не раскрываются
Организатор: EazyML
Дата: 13-15 ноября 2020
Описание: спонсируемый EazyML виртуальный хакатон на 36 часов для студентов. Участникам дадут сутки на создание любого программного или аппаратного проекта с использованием платформы или API EazyML. Также пройдут семинары по Python, JavaScript, машинному обучению и другим интересным темам. Хакерам будут помогать опытные наставники.
Место проведения: онлайн
Контакты: EazyHacks
Тема: машинное обучение, ИИ
Призы: 12580 долларов США в виде призов
Организатор: AD’OCC (Agence de Développement Economique d’Occitanie), Университетом Монпелье и IBM
Дата: 3-4 декабря 2020
Описание: первый хакатон по квантовым вычислениям. Для участия потребуются python 3, библиотека qiskit и платформа anaconda.
Место проведения: 132 Boulevard Pénélope, 34000 Montpellier, Франция или онлайн
Контакты: Mpl-QC-Hack-2020
Тема: квантовые вычисления
Призы: неизвестно
Организатор: CloudFest
Дата: 23-25 марта 2021
Описание: мероприятие ориентировано на веб-разработчиков, пишущих код на Python, PHP, JavaScript, Bash или Go. Для участия требуется понимание азов облачных вычислений и опыт работы с Git
Место проведения: онлайн
Контакты: Cloudfest 2021
Тема: облачные вычисления
Призы: неизвестно
Если вы решили участвовать в хакатоне Python, подготовиться поможет шпаргалка.
Конференция собирает профессионалов для решения организационных вопросов и обсуждения разработок. Такой формат предполагает серьезную организацию, разделение на потоки/секции, многочисленные доклады и презентации, а иногда в рамках конференции проходят и другие мероприятия.
Организатор: поддерживается Бразильской ассоциацией Python (APyB) и Фондом программного обеспечения Python (PSF)
Дата: 2-8 ноября 2020
Описание: Python Brasil 2020 – крупнейшая конференция по Python в Латинской Америке, организованная сообществом разработчиков. Участники прослушают интересные доклады, получат возможность учиться у опытных профессионалов и даже смогут внести вклад в проекты со свободным кодом: в рамках конференции пройдет множество интересных мероприятий.
Место проведения: онлайн
Контакты: Python Brasil 2020
Организатор: WWCode. Ришика Сингх, Карен Вонг, Стефани Райдаут и Кхьяти Таплиял
Дата: 4 и 18 ноября, 2 декабря 2020
Описание: путешествие по захватывающему миру библиотек Python, типов данных, логики программирования и полезных функций. Также будут упражнения по кодированию в реальном времени.
Место проведения: онлайн
Контакты: WWCodePython
Организатор: PyCon
Дата: 5-8 ноября 2020
Описание: PyCon Italia – итальянская конференция по Python считается одной из важнейших в Европе. Следующее мероприятие будет 11-ым по счету.
Место проведения: Lungarno del Tempio, 44 отель Mediterraneo, Флоренция, Италия
Контакты: PyCon
Организатор: Loginom
Дата: 9-13 ноября 2020
Описание: новые возможности low-code платформы Loginom. Отраслевые решения для B2B и B2C. Кейсы от ведущих аналитиков России и СНГ: ЭОС, ТБМ, Estée Lauder Companies и других.
Место проведения: онлайн
Контакты: Loginom Days
Организатор: Python Sverige
Дата: 12-13 ноября 2020
Описание: независимо от того, являетесь ли вы опытным программистом, хакером-любителем или абсолютным новичком, вас будут рады приветствовать в сообществе Python.
Место проведения: онлайн
Контакты: PyCon
Организатор: Plone Foundation
Дата: 5-13 декабря 2020
Описание: конференция для участников сообществ Plone, Zope, Guillotina, Pyramid & Volto
Место проведения: онлайн
Контакты: Plone Conference 2020
Организатор: PyCascades
Дата: 19 – 21 февраля 2021
Описание: PyCascades – это региональный PyCon на северо-западе Тихого океана, посвященный сообществу разработчиков и пользователей Python.
Место проведения: онлайн
Контакты: PyCascades
Организатор: enterPy
Дата: 26 мая 2021
Описание: EnterPy нацелен на профессионалов, использующих (или только собирающихся делать это) Python для анализа данных, машинного обучения, веб-программирования или внедрения практик DevOps.
Место проведения: онлайн
Контакты: enterPy
Организатор: Conf42
Дата: 27 мая 2021
Описание: в мероприятии могут принять участие успешные инвесторы, программисты и даже криптотрейдеры-самоучки, если они используют в работе Python и хотят совершенствоваться.
Место проведения: онлайн
Контакты: Conf42
Митап (англ. meet up, meetup) – неформальная встреча специалистов для обсуждения насущных вопросов и обмена опытом. Проходит в свободном формате, иногда между другими мероприятиями. Организаторы могут пригласить на митап спикеров с короткими докладами, но в основном расчет на самоорганизацию.
Организатор: Tokyo Python Society Club
Дата: 4 ноября 2020
Описание: на этой встрече имеющие опыт работы с Python помогут новичкам.
Место проведения: онлайн
Контакты: Tokyo Python Society Club
Тема: автоматизация, Python
Организатор: Solvery
Дата: 5 ноября 2020
Описание: Code-review проведет Назарий Романченко, Python Developer в Stem SC. Он посмотрит код участников, найдет в нем слабые места и предложит улучшения. Самые интересные кейсы Назарий разберет в прямом эфире.
Место проведения: онлайн
Контакты: Solvery code-review
Тема: code-review, Python
Организатор: PyATL
Дата: 5 ноября 2020
Описание: встречи Jam Session предназначены для практического взаимодействия с другими участниками PyATL. Приглашаются программисты любого уровня подготовки.
Место проведения: онлайн
Контакты: PyATL Jam Session
Тема: Python
Организатор: Tokyo AEC Industry Dev Group
Дата: 7 ноября 2020
Описание: семинар посвящен разработке REST API, который можно запустить из Rhino, а также Python и Django REST Framework.
Место проведения: онлайн
Контакты: Tokyo AEC Industry Dev Group
Тема: Python
Организатор: PyHPC совместно с SC20
Дата: 13 ноября 2020
Описание: в этом году PyHPC возвращается к суперкомпьютерам.
Место проведения: онлайн
Контакты: PyHPC
Тема: высокопроизводительные вычисления
Организатор: Фрэнк В. и Лорел Т.
Дата: 17 ноября 2020
Описание: встреча начинающих программистов и разработчиков продвинутого уровня, которые хотят помочь другим в изучении Python
Место проведения: онлайн
Контакты: Tucson-Python-Meetup
Тема: Python
Организатор: Geekle
Дата: 19 ноября 2020
Место проведения: онлайн
Контакты: Geekle
Тема: Python WEB Edition
Организатор: SPb Python Community
Дата: 26 ноября 2020
Описание: встреча единомышленников, программистов на Python
Место проведения: Санкт-Петербург, Россия
Контакты: SPb Python Community
Тема: Python
Еще больше мероприятий вы можете найти в календаре международного сообщества разработчиков на Python. Там публикуется информация о региональных и международных событиях.
Чтобы определить, какие из них вам подойдут, можно пройти наш тест на знание языка Python.
Митапы, конференции и хакатоны полезны начинающим и продвинутым разработчикам, но системного образования они не заменяют. Если вы только осваиваете профессию, стоит обратить внимание на факультет Python-разработки онлайн-академии GeekBrains. Новичкам также поможет наша пошаговая инструкция для желающих изучить программирование на Python.
Raspberry Pi идеально подходит для любителей поэкспериментировать с электронными компонентами. Если объединить его с инструментами Java-разработчика, вы откроете для себя новый мир.
Недорогой одноплатный компьютер Raspberry Pi отлично работает с Java, отчего hardware-разработка становится не сложнее классической разработки ПО.
Из этой статьи вы узнаете, как разработать приложение на JavaFX в
стиле дашборд, используя библиотеку TilesFX.
На рис. 1 изображен
пользовательский интерфейс (далее UI).
Также вы можете ознакомиться
с видео, на
котором показана работа приложения на Raspberry Pi 3B+ и функциональность интерфейса с тачскрином.
Приведенный код и рассмотренные методы применимы только к микрокомпьютерам Raspberry Pi на чипах ARM v7 и ARM
v8. В разделе спецификаций плат Raspberry Pi на Википедии вы найдете типы поставляющихся с этими процессорами плат:
● Модель A+,
версия 3;
● Модель B, версии 2, 3 и 4;
● Вычислительный модуль (Compute Module), версия
3.
Прочие используемые в проекте электронные компоненты вы найдете в большинстве стартовых наборов
Arduino/Pi. Если вы хотите использовать другие элементы, можете
начать с компонентов из проекта, и подстроить их под свои
нужны. Мой комплект выглядит следующим образом:
● Raspberry Pi 3 Модель B+;
● SD карта 32 GB (или более) на ОС Raspberry Pi
(бывш. Raspbian);
● Монитор, клавиатура и мышь;
● Светодиод и резистор (для большинства подойдет
330 Ом);
● Кнопочный переключатель;
● Датчик расстояния HC-SR04;
● Беспаечная макетная плата и провода.
Если вы работаете Raspberry Pi впервые, подготовьте карту SD с операционной системой. В проекте
используется Full ОС Raspbian (полная версия). Загрузите инструмент
Imager. Для своей работы я взял версию Raspberry Pi Imager 1.2 от марта 2020 г. (рис. 2 и рис. 3). Убедитесь,
что устанавливаете полную версию.
Как только SD карта будет готова,
вставьте ее в плату Raspberry Pi, запустите операционную систему и выполните
действия по настройке и подключению к вашей сети Wi-Fi.
В примечаниях к релизу Raspbian
указано, что используемая мной версия ОС включает OpenJDK 11.
2019-06-20:
* Based on Debian Buster
* Oracle Java 7 and 8 replaced with OpenJDK 11
Java-версия:
$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-post-Raspbian-5)
OpenJDK Server VM (build 11.0.3+7-post-Raspbian-5, mixed mode)
Теперь плата готова к запуску любых
приложений на основе Java 11. Однако JavaFX больше не является частью JDK
(начиная с Java 11), и запустить JavaFX-программу на Raspberry Pi «из коробки» не
получится.
К счастью, BellSoft разработала Liberica JDK. Предназначенная для Raspberry Pi версия включает JavaFX,
поэтому вы сможете запускать упакованное приложение JavaFX с помощью команды java -jar yourapp.jar
. Используйте ссылку для загрузки от BellSoft, чтобы установить
альтернативную JDK:
$ cd /home/pi
$ wget https://download.bell-sw.com/java/13/bellsoft-jdk13-linux-arm32-vfp-hflt.deb
$ sudo apt-get install ./bellsoft-jdk13-linux-arm32-vfp-hflt.deb
$ sudo update-alternatives --config javac
$ sudo update-alternatives --config java
Когда инсталляция будет завершена,
проверьте версию снова. Она должна выглядеть следующим образом:
$ java --version
openjdk version "13-BellSoft" 2019-09-17
OpenJDK Runtime Environment (build 13-BellSoft+33)
OpenJDK Server VM (build 13-BellSoft+33, mixed mode)
На моей тестовой плате хранятся
различные версии Liberica JDK. Переключаться между ними несложно с
помощью команды update-alternatives
. (см. Рис.4)
В папке исходного кода Chapter_04_Java/scripts
на GitHub расположены установочные скрипты
различных версий Liberica JDK. Они содержат ссылки для скачивания. (см. Рис. 5)
Прежде чем подключать компоненты к
разъемам GPIO (Интерфейс ввода/вывода общего назначения) на плате, изучите три
схемы нумерации, используемые для идентификации пинов. Вас может запутать
работа с разъемами GPIO. Детальную информацию можно найти в подробном
руководстве по распиновке GPIO. Ниже приведена краткая сводка.
Нумерация Header Pin.
Это логическая нумерация заголовка платы. Один ряд содержит четные пины, другой – нечетные.(см. Рис. 6)
Нумерация BCM. Относится
к номеру канала Broadcom – нумерации внутри микросхемы, используемой на
Raspberry Pi.
Нумерация WiringPi.
Wiring Pi
– основной фреймворк, используемый Pi4J (в проекте он применяется в качестве
библиотеки в Java) для управления GPIO. Причина другой схемы нумерации
кроется в истории платы. Когда еще велась разработка первых моделей Raspberry Pi,
предполагалось всего восемь контактов. В результате дальнейшего развития
микрокомпьютера и добавления дополнительных контактов, нумерацию в WiringPi расширили, чтобы можно было на них ссылаться.
Чтобы Java разработчикам было проще
понять разницу между различными типами заголовков, пинами и функциями, я
разработал небольшую библиотеку, расположенную в репозитории Maven по адресу be.webtechie.pi-headers. Используя ее и небольшое приложение JavaFX, я
сделал вспомогательную таблицу (см. Рис.
7), которая упрощает поиск и сопоставление номеров с соответствующими им
пинами на плате. Более подробную информацию вы найдете по ссылке “Raspberry
Pi history, versions, pins and headers as a Java Maven library.”
Давайте подключим оборудование, чтобы использовать часть мощностей платы Pi: светодиод,
кнопку и датчик расстояния. См. Табл. 1,
Рис. 8, Рис. 9.
На рис. 10 изображена система с использованием моста на макетной плате RasPiO, что упрощает поиск правильного пина. Разъем моста помещает номера
BCM в логическом порядке, но я все еще использую отдельную макетную плату,
чтобы было немного больше места. Portsplus предлагает аналогичное удобное решение.
Чтобы проверить, подключен ли
светодиод в правильном положении с учетом его полярности, отсоедините кабель
между светодиодом и пином GPIO (оранжевый кабель на рис. 10) и подключите его непосредственно к контакту 3,3 В (или к
плюсу на плате). Если светодиод не загорится, вам нужно поменять его положение.
Чтобы проверить соединение,
запустите команду gpio
через
терминал.
Примечание: Если вы работаете с платой Raspberry Pi 4,
обязательно используйте версию 2.52 утилиты gpio. Поскольку внутренняя проводка процессора на плате Pi 4
отличается от предыдущих моделей, при необходимости доступно обновление для
утилиты. Проверьте свою версию с помощью команды gpio -v через терминал и, если
нужно, установите новую с помощью следующих команд:
$ gpio -v
gpio version: 2.50
$ cd /tmp
$ wget https://project-downloads.drogon.net/wiringpi-latest.deb
$ sudo dpkg -i wiringpi-latest.deb
$ gpio -v
gpio version: 2.52
Включить (1) и
выключить (0) светодиод:
$ gpio mode 29 out
$ gpio write 29 1
$ gpio write 29 0
Состояние кнопки
(1=нажата, 2=не нажата) 27 пина WiringPi
$ gpio mode 27 in
$ gpio read 27
1
Начинается самое интересное! Следующий код настраивает 29 пин WiringPi и 10 раз переключает его
между включением и выключением с интервалом в 500 мс, используя ту же команду,
которую я применял в терминале. Создайте файл под именем HelloGpio.java со следующим содержанием:
public class HelloGpio {
public static void main (String[] args) {
System.out.println("Hello Gpio");
try {
Runtime.getRuntime().exec("gpio mode 29 out");
var loopCounter = 0;
var on = true;
while (loopCounter < 10) {
System.out.println("Changing LED to " + (on ? "on" : "off"));
Runtime.getRuntime().exec("gpio write 29 " + (on ? "1" : "0"));
on = !on;
Thread.sleep(500);
loopCounter++;
}
} catch (Exception ex) {
System.err.println("Exception from Runtime: " + ex.getMessage());
}
}
}
Поскольку код будет использовать Java 11 (или выше), файл
Java может быть выполнен без компиляции:
$ java HelloGpio.java
Hello Gpio
Changing LED to on
Changing LED to off
Changing LED to on
…
Написанное для этого
блока приложение использует обычный ультразвуковой датчик расстояния, который можно найти
во многих стартовых наборах Arduino и Pi. Это модуль под названием HC-SR04;
дополнительную информацию и примеры вы можете найти в интернете. Модулю
требуются входные и выходные GPIO-соединения. Датчик работает по той же
схеме, что и система, используемая летучей мышью для полета в темноте: он использует отражение ультразвука для расчета расстояния до
объекта.
Для измерения расстояния требуется,
чтобы приложение и модуль выполнили следующие действия:
Запуск одного файла Java хорошо для
тестирования системы, но это только первый шаг. В приложении используется библиотека
Pi4J для объединения Java и портов GPIO
на плате Raspberry Pi. Pi4J должен быть установлен на Raspberry Pi и может быть
интегрирован в приложение Java с Maven. Полный исходный код примера вы можете найти на GitHub.
Следующие зависимости Maven указаны
в файле POM:
● Для JavaFX,
расширенная зависимость javafx-web, которая включает:
○ javafx-controls – основу для приложения JavaFX;
○ Веб-компоненты,
необходимые для TilesFX.
● Логирование;
● TilesFX для
панели инструментов Tiles;
● Pi4J для
использования портов GPIO.
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.1</version>
</dependency>
<dependency>
<groupId>eu.hansolo</groupId>
<artifactId>tilesfx</artifactId>
<version>11.13</version>
</dependency>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-core</artifactId>
<version>1.2</version>
</dependency>
Вот классы для взаимодействия с
оборудованием.
Класс GpioHelper. В нем сгруппированы функции, связанные с портами GPIO. Код начинается с
определения контактов, к которым подключены компоненты оборудования, и
инициализации Pi4J GpioController. Расширенная функциональность обрабатывается в
отдельных классах: ButtonChangeEventListener
и DistanceSensorMeasurement
(описаны вкратце). Дополнительные методы и геттеры будут использоваться в UI
позже.
public class GpioHelper {
private static final Logger logger = LogManager.getLogger(GpioHelper.class);
/**
* The pins being used in the example.
*/
private static final Pin PIN_LED = RaspiPin.GPIO_29; // BCM 21, Header pin 40
private static final Pin PIN_BUTTON = RaspiPin.GPIO_27; // BCM 16, Header pin 36
private static final Pin PIN_ECHO = RaspiPin.GPIO_05; // BCM 24, Header pin 18
private static final Pin PIN_TRIGGER = RaspiPin.GPIO_01; // BCM 18, Header pin 12
/**
* The connected hardware components.
*/
private GpioController gpioController;
/**
* The Pi4J GPIO input and outputs.
*/
private GpioPinDigitalOutput led = null;
/**
* The GPIO handlers.
*/
private ButtonChangeEventListener buttonChangeEventListener = null;
private DistanceSensorMeasurement distanceSensorMeasurement = null;
/**
* Constructor.
*/
public GpioHelper() {
try {
// Initialize the GPIO controller
this.gpioController = GpioFactory.getInstance();
// Initialize the LED pin as a digital output pin with an initial low state
this.led = gpioController.provisionDigitalOutputPin(PIN_LED, "RED", PinState.LOW);
this.led.setShutdownOptions(true, PinState.LOW);
// Initialize the input pin with pulldown resistor
GpioPinDigitalInput button = gpioController
.provisionDigitalInputPin(PIN_BUTTON, "Button", PinPullResistance.PULL_DOWN);
// Initialize the pins for the distance sensor and start thread
GpioPinDigitalOutput trigger = gpioController.provisionDigitalOutputPin(PIN_TRIGGER, "Trigger", PinState.LOW);
GpioPinDigitalInput echo = gpioController.provisionDigitalInputPin(PIN_ECHO, "Echo", PinPullResistance.PULL_UP);
this.distanceSensorMeasurement = new DistanceSensorMeasurement(trigger, echo);
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(this.distanceSensorMeasurement, 1, 1, TimeUnit.SECONDS);
// Attach an event listener
this.buttonChangeEventListener = new ButtonChangeEventListener();
button.addListener(this.buttonChangeEventListener);
} catch (UnsatisfiedLinkError | IllegalArgumentException ex) {
logger.error("Problem with Pi4J! Probably running on non-Pi-device or Pi4J not installed. Error: {}",
ex.getMessage());
}
}
public GpioController getGpioController() {
return this.gpioController;
}
/**
* Set the state of the LED.
*
* @param on Flag true if the LED must be switched on
*/
public void setLed(boolean on) {
if (this.led != null) {
if (on) {
this.led.high();
} else {
this.led.low();
}
}
}
/**
* Get the data from the button.
*
* @return {@link XYChart.Series}
*/
public XYChart.Series<String, Number> getButtonEvents() {
if (this.buttonChangeEventListener != null) {
return this.buttonChangeEventListener.getData();
} else {
return new Series<>();
}
}
/**
* Get the data from the distance measurement.
*
* @return {@link XYChart.Series}
*/
public XYChart.Series<String, Number> getDistanceMeasurements() {
if (this.distanceSensorMeasurement != null) {
return this.distanceSensorMeasurement.getData();
} else {
return new Series<>();
}
}
}
Класс
ButtonChangeEventListener. Поскольку этот класс реализует Pi4J
GpioPinListenerDigital, он может обрабатывать изменение кнопки и сохранять
изменение в XYChart.Series с отметкой времени.
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
var timeStamp = LocalTime.now().format(DateTimeFormatter.ofPattern("HH.mm.ss"));
this.data.getData().add(new XYChart.Data<>(timeStamp, event.getState().isHigh() ? 1 : 0));
logger.info("Button state changed to {}", event.getState().isHigh() ? "high" : "low");
}
Класс DistanceSensorMeasurement. Этот класс является Runnable. Он добавляет отмеренное
расстояние к аналогичной серии данных с отметкой времени для каждого пробега.
@Override
public void run() {
// Set trigger high for 0.01 ms
this.trigger.pulse(10, PinState.HIGH, true, TimeUnit.NANOSECONDS);
// Start the measurement
while (this.echo.isLow()) {
// Wait until the echo pin is high, indicating the ultrasound was sent
}
long start = System.nanoTime();
// Wait until measurement is finished
while (this.echo.isHigh()) {
// Wait until the echo pin is low, indicating the ultrasound was received back
}
long end = System.nanoTime();
// Output the distance
float measuredSeconds = getSecondsDifference(start, end);
int distance = getDistance(measuredSeconds);
logger.info("Distance is: {}cm for {}s ", distance, measuredSeconds);
var timeStamp = new SimpleDateFormat("HH.mm.ss").format(new Date());
this.data.getData().add(new XYChart.Data<>(timeStamp, distance));
}
UI. Благодаря
TilesFX приложение в стиле дашборда может быть создано быстро. Полное
построение интерфейса выполняется в классе DashboardScreen.java
. В следующем
фрагменте кода показана кнопка переключателя для включения и выключения
светодиода:
var ledSwitchTile = TileBuilder.create()
.skinType(SkinType.SWITCH)
.prefSize(200, 200)
.title("LED")
.roundedCorners(false)
.build();
ledSwitchTile.setOnSwitchReleased(e -> gpioHelper.setLed(ledSwitchTile.isActive()));
Чтобы показать измерение расстояния, я использую tile типа SMOOTHED_CHART
, который в свою очередь использует XYChart.Series
из доступного через GpioHelper DistanceSensorMeasurement
.
var distanceChart = TileBuilder.create()
.skinType(SkinType.SMOOTHED_CHART)
.prefSize(500, 280)
.title("Distance measurement")
//.animated(true)
.smoothing(false)
.series(gpioHelper.getDistanceMeasurements())
.build();
Класс приложения. Теперь все
элементы готовы к объединению в класс приложения JavaFX. Ниже описано, как
инициализировать GpioHelper и использовать его для инициализации
DashboardScreen, а также есть дополнительный код, позволяющий красиво закрыть
приложение.
public class DashboardApp extends Application {
private GpioHelper gpioHelper;
@Override
public void start(Stage stage) {
Platform.setImplicitExit(true);
this.gpioHelper = new GpioHelper();
var scene = new Scene(new DashboardScreen(this.gpioHelper), 640, 480);
stage.setScene(scene);
stage.setTitle("JavaFX demo application on Raspberry Pi");
stage.show();
// Make sure the application quits completely on close
stage.setOnCloseRequest(t -> CleanExit.doExit(this.gpioHelper.getGpioController()));
}
public static void main(String[] args) {
launch();
}
}
Вы можете запустить приложение на
своем ПК через среду IDE, и UI отобразится, но большинство возможностей будут
недоступны, потому что необходимы Pi4J и аппаратные компоненты. Перейдем
к Raspberry Pi! Сначала вам нужно установить Pi4J. Это можно сделать с помощью
однострочной команды:
$ curl -sSL
https://pi4j.com/install | sudo bash
Финальный шаг – загрузить
скомпилированный файл JAR с вашего ПК на плату Pi, что можно сделать с помощью
SSH, USB-накопителя, загрузки или SD-карты. Поместите файл в /home/pi и
запустите его с помощью java -jar
:
$ cd /home/pi
$ ls *.jar
javamagazine-javafx-example-0.0.1-jar-with-dependencies.jar
$ java -jar javamagazine-javafx-example-0.0.1-jar-with-dependencies.jar
INFO be.webtechie.gpio.DistanceSensorMeasurement - Distance is: 103cm for 0.006021977s
INFO be.webtechie.gpio.DistanceSensorMeasurement - Distance is: 265cm for 0.01544218s
INFO be.webtechie.gpio.DistanceSensorMeasurement - Distance is: 198cm for 0.011520567s
INFO be.webtechie.gpio.ButtonChangeEventListener - Button state changed to high
INFO be.webtechie.gpio.ButtonChangeEventListener - Button state changed to low
Сначала на экране отобразятся логи,
а чуть позже откроется экран JavaFX. Диаграмма расстояний получает новое
значение каждую секунду, а диаграмма кнопки обновляется при каждом ее нажатии.
Светодиод можно переключать с помощью кнопки переключения на экране в одной из
плиток. (см. Рис. 11)
Как только вы узнаете, какую версию
Java нужно использовать на Pi, вы можете очень быстро начать работу с простыми
тестовыми программами и расширить их с помощью пользовательского интерфейса
JavaFX. Создание сложного приложения требует дополнительных усилий, чтобы настроить
все в вашей среде IDE и иметь возможность тестового запуска. Это позволяет вам легко разрабатывать программы на ПК и выполнять их на Pi.
Текст опубликован в переводе. Автор оригинальной статьи Frank Delporte.
Изучение Java – непростая задача. Можно освоить необходимые знания самостоятельно, но если вы только начинаете путь в профессии, стоит обратить внимание на курс Факультета Java-разработки онлайн-университета GeekBrains. Занятия ведут опытные преподаватели, а студенты во время обучения создают проекты, которые будет не стыдно показать потенциальным работодателям. Кроме того онлайн-университет помогает выпускникам с трудоустройством.
Онлайн-курсы – один из способов улучшить знание английского языка. Их авторы предлагают систематизированный подход к обучению и возможность заниматься в любое удобное время.
Перево…
Онлайн-курсы – один из способов улучшить знание английского языка. Их авторы предлагают систематизированный подход к обучению и возможность заниматься в любое удобное время.
Перево…
Вокруг науки о данных возникло множество разнообразных заблуждений, мешающих освоить эту замечательную дисциплину. Развенчиваем наиболее распространенные мифы о профессии Data Scientist.
Data Science – относительно новый раздел знаний, поэтому существует множество мифов о том, чем занимаются специалисты по науке о данных. Мы собрали несколько самых распространенных заблуждений о профессии Data Scientist и разрушили их раз и навсегда.
Распространенное заблуждение заключается в том, что Data Scientists являются также специалистами в статистике и математике. Это не совсем так. В Data Science действительно требуется понимание статистики, но компании могут использовать анализ данных и не имея статистика в штате. У большинства разработчиков есть базовое представление о статистике, благодаря прослушанным в вузе курсам. Хотя в машинном обучении и Deep learning требуются продвинутые знания, это не означает, что не обладая степенью в области математики или статистики нельзя стать экспертом по данным.
Если вы являетесь разработчиком, которому поручено создание возможностей для анализа данных, или вы хотите заняться этим самостоятельно, стоит обновить или расширить познания в статистике. Иначе невозможно понять основные принципы разработки моделей.
Вам не нужно проходить формальный курс. Вам не нужно стремиться получить степень магистра. Электронные книги и другие упомянутые в статье о навыках, необходимых в профессии Data Scientist ресурсы помогут понять основы. Вооружившись этим знанием, вы сможете создавать модели, которые будут полезны для бизнеса.
Если вы захотите изменить или оптимизировать модель, могут потребоваться более глубокие познания в математике и статистике. Они помогут понять, какие параметры влияют на результаты модели. В статье Как я перешел из математиков в аналитики данных мы писали о Тиме Хоппере, математике, который самостоятельно освоил профессию Data Scientist и работает в сфере кибербезопасности и инжиниринга машинного обучения. Тим является отличным примером специалиста Data Science, который построил свою карьеру практически с нуля и научился всему самостоятельно.
Для освоения профессии Data Scientist необязательно получать ученую степень или специальное образование. Во вступительных публикациях серии мы писали о том, как можно изучить Data Science онлайн с нуля, а также о навыках, необходимых в профессии Data Scientist. В предыдущих статьях подробно рассказано о навыках, которые потребуются для освоения профессии, а также даны ссылки на необходимые для обучения ресурсы: онлайн-курсы, подкасты, каналы Youtube и книги.
Давайте все же проясним, откуда возникло это заблуждение. Многие знания и навыки профессии Data Scientist можно освоить самостоятельно с нуля. Однако роль специалиста Data Science делится на две категории: прикладную и исследовательскую. Прикладная наука о данных – это прежде всего работа с существующими алгоритмами и понимание их особенностей. Задача таких специалистов – применение методов Data Science в конкретных проектах. В профессии требуются в основном специалисты-прикладники.
Если вас больше интересует роль исследователя, тогда может пригодиться степень кандидата наук: вам наверняка потребуются навыки создания новых алгоритмов с нуля, их тестирования и оптимизации, написания научных статей и т. д. Получение ученой степени в сфере, которая поможет будущей карьере, также отличная идея. Например, степень по лингвистике будет чрезвычайно полезна для карьеры в NLP.
Стоит понимать, что получение степени – большая затрата времени, а также ответственность, как моральная так и финансовая. Итак, в какой роли вы видите себя? Это очень важный вопрос, на который нужно ответить, прежде чем перейти в профессию Data Scientist.
Многие бизнесмены и предприниматели имеют ложное представление о Data Science. Одно из самых распространенных заблуждений заключается в том, что наука о данных якобы нужна только крупным организациям. Это происходит из-за неправильного представления о требованиях к инфраструктуре для обработки данных и получения максимальной ценности для бизнеса. На самом деле необходима только группа людей, которые знают, как извлечь полезную информацию из имеющихся данных. Учитывая основанный на данных подход, не стоит вкладывать значительные средства в создание аналитической инфраструктуры. Существует множество инструментов с открытым исходным кодом, которые помогут в обработке крупномасштабных данных с высокой точностью и эффективностью.
Другой распространенный миф о связанных с Data Science проектах для бизнеса – возможность решить любую проблему методами Data Science. Заказчики ждут от команды результатов, которых невозможно достичь, анализируя существующие данные. Подробнее о проблемах, с которыми сталкиваются проекты, мы писали в статье 5 возможных причин провала проектов в Data Science.
Многие придерживаются неверного мнения о том, что изучения статистического инструмента, наподобие SAS, или освоения программирования на Python с использованием библиотек для Data Science, достаточно, чтобы получить профессию. Изучение инструментов важно, но не является единственными необходимым условием для эффективной работы в Data Science. Для специалиста в этой области требуется умение выйти за рамки инструментов и быстро овладеть знаниями в бизнес-области и навыками правильного применения доступных средств для решения бизнес-проблем. Большим плюсом являются хорошие коммуникативные навыки: они необходимы, чтобы представить идеи и результаты самым простым из возможных способов.
Существует также заблуждение о том, что специалист по анализу данных должен писать сложный код и иметь степень в области компьютерных наук. Чтобы получить профессию Data Scientist, не нужно быть отличным программистом. Если перечислить рутинные задачи науки о данных, можно обнаружить, что никакого сложного кодирования не требуется. На самом деле большинство методов или алгоритмов Data Science легко доступны, они предполагают лишь небольшую настройку и оптимизацию под цели и задачи проекта. Для этого необходим логический склад ума — особенность психики, которая является ключевой в профессии Data Scientist.
Многие считают, будто Data Science – это только построение моделей, а типичный Data Scientist работает над их созданием и оптимизацией. На самом деле работа в Data Science – это гораздо больше, чем построение моделей, а общий процесс разработки проекта разбивается на несколько этапов. Он включает в себя сбор и очистку данных, исследовательский анализ, проверку данных и т. д. Построение модели – только один из уровней. Полный жизненный цикл проекта выглядит примерно так:
Кроме того Data Science не ограничивается простым составлением прогнозов. Главная задача здесь – комбинация методов кластеризации и ассоциативных правил, а также обнаружение ошибок и способность вычислять сбои в данных.
Из-за все более широкого внедрения автоматизации в Data Science возник миф о том, что в ближайшем будущем профессионалов полностью заменит искусственный интеллект. Одна из причин распространения этого заблуждения, вероятно, связана с задачей поиска закономерностей. Как правило компьютеры решают ее лучше людей, но это не тот случай. Вполне возможно, что ИИ доверят некоторые рутинные задачи, вроде очистки и подготовки данных, но человек всегда будет играть важную роль в выполнении интеллектуальных операций. Data Science стремится к автоматизации многих задач, и в результате создаются все более сложные алгоритмы, которые смогут в будущем заменить Data Scientists. Однако это по-прежнему остается маловероятным, так как даже самые продвинутые информационные системы требуют человеческого руководства и инструкций.
Популярность Data Science продолжает расти, а навыки работы в этой сфере остаются одними из самых востребованных, которые вы можете вписать в свое резюме. Если вы только начинаете путь в профессии и хотите освоить самые необходимые Data Scientist навыки, мы рекомендуем записаться на курс Data Science Факультета Искусственного интеллекта онлайн-университета GeekBrains. Программа курса включает основательную математическую подготовку, изучение программирования и статистического анализа, а также работу с базами данных реальных проектов. Обучение ориентировано на применение полученных навыков в бизнесе и построено по принципам практической работы с ведущими специалистами в сфере анализа данных и личным помощником-куратором.
Сохранение творческого запала в течение длительного времени – одна из основных и тяжелых задач, стоящих перед разработчиком. Копнем глубже.
Перевод выполнен с сокращениями, автор о…
Постоянно чувствуете усталость? Рассказываем, как провести тонкую настройку психофизического аппарата и повысить продуктивность, опираясь на научные публикации.
1. Микрок…
А вы знали о существовании языка программирования V? Это простой компилируемый язык для разработки быстрого и легковесного софта. И главное, что он продолжает активно развиваться.
Несмотря
на свою простоту, язык V может использоваться
практически во всех областях разработки: системное программирование, веб, разработка игр, GUI, мобильные приложения и научные исследования.
V представляет собой компилируемый в машинный код язык со статической типизацией, сосредоточенный на решении задач по упрощению сопровождения разработки и обеспечению максимальной высокой скорости компиляции. Код компилятора, библиотек и сопутствующих инструментов открыт под лицензией MIT.
В этой публикации мы рассмотрим основные характеристики языка, примеры кода и как установить средства работы с языком на вашей операционной системе.
Вот как характеризуют язык автор проекта и те, кто им успели воспользоваться:
null
и globals
, никакого неопределенного поведения, иммутабельный по умолчаниюv install sqlite
foo()
в новом потоке, достаточно написать go foo()
Александр Медведников начал работу над языком для решения собственных задач, и постоянно его совершенствует. В проекте сейчас 200 контрибьюторов, код распространяется по лицензии MIT.
Не будем далеко ходить, посмотрим сразу на примеры кода. Протестировать их и примеры из документации можно, не устанавливая V – на онлайн-площадке Playground.
fn main() {
areas := ['game', 'web', 'tools', 'science', 'systems', 'GUI', 'mobile']
for area in areas {
println('Hello, $area developers!')
}
}
Hello, game developers!
Hello, web developers!
Hello, tools developers!
Hello, science developers!
Hello, systems developers!
Hello, GUI developers!
Hello, mobile developers!
Числа Фибоначчи
fn fib(n int) int {
if n <= 1 {
return n
}
return fib(n - 1) + fib(n - 2)
}
fn main() {
for i := 0; i < 10; i++ {
println(fib(i))
}
}
0
1
1
2
3
5
8
13
21
34
const (
MAX = 15
)
struct Fib {
nums []int
}
fn (fib mut Fib) calc(n int) int {
if n <= 1 {
return n
}
if fib.nums[n] != 0 {
return fib.nums[n]
}
fib.nums[n] = fib.calc(n - 1) + fib.calc(n - 2)
return fib.nums[n]
}
fn main() {
mut fib := Fib {
nums: [0].repeat(MAX)
}
for i := 0; i < MAX; i++ {
println(fib.calc(i))
}
}
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
import json
struct User {
name string
age int
mut:
is_registered bool
}
fn main() {
s := '[{ "name":"Frodo", "age":25}, {"name":"Bobby", "age":10}]'
mut users := json.decode( []User, s) or {
eprintln('Failed to parse json')
return
}
for user in users {
println('$user.name: $user.age')
}
println('')
for i, user in users {
println('$i) $user.name')
if !user.can_register() {
println('Cannot register $user.name, they are too young')
continue
}
users[i].register() // `user` is immutable, we have to modify the array
}
// Let's encode users again just for fun
println('')
println(json.encode(users))
}
fn (u User) can_register() bool {
return u.age >= 16
}
fn (u mut User) register() {
u.is_registered = true
}
Перегрузка операторов
struct Vec {
x int
y int
}
pub fn (a Vec) str() string {
return '{$a.x, $a.y}'
}
fn (a Vec) + (b Vec) Vec {
return Vec {
a.x + b.x,
a.y + b.y
}
}
fn (a Vec) - (b Vec) Vec {
return Vec {
a.x - b.x,
a.y - b.y
}
}
fn main() {
a := Vec{2, 3}
b := Vec{4, 5}
println(a + b)
println(a - b)
}
{6, 8}
{-2, -2}
struct User {
name string
age int
}
fn main() {
user1 := User{'Bob', 20}
user2 := { user1 | name: 'Peter' }
println(user1.name)
println(user1.age)
println(user2.name)
println(user2.age)
}
Bob
20
Peter
20
Средства работы с языком можно установить из сборок (Linux, macOS, Windows) или из исходников, клонировав репозиторий с GitHub:
git clone https://github.com/vlang/v
cd v
make
Это уже полностью готовый V, который доступен по адресу [путь к V repo]/v
. На
Windows следует через командную строку использовать make.bat
.
Язык постоянно обновляется. Чтобы сделать апдейт, используем простую команду:
v up
Компилятор C. Для работы с языком V вам также понадобится C-компилятор – можно использовать такие средства, как Clang, GCC или Visual Studio. Если у вас нет компилятора, воспользуйтесь инструкциями для своей платформы.
xcode-select --install
для установки инструментов XCode.sudo apt install build-essential
sudo yum groupinstall "Development Tools"
sudo dnf install @development-tools
На Windows можно использовать MinGW-w64, Visual Studio или llvm-mingw.
Visual Studio занимает гораздо больше места, но если вы планируете использовать UI-библиотеку, эта среда предпочтительнее. Язык V использует функции Windows: поддержка вывода цвета в консоли, IPv6, TLS на сокетах и др.
Симлинк. Можно создать символьную ссылку /usr/local/bin/v
, чтобы V был доступен глобально: sudo ./v symlink
Docker. Средства языка также доступны в виде образа Docker:
git clone https://github.com/vlang/v
cd v
docker build -t vlang .
docker run --rm -it vlang:latest
Docker на Alpine/musl:
git clone https://github.com/vlang/v
cd v
docker build -t vlang --file=Dockerfile.alpine .
docker run --rm -it vlang:latest
/usr/local/v/v
Убедимся, что V может сам себя скомпилировать:
v -o v2 cmd/v
$ v
V 0.1.x
Use Ctrl-C or `exit` to exit
>>> println('hello world')
hello world
>>>
Проверим, что работают примеры:
cd examples
v hello_world.v && ./hello_world # или проще
v run hello_world.v # так можно собрать и запустить код
v word_counter.v && ./word_counter cinderella.txt
v run news_fetcher.v
v run tetris/tetris.v
Чтобы с помощью графического модуля создать тетрис или что-то подобное, вам также потребуются библиотеки glfw
и freetype
.
Если вы планируете использовать пакет http
, то на системах, отличных от Windows, необходимо установить
OpenSSL
:
macOS:
brew install glfw freetype openssl
Debian/Ubuntu:
sudo apt install libglfw3 libglfw3-dev libfreetype6-dev libssl-dev
Arch/Manjaro:
sudo pacman -S glfw-x11 freetype2
Fedora:
sudo dnf install glfw glfw-devel freetype-devel
Windows:
git clone --depth=1 https://github.com/ubawurinna/freetype-windows-binaries [path to v repo]/thirdparty/freetype/
V UI – это кроссплатформенный инструментарий, написанный на V для Windows, macOS, Linux (скоро будет для Android, iOS и JS/WASM). Графический интерфейс V использует нативные виджеты на Windows и macOS, а на других платформах они написаны сразу на V.
ui.window({
width: 600
height: 400
title: 'V UI Demo'
}, [
ui.row({
stretch: true
margin: {10, 10, 10, 10}
}, [
ui.column({
width: 200
spacing: 13
}, [
ui.textbox({
max_len: 20
width: 200
placeholder: 'First name'
})
ui.textbox({
max_len: 50
width: 200
placeholder: 'Last name'
})
])
])
]);
Установка:
v up
v install ui
Запуск:
cd examples
v run users.v
v run temperature.v
v run ...
Библиотеке
предстоит еще долгий процесс роста, многие функции пока отсутствуют.
Бинарники, созданные с помощью V UI, не имеют зависимостей. Для того чтобы начать разработку V UI-приложений необходимо установить V
, glfw
и freetype
(glfw
скоро будет изъята из списка необходимых).
macOS:
brew install glfw freetype
Debian/Ubuntu:
sudo apt install libglfw3 libglfw3-dev libfreetype6-dev
Arch/Manjaro:
sudo pacman -S glfw-x11 freetype2
Fedora:
sudo dnf install glfw glfw-devel freetype-devel
ClearLinux:
sudo swupd bundle-add devpkg-libX11 devpkg-mesa devpkg-freetype devpkg-glfw3
Windows:
git clone --depth=1 https://github.com/ubawurinna/freetype-windows-binaries [path to v repo]/thirdparty/freetype/
Большинство из следующих программ имеют открытый исходный, так что вы можете посмотреть примеры рабочего кода:
Язык программирования V является интересной альтернативой популярным языкам с компиляцией кода быстрее, чем в C++. По сравнению с Go, в V поддерживается только один вид
присваиваний, отсутствует null
и глобальные переменные. Если вам интересно сопоставить V с этими и другими языками, просмотрите эту страницу.
Важно, что язык развивается и не стоит на месте. В скором будущем можно
ожидать расширения функциональности и исправления мелких недочетов.
Как работает Scrum, и работает ли он вообще? Разбираемся с фреймворком Agile, его преимуществами и не самыми очевидными недостатками. Скрам – самый популярный Agile-фреймворк. Точка. Согласно отчету VersionOne 11th State of Agile, Скрам используют 58% респондентов (или 68%, если суммировать Скрам и гибрид «Скрам/XP»). Среди масштабируемых фреймворков Скрам, безусловно, занимает лидирующее положение: на долю Scrum-of-Scrums […]
Запись Почему Scrum не работает (и что с этим можно сделать) впервые появилась Библиотека программиста.
Что такое облачная инфраструктура, ее примеры, а также грамотный выбор инструментов. Читайте наш краткий дайджест с советами и описаниями.
Хотите изучить новый язык – пожалуйста. Мы подготовили для вас туториал по созданию приложения для заметок на Dart и Flutter.
Flutter – это мобильный кроссплатформенный SDK с открытым исходным кодом от Google. Приложения, написанные на Dart и Flutter, по умолчанию включают в себя Material Design компоненты, что придает привлекательный внешний вид и юзабилити.
Управление людьми в сфере разработки софта имеет гору подходов. Чтобы разобраться в вопросе читайте подборку по управлению программистами.
Хьюман менеджмент уже давно стал частью IT и требует отдельного рассмотрения и изучения. Без знания правильной стратегии и
Свежие комментарии