Category: Разное

14
Янв
2021

🕸 Что не так с веб-сборкой?

Ее потенциал и перспективы огромны. Что же пошло не так? Почему не все используют WASM? Попробуем ответить на эти вопросы.

Перевод публикуется с сокращениями, автор оригинальной ст…

11
Янв
2021

❓ Почему нельзя соглашаться на тестовый кодинг во время собеседования

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

Перевод публикуется с сокращени…

06
Янв
2021

💸 Программирование с пассивным доходом: 5 способов для разработчиков ПО

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

Перевод публикуется с сокра…

31
Дек
2020

🎄 С Новым годом!

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

Уходящий год был непростым, и это не дежурная фраза. Кт…

26
Дек
2020

📈 Инфлюенсеры в Big Data и Machine Learning: за кем следить в 2021 году?

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

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

О работе специалистов по анализу больших данных мы писали в статье «Стать аналитиком Big Data: пошаговое руководство». Продолжая тему, мы собрали в одной публикации влиятельных инфлюенсеров в сфере Big Data и ML, а также сообщества, на которые стоит подписаться в 2021 году.

Предлагаем вашему вниманию подборку самых влиятельных сообществ и инфлюенсеров в сфере Big Data и Machine Learning.

<a href="https://rismedia.com/wp-content/uploads/2020/06/social_media_strategy_1153737066.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Сообщества

Big Data and Analytics

Сообщество LinkedIn, в котором собраны не только курсы и офферы для аналитиков Big Data, но и вся актуальная информация от ведущих экспертов области. Сообщества на LinkedIn – одно из лучших мест для энтузиастов данных и начинающих ученых, желающих овладеть искусством работы с большими данными. Активное участие в дискуссиях и собственные публикации дают возможность укрепить знания, найти наставника и расширить сеть профессиональных контактов.

Data Science Central

Твиттер-аккаунт одного из самых известных сообществ Data Science, где вы найдете новости о последних технологиях Big Data, машинного обучения, AI, Deep Learning, dataviz, Hadoop, IoT, и BI. Data Science Central объединяет пользователей, которые хотят получить уникальный опыт участия в дискуссиях на темы сбора и интеграции, а также аналитики и визуализации данных. Построенное на инновационной платформе сообщество включает технические форумы и сведения о рыночных тенденциях, а также дает возможности социального взаимодействия и трудоустройства.

DataDriven

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

<a href="https://t4.ftcdn.net/jpg/02/61/98/23/360_F_261982331_9P4vDtQz8briwqDPIs7f94LW7IUuXHiX.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Инфлюенсеры

Ronald Van Loon

Ronald Van Loon, директор Advertisement компании, которая предлагает партнерам и клиентам консалтинговые, технологические, информационные и автоматизированные решения. Известный инфлюенсер в сфере Data Science, Ronald публикует статьи и посты на темы больших данных, искусственного интеллекта, автономных автомобилей, аналитики и многого другого.

Kenneth Cukier

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

Ganapathi Pulipaka – главный Data Scientist в Accenture. Он разработал ряд программ Deep Learning и машинного обучения и продолжает публиковать новые идеи на GitHub и Medium. Советуем подписаться тем, кто заинтересован в математическом моделировании, нейросетях и визуализации данных в TensorFlow.

Kirk Borne

Kirk Borne является советником и главным специалистом по обработке данных в Booz Allen Hamilton. Kirk – астрофизик и консультант по большим данным, он также специализируется на интеллектуальном анализе данных, машинном обучении и вычислительной астрофизике. Kirk уже более 20 лет участвует в нескольких проектах NASA, включая его астрономический центр и операции с данными космической науки. В своем аккаунте в Твиттер он публикует множество ресурсов по машинному обучению и делится опытом работы.

Iain Brown

Dr. Ian Brown – консультант по большим данным и руководитель научных данных для SAS UK&I. За последние десять лет он работал в нескольких секторах, обеспечивая лидерство по темам риска, искусственного интеллекта и машинного обучения. Ian активно публикует посты в Твиттер и рассказывает о проектах в сфере искусственного интеллекта.

Yves Mulkers

Yves Mulkers – стратег данных и основатель популярного цифрового издания 7wData. Как специалист по интеграции, Yves в постах фокусируется на организации данных и возможностях архитектуры данных в организации. Он публикует свое видение проблем бизнес-аналитики и связанных с данными вопросов.

Mike Quindazzi

Mike Quindazzi – лидер продаж цифровых альянсов в PWC. Он помогает управлять бизнес-результатами, предлагая консультации по новым технологиям, вроде беспилотных летательных аппаратов, 3D-печати, блокчейна, IoT, больших данных и робототехники. Mike работал с такими брендами, как Microsoft, SAP, Amazon и Oracle, и помог сформировать инновационные подходы к решению их проблем. Он часто публикует свое мнение о развитии сферы больших данных и рассуждения на темы, связанные с AI и машинным обучением.

Evan Kirstel

Evan Kirstel является ведущим технологическим влиятельным лицом в сегменте B2B и соавтором eVira Health, которая предлагает консультации, а также разработку продуктов и стратегий развития бизнеса для сообщества медицинских технологий. Он работал с такими известными брендами, как IBM, Intel и AT&T, среди прочих, чтобы максимизировать их видимость и масштабирование в 5G, blockchain, AI, cloud, IoT, AR, VR, Big Data и analytics.

Marcus Borba

Marcus Borba – создатель Borba Consulting, консалтинговой и исследовательской фирмы, которая решает сложные информационные задачи компаний с помощью таких инструментов, как аналитика больших данных и бизнес-аналитика. Считающийся одним из ведущих специалистов в области науки о данных и бизнес-аналитики, Marcus также регулярно публикует в своем Твиттере посты на темы нейронных сетей и машинного обучения.

Bill Schmarzo

Инфлюенсер и автор книги «The art of thinking like a Data Scientist». Он очень активен и на LinkedIn: прочтите пост «Will AI force Humans to become more Human» и подпишитесь, если хотите стать «Data Science Think Tank».

<a href="https://image.freepik.com/free-vector/blog-authors-writing-articles_179970-1523.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Michael Fisher

Michael Fisher – технический евангелист и старший системный аналитик в Whitcraft Group. Он считается ведущим специалистом в области IoT, 5G, VR и FinTech, и пишет о таких областях, как кибербезопасность, консалтинг и архитектура больших данных.

Srivatsan Srinivasan

Srivatsan Srinivasan – Chief Data Scientist/Architect в Cognizant. Его опыт в построении сложных аналитических конвейеров, моделей машинного обучения для бизнес-процессов и помощи компаниям в преобразовании пространства данных и аналитики, сможет помочь расширить понимание многих областей больших данных, облаков и искусственного интеллекта. Советуем обратить внимание на его посты в LinkedIn, которые точно будут полезны тем, кто хочет быть в курсе новейших технологий AI и лучших практик в области Data Science.

Nando de Freitas

Nando de Freitas – ученый, который возглавляет команду машинного обучения Google DeepMind. Профессор компьютерных наук Оксфордского университета, Nando de Freitas является специалистом в области машинного обучения с фокусом на нейронные сети, байесовскую оптимизацию и вывод, а также Deep Learning. Как главный ученый в Google DeepMind, он помогает в организации ее миссии – использовать технологии для широкой общественной пользы и научных открытий, обеспечивая при этом безопасность и соблюдение этических норм.

David Langer

Если вы регулярно читаете учебные публикации по теме Data Science на LinkedIn, скорее всего вы уже знакомы с David Langer. Помимо того, что он является VP of Analytics в Schedulicity, он также известен как инструктор и YouTube-блогер. У него слава одного из самых выдающихся педагогов в области Data Science. David Langer создает образовательный контент для всех заинтересованных в развитии навыков работы с данными.

Andrew Ng

Основатель и генеральный директор Landing AI, а также основатель Deeplearning.ai. Andrew работал главным научным сотрудником Baidu Research, был профессором Стэнфордского университета, основателем и председателем правления Coursera, поэтому его считают пионером в области онлайн-образования. Он основал проект Google Brain, который разработал крупномасштабные искусственные нейронные сети, в том числе ту, которая научилась распознавать кошек на видео. Andrew специализируется на Deep Learning и часто делает публикации на связанные с машинным обучением темы.

Kristen Kehrer

Kristen Kehrer является преподавателем Data Science в UC Berkeley Extension и основателем Data Moves Me. С 2010 года Kristen предлагает инновационные и эффективные решения для машинного обучения в различных отраслях промышленности, включая коммунальное хозяйство, здравоохранение и электронную коммерцию. Kristen является инфлюенсером и наставником, у которого можно многому научиться благодаря ее опыту и знаниям в области SQL и аналитики больших данных.

***

Без чтения публикаций ведущих специалистов отрасли сложно освоить развивающиеся так быстро профессии. Если же вы только планируете карьеру в этой области, стоит обратить внимание на курс Факультета Аналитики Big Data онлайн-университета GeekBrains. Программа обучения включает основательную математическую и подготовку, изучение основ языка Python и работы с базами данных, а также работу с Hadoop и Apache Spark. Курс ориентирован на применение навыков машинного обучения в бизнесе и построен на основе практической работы над проектами с ведущими специалистами отрасли и личным помощником-куратором. Успешно окончившим его студентам онлайн-университет помогает с трудоустройством.

22
Дек
2020

❓ Потребуются ли программисту на собеседовании алгоритмы и структуры данных?

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

Нужны ли структуры данных и алгоритмы программисту средней руки вопрос спорный. Едва ли ему придется самостоятельно разрабатывать быструю сортировку или что-нибудь в этом духе. С другой стороны, теоретический базис необходим любому специалисту для формирования правильного образа мыслей. Работодатели на собеседованиях проверяют не только владение языками программирования и фреймворками, но и насколько хорошо кандидат знаком с вечной классикой. Если он не может отличить FIFO от LIFO или плавает в вопросе о пузырьковой сортировке, путь в профессию закроется. Есть мнение, будто усвоить необходимые знания можно за пару дней с книжкой в руках, но это не так. Материал слишком объемный, чтобы быстро с ним справиться – о подготовке к собеседованию лучше позаботиться заранее.


Чего хотят работодатели?

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

О чем на собеседованиях спрашивают в корпорациях?

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

О чем спрашивают в средних и небольших компаниях?

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

Чего хотят от соискателей стартапы?

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


Какие знания необходимо освоить?

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

  1. Основные структуры данных и алгоритмы: сюда входят стеки, очереди и связные списки, битовые операции, циклы, рекурсия и алгебраические алгоритмы;
  2. Алгоритмы сортировки: простые сортировки, линейная сортировка, пирамидальная сортировка, а также быстрая и внешняя сортировка;
  3. Деревья: двоичные, красно-черные и прочая, прочая, прочая;
  4. Хэш-таблицы: сюда же входят хэш-функции, универсальное и идеальное хэширование, а также разрешение коллизий;
  5. Теория графов и комбинаторная оптимизация: владеть этой областью нужно на уровне студента-математика первого курса. Ничего сложного, все сводится к основным определениям и решению типовых задач, вроде задачи коммивояжера.
  6. Алгоритмы на строках: тут придется вспомнить забытые со студенческих времен фамилии: Ахо-Корасика, Бойера-Мура и прочего Кнута-Морриса-Пратта. Еще потребуется подучить алгоритмы сжатия и шифрования;
  7. Вероятностные алгоритмы: MinHash, SimHash, HyperLogLog, Count-Min Sketch, фильтр Блума и вот это все;

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


Где можно научиться?

Перечисленные выше темы изучаются в вузах, но уже к старшим курсам ударившиеся в современные технологии студенты забывают о классике. У пришедших в программирование из других профессий специалистов теоретический базис тоже хромает, и это вполне естественно. Заполнить пробелы в знаниях помогают книги. В интернет-магазинах доступны неплохие работы: от модной «Грокаем алгоритмы», которую написал Адитья Бхарагава, до классической «Introduction to Algorithms» издательства MIT Press. Некоторым нравится «The Algorithm Design Manual» Стивена Скиены – выбрать есть из чего, но на изучение теории по книгам у работающих программистов не хватает ни времени, ни мотивации. Это тоже вполне естественно.

Не стоит заниматься ̶с̶а̶м̶о̶л̶е̶ч̶е̶н̶и̶е̶м̶самообучением, когда можно обратиться за помощью к профессионалам. Каждый хорош в своей работе: кто-то умеет писать программы, а кто-то – еще и учить этому других. Если вы хотите получить целостные и системные знания, компания OTUS предлагает IT-специалистам более 60 авторских курсов. Сейчас идет набор на пятимесячную программу онлайн-обучения «Алгоритмы и структуры данных»: вступительное тестирование можно пройти на сайте. Желающим также предлагают посетить бесплатный демо-урок, который пройдет 22 января.

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

09
Дек
2020

👶 10 ошибок начинающего разработчика

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

Перевод публикуе…

23
Ноя
2020

🖥🛠❓Брендовый неттоп vs самосборный мини-ПК: выбираем компьютер для программиста

Собрать компактный компьютер для программирования самому или взять готовый? Наш сравнительный обзор поможет выбрать. В него вошли восемнадцать неттопов и комплектующие для системника Mini ATX.

23
Ноя
2020

❹ ❌👨‍🎓️4 мифа о профессии программиста, в которые вы почему-то еще верите

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

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


Миф №1. Программирование – только для технарей

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

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

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


Миф №2. Слишком долго учиться

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

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


Миф №3. Нужно много свободного времени на учебу, а работу потом найти сложно

Во-первых, давайте зададимся вопросом: «много времени» – это сколько? 10 часов в неделю – это много или мало? А ведь именно столько времени нужно тратить на обучение новой профессии. Скорее всего эти же 10 часов вы проведете, залипая в ленте Фейсбука или Тиктока.

Во-вторых – со знанием Python сложно остаться без работы. Число вакансий растет с каждым годом: +127% с 2015 года по данным HH.ru. На курсе «Fullstack-разработчик на Python» в SkillFactory вас не только научат программировать, но и помогут найти работу. Начиная с первых недель обучения, ментор поможет определить карьерные цели и не сойти с намеченного пути, а карьерный центр подскажет, как оформить резюме и попасть на собеседования.


Миф №4. Программирование – только для мальчиков

Самый неприятный миф в этой статье. Да, сейчас среди программистов мужчин больше, чем женщин, но если бы этот миф был правдой, то мир никогда бы не узнал о Мариссе Майер (экс-директор Yahoo!), Адель Голдберг (разработала язык программирования Smalltalk), Катарине Фейк (основала фотохостинг Flickr) и других крутых женщинах-программистах.

Если все действительно не так страшно, то куда идти учиться?

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

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

***

С 17 по 30 ноября действуют скидки от 50% на все курсы онлайн-школы SkillFactory. Окончив онлайн-программу, вы сможете сразу же начать работать – это самый безопасный способ войти в сферу IT, не тратя несколько лет на учёбу, но при этом получив все базовые знания. Выгодно используя распродажу сейчас, вы инвестируете в своё будущее.

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

21
Ноя
2020

🐍 10 классных функций Python 3.9

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

Перевод подготовлен совместно с факультетом Python-разработки GeekBrains. Автор оригинального текста Farhad Malik.

***

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

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

***

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

Давайте разбираться с нововведениями.

1. Операторы обновления и слияния словарей

Во встроенный класс 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

2. Новый высокопроизводительный парсер на основе PEG

С 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

3. Новые строковые функции для удаления префикса и суффикса

К объекту 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

4. Подсказки типов для встроенных универсальных типов

Аннотирование программ стало проще за счет удаления иерархии параллельных типов в 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

5. Поддержка часового пояса IANA в DateTime

Модуль 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

6. Возможность отмены одновременных фьючерсов.

В concurrent.futures.Executor.shutdown () добавлен новый параметр cancel_futures.

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

До версии 3.9 процесс ожидал их завершения перед завершением работы исполнителя.

Пояснение

Новый параметр cancel_futures был добавлен в ThreadPoolExecutor и ProcessPoolExecutor. Это работает так: если его значение – True, все ожидающие фьючерсы отменяются при вызове функции shutdown ().

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

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

***

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

https://bugs.python.org/issue30966

7. Улучшения AsyncIO и многопроцессорности

В библиотеку 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

8. Постоянные ошибки импорта пакетов

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

Встроенная функция __ import __ () вызывает ошибку ValueError, а importlib .__ import __ () вызывает ошибку ImportError.

Теперь это исправили. __Import __ () вызывает ImportError вместо ValueError.

***

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

https://bugs.python.org/issue37444

9. Генерация случайных байтов

Еще одна функция, добавленная в версии 3.9 – random.Random.randbytes (). Эта функция может использоваться для генерации случайных байтов.

Можно генерировать случайные числа, но что, если нужно генерировать случайные байты? Раньше разработчикам приходилось для этого проявлять изобретательность. Хотя можно использовать os.getrandom (), os.urandom () или secrets.token_bytes (), но нельзя генерировать псевдослучайные паттерны.

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

В результате был введен метод random.Random.randbytes (). Он также может генерировать случайные байты контролируемым способом.

***

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

https://bugs.python.org/issue40286

10. Исправление функции замены строки

Раньше «» .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. Под руководством опытных преподавателей вы получите необходимые знания, а успешно завершившим обучение студентам онлайн-академия поможет с трудоустройством.

18
Ноя
2020

📊Django, Pandas и Chart.js для быстрой панели инструментов

Попробуем разобраться, как можно использовать Django, Pandas и Chart.js для быстрого отображения данных в виде различных графиков и диаграмм.

Перевод публикуется с сокращениями, автор оригинальной статьи Shane
Gary.


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

Почему Pandas? Все задачи можно выполнить изнутри Django непосредственно из БД, т. к. правильные запросы к базе всегда будут выгоднее для
продакшена.

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

Почему Chart.js? Если вы хотите развернуть кучу различных
интерактивных диаграмм, изменив несколько переменных – Chart.js сделает это быстрее
других.

Исходные тексты и простой набор данных из туториала вы
найдете по ссылкам.

Настройка Django

Все действия в этом проекте будут происходить на сервере с 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.

Настройка HTML

Есть базовый файл, который мы будем расширять:

        {% 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

Чтобы лучше понять происходящее, посмотрим на 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-запись.

Charts.py

И наконец файл 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
    

Дополнительные материалы:

18
Ноя
2020

🥇👨‍🎓️📈Хакатоны и соревнования для специалистов по Data Science

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

В статье «Научиться Data Science онлайн» мы рассказали, как овладеть стать специалистам по анализу данных с нуля. В подготовленной при поддержке Факультета Искусственного интеллекта онлайн-университета GeekBrains публикации мы собрали все ближайшие хакатоны и соревнования, которые помогут освоить навыки Data Scientist на практике.

Хакатоны

<a href="https://latimeshighschool.files.wordpress.com/2020/08/bytes-of-tech.png" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Хакатон FIT-M 2020

Когда: c 16 по 18 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: русский

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

Подробнее: https://fit-m.org/hack

Hack Life

Когда: c 21 по 22 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: русский

Призовой фонд: 100000 рублей

Самое интересное: хакатон для начинающих аналитиков, посвященный комфортной городской среде.

Подробнее: https://hacklife.fun/

SharkHacks

Когда: c 4 по 6 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: английский

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

Подробнее: https://organize.mlh.io/participants/events/6046-sharkhacks

TechTogether New York 2020

Когда: c 4 по 6 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: английский

Самое интересное: открытый хакатон для всех, кто интересуется STEM – от новичков до опытных хакеров.

Подробнее: https://newyork.techtogether.io/

Who Done It Hacks?

Когда: c 11 по 13 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: английский

Самое интересное: хакатон в стиле Шерлока Холмса, во время которого вам предстоит следовать подсказкам для разгадки тайн.

Подробнее:https://organize.mlh.io/participants/events/6047-who-done-it-hacks

Hack Off

Когда: c 12 по 13 декабря 2020 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: английский

Самое интересное: 48-часовой хакатон на темы Data Science, AI, OIT, robotics, blockchain, AR и VR, open innovations.

Подробнее: https://www.hackoff.tech/

RoseHack

Когда: c 16 по 17 января 2021 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: английский

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

Подробнее: https://rosehack.com/

HoyaHacks

Когда: c 29 по 31 января 2021 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: английский

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

Подробнее: http://hoyahacks.georgetown.domains/

Hacklytics

Когда: c 5 по 7 февраля 2021 г.

Где: онлайн

Стоимость участия: бесплатно

Язык мероприятия: английский

Самое интересное: хакатон на тему “Building a Data-Driven World” для студентов и специалистов Data Science.

Подробнее: https://hacklytics.io/

Соревнования

<a href="https://mysterium.network/wp-content/uploads/2019/10/Artboard-7-100.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Riiid! Answer Correctness Prediction

Дедлайн для регистрации команд: 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

NFL Big Data Bowl 2021

Дедлайн для регистрации команд: 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

Rock, Paper, Scissors

Дедлайн для регистрации команд: 1 февраля 2021 г.

Дата окончания: 8 февраля 2021 г.

Призы: мерч Kaggle достанется пяти лучшим проектам соревнования.

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

Подробнее: https://www.kaggle.com/c/rock-paper-scissors

Predict Future Sales

Дата окончания: декабрь 2020 г.

Заключительный проект курса “How to win a data science competition”. В конкурсе вы будете работать со сложным набором временных рядов, состоящим из ежедневных данных о продажах 1C Company. Вам предстоит спрогнозировать общий объем продаж для каждого продукта и магазина в следующем месяце.

Подробнее: https://www.kaggle.com/c/competitive-data-science-predict-future-sales/overview

INGV – Volcanic Eruption Prediction

Дедлайн для регистрации команд: 30 декабря 2020 г.

Дата окончания: 30 декабря 2020 г.

Призы: мерч Kaggle достанется трем лучшим проектам соревнования.

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

Подробнее: https://www.kaggle.com/c/predict-volcanic-eruptions-ingv-oe

House Prices: Advanced Regression Techniques

Дата окончания: неизвестно

Это соревнование подходит имеющим опыт программирования на R или Python и знакомым с основами машинного обучения студентам, которые хотят расширить навыки перед участием в соревнованиях с денежными призами. С помощью 79 описывающих характеристики жилых домов в Эймсе (штат Айова, США) переменных участникам нужно предсказать окончательную цену каждого объекта. Практические навыки, которые вы сможете развить: Creative feature engineering и продвинутые методы регрессии, вроде random forest and gradient boosting.

Подробнее: https://www.kaggle.com/c/house-prices-advanced-regression-techniques

Digit Recognizer

Дата окончания: неизвестно

MNIST (“Modified National Institute of Standards and Technology”) — это “hello world” компьютерного зрения. В соревновании нужно правильно идентифицировать цифры из десятков тысяч рукописных изображений. Вам предстоит поэкспериментировать с различными алгоритмами, чтобы лучше понять их работу. Практические навыки, которые вы сможете развить: основы компьютерного зрения, включая простые нейронные сети, а также методы классификации, вроде SVM и K-nearest neighbors.

Подробнее: https://www.kaggle.com/c/digit-recognizer

I’m Something of a Painter Myself

Дата окончания: неизвестно

Призы: победители получат один из 3 призов “TPU Star” – 20 часов TPU в неделю на Kaggle в течение четырех недель.

GANs – генеративные состязательные сети, которые состоят их двух нейронных сетей: модели генератора и модели дискриминатора. Они будут работать друг против друга, причем генератор попытается обмануть дискриминатор, а дискриминатору нужно точно классифицировать реальные и сгенерированные изображения. Ваша задача – построить GANs, которые генерируют от 7000 до 10 000 изображений в стиле Моне.

Подробнее: https://www.kaggle.com/c/gan-getting-started

Contradictory, My Dear Watson

Дата окончания: неизвестно

Если у вас есть два предложения, одно может следовать из другого, противоречить ему, или они могут быть не связанными. Natural Language Inferencing (NLI) является одной из проблем NLP, которая заключается в определении связи между парой предложений. Задача соревнования — создать модель NLI, которая присваивает метки, соответствующие влечению, нейтральности и противоречию парам предпосылок и гипотез. Тренировочный и тестовый набор данных включают тексты на пятнадцати различных языках.

Подробнее: https://www.kaggle.com/c/contradictory-my-dear-watson

EMO 2021 HUAWEI Logistics Competition

Дата окончания: 1 марта 2021 г.

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

Соревнование от компании Huawei Technologies Ltd, посвященное оптимизации маршрутизации транспорта.

Подробнее: https://competitions.codalab.org/competitions/27329

***

Если вы только начинаете свой путь в Data Science, хотите получить диплом и помощь в трудоустройстве, стоит обратить внимание на курс Факультета Искусственного интеллекта онлайн-университета GeekBrains. Он включает основательную математическую подготовку, изучение программирования и статистического анализа, а также работу с базами данных реальных проектов.

18
Ноя
2020

💲🛠 🖥 👍 Лучшие настольные компьютеры для программиста в 2020 году

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

13
Ноя
2020

☕ ☁️ 👍 Начало работы с IntelliJ IDEA и распределенным SQL

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

Перевод публикуется с сокращениями, автор оригинальной статьи Jimmy
Guerrero.

IntelliJ IDEA – это интегрированная написанная на Java среда разработки (IDE). Создана она компанией JetBrains
и доступна как лицензионное издание сообщества Apache 2, а также в проприетарном
коммерческом формате. Поскольку YugabyteDB совместим с PostgreSQL, большинство
сторонних инструментов и приложений будут работать “из коробки”.

В этом материале вы узнаете как:

  • установить кластер YugabyteDB на движке Google Kubernetes;
  • установить БД Northwind;
  • настроить IntelliJ для работы с YugabyteDB;
  • протестировать некоторые основные функции БД IntelliJ с помощью YugabyteDB.

Что такое распределенный SQL?

Распределенные базы данных SQL пользуются популярностью среди
организаций, заинтересованных в переносе инфраструктуры данных в облако. Это
часто затевается ради уменьшения TCO (Total Cost of Ownership) или избавления
от ограничений горизонтального масштабирования СУБД: Oracle, PostgreSQL, MySQL
и Microsoft SQL Server. Основные характеристики распределенного SQL:

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

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

Что такое YugabyteDB?

YugabyteDB – это
высокопроизводительная распределенная СУБД с открытым исходным кодом, построенная
на масштабируемом и отказоустойчивом дизайне, вдохновленном Google Spanner.
YugabyteDB совместима с PostgreSQL, а также умеет интегрироваться с
проектами GraphQL и поддерживает хранимые процедуры, триггеры, а также UDFs.

Остались вопросы – обратитесь к официальному
форуму
.

Шаг 1: Установка YugabyteDB на кластер GKE с помощью Helm 3

Полный мануал можно найти по этой ссылке. Предположим, что у вас уже есть запущенный и работающий кластер 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.

Шаг 2: Создайте Northwind БД

Следующим шагом является загрузка образца схемы и данных. Вы
можете найти множество примеров
совместимых с 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';
    

Шаг 3: Настройка IntelliJ для работы с YugabyteDB

Откройте окно БД (View > Tool Windows > Database):


Добавьте источник данных PostgreSQL. (New (+) > Data Source >
PostgreSQL
):


На вкладке General заполните данные для подключения к БД:

  • Host: внешний IP-адрес, который GKE назначил YugabyteDB на предыдущем шаге.
  • Port: YugabyteDB использует порт 5433.
  • Database: образец БД northwind из предыдущего шага.
  • User: по умолчанию – это yugabyte.
  • Password: пароль из предыдущего шага.
  • Driver: установите последнюю версию драйвера PostgreSQL.

Прежде чем нажать кнопку “ОК”, убедитесь, что присутствует
соединение.

Шаг 4: Выполнение запроса

Теперь давайте протестируем интеграцию, выполнив следующий
запрос в IntelliJ:


В окне вывода должны увидеть следующий результат:


Шаг 5: Генерируем объяснение

IntelliJ умеет создавать визуализацию ваших запросов.
Например, можно получить визуализацию последнего запроса, выбрав Explain Plan > Show Visualization.


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

Заключение

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

Дополнительные материалы

09
Ноя
2020

🎨 22 тенденции веб-дизайна в 2020 году, о которых нужно знать

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

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

В конце концов, быть в курсе возникающих или развивающихся тенденций жизненно важно, если хочешь оставаться на вершине горы. Так какие же эти новые тренды? Что сработает лучше всего в 2020?

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

1. Hero Images и Headers

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

Ниже приведен пример с официального сайта Samsung с одним из последних трендов веб-дизайна 2020 года:


Hero Images – это отличный способ привлечь потенциальных покупателей, фон в таком случае становится объектом внимания и перестает быть серым.

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

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

2. Пустое пространство и минималистичный дизайн

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

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

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

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

Если хотите применить этот подход в веб-дизайне на практике, взгляните на пример от Squarespace:


Несмотря на наличие на главной странице пустого пространства, она по-прежнему смотрится элегантно и привлекательно.

3. Эмоциональный дизайн

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

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

Люди часто называют их “связующими”, и в результате даже не замечают, как втянулись:


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

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

4. Динамический скроллинг

Динамическая прокрутка набирает обороты, и все крупные компании движутся в этом направлении. Причина проста: чем привлекательнее смотрится веб-сайт, тем красивее продукт. С запуском Note 20 в августе этого года, я решил зайти на сайт Samsung, чтобы посмотреть спецификации смартфонов и Galaxy Watch 3.

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


5. Градиент 2.0

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

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

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


6. Темный интерфейс

Темная тема стала трендом практически в каждом приложении. Она есть в WhatsApp и Skype, Gmail, Facebook, YouTube и во многих других приложениях.

Это стало настолько обыденным, что некоторые компании начали добавлять dark mode в свои последние обновления. Темная тема даже глазам дает отдохнуть! Так почему не применить ее в веб-дизайне?

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

Для максимального эффекта нужны контрастирующие цвета с оттенком: к примеру, #000000 идеально сочетается с #FFFFFF или желтым и так далее.

Представленный на скриншоте веб-сайт пояснит, что я имею в виду:


7. Scroll-generated веб-сайты

Scroll-generated веб-сайты (прим. переводчика – “основанные на скроллинге”) – один из последних трендов, подхваченных веб-дизайнерами.

Название может показаться схожим с динамическим скроллингом (англ. Dynamic scrolling) и сбить вас с толку, но на деле это разные понятия. Scroll-generated веб-сайт работает следующим образом: элементы сайта зависят от прокрутки и появляются во время скроллинга.

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

Чтобы стало более понятно, взгляните на представленный ниже скриншот веб-сайта:


8. Интерактивные курсоры

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

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

Для лучшего понимания взгляните на веб-сайт ниже:


9. 3D-дизайн

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

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

Прекрасный пример веб-сайта на скриншоте ниже:


10. Оптимизированная навигация

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

Для вдохновения взгляните на скриншот сайта Bikebear:


11. Фокус на улучшении UI и UX

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

В 2018 году интернет охватила волна модернизации UI и UX. Люди сфокусировались на дизайне настолько, что кто-то построил на этом карьеру. Причина проста: UI отвечает за привлекательность сайта, UX – за удобство для пользователя.

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

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


12. Большие жирные шрифты

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

Пример того, как применить это на практике, представлен ниже:


13. Художественные иллюстрации

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

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

Ниже представлена демонстрация от Lisa Glanz:


14. Сеточный дизайн

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

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

Лучший пример – Pinterest:


15. Слияние фотографии с графикой

Слияние фотографий с графикой – правильное сочетание абстрактного и красочной графики. Фотография – это прекрасный способ передать какой-либо посыл (обычно это такая насущная тема, как феминизм) практически без слов.

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

В качестве примера для демонстрации я выбрал Wix:


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

16. Анимация, запускаемая пользователем

Часто анимация отображается на сайте через @keyframes и другие фреймворки, вроде anime.js. Суть тренда заключается в использовании анимации через взаимодействие с пользователем.

Такой подход завлекает посетителя и в целом улучшает user experience.

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


17. Плавающие элементы

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

99designs используем в качестве демонстрации:


18. Истории с графикой

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

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

Истории с графикой могут вывести завлечение читателей на новый уровень.

Сайт, используемый в качестве демонстрации, – Apple:


19. Графики данных на веб-сайтах

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

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

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

Для демонстрации использован сайт Uber:


20. Черное и белое

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

В качестве примера сайта я использовал Dribbble:


21. Геометрические фигуры и узоры

Геометрические формы помогают веб-дизайнерам создавать что-то захватывающее и мощное из обычного изображения.

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

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


22. Эксперименты с иллюстрациями

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

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

Прекрасным примером служит приведенный ниже веб-сайт:


Заключение

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

Статья публикуется в переводе. Автор оригинального текста Harish Rajora.

***

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

30
Окт
2020

🦋 7 мифов о профессии тестировщика

Поиск ошибок в софте – удел неудачников. Однообразная работа за еду, война с программистами, нудные задачи для технарей и другие мифы о профессии инженеров Quality Assurance.

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

Иллюстрация с pixabay.com
Иллюстрация с pixabay.com

Миф 1. Тестировщик – как программист, только похуже.

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

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

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

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

Миф 2. Тестировщики – самые бесполезные участники процесса. Они только ищут ошибки, а значит можно работать без них.

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

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

Инженер по QA – это буфер между разработкой и пользователем. Он понимает обе стороны и с каждой говорит на ее языке.

Иллюстрация с pixabay.com
Иллюстрация с pixabay.com

Миф 3. Программист vs тестировщик.

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

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

Миф 4 . Работа тестировщика лишена творчества.

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

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

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

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

Миф 5. Тестировщики зарабатывают меньше всех в ИТ.

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

Иллюстрация с pixabay.com
Иллюстрация с pixabay.com

Миф 6. Тестировщику некуда расти. Тупиковая ветвь карьеры.

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

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

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

Миф 7. Если программа работает плохо, виноват тестировщик.

В QA у каждого своя роль, от которой зависит результат. Невозможно ответственность за проект отдать только этапу тестирования.

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

***

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

30
Окт
2020

🐍 Хакатоны, конференции и митапы: календарь мероприятий для программиста на Python

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

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

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

Иллюстрация с сайта pixabay.com
Иллюстрация с сайта pixabay.com

Хакатоны

На хакатонах (англ. hackathon от hack + marathon) собираются специалисты для совместной работы над проектами. Начинается все с презентаций, сбора идей и формирования команд для их реализации. Затем участники демонстрируют результаты – часто хакатоны проводятся в виде конкурсов.

HackPSU

Организатор: Университет штата Пенсильвания

Дата: 6-8 ноября 2020

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

Место проведения: онлайн

Контакты: HackPSU Fall 2020

Тема: программирование python

Призы: будут, но детали не раскрываются

EazyHacks

Организатор: 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 2021

Организатор: CloudFest

Дата: 23-25 марта 2021

Описание: мероприятие ориентировано на веб-разработчиков, пишущих код на Python, PHP, JavaScript, Bash или Go. Для участия требуется понимание азов облачных вычислений и опыт работы с Git

Место проведения: онлайн

Контакты: Cloudfest 2021

Тема: облачные вычисления

Призы: неизвестно

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

Иллюстрация с сайта pixabay.com
Иллюстрация с сайта pixabay.com

Конференции

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

Python Brasil 2020

Организатор: поддерживается Бразильской ассоциацией Python (APyB) и Фондом программного обеспечения Python (PSF)

Дата: 2-8 ноября 2020

Описание: Python Brasil 2020 – крупнейшая конференция по Python в Латинской Америке, организованная сообществом разработчиков. Участники прослушают интересные доклады, получат возможность учиться у опытных профессионалов и даже смогут внести вклад в проекты со свободным кодом: в рамках конференции пройдет множество интересных мероприятий.

Место проведения: онлайн

Контакты: Python Brasil 2020

Группа по изучению Python для начинающих

Организатор: WWCode. Ришика Сингх, Карен Вонг, Стефани Райдаут и Кхьяти Таплиял

Дата: 4 и 18 ноября, 2 декабря 2020

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

Место проведения: онлайн

Контакты: WWCodePython

PyCon Italy 11

Организатор: PyCon

Дата: 5-8 ноября 2020

Описание: PyCon Italia – итальянская конференция по Python считается одной из важнейших в Европе. Следующее мероприятие будет 11-ым по счету.

Место проведения: Lungarno del Tempio, 44 отель Mediterraneo, Флоренция, Италия

Контакты: PyCon

Loginom Days 2020: конференция по продвинутой аналитике

Организатор: Loginom

Дата: 9-13 ноября 2020

Описание: новые возможности low-code платформы Loginom. Отраслевые решения для B2B и B2C. Кейсы от ведущих аналитиков России и СНГ: ЭОС, ТБМ, Estée Lauder Companies и других.

Место проведения: онлайн

Контакты: Loginom Days

PyCon Sweden

Организатор: Python Sverige

Дата: 12-13 ноября 2020

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

Место проведения: онлайн

Контакты: PyCon

Plone Conference 2020

Организатор: Plone Foundation

Дата: 5-13 декабря 2020

Описание: конференция для участников сообществ Plone, Zope, Guillotina, Pyramid & Volto

Место проведения: онлайн

Контакты: Plone Conference 2020

PyCascades 2021

Организатор: PyCascades

Дата: 19 – 21 февраля 2021

Описание: PyCascades – это региональный PyCon на северо-западе Тихого океана, посвященный сообществу разработчиков и пользователей Python.

Место проведения: онлайн

Контакты: PyCascades

enterPy

Организатор: enterPy

Дата: 26 мая 2021

Описание: EnterPy нацелен на профессионалов, использующих (или только собирающихся делать это) Python для анализа данных, машинного обучения, веб-программирования или внедрения практик DevOps.

Место проведения: онлайн

Контакты: enterPy

Conf42.com: Python для финансов 2021

Организатор: Conf42

Дата: 27 мая 2021

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

Место проведения: онлайн

Контакты: Conf42

Иллюстрация с сайта pixabay.com
Иллюстрация с сайта pixabay.com

Митапы

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

Автоматизируйте скучные вещи с помощью Python

Организатор: Tokyo Python Society Club

Дата: 4 ноября 2020

Описание: на этой встрече имеющие опыт работы с Python помогут новичкам.

Место проведения: онлайн

Контакты: Tokyo Python Society Club

Тема: автоматизация, Python

Solvery code-review. Разбор django-проектов

Организатор: Solvery

Дата: 5 ноября 2020

Описание: Code-review проведет Назарий Романченко, Python Developer в Stem SC. Он посмотрит код участников, найдет в нем слабые места и предложит улучшения. Самые интересные кейсы Назарий разберет в прямом эфире.

Место проведения: онлайн

Контакты: Solvery code-review

Тема: code-review, Python

PyATL Jam Session (In-town)

Организатор: PyATL

Дата: 5 ноября 2020

Описание: встречи Jam Session предназначены для практического взаимодействия с другими участниками PyATL. Приглашаются программисты любого уровня подготовки.

Место проведения: онлайн

Контакты: PyATL Jam Session

Тема: Python

Rhino.Inside Python и Django REST Framework

Организатор: Tokyo AEC Industry Dev Group

Дата: 7 ноября 2020

Описание: семинар посвящен разработке REST API, который можно запустить из Rhino, а также Python и Django REST Framework.

Место проведения: онлайн

Контакты: Tokyo AEC Industry Dev Group

Тема: Python

9-й семинар по Python для высокопроизводительных и научных вычислений

Организатор: PyHPC совместно с SC20

Дата: 13 ноября 2020

Описание: в этом году PyHPC возвращается к суперкомпьютерам.

Место проведения: онлайн

Контакты: PyHPC

Тема: высокопроизводительные вычисления

Практический семинар по Python

Организатор: Фрэнк В. и Лорел Т.

Дата: 17 ноября 2020

Описание: встреча начинающих программистов и разработчиков продвинутого уровня, которые хотят помочь другим в изучении Python

Место проведения: онлайн

Контакты: Tucson-Python-Meetup

Тема: Python

Саммит python Universe WEB Edition

Организатор: Geekle

Дата: 19 ноября 2020

Место проведения: онлайн

Контакты: Geekle

Тема: Python WEB Edition

SPb Python Drinkup

Организатор: SPb Python Community

Дата: 26 ноября 2020

Описание: встреча единомышленников, программистов на Python

Место проведения: Санкт-Петербург, Россия

Контакты: SPb Python Community

Тема: Python

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

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

***

Где учиться программировать на Python?

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

27
Окт
2020

☕ Начало работы с JavaFX на Raspberry Pi

Raspberry Pi идеально подходит для любителей поэкспериментировать с электронными компонентами. Если объединить его с инструментами Java-разработчика, вы откроете для себя новый мир.

Недорогой одноплатный компьютер Raspberry Pi отлично работает с Java, отчего hardware-разработка становится не сложнее классической разработки ПО.

***

Из этой статьи вы узнаете, как разработать приложение на JavaFX в
стиле дашборд, используя библиотеку
TilesFX.

На рис. 1 изображен
пользовательский интерфейс (далее UI).

<b>Рис. 1</b> UI приложения
Рис. 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

Если вы работаете Raspberry Pi впервые, подготовьте карту SD с операционной системой. В проекте
используется Full ОС Raspbian (полная версия). Загрузите инструмент
Imager
. Для своей работы я взял версию Raspberry Pi Imager 1.2 от марта 2020 г. (рис. 2 и рис. 3). Убедитесь,
что устанавливаете полную версию.

<b>Рис. 2 </b>Страница скачивания инструмента Imager
Рис. 2 Страница скачивания инструмента Imager
<b>Рис.3</b> Выберите полную версию (Raspbian Full)
Рис.3 Выберите полную версию (Raspbian Full)

Как только SD карта будет готова,
вставьте ее в плату Raspberry Pi, запустите операционную систему и выполните
действия по настройке и подключению к вашей сети Wi-Fi.

Установка JDK (Java Development Kit) с помощью JavaFX

В примечаниях к релизу 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)

<b>Рис. 4 </b>Переключение между версиями Liberica JDK
Рис. 4 Переключение между версиями Liberica JDK

В папке исходного кода Chapter_04_Java/scripts на GitHub расположены установочные скрипты
различных версий Liberica JDK. Они содержат ссылки для скачивания. (см. Рис. 5)

<b>Рис. 5</b> Установочные скрипты различных версий Liberica JDK
Рис. 5 Установочные скрипты различных версий Liberica JDK

Различные схемы нумерации Raspberry Pi

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

Нумерация Header Pin.
Это логическая нумерация заголовка платы. Один ряд содержит четные пины, другой – нечетные.(см. Рис. 6)

<b>Рис. 6</b> Нумерация пинов заголовка платы
Рис. 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
.”

<b>Рис. 7 </b>Сопоставление номеров с пинами на плате
Рис. 7 Сопоставление номеров с пинами на плате

Подключение оборудования

Давайте подключим оборудование, чтобы использовать часть мощностей платы Pi: светодиод,
кнопку и датчик расстояния. См. Табл. 1,
Рис. 8, Рис. 9.

<b>Табл. 1 </b>Сопоставление пинов с соответствующими устройствами
Табл. 1 Сопоставление пинов с соответствующими устройствами
<b>Рис. 8</b> Подключение проводов
Рис. 8 Подключение проводов
<b>Рис. 9</b> Схема подключения
Рис. 9 Схема подключения

На рис. 10 изображена система с использованием моста на макетной плате RasPiO, что упрощает поиск правильного пина. Разъем моста помещает номера
BCM в логическом порядке, но я все еще использую отдельную макетную плату,
чтобы было немного больше места.
Portsplus предлагает аналогичное удобное решение.

<b>Рис. 10 </b>Фото системы с использованием моста макетной платы RasPiO
Рис. 10 Фото системы с использованием моста макетной платы RasPiO

Чтобы проверить, подключен ли
светодиод в правильном положении с учетом его полярности, отсоедините кабель
между светодиодом и пином 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

    

Переключение светодиода с помощью Java

Начинается самое интересное! Следующий код настраивает 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-соединения. Датчик работает по той же
схеме, что и система, используемая летучей мышью для полета в темноте: он использует отражение ультразвука для расчета расстояния до
объекта.

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

  1. Модуль нужно запитать на 5 V;
  2. Приложению нужно установить вывод trig в положение high как минимум на 10 мкс;
  3. Модуль посылает несколько (обычно восемь) сигналов 40 кГц и определяет, когда сигнал принимается обратно;
  4. Вывод echo устанавливается в положение high на ту же продолжительность, что и время, необходимое для возврата ультразвука к датчику;
  5. Приложение измеряет длительность положения high echo-вывода, чтобы рассчитать расстояние на основе скорости звука.

Готовое приложение

Запуск одного файла 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();
    }

}

    

Запуск приложения на одноплатном компьютере
Raspberry Pi

Вы можете запустить приложение на
своем ПК через среду 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)

<b>Рис. 11 </b>Фото запущенного приложения вместе с Raspberry Pi и другими компонентами
Рис. 11 Фото запущенного приложения вместе с Raspberry Pi и другими компонентами

Заключение

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

Текст опубликован в переводе. Автор оригинальной статьи Frank Delporte.

***

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

23
Окт
2020

💪 13 онлайн-курсов по изучению английского языка для ИТ-специалистов

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

Перево…

23
Окт
2020

? 13 онлайн-курсов по изучению английского языка для ИТ-специалистов

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

Перево…

06
Окт
2020

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

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

Чтобы стать Data Scientist необходимо специальное образование

Распространенное заблуждение заключается в том, что Data Scientists являются также специалистами в статистике и математике. Это не совсем так. В Data Science действительно требуется понимание статистики, но компании могут использовать анализ данных и не имея статистика в штате. У большинства разработчиков есть базовое представление о статистике, благодаря прослушанным в вузе курсам. Хотя в машинном обучении и Deep learning требуются продвинутые знания, это не означает, что не обладая степенью в области математики или статистики нельзя стать экспертом по данным.

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

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

Если вы захотите изменить или оптимизировать модель, могут потребоваться более глубокие познания в математике и статистике. Они помогут понять, какие параметры влияют на результаты модели. В статье Как я перешел из математиков в аналитики данных мы писали о Тиме Хоппере, математике, который самостоятельно освоил профессию Data Scientist и работает в сфере кибербезопасности и инжиниринга машинного обучения. Тим является отличным примером специалиста Data Science, который построил свою карьеру практически с нуля и научился всему самостоятельно.

Чтобы стать Data Scientist необходим диплом

Для освоения профессии Data Scientist необязательно получать ученую степень или специальное образование. Во вступительных публикациях серии мы писали о том, как можно изучить Data Science онлайн с нуля, а также о навыках, необходимых в профессии Data Scientist. В предыдущих статьях подробно рассказано о навыках, которые потребуются для освоения профессии, а также даны ссылки на необходимые для обучения ресурсы: онлайн-курсы, подкасты, каналы Youtube и книги.

Давайте все же проясним, откуда возникло это заблуждение. Многие знания и навыки профессии Data Scientist можно освоить самостоятельно с нуля. Однако роль специалиста Data Science делится на две категории: прикладную и исследовательскую. Прикладная наука о данных это прежде всего работа с существующими алгоритмами и понимание их особенностей. Задача таких специалистов применение методов Data Science в конкретных проектах. В профессии требуются в основном специалисты-прикладники.

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

Стоит понимать, что получение степени большая затрата времени, а также ответственность, как моральная так и финансовая. Итак, в какой роли вы видите себя? Это очень важный вопрос, на который нужно ответить, прежде чем перейти в профессию Data Scientist.

Data Science подходит только для крупных организаций с большими ресурсами

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

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

Чтобы стать Data Scientist достаточно приобрести опыт работы с инструментами Data Science

Многие придерживаются неверного мнения о том, что изучения статистического инструмента, наподобие SAS, или освоения программирования на Python с использованием библиотек для Data Science, достаточно, чтобы получить профессию. Изучение инструментов важно, но не является единственными необходимым условием для эффективной работы в Data Science. Для специалиста в этой области требуется умение выйти за рамки инструментов и быстро овладеть знаниями в бизнес-области и навыками правильного применения доступных средств для решения бизнес-проблем. Большим плюсом являются хорошие коммуникативные навыки: они необходимы, чтобы представить идеи и результаты самым простым из возможных способов.

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

Data Science – это только построение моделей

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

  1. Понимание и постановка задач;
  2. Построение гипотезы;
  3. Сбор данных;
  4. Проверка данных;
  5. Очистка данных;
  6. Исследовательский анализ;
  7. Проектирование модели;
  8. Тестирование/верификация модели;
  9. Возврат к этапу проверки или очистки в случае обнаружения ошибки;
  10. Запуск проекта в производство (развертывание модели).

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

ИИ аменит Data Science в будущем

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

Заключение

Популярность Data Science продолжает расти, а навыки работы в этой сфере остаются одними из самых востребованных, которые вы можете вписать в свое резюме. Если вы только начинаете путь в профессии и хотите освоить самые необходимые Data Scientist навыки, мы рекомендуем записаться на курс Data Science Факультета Искусственного интеллекта онлайн-университета GeekBrains. Программа курса включает основательную математическую подготовку, изучение программирования и статистического анализа, а также работу с базами данных реальных проектов. Обучение ориентировано на применение полученных навыков в бизнесе и построено по принципам практической работы с ведущими специалистами в сфере анализа данных и личным помощником-куратором.

01
Окт
2020

⌛ Правило трех лет: как сохранить мотивацию на долгосрочных проектах

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

Перевод выполнен с сокращениями, автор о…

23
Фев
2020

V – значит… язык программирования!

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

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

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

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

Основные
характеристики

Вот как характеризуют язык автор проекта и те, кто им успели воспользоваться:

  • Простота: при знакомстве с другими языками, изучить V можно выучить менее, чем за час
  • Быстрая компиляция: от 100 тыс. до 1,2 млн строк кода в секунду на одном ядре CPU (данные приведены для Intel i5-7500 @ 3.40GHz, SM0256L SSD, без оптимизации). Самосборка компилятора: от 0.15 – 0.6 с
  • Безопасность: нет null и globals, никакого неопределенного поведения, иммутабельный по умолчанию
  • Возможность бесшовного взаимодействия с C-кодом
  • Трансляция проектов на C/С++
  • Кроссплатформенная UI-библиотека
  • Встроенная графическая библиотека
  • Легкая кросс-компиляция
  • Программы компилируются в исполняемые файлы без внешних зависимостей
  • Поддержка hot reload: при внесении изменений не требуется компилировать код заново
  • Есть интерактивная среда (REPL)
  • Встроенный ORM (объектно-реляционное отображение)
  • Встроенный веб-фреймворк
  • Нет сборщика мусора или подсчета ссылок. Очистка происходит во время компиляции. Если V-программа компилируется, в ней нет утечек памяти.
  • Язык имеет модульную структуру, есть менеджер пакетов vpm. Установка пакетов выглядит так: v install sqlite
  • Чтобы вызвать функцию foo() в новом потоке, достаточно написать go foo()

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

Временная лента автора на GitHub

Примеры кода

Не будем далеко ходить, посмотрим сразу на примеры кода. Протестировать их и примеры из документации можно, не устанавливая V – на онлайн-площадке Playground.

Расширенный “Hello world”

            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
        

JSON кодирование/декодирование

            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

            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
        

Установка
V

Средства работы с языком можно установить из сборок (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. Если у вас нет компилятора, воспользуйтесь инструкциями для своей платформы.

  • macOS: Установите XCode из App Store или запустите xcode-select --install для установки инструментов XCode.
  • Debian/Ubuntu: в терминалеsudo apt install build-essential
  • CentOS/RHEL: sudo yum groupinstall "Development Tools"
  • Fedora: sudo dnf install @development-tools
  • Arch Linux: V можно найти в AUR vlang или vlang-git.

На 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

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

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

  • Компилятор языка и средства работы с языком: V UI, транслятор из C/C++ на V и др.
  • Volt – легковесный десктопный клиент для работы со Slack, Skype, Gmail, Twitter, Facebook, Telegram, Twitch и другими ресурсами
  • Vid – небольшой и быстрый текстовый редактор для кода
  • Gitly – open source альтернатива GitHub/GitLab
  • vgram – библиотека для написания телеграм-ботов

Другие примеры

Заключение

Язык программирования V является интересной альтернативой популярным языкам с компиляцией кода быстрее, чем в C++. По сравнению с Go, в V поддерживается только один вид
присваиваний, отсутствует null и глобальные переменные. Если вам интересно сопоставить V с этими и другими языками, просмотрите эту страницу.

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

26
Авг
2019

Почему Scrum не работает (и что с этим можно сделать)

Почему Scrum не работает (и что с этим можно сделать)Как работает Scrum, и работает ли он вообще? Разбираемся с фреймворком Agile, его преимуществами и не самыми очевидными недостатками. Скрам – самый популярный Agile-фреймворк. Точка. Согласно отчету VersionOne 11th State of Agile, Скрам используют 58% респондентов (или 68%, если суммировать Скрам и гибрид «Скрам/XP»). Среди масштабируемых фреймворков Скрам, безусловно, занимает лидирующее положение: на долю Scrum-of-Scrums […]

Запись Почему Scrum не работает (и что с этим можно сделать) впервые появилась Библиотека программиста.

01
Июл
2019

Создание приложения для заметок на Flutter/Dart

Хотите изучить новый язык – пожалуйста. Мы подготовили для вас туториал по созданию приложения для заметок на Dart и Flutter.

Flutter – это мобильный кроссплатформенный SDK с открытым исходным кодом от Google. Приложения, написанные на Dart и Flutter, по умолчанию включают в себя Material Design компоненты, что придает привлекательный внешний вид и юзабилити.

22
Июн
2019

ТОП-5 книг для программиста по управлению программистами

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

Хьюман менеджмент уже давно стал частью IT и требует отдельного рассмотрения и изучения. Без знания правильной стратегии и