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

Vscode

Сниппет, расширение для VSCode и CLI. Часть 1

04.12.2020 14:04:54 | Автор: admin


Доброго времени суток, друзья!

В процессе разработки Современного стартового HTML-шаблона я задумался о расширении возможностей его использования. На тот момент варианты его применения ограничивались клонированием репозитория и скачиванием архива. Так появились HTML-сниппет и расширение для Microsoft Visual Studio Code HTML Template, а также интерфейс командной строки create-modern-template. Конечно, указанные инструменты далеки от совершенства и я буду их дорабатывать по мере сил и возможностей. Однако, в процессе их создания я узнал несколько интересных вещей, которыми и хочу с вами поделиться.

В этой части мы рассмотрим сниппет и расширение, а CLI в следующей.

Если вас интересует лишь исходный код, вот ссылка на репозиторий.

Сниппет (Snippet)


Что такое сниппет? Если коротко, сниппет это заготовка, которую использует редактор для автозаполнения (автодополнения кода).

В VSCode встроен Emmet (официальный сайт, Emmet in Visual Studio Code), который использует многочисленные HTML, CSS и JS-сниппеты для помощи в написании кода. Набираем в редакторе (в .html) !, нажимаем Tab или Enter, получаем готовую html5-разметку. Набираем nav>ul>li*3>a.link>img, нажимаем Tab, получаем:

<nav>    <ul>      <li><a href="" class="link"><img src="" alt=""></a></li>      <li><a href="" class="link"><img src="" alt=""></a></li>      <li><a href="" class="link"><img src="" alt=""></a></li>    </ul>  </nav>

и т.д.

Кроме встроенных, VSCode предусматривает возможность использования пользовательских сниппетов. Для их создания необходимо перейти в File -> Preferences -> User Snippets (или нажать на кнопку Manage в левом нижнем углу и выбрать User Snippets). Настройки для каждого языка хранятся в соответствующем JSON-файле (для HTML в html.json, для JavaScript в javascript.json и т.д.).

Потренируемся создавать JS-сниппеты. Находим файл javascript.json и открываем его.



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

Начнем с чего-нибудь простого. Создадим сниппет для console.log(). Вот как он выглядит:

"Print to console": {  "prefix": "log",  "body": "console.log($0)",  "description": "Create console.log()"},

  • Print to console ключ объекта, название сниппета (обязательно)
  • prefix сокращение для сниппета (обязательно)
  • body сам сниппет (обязательно)
  • $число положение курсора после создания сниппета; $1 первое положение, $2 второе и т.д., $0 последнее положение (опционально)
  • description описание сниппета (опционально)

Сохраняем файл. Набираем log в скрипте, нажимаем Tab или Enter, получаем console.log() с курсором между скобками.

Создадим сниппет для цикла for-of:

"For-of loop": {  "prefix": "fo",  "body": [    "for (const ${1:item} of ${2:arr}) {",    "\t$0",    "}"  ]},

  • Сниппеты, состоящие из нескольких строк, создаются с помощью массива
  • ${число: значение}; ${1:item} означает первое положение курсора со значением item по умолчанию; данное значение выделяется после создания сниппета, а также после перехода к следующему положению курсора для быстрого редактирования
  • \t один отступ (величина оступа определяется соответствующими настройками редактора или, как в моем случае, расширения Prettier), \t\t два отступа и т.д.

Набираем в скрипте fo, нажимаем Tab или Enter, получаем:

for (const item of arr) {}

с выделенным item. Нажимаем Tab, выделяется arr. Еще раз нажимаем Tab, переходим на вторую строку.

Вот еще несколько примеров:

"For-in loop": {  "prefix": "fi",  "body": [    "for (const ${1:key} in ${2:obj}) {",    "\t$0",    "}"  ]},"Get one element": {  "prefix": "qs",  "body": "const $1 = ${2:document}.querySelector('$0')"},"Get all elements": {  "prefix": "qsa",  "body": "const $1 = [...${2:document}.querySelectorAll('$0')]"},"Add listener": {  "prefix": "al",  "body": [    "${1:document}.addEventListener('${2:click}', (${3:{ target }}) => {",    "\t$0",    "})"  ]},"Async function": {  "prefix": "af",  "body": [    "const $1 = async ($2) => {",    "\ttry {",    "\t\tconst response = await fetch($3)",    "\t\tconst data = await res.json()",    "\t\t$0",    "\t} catch (err) {",    "\t\tconsole.error(err)",    "\t}",    "}"  ]}

HTML-сниппеты строятся по такому же принципу. Вот как выглядит HTML Template:

{  "HTML Template": {    "prefix": "html",    "body": [      "<!DOCTYPE html>",      "<html",      "\tlang='en'",      "\tdir='ltr'",      "\titemscope",      "\titemtype='https://schema.org/WebPage'",      "\tprefix='og: http://ogp.me/ns#'",      ">",      "\t<head>",      "\t\t<meta charset='UTF-8' />",      "\t\t<meta name='viewport' content='width=device-width, initial-scale=1' />",      "",      "\t\t<title>$1</title>",      "",      "\t\t<meta name='referrer' content='origin' />",      "\t\t<link rel='canonical' href='$0' />",      "\t\t<link rel='icon' type='image/png' href='./icons/64x64.png' />",      "\t\t<link rel='manifest' href='./manifest.json' />",      "",      "\t\t<!-- Security -->",      "\t\t<meta http-equiv='X-Content-Type-Options' content='nosniff' />",      "\t\t<meta http-equiv='X-XSS-Protection' content='1; mode=block' />",      "",      "\t\t<meta name='author' content='$3' />",      "\t\t<meta name='description' content='$2' />",      "\t\t<meta name='keywords' content='$4' />",      "",      "\t\t<meta itemprop='name' content='$1' />",      "\t\t<meta itemprop='description' content='$2' />",      "\t\t<meta itemprop='image' content='./icons/128x128.png' />",      "",      "\t\t<!-- Microsoft -->",      "\t\t<meta http-equiv='x-ua-compatible' content='ie=edge' />",      "\t\t<meta name='application-name' content='$1' />",      "\t\t<meta name='msapplication-tooltip' content='$2' />",      "\t\t<meta name='msapplication-starturl' content='/' />",      "\t\t<meta name='msapplication-config' content='browserconfig.xml' />",      "",      "\t\t<!-- Facebook -->",      "\t\t<meta property='og:type' content='website' />",      "\t\t<meta property='og:url' content='$0' />",      "\t\t<meta property='og:title' content='$1' />",      "\t\t<meta property='og:image' content='./icons/256x256.png' />",      "\t\t<meta property='og:site_name' content='$1' />",      "\t\t<meta property='og:description' content='$2' />",      "\t\t<meta property='og:locale' content='en_US' />",      "",      "\t\t<!-- Twitter -->",      "\t\t<meta name='twitter:title' content='$1' />",      "\t\t<meta name='twitter:description' content='$2' />",      "\t\t<meta name='twitter:url' content='$0' />",      "\t\t<meta name='twitter:image' content='./icons/128x128.png' />",      "",      "\t\t<!-- IOS -->",      "\t\t<meta name='apple-mobile-web-app-title' content='$1' />",      "\t\t<meta name='apple-mobile-web-app-capable' content='yes' />",      "\t\t<meta name='apple-mobile-web-app-status-bar-style' content='#222' />",      "\t\t<link rel='apple-touch-icon' href='./icons/256x256.png' />",      "",      "\t\t<!-- Android -->",      "\t\t<meta name='theme-color' content='#eee' />",      "\t\t<meta name='mobile-web-app-capable' content='yes' />",      "",      "\t\t<!-- Google Verification Tag -->",      "",      "\t\t<!-- Global site tag (gtag.js) - Google Analytics -->",      "",      "\t\t<!-- Global site tag (gtag.js) - Google Analytics -->",      "",      "\t\t<!-- Yandex Verification Tag -->",      "",      "\t\t<!-- Yandex.Metrika counter -->",      "",      "\t\t<!-- Mail Verification Tag -->",      "",      "\t\t<!-- JSON-LD -->",      "\t\t<script type='application/ld+json'>",      "\t\t\t{",      "\t\t\t\t'@context': 'http://schema.org/',",      "\t\t\t\t'@type': 'WebPage',",      "\t\t\t\t'name': '$1',",      "\t\t\t\t'image': [",      "\t\t\t\t\t'$0icons/512x512.png'",      "\t\t\t\t],",      "\t\t\t\t'author': {",      "\t\t\t\t\t'@type': 'Person',",      "\t\t\t\t\t'name': '$3'",      "\t\t\t\t},",      "\t\t\t\t'datePublished': '2020-11-20',",      "\t\t\t\t'description': '$2',",      "\t\t\t\t'keywords': '$4'",      "\t\t\t}",      "\t\t</script>",      "",      "\t\t<!-- Google Fonts -->",      "",      "\t\t<style>",      "\t\t\t/* Critical CSS */",      "\t\t</style>",      "",      "\t\t<link rel='preload' href='./css/style.css' as='style'>",      "\t\t<link rel='stylesheet' href='./css/style.css' />",      "",      "<link rel='preload' href='./script.js' as='script'>",      "\t</head>",      "\t<body>",      "\t\t<!-- HTML5 -->",      "\t\t<header>",      "\t\t\t<h1>$1</h1>",      "\t\t\t<nav>",      "\t\t\t\t<a href='#' target='_blank' rel='noopener'>Link 1</a>",      "\t\t\t\t<a href='#' target='_blank' rel='noopener'>Link 2</a>",      "\t\t\t</nav>",      "\t\t</header>",      "",      "\t\t<main></main>",      "",      "\t\t<footer>",      "\t\t\t<p> 2020. All rights reserved</p>",      "\t\t</footer>",      "",      "\t\t<script src='./script.js' type='module'></script>",      "\t</body>",      "</html>"    ],    "description": "Create Modern HTML Template"  }}

Набираем html, нажимаем Tab или Enter, получаем разметку. Положения курсора определены в следующем порядке: название приложения (title), описание (description), автор (author), ключевые слова (keywords), адрес (url).

Расширение (Extension)


На сайте VSCode имеется отличная документация по созданию расширений.

Мы создадим два варианта расширения: в форме сниппетов и в форме CLI. Второй вариант опубликуем в Visual Studio Marketplace.

Примеры расширений в форме сниппетов:


Расширения в форме CLI менее популярны, вероятно, по той причине, что существуют настоящие CLI.

Расширение в форме сниппетов

Для разработки расширений для VSCode, нам, кроме Node.js и Git, потребуется еще парочка библиотек, точнее, одна библиотека и плагин, а именно: yeoman и generator-code. Устанавливаем их глобально:

npm i -g yo generator-code// илиyarn global add yo generator-code

Выполняем команду yo code, выбираем New Code Snippets, отвечаем на вопросы.



Осталось скопировать созданный нами ранее HTML-сниппет в файл snippets/snippets.code-snippets (файлы сниппетов также могут иметь расширение json), отредактировать package.json и README.md, и можно публиковать расширение в маркетплейсе. Как видите, все очень просто. Слишком просто, подумал я, и решил создать расширение в форме CLI.

Расширение в форме CLI

Снова выполняем команду yo code. На этот раз выбираем New Extension (TypeScript) (не бойтесь, TypeScript в нашем коде почти не будет, а там, где будет, я дам необходимые разъяснения), отвечаем на вопросы.



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

cd htmltemplatecode .

Нажимаем F5 или на кнопку Run (Ctrl/Cmd+Shift+D) слева и кнопку Start Debugging сверху. Иногда при запуске можно получить ошибку. В этом случае отменяем запуск (Cancel) и повторяем процедуру.

В открывшемся редакторе нажимаем View -> Command Palette (Ctrl/Cmd+Shift+P), набираем hello и выбираем Hello World.



Получаем информационное сообщение от VSCode и соответствующее сообщение (поздравление) в консоли.



Из всех файлов, имеющихся в проекте, нас интересуют package.json и src/extension.ts. Директорию src/test и файл vsc-extension-quickstart.md можно удалить.

Заглянем в extension.ts (комментарии удалены для удобочитаемости):

// импорт функционала VSCodeimport * as vscode from 'vscode'// функция, вызываемая при активации расширенияexport function activate(context: vscode.ExtensionContext) {  // сообщение, выводимое в консоль редактора,  // в котором запущена отладка расширения  console.log('Congratulations, your extension "htmltemplate" is now active!')  // функционал расширения  // команда - это свойство расширения  // htmltemplate - название расширения  // helloWorld - название команды  let disposable = vscode.commands.registerCommand(    'htmltemplate.helloWorld',    () => {      // информационное сообщение, отображаемое в редакторе      // при успешном выполнении команды      vscode.window.showInformationMessage('Hello World from htmltemplate!')    }  )  // регистрация команды  // судя по всему, здесь реализован паттерн проектирования "Подписка/Уведомление",  // один из вариантов паттерна "Наблюдатель"  context.subscriptions.push(disposable)}// функция, вызываемая при деактивации расширенияexport function deactivate() {}

Важный момент: 'расширение.команда' в extension.ts должно совпадать со значениями полей activationEvents и command в package.json:

"activationEvents": [  "onCommand:htmltemplate.helloWorld"],"contributes": {  "commands": [    {      "command": "htmltemplate.helloWorld",      "title": "Hello World"    }  ]},

  • commands список команд
  • activationEvents функции, вызываемые при выполнении команд

Приступаем к разработке расширения.

Мы хотим, чтобы наше расширение по функционалу напоминало create-react-app или vue-cli, т.е. по команде create создавало проект, содержащий все необходимые файлы, в целевой директории.

Для начала отредактируем package.json:

"displayName": "HTML Template","activationEvents": [  "onCommand:htmltemplate.create"],"contributes": {  "commands": [    {      "command": "htmltemplate.create",      "title": "Create Template"    }  ]},

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

Создаем файлы проекта в виде ES6-модулей (VSCode по умолчанию использует ES6-модули (export/import), но поддерживает и CommonJS-модули (module.exports/require)): index.html.js, css/style.css.js, script.js и т.д. Содержимое файлов экспортируется по умолчанию:

// index.html.jsexport default `<!DOCTYPE html><html  lang="en"  dir="ltr"  itemscope  itemtype="http://personeltest.ru/aways/schema.org/WebPage"  prefix="og: http://ogp.me/ns#">  ...</html>`

Обратите внимание, что при таком подходе все изображения (в нашем случае, иконки) должны быть закодированы в Base64: вот один из подходящих онлайн-инструментов. Наличие строки data:image/png;base64, в начале преобразованного файла принципиального значение не имеет.

Для копирования (записи) файлов мы будем использовать fs-extra. Метод outputFile данной библиотеки делает томе самое, что и встроенный Node.js-метод writeFile, но также создает директорию для записываемого файла при ее отсутствии: например, если мы указали создать css/style.css, а директории css не существует, outputFile создаст ее и запишет туда style.css (writeFile при отсутствии директории выбросит исключение).

Файл extension.ts выглядит следующим образом:

import * as vscode from 'vscode'// импорт библиотеки fs-extraconst fs = require('fs-extra')const path = require('path')// импорт файлов проекта, точнее, содержимого этих файловimport indexHTML from './components/index.html.js'import styleCSS from './components/css/style.css.js'import scriptJS from './components/script.js'import icon64 from './components/icons/icon64.js'// ...export function activate(context: vscode.ExtensionContext) {  console.log('Congratulations, your extension "htmltemplate" is now active!')  let disposable = vscode.commands.registerCommand(    'htmltemplate.create',    () => {      // мы хотим, чтобы файлы проекта хранились в директории html-template      // filename: string указывает TypeScript-компилятору,      // что типом аргумента, передаваемого функции,      // должна быть строка      const folder = (filename: string) =>        path.join(vscode.workspace.rootPath, `html-template/${filename}`)      // массив с контентом файлов      // files: string[] означает, что значением переменной files является массив строк      const files: string[] = [        indexHTML,        styleCSS,        scriptJS,        icon64,        ...      ]      // массив с названиями файлов      // обратите внимание, что индексы контента и названий файлов должны совпадать      const fileNames: string[] = [        'index.html',        'css/style.css',        'script.js',        'server.js',        'icons/64x64.png',        ...      ]      ;(async () => {        try {          // перебираем массив с контентом          for (let i = 0; i < files.length; i++) {            // метод outputFile принимает два обязательных и один опциональный параметр:            // путь к файлу (его название), содержимое файла и кодировку (по умолчанию UTF-8)            // если название файла включает png,            // значит, мы имеем дело с Base64-изображением:            // указываем соответствующую кодировку            if (fileNames[i].includes('png')) {              await fs.outputFile(folder(fileNames[i]), files[i], 'base64')            // иначе, используем кодировку по умолчанию            } else {              await fs.outputFile(folder(fileNames[i]), files[i])            }          }          // информационное сообщение об успехе операции          return vscode.window.showInformationMessage(            'All files created successfully'          )        } catch {          // сообщение об ошибке          return vscode.window.showErrorMessage('Failed to create files')        }      })()    }  )  context.subscriptions.push(disposable)}export function deactivate() {}

Для того, чтобы TypeScript не обращал внимания на отсутствие типов импортируемых файлов-модулей, создадим src/global.d.ts следующего содержания:

declare module '*'

Протестируем расширение. Открываем его в редакторе:

cd htmltemplatecode .

Запускаем отладку (F5). Переходим в целевую директорию (test-dir, например) и выполняем команду create в Command Palette.



Получаем информационное сообщение об успешном создании файлов. Ура!



Публикация расширения в Visual Studio Marketplace

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

  • Создать аккаунт в маркетплейсе (запомните значение поля publisher)
  • Глобально установить библиотеку vsce

Редактируем package.json:

{  "name": "htmltemplate",  "displayName": "HTML Template",  "description": "Modern HTML Starter Template",  "version": "1.0.0",  "publisher": "puslisher-name",  "license": "MIT",  "keywords": [    "html",    "html5",    "css",    "css3",    "javascript",    "js"  ],  "icon": "build/128x128.png",  "author": {    "name": "Author Name @githubusername"  },  "repository": {    "type": "git",    "url": "https://github.com/username/dirname"  },  "engines": {    "vscode": "^1.51.0"  },  "categories": [    "Snippets"  ],  "activationEvents": [    "onCommand:htmltemplate.create"  ],  "main": "./dist/extension.js",  "contributes": {    "commands": [      {        "command": "htmltemplate.create",        "title": "Create Template"      }    ]  },  ...}

Редактируем README.md.

Выполняем команду vsce package в директории расширения для создания публикуемого пакета с расширением vsix. Получаем файл htmltemplate-1.0.0.vsix.

На странице управления расширениями маркетплейса нажимаем кнопку New extension и выбираем Visual Studio Code. Переносим или загружаем в модальное окно VSIX-файл. Ждем завершения проверки.



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



Для обновления расширения необходимо изменить номер версии в package.json, сгенерировать VSIX-файл и загрузить его в маркетплейс, нажав на кнопку More actions и выбрав Update.

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

В следующей части мы создадим полноценный интерфейс командной строки сначала с помощью фреймворка от Heroku oclif, затем без него. Наш Node.js-CLI будет сильно отличаться от расширения, в нем будет присутствовать некоторая визуализация, возможность опциональной инициализации git и установки зависимостей.

Надеюсь, вы нашли для себя что-нибудь интересное. Благодарю за внимание.
Подробнее..

ESP32 в окружении VSCode

30.11.2020 20:13:26 | Автор: admin

В нескольких следующих статьях я хотел бы детально рассмотреть настройку окружения VSCode для работы с фреймворком ESP-IDF. Не совсем популярная комбинация ПО обладает как преимуществами, так и недостатками, которые при детальном рассмотрении мы попытаемся исправить, обойти или превратить в достоинства.

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

Поскольку предполагается многопользовательская удаленная разработка, то мы решили вначале отработать выбор и настройку самой среды разработки. После нескольких экспериментов с Eclipse, Visual Studio и QT Creator выбор пал на кроссплатформенный VSCode и плагин от разработчика Espressif IDF для работы с фреймворком ESP-IDF.

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

  1. ESP32 это не MCU, а SoC*, имеющий на борту:

    1. Wi-Fi: 802.11 b/g/n/e/i (802.11n @ 2.4 GHz up to 150 Mbit/s)

    2. Bluetooth: v4.2 BR/EDR and Bluetooth Low Energy (BLE)

      * Все эти интерфейсы мы планируем использовать для коммуникации с изделием. А вот аналоговый радиоканал и FPV использовать по возможности не планируем.

  2. 2 Cores 240 MHz up to 600 DMIPS

  3. ULP co-processor

В качестве ядра ESP32 использует Tensilica Xtensa 32-bit LX6, у которого есть свои недостатки, главным из который, на мой взгляд, пока является слабая производительность с операциями с плавающей точкой в реальных приложениях. Возможно, это связано с текущей версией ядра LX6 или с компилятором GCC 8 toolchain, пока нет точного понимания. Пока это создает некоторые теоретические проблемы со скоростью работы фильтра Калмана и похожих алгоритмов (реализация Madgwick и Mahony).

Есть информация, что новое ядро LX7 уже имеет большую производительность, но оно пока используется только в одноядерной версии ESP32-S2.

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

Более детальное сравнение ядер Xtensa vs ARM можно посмотреть здесь.

Начиная с версии фреймворка ESP-IDF v4.0 Espressif существенно улучшила техническую поддержку и дальнейшую разработку фреймворка. Качественно улучшилась техническая документация и поддержка разработчиков на форуме компании и GitHub. Кардинально улучшилась оперативность обработки сообщений об ошибках в фреймворке и их устранение. Ускорился выпуск новых версий базового фреймворка ESP-IDF, и дополнительных на нем основанных, например Arduino-ESP32.

НАСТРОЙКА ОКРУЖЕНИЯ

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

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

В состав окружения будут входить, в порядке очередности установки:

  1. Git

  2. Python

  3. CMake

  4. VSCode ESP-IDF (далее фреймворк)

  5. ESP-IDF Tools (далее Toolchain)

Я рекомендую все утилиты ставить в отдельную папку в корень диска, например в C:\dev , за исключением VSCode.

А проекты сохранять в папку C:\dev\esp32 .

В дальнейшем это сделает настройку фреймворка более удобной, с визуальной точки зрения, поскольку существенно сократит длину путей к утилитам Toolchain.

Git

Сначала поставим Git

Download URL: https://git-scm.com/

Installation path: C:\dev\Git

Python

Затем поставим Python

Download URL: https://www.python.org/downloads/

Installation path: C:\dev\Python39

Перед установкой убедитесь, что в папке C:\Users\UserName\AppData\Roaming\Python\Python39 не осталось скриптов от предыдущих установок. Почему скрипты для Python из Toolchain попадают в C:\Users\UserName\AppData\Roaming\Python\Python39 (внутри есть еще две папки \Scripts и \site-packages) для меня загадка. Правда скрипты попадают в эту папку только если производить установку ESP-IDF Toolchain из дистрибутива esp-idf-tools-setup-2.3.exe или более ранних версий. Буду признателен, если кто-то подскажет ответ.

(Q1) Вопрос 1: Почему скрипты для Python из дистрибутива ESP-IDF Tools попадают в папку C:\Users\UserName\AppData\Roaming\Python\Python39 (\Scripts и \site-packages), а не в папку с Python? Можно ли изменить этот путь на пользовательский?

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

CMake

Теперь поставим CMake

Download URL: https://cmake.org/download/

Installation path: C:\dev\CMake

На текущий момент Toolchain ESP-IDF использует для сборки проекта только свою версию CMake v3.13.4, которая идет в комплекте, и категорически не хочет использовать другие, в отличии от Python. Это выглядит странно, поскольку на сколько мне известно, у версий 3.13-19 нет явных проблем с обратной совместимостью.

(Q2) Вопрос 2: Какие проблемы с обратной совместимостью есть у CMake версий 3.13-19? Почему Toolchain ESP-IDF не позволяет использовать альтернативные версии CMake?

VSCode

Теперь можно установить VSCode

Download URL: https://code.visualstudio.com/

Installation path: в папку по умолчанию

VSCode plugins

Далее необходимо поставить в VSCode два плагина:

  • Espressif IDF (espressif.esp-idf-extension)

  • C/C++ IntelliSense (ms-vscode.cpptools)

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

Default Terminal Shell

Перед тем как продолжить, я настоятельно рекомендую установить CMD как оболочку терминала VSCode по умолчанию. Дело в том, что по умолчанию после установки в VSCode в качестве терминала используется MS PowerShell, но не все скрипты, которые используются в плагине Espressif IDF для работы с фреймворком корректно выполняются в powershell. А в новой версии оболочки PowerShell, которую предлагается скачать и установить, эти скрипты выполняются еще хуже. К тому же далее мы будем использовать в настройках ESP-IDF некоторый лайфхак, который в PowerShell вообще не выполняется.

Для установки оболочки терминала по умолчанию запустите терминал Terminal ==> New Terminal и выберете окне терминала в выпадающем списке опцию Select Default Shell. Далее выберите в списке Command Prompt cmd.exe

Окно терминала теперь можно закрыть.

Установка ESP-IDF

Если вы еще не убирали опцию Show Onboarding on Visual Studio Code start в настройках Espressif IDF, то после перезагрузки VSCode и выбора в правой части экрана иконки с логотипом Espressif автоматически запустится мастер настройки ESP-IDF (далее просто Мастер).

ESSPRESSIF

Данный Мастер можно также вызвать командой ESP-IDF: Configure ESP-IDF extension (onboarding.start)

Теперь можно приступить непосредственно к установке и базовой конфигурации фреймворка и Toolchain.

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

Для первого раза я рекомендую сохранить настройки непосредственно в пустой папке нового проекта, которую мы предварительно создадим, например здесь: C:\dev\esp32\device01 , и откроем в VSCode. Это немного облегчит понимание, какие настройки, когда и для чего создает данный Мастер, и какие настройки понадобятся еще.

Для сохранения настроек в нашу папку выберем опцию Workspace folder settings и укажем путь C:\dev\esp32\device01.

Нажимаем START

_ User & Workplace

Небольшое отступление.

VSCode оперирует двумя типами настроек глобальными, которые обозначаются как User и локальными, которые обозначаются как Workspace и действуют для конкретного проекта. Есть некоторое несоответствие английских названий смыслу, поскольку User ассоциируется с пользовательскими настройками, но так сложилось исторически, и этот момент нужно просто запомнить, как есть. Мы будем далее называть настройки из раздела User Глобальными, а из Workspace Локальными. Если кто-то знает более подходящую терминологию, милости прошу поделиться в комментариях.

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

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

Таким образом, те настройки, которые мы получим в результате работы Мастера и сохраним в папке проекта будут для нас Локальными (Workspace), а в дальнейшем мы перенесем их и в Глобальные (User).

Select Python version to use

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

Также на экране показана определившаяся в нашей системе версия Git, которую мы поставили ранее.

Проверяем путь к Python и нажимаем Configure ESP-IDF

Configure ESP-IDF

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

Можно также выбрать опцию Find ESP-IDF in your system и указать папку с ранее скаченным фреймворком. Именно этой опцией, скорее всего, вы будете пользоваться в дальнейшей повседневной работе.

Если вы хотите дополнительно использовать в своих разработках класс Arduino, как компоненту проекта, то необходимо выбрать версию ESP-IDF - release/v4.0 (release branch) или v4.0.2 (release version), т.к. фреймворк Arduino-ESP32 доступен сейчас только для версии v3.3, v4.0 и v4.2.

Однако, v3.3 уже морально устарела, а v.4.2, на мой взгляд, пока еще слишком сырая и не имеет окончательного релиза, хотя к моменту окончания нашей установки она может уже и стабилизироваться.

Использование более ранних версий фреймворков ESP-IDF и Arduino-ESP32 чем v.4.0 настоятельно не рекомендуется. Чтобы убедиться в этом можно просто ознакомиться с количеством изменений для базового фреймворка v4.0 по сравнению с версиями v3.x https://github.com/espressif/esp-idf/releases/tag/v4.0 , а фреймворк Arduino-ESP32 основывается как раз на базовой версии фреймворка ESP-IDF. Версии ниже v4.0 также плохо поддерживают, или вообще не поддерживают CMake, а все наши дальнейшие изыскания будут связаны именно с этой популярной системой сборки проектов.

Примечательно, что для Arduino IDE доступен только фреймворк Arduino-ESP32 на версии v.3.3 ESP-IDF, поэтому разработка в нашем окружении VSCode дает несомненное преимущество при работе с классом Arduino, как с компонентой проекта. Правда в этой связке тоже не все так гладко, о чем мы позднее поговорим более подробно.

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

А мы тем временем, выбираем release/v4.0 (release branch), а в качестве пути к фреймворку ESP-IDF укажем папку C:\dev , к которой автоматически добавится адрес \esp-idf .

Нажимаем Check here to download, после чего начинается процесс загрузки с GitHub.

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

Дело в том, что в плагине Espressif IDF версии 0.5.1 вот уже много месяцев присутствует ошибка для выбора release/v4.0 (release branch) после загрузки репозитария v4.0 система пытается найти архив для версии 4.0.2

Будем надеяться, что в будущих версиях эту ошибку исправят. Соответствующую проблему я зарегистрировал на GitHub https://github.com/espressif/vscode-esp-idf-extension/issues/223

А нам остается только выбрать v4.0.2 (release version) и повторить загрузку.

После успешной загрузки и распаковки фреймворка Мастер предложит перейти к настройке утилит Toolchain.

Нажимаем Go to ESP-IDF Tools setup

ESP-IDF Tools Configuration

На данном экране выбираем Download ESP-IDF Tools

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

Теперь необходимо указать папку, в которую будет загружен Toolchain ESP-IDF Tools. Укажем C:\dev\.espressif .

Обратите внимание, ниже перечислены версии всех утилит, входящих в комплект Toolchain для ESP-IDF v4.0.2 именно с ними будет гарантироваться работа (компиляция) как самого фреймворка ESP-IDF, так и компоненты Arduino-ESP32 v4.0.

Tool: xtensa-esp32-elf Version: esp-2020r3-8.4.0

Tool: esp32ulp-elf Version: 2.28.51.20170517

Tool: cmake Version: 3.13.4

Tool: openocd-esp32 Version: v0.10.0-esp32-20200709

Tool: mconf Version: v4.6.0.0-idf-20190628

Tool: ninja Version: 1.9.0

Tool: idf-exe Version: 1.0.1

Tool: ccache Version: 3.7

Нажимаем Download

Ждем несколько минут и в самом конце установки получаем в консоли ошибку:


ERROR: Failed building wheel for psutil

ERROR: Command errored out with exit status 1:

VisualStudio is not installed; get it from http://www.visualstudio.com/en-au/news/vs2015-preview-vs

error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/

...

WARNING: You are using pip version 20.2.3; however, version 20.2.4 is available.

You should consider upgrading via the 'C:\dev\.espressif\python_env\idf4.0_py3.9_env\Scripts\python.exe -m pip install --upgrade pip' command.


Оказывается, для установки одной из компонент wheel for psutil требуется ее предварительно скомпилировать с участием MS С++14 и именно из состава Visual Studio! Ну кто бы мог подумать?!

Я не стал пока искать альтернативных решений, а просто перешел по предложенной ссылке https://visualstudio.microsoft.com/downloads/ , скачал и установил VisualStudio.

После чего вернулся в окно VSCode и снова нажал Download.

Забегая вперед, скажу, что в этот раз установка ESP-IDF Tools закончилась успешно, все компоненты скомпилировались и установились. Однако мне осталось не ясным, нужен ли для успешной установки именно компилятор С++14 и состава Visual Studio, или подойдет любой другой компилятор С++14, установленный в системе?

Если у вас не было данной ошибки, значит в вашей системе стояли необходимые компиляторы. Буду признателен, если вы поделитесь описанием вашей конфигурации. С какими компиляторами установка ESP-IDF Tools завершилась у вас удачно?

(Q3) Вопрос 3: С какими компиляторами С++14, помимо штатного из состава Visual Studio, может успешно завершиться установка ESP-IDF Tools? Нужно ли обязательно при этом иметь в системе установленную программу Visual Studio, или достаточно только компилятора?

_ PIP

Перед тем, как вы тоже повторите действия выше с установкой Visual Studio и нажмете Download обратите внимание на последние строчки сообщения об ошибки. Там сказано, что в системе используется устаревшая версия pip в то время, как доступна более новая.

PIP это система управления пакетами, которая используется для установки и управления программными пакетами, написанными на Python. На сколько я помню, pip попадает в систему автоматически при установке Python версии > 3.4.

Я рекомендую перед повторной попыткой установки ESP-IDF Tools устранить это замечание, чтобы данные строки больше не появлялись в консоли и не мешали восприятию сообщений.

Для этого запустим командную стоку CMD из меню Пуск и введем сначала команду C:\dev\.espressif\python_env\idf4.0_py3.9_env\Scripts\python.exe -m pip install --upgrade pip , а затем python -m pip install --upgrade pip

Дело в том, что первая команда обновит pip в локальной копии idf4.0_py3.9_env, а вторая команда обновит pip уже в основной системной версии Python.

_ PIP cache

Еще один нюанс кроется в кэше pip. Если после всех установок и настроек ESP-IDF вы вдруг решите удалить Visual Studio со всеми дистрибутивами C++, а потом решите повторно запустить мастер настройки ESP-IDF, то процесс установки ESP-IDF Tools пройдет успешно, как ни в чем не бывало. Дело в том, что в процессе предыдущей установки pip сохранил в кэш результаты всех успешных компиляций. Кэш находится по адресу C:\Users\UserName\AppData\Local\pip\cache , и далее, при повторных установках, если в кэше находится файл для утилиты подходящей версии, то он берется именно из кэша. Новые файлы будут компилироваться только для новых версий утилит из Toolchain.

Для того чтобы провести полную переустановку Toolchain для ESP-IDF, без использования кэша pip, достаточно просто удалить папку C:\Users\UserName\AppData\Local\pip\cache\wheels , это вернет в консоль сообщение о недостающем дистрибутиве С++14, если таковой отсутствует в вашей системе.

Теперь скачиваем Visual Studio https://visualstudio.microsoft.com/downloads/ , устанавливаем его с одной единственной опцией Разработка классических приложений на C++, возвращаемся в окно VSCode и

Примечание: не стоит пока выбирать опцию Разработка на Python, поскольку это установит в систему еще одну копию Python более низкой версии, что может создать трудности для дальнейшей настройки и работы фреймворка ESP-IDF.

Возвращаемся на шаг назад, нажав на стрелку влево над надписью ESP-IDF Tools, нажимаем Download ESP-IDF Tools и снова нажимаем Download.

В случае успешной установки Toolchain станет доступна кнопка Go to next step.

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

Дело в том, что если мы отмотаем лог наверх, то найдем сообщение:

Creating a new Python environment in C:\dev\.espressif\python_env\idf4.0_py3.9_env ...

Да, Мастер создал новую версию локального окружения Python, в которую поместил версию pip, идущую в комплекте с Toolchain, а не ту, которая установлена и обновлена в системном Python. Почему Мастер не взял системную версию pip неизвестно. Будем надеяться, что в будущих версиях Матера это поправят.

Чтобы снова обновить локальную версию pip снова выполняем в командной строке команду C:\dev\.espressif\python_env\idf4.0_py3.9_env\Scripts\python.exe -m pip install --upgrade pip

Нажимаем Go to next step

Verify ESP-IDF Tools

Теперь мастер предлагает нам проверить все абсолютные пути для утилит из Toolchain.

Обратите внимание, мастер сделал локальную копию нашего Python39 со всеми скриптами и окружением - idf4.0_py3.9_env, и менять этот путь не стоит.

Также учтите, что несмотря на установленный в системе CMake v3.19 ESP-IDF использует свой CMake v3.13.4, и это доставит нам в дальнейшем некоторые сложности. Заменить путь к CMake более новой версии на данном этапе пока не удастся, т. к. на следующем шаге проверки Мастер укажет на несоответствие версий и не даст завершить настройку. Поэтому оставляем все как есть.

Нажимаем Click here to check tools exist

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

Если все соответствует везде появятся положительные галочки и сообщения are satisfied.

Нажимаем Go to next step

ESP-IDF Tools have been configured

И вот она, заветная надпись об успешном окончании установки.

Настройки проекта

Однако не спешите пока открывать примеры кода. Давайте посмотрим вначале, что же записал мастер настройки ESP-IDF в нашу папу, которую мы указали в самом начале как C:\dev\esp32\device01

В данной папке появилась папка .vscode с единственным файлом settings.json который содержит всего пять строк:

{

"idf.espIdfPathWin": "C:\\dev\\esp-idf",

"idf.toolsPathWin": "C:\\dev\\.espressif",

"idf.customExtraPaths": "C:\\dev\\.espressif\\python_env ",

"idf.customExtraVars": "{\"OPENOCD_SCRIPTS ",

"idf.pythonBinPathWin": "C:\\dev\\.espressif\\python_env "

}

Это пять основных переменных, которые определяют какой именно фреймворк ESP-IDF и Toolchain будут применяться для компилирования и работы с проектом.

Но это еще не все настройки, которые нам необходимы.

Теперь давайте создадим еще одну папку, например C:\dev\esp32\device02 , откроем ее в VSCode и выполним команду ESP-IDF: Add vscode configuration folder, далее будем для краткости называть ее ESP:Avcf. Для выполнения команды нажмите F1 и начните набирать ESP, далее уже можно выбрать команду из списка.

Теперь в папке .vscode появилось уже 4 файла. Причем в фале settings.json нет переменных, которые мы получили после мастера настройки ESP-IDF. А в фале c_cpp_properties.json как раз есть ссылки на эти переменные с путями к фреймворку и Toolchain.

Более того, если бы мы выполнили команду ESP:Avcf в нашей первой папке device01, то наши настройки были бы перезаписаны новым файлом settings.json .

Все дело в том, что, к сожалению, эти две команды работают не совсем взаимосвязано. Мастер настройки ESP-IDF запоминает в переменных среды idf пути к фреймворку и toolchain и сохраняет их, в нашем случае, Локально. А команда ESP:Avcf создает конфигурационные файлы ВСЕГДА используя Глобальные переменные.

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

Дело в том, что, как мы уже говорили ранее, параметры Workspace (Локальные) применяются после параметров User (Глобальных), и если и там и там есть одни и те же параметры, то Workspace имеет преимущество перед User и перезаписывает их. Таким образом, мы может как внести наши переменные в User, так и добавить их в наш Workspace, после параметров, созданных командой ESP:Avcf, в низ файла settings.json, непосредственно в папку .vscode в нашей папке проекта . И то и другое будет работоспособно.

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

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

Внести настройки переменных idf в User можно как вручную, так и еще раз запустив Мастер, выбрав в самом начале опцию User settings и далее указав папку уже со скаченным фреймворком ESP-IDF.

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

ПРИМЕР КОДА и КОМПИЛЯЦИЯ

Чтобы открыть библиотеку примеров кодов ESP-IDF выполним команду ESP-IDF: Show ESP-IDF Examples Projects.

В открывшемся списке выберем проект get-started\blink и нажмем кнопку Crate project using example blink. Разместим проект в папке esp32.

Теперь откроем файл .vscode\settings.json и добавим в конец файла наши настройки из папки device01. Будьте внимательны с синтаксисом JSON, не забудьте про запятые и фигурные скобки.

Теперь перейдем на фаqл с кодом проекта main\blink.c .

Обратите внимание, после открытия проект содержит две проблемы - BLINK_GPIO и portTICK_PERIOD_MS подкрашены красным системой проверки синтаксиса C/C++ IntelliSense. Мы разберем этот момент чуть позже, следующей статье про тонкие настройки окружения VSCode.

А сейчас выполним команду ESP-IDF: Build your project.

Первый процесс компиляции занимает несколько минут, поскольку создается папка build, последующие будут происходить значительно быстрее. В конце компиляции появится сообщение Build Successfully. Это значит, наши Локальные настройки применились успешно.

К сожалению, в случае компиляции проекта командой ESP-IDF: Build your project не происходит отображения лога компиляции в окне терминала. Но можно выполнить эту команду другим способом, из меню Terminal => Run Task => Build Build project или Terminal => Run Build Task

Если окно терминала не было открыто, оно откроется автоматически и в конце компиляции в терминале появится сообщение Project build complete. To flash, run this command:..

Выполнение команд из меню Terminal обеспечивается скриптами в файле .vscode\task.json , но их ход выполнения немного отличается от аналогичных команд через меню F1, например ESP-IDF: Build your project.

На этом мы пока прервемся мы смогли сделать базовую настройку плагина Espressif IDF для работы с VSCode и успешно скомпилировали один из примеров кода из библиотеки фреймворка.

В следующей статье мы займемся более тонкой настройкой окружения VSCode и самого фреймворка рассмотрим утилиту menuconfig, новые скрипты для task.json и решим проблему с не всегда корректной подсветкой синтаксиса IntelliSense, также рассмотрим выполнение команд фреймворка из командной строки.

Подробнее..

Перевод Дружим WSL и VSCode через Tailscale и упрощаем работу в сети

27.02.2021 20:23:19 | Автор: admin

От переводчика:

Когда-нибудь я подключу к одной сети VPN свою нынешнюю машину в Беларуси и машину в России. Пробовал на зуб ZeroTier, чтобы соединить их вообще, но сервис мне не зашёл, тем более, тогда речь не шла о том, чтобы легко подружить подсистему Linux внутри Windows с любой другой машиной извне. Здесь речь именно об этом. Поэтому, думаю, этот перевод окажется полезным не только мне.


Tailscale это сеть VPN, которая не нуждается в конфигурировании. Она работает поверх других сетей, выравнивает сети и позволяет пользователям и сервисам упростить коммуникацию и сделать её безопаснее. Я подробно писал о том, как подключиться к WSL2 внутри Windows 10 по SSH, с другого компьютера. В инструкции по ссылке не только множество шагов, но и несколько способов подключения.

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

Не было бы проще, если бы все были в одной сети и одной подсети?

Поясню. WSL первой версии делит сетевой стек с Windows 10, поэтому машина WSL и Windows рассматривается как одна и та же. Выполняемый на порте 5000 сервис, сервис Windows или работающее в Linux под WSL1 приложение выполняется на одной и той же машине. Однако в WSL2 Linux находится за хостом Windows.

Хотя WSL2 упрощает доступ к http://localhost:5000 через прозрачную переадресацию портов, ваш Linux на WSL на самом деле не является одноранговым узлом в той же сети, что и другие ваши устройства.

Инструмент вроде Tailscale решает проблему, то есть как будто выравнивает сеть. Надо сказать, что из-за некоторых особенностей WSL2 при работе с ней можно допустить несколько ошибок. Я расскажу, что делал, чтобы всё заработало у меня.

Tailscale на WSL2

Установите WSL2 следуйте этой инструкции. Установите дистрибутив Linux. Я работал с Ubuntu 20.04. Погрузитесь в процесс, создайте пользователя и т.д. Установите Windows Terminal работа с командной строкой станет приятнее. Установите Tailscale я руководствовался инструкцией для Ubuntu 20.04.

Настройка WSL2

Сейчас нельзя запустить Tailscale на WSL2 через IPv6, поэтому я отключил протокол:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

Здесь мы запускаем демон. На WSL2 пока нет systemd, но если ваша версия сборки Windows 10 выше 21286, можно выполнять команды при запуске WSL. Лично я прописал всё в bash.

sudo tailscaled

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

tailscale up --authkey=tskey-9e85d94f237c54253cf0

Мне нравится держать Tailscale открытым в другой вкладке терминала или в другой панели вкладок, так, чтобы смотреть логи. Это интересно и информативно!

В панели администрирования машин Tailscale вы увидите все машины в сети, как показано ниже. Обратите внимание: scottha-proto в списке это Windows, а scottha-proto-1 это Linux. Первая машина это мой хост, вторая экземпляр Linux WSL2, они теперь в одной сети!

У меня получилось пригласить пользователя вне своей сети при помощи новой функции совместного использования узлов. Мой друг Гленн не работает в моей организации, но так же, как и я, пользуется OneDrive или DropBox, чтобы создать ссылку или по созданной ссылке получить доступ к одной сущности системы, а не ко всей системе. Я могу сделать то же самое в смысле Tailscale:

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

Создаём сервис и привязываем его к сети Tailscale

Я установил .NET 5 в Ubuntu на WSL2, создал папку и запустил команду dotnet new web, чтобы сгенерировать микросервисный Hello World. Когда я запускаю сервис .NET, Node, или какой-то ещё, важно, чтобы он прослушивался в сети Tailscale. Linux в WSL2 подключена к нескольким сетям.

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

dotnet run --urls http://*:5100;https://*:5101

Итак, я подключился к IP-адресу в Tailscale, который связан с моим экземпляром WSL2, и постучался к моему сервису внутри Linux:

Что теперь можно сделать? Мы с Гленном находимся в сети Tailscale, кроме того, вся сеть единообразная, а значит, Гленн может легко достучаться до моего сервиса! На скрине ниже я нахожусь в Teams: мой рабочий показывается внизу, а рабочий стол Гленна наверху.

Добавляем VSCode и расширение SSH для удалённой разработки

Окей, у нас есть безопасная, единообразная сеть и полная свобода! Могу ли я превратить мой экземпляр WSL2 в систему удалённой разработки для Гленна? Конечно, почему бы и нет?

Для ясности: это просто разговоры, эксперимент, но в нём что-то есть. Например, кроссплатформенность: можно работать с Mac, Windows, WSL2 и так далее. Этим разделом можно руководствоваться, чтобы поднять виртуальную машину на любом облачном или обычном хостере, установить Tailscale и больше не думать о перенаправлении портов, пользуясь поднятой машиной как песочницей. Да, можно работать с WSL локально, но установка на хосте это весело, так появляется много классных вариантов.

Начнём. В WSL2 я запускаю сервис ssh. Можно было поделиться открытыми ключами и войти в систему с их помощью, но здесь залогинюсь по имени пользователя и отредактирую /etc/ssh/sshd_config, установлю порт, ListenAddressи PasswordAuthenticationв Yes:

Port 22#AddressFamily anyListenAddress 0.0.0.0ListenAddress ::PasswordAuthentication yes

glenn локальный суперпользователь только в моём инстансе WSL2:

sudo adduser glennusermoid -aG sudo glenn

Теперь Гленн устанавливает пакет VS Code Remote Development и при помощи Remote via SSH подключается к моему IP в сети Tailscale. Ниже вы видите VS Code на машине Гленна, где ставится VS Code Server [не перепутайте с code-server для развёртывания VSC в вебе] и удалённую разработку вообще.

С точки зрения архитектуры Гленн и код в VS Code поделены пополам между клиентом на его машине Windows и сервером на моём экземпляре WSL2. Обратите внимание: в левом нижнем углу видно, что его VSCode подключён к IP моей WSL2 в сети Tailscale!

Что вы думаете об этом? Можно сравнить Tailscale с инструментами типа ориентированного на разработчиков типа NGrok, который прокладывает туннели к localhost, но есть кое-какие существенные отличия. Проведите расследование! Я никак не отношусь к компании NGrok, разве что я её фанат.

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

Подробнее..

Объясните, почему мой рокет-саенс бэкенд билдится пару секунд, а четыре формы на фронте полгода

09.09.2020 18:05:36 | Автор: admin

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

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

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

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

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

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

Смотрите, я запускаю ноут, на нем начинает крутиться операционка, со всеми своими службами и драйверами. Дотнет, студия, райдер, плеер, почтовый клиент, FIFA18, проводник, телега. И это все 20% моей оперативы. А потом я запускаю интерпретаторы и исполнители js. 80+ % оперативы. Браузер, нода, вскод. Три приложения, которым я дал одно простое задание отрендерить формы и интерпретировать жс в них. Двумерные, простые формы, без физики.

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

Давайте так я нихрена не эксперт в производительности, я очень слабо себе представляю, как отличается программирование операционной системы от создания штуки вроде Node.js на мой дилетантский взгляд ОС решает гораздо более сложные и ресурсоемкие задачи, но хрен с ним. Нода у меня билдит код, который я написал на тайпскрипте. Но у меня ещё есть код, который я написал на сишарпе его билдит, запускает и исполняет дотнет. Почему он жрет в десятки раз меньше памяти? Дотнет что, решает более простые задачи? Или может он медленнее? Меньше функциональности? Хер там плавал.

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

У меня гигантейший бекенд проект, и к нему малюсенький фронтендик на четыре формы. Я делаю фичу вношу изменения в кодовые базы обеих проектов. Когда изменения внесены надо билдить. Я нажимаю f5 в райдере, альтабаюсь на вскод и когда вижу перед собой стройные ряды typescript кода, получаю десктопную нотификацю: "build succeed". Все.

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

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

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

  • Нужно высыпать из кофемолки среднепрожаренную бурду, которую пьет жена

  • Достать нужные зерна из специальной непроницаемой баночки,

  • Засыпать в кофемолку,

  • Выставить верный помол, включить её,

  • Тщательно промыть френч-пресс.

  • Пока чайник кипит, нужно держать френч под горячей водой чтобы холодные стенки не остудили кипяток

  • Быстро ошпарить огромное количество молотого кофе.

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

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

Прошелся по двору, вернулся на кухню. Тут запишите еще пункт:

  • Пара ложек тростникового сахара, тщательно размешиваем.

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

А билд ещё идет. Четыре формы, сынок.

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

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

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

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

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

А билд ещё идет. Четыре формы, сынок.


На правах рекламы

Эпичные серверы - это мощные серверы на базе новейших процессоров AMD EPYC. Частота процессора до 3.4 GHz. Максимальная конфигурация - 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe!

Подробнее..

Работа с системой сборки QBS в редакторе Visual Studio Code

03.11.2020 16:17:49 | Автор: admin
Здравствуйте, товарищи программисты и все кто им сочувствует. Я хотел бы предложить обзор возможностей редактора Visual Studio Code в связке с системой сборки QBS. Кому эта тема интересна, добро пожаловать по кат.



Примечание: Напомню, что QBS разрабатывалась компанией Qt Company, которая в дальнейшем отказалась от разработки данного продукта и отдала его на откуп сообществу. На данный момент QBS активно развивается и выходят новые релизы. Это я на тот случай, чтобы не было глупых комментариев на этот счет. Так сказать, расставляю точки над И.

До недавнего времени система сборки QBS поддерживалась только в IDE QtCreator.

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

Буквально, чуть больше месяца назад ребята из QBS-community подкинули идейку: а почему бы собственно, не создать плагин для Visual Studio Code?. Хмм, действительно, сама Visual Studio Code имеет широкое распространение среди определенной части человечества, да и QBS имеет специально разработанное JSON подобное API для упрощения интеграции с любыми IDE. И работа закипела.

В результате этой работы на свет появилось расширение QBS для Visual Studio Code, которое уже имеет следующие возможности:

  • Открыть директорию с файлами проектов.
  • Выбрать нужный проект для сборки (если в директории несколько файлов).
  • Выбрать профиль для сборки (аналог комплекта с компиляторами).
  • Выбрать конфигурацию сборки (debug/release).
  • Выбрать конкретный продукт для сборки (или все продукты).
  • Выбрать конкретный продукт для запуска в терминале.
  • Выбрать конкретный продукт для его отладки.
  • Работает автоматическая интеллектуальная подсветка C/C++ кода.
  • Работает базовая подсветка для файлов *.qbs.
  • Строится дерево проекта со всеми артефактами.


Примечание: На данный момент это расширение еще не опубликовано в маркете Visual Studio Code, т.к. еще необходимо некоторое время для доработки.

Итак, давайте подробнее разберем, как же использовать данное расширение.

Установка зависимостей



Здесь описывается базовый процесс установки QBS и Visual Studio Code.

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

    Примечание: Я не буду здесь описывать процесс установки QBS.
  • Далее, необходимо настроить профили, которыми QBS будет компилировать проекты. Как это делать, подробно описано в документации.

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

    qbs setup-toolchains --detect
    


    и потом посмотреть что получилось используя UI утилиту config-ui, или сделать все из командной строки:

    qbs config --list profiles
    


    Примечание: Возможно, перед этим нужно задать путь к желаемому компилятору в переменной окружения PATH.
  • Далее, необходимо скачать последнее QBS расширение отсюда.

    Примечание: Это файл с расширением *.vsix
  • Далее, необходимо установить редактор Visual Studio Code, запустить его и установить скачанное ранее QBS расширение, набрав комбинацию клавиш ctrl+ shift + p и в выпадающем меню выбрав пункт Extensions: Install from VSIX... указав путь к *.vsix файлу.


Подготовка к работе



Теперь необходимо настроить установленное расширение для работы QBS. Для этого нужно открыть настройки этого расширения, выбрав File -> Preferences -> Extensions. Далее выбратьQBS, нажать на кнопочку Manage и выбрать пункт Extension Settings.

  • Далее, необходимо указать путь к исполняемому файлу QBS в поле QBS Path, например:



    Примечание: В качестве разделителей пути надо использовать прямую черту /.
  • Остальные параметры можно на данный момент оставить как есть.


Открытие проекта



Чтобы открыть проект, необходимо выбрать директорию в которой находится файл проекта *.qbs. Для этого нужно выбрать File -> Open Folder и выбрать желаемую директорию.

Примечание: Кажется, это такая особенность данного редактора.

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



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



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

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

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



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

Кроме того, расширение создает два выходных окна для просмотра текущих сообщений:

  • QBS Compile Output отображает сообщения от основных операций сканирования, сборки и очистки:


  • QBS Message Output отображает сервисные сообщения (например из JS кода от модулей QBS):




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



Примечание: В этом случае, дерево проекта отображает все под-проекты, продукты, группы и артифакты, предоставляемые QBS после сканирования проекта.

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

Сборка проекта



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

  • Выбор профиля сводится к нажатию соответствующей кнопки внизу на панели инструментов редактора и выбору нужного пункта из списка доступных профилей:



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



  • Выбор продукта сводится к нажатию соответствующей кнопки внизу на панели инструментов редактора и выбору нужного пункта из списка доступных продуктов:



    Примечание: Пользователь может выбрать [all] для сборки всех продуктов в проекте.



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



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

Выбор продукта для запуска или отладки



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



При этом, если продукт уже скомпилирован и его исполняемый файл существует, то кнопки Run и Debug закрасятся зеленым цветом:



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



Запуск выбранного продукта



Для запуска продукта достаточно нажать на кнопку Run внизу на панели инструментов редактора:



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



Отладка выбранного продукта



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

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

По умолчанию текущее QBS расширение ожидает этот файл в директории .vscode/ в корне открытого проекта. Но этот путь к файлу launch.json может быть изменен пользователем в настройках плагина.

Например, при использовании отладчика из MSVC, этот файл может иметь такое содержимое:

{    "version": "0.2.0",    "configurations": [        {            "name": "C++ Debugger (Windows)",            "type": "cppvsdbg",            "request": "launch",            "externalConsole": false        }    ]}


Примечание: Свойство externalConsole должно быть установлено в false если мы хотим видеть отладочные сообщения приложения в окне отладчика.

Примечание: Этот файл может иметь несколько конфигураций для одного и того же, или разных отладчиков (таких как MSVC, GDB, LLDB).

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



Теперь можно устанавливать точку останова в исходном коде выбранного продукта и нажимать на кнопку Debug внизу на панели инструментов редактора:



После этого можно наслаждаться отладкой:



Заключение



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



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

Также, настоятельная просьба все ошибки, пожелания, исправления слать на баг-трекер.
Подробнее..
Категории: C++ , Qt , Системы сборки , Visual studio , Vscode , Qbs

Разработка приложения с использованием Python и OpenCV на Android устройстве

18.11.2020 22:19:29 | Автор: admin

В это статье я хочу показать пример того, как андроид устройство можно использовать для разработки на таких языках программирования как python с библиотекой opencv в среде VSCode (будет использован code-server). В конце статьи приведено небольшое сравнение производительности Termux на моем Android устройстве и Raspberry Pi 3B.

Все действия описанные статье выполнялись на:
Huawei MediaPad M5 10.8
4GB ОЗУ, Hisilicon Kirin 960s, EMUI 9, без root

Для начала понадобится установить Termux (эмулятор терминала, предоставляющий возможности среды Linux), о придожении уже писали на habr.

Далее установим необходимые пакеты, а так же, для более быстрой настройки в дальнейшем, установим ssh сервер:
$ pkg update -y pkg install curl openssh autossh termux-services screen$ sv-enable sshd$ sv up sshd

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

По умолчанию openssh прослушивает порт 8022, узнать ip адрес устройства можно с помощью команды ifconfig:
$ ifconfigwlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500         inet 192.168.1.88  netmask 255.255.255.0  broadcast 192.168.1.255

Подключаемся к Termux:
$ ssh u0_a137@192.168.1.88 -p 8022 

Установить opencv-python в собственном окружении Termux мне не удалось, поэтому воспользуемся трудами Andronix и запустим в Termux Ubuntu 18.04.
$ curl https://raw.githubusercontent.com/AndronixApp/AndronixOrigin/master/Installer/Ubuntu/ubuntu.sh | bash

В официальном приложением Andronix можно найти команды для установки других дистрибутивов таких как Kali, Manjaro и т.д.
Если все выполнилось успешно на экране появится
You can now launch Ubuntu with the ./start-ubuntu.sh script

Запускаем Ubuntu
$ ./start-ubuntu.sh 

Установим пакеты необходимые для разработки на python3 с использованием opencv:
$ apt update$ apt install curl git net-tools unzip yarn nano nodejs python3-dev python3-pip python3-opencv -y

Установка занимает довольно много времени.
Теперь установим code-server
$ curl -fsSL https://code-server.dev/install.sh | sh

После установки code-server необходимо отредактировать файл конфигурации
$ nano ~/.config/code-server/config.yamlbind-addr: 127.0.0.1:8080auth: passwordpassword: 4a40bd9973dae545b3b4c037cert: false

По умолчанию code-server прослушивает адрес 127.0.0.1:8080, для обращения к code-server с других устройств необходимо поменять bind-addr на 0.0.0.0:8080. Присутствует возможность авторизации по паролю. Для задания пароля необходимо изменить значение password. Для отключения авторизации необходимо указать auth: none.

Все действия в статье выполняются в Ubuntu без графического интерфейса в результате чего нет возможности использовать imshow, но есть способ транслировать видео в браузер используя библиотеку flask и специальный MIME тип multipart.

Чтобы не отвлекаться на написание кода, используемого в статье для примера, его можно взять в моем github репозитории.
$ git clone https://github.com/guinmoon/flask_opencv_sample$ cd flask_opencv_sample && pip3 install flask

Открываем проект в code-server

При первом открытии будет предложено установить расширение Python соглашаемся.
Установим приложение для потоковой передачи с камеры устройства, например IP Webcam. Главное требование к приложению возможность транслировать с камеры поток понятный opencv, например rtsp. Разрешение видео потока настраиваем в зависимости от производительности устройства. На моем самое оптимальное 1280x720.


Запускаем трансляцию видео в IP Webcam и проект:


В заключение хочу отметить, что при наличии современного Android устройства его можно использовать как альтернативу raspberry pi. Так, например, сняв ограничения энергопотребления домашний планшет можно использовать как полноценный arm64 мини пк, работающий в фоне постоянно. При этом производительность у Termux вполне высокая.
Сравнение запуска того же кода на Raspberry pi 3
Разрешение видео 1280x720


Далее несколько дополнений которые не вошли в основную статью

Память устройства
Для того чтобы иметь возможность обмениваться файлами между termux и android необходимо в выполнить команду
$ termux-setup-storage

Теперь локальная память устройства примонтирована в ~/storage

.Net Core
Присутствует возможность компилировать приложения .net-core, но к сожалению без возможности отладки так как нет версии OmniSharp скомпилированной под arm.
в start_ubuntu.sh
ищем строчку
command+=" -b /data/data/com.termux/files/home:/root"
и исправляем ее на
command+=" -b /data/data/com.termux/files/home"
curl -SL -o dotnet-sdk-3.1.403-linux-arm64.tar.gz https://download.visualstudio.microsoft.com/download/pr/7a027d45-b442-4cc5-91e5-e5ea210ffc75/68c891aaae18468a25803ff7c105cf18/dotnet-sdk-3.1.403-linux-arm64.tar

если ссылка не работает то руками качаем от сюда

mkdir -p /usr/share/dotnettar -zxf dotnet-sdk-3.1.403-linux-arm64.tar.gz -C /usr/share/dotnetln -s /usr/share/dotnet/dotnet /usr/bin/dotnetdotnet new console -o appcd appdotnet run


Тестируем производительность с помощью sysbench
В sourses.list добавляем
deb ftp.debian.org/debian buster-backports main
apt-get updateapt install sysbenchsysbench --test=cpu --cpu-max-prime=20000 --num-threads=4 run

Подробнее..

Удаленная отладка Go-кода с VSCode без Remote Development

26.08.2020 14:06:49 | Автор: admin

В какой-то момент начинает требоваться отладить программу, которую нельзя отладить на рабочем компьютере. В моем случае потребовалось отладить программу, общающуюся по D-Bus с iwd, демоном, заведующим соединениями по Wi-Fi, на ноутбуке.


В VSCode есть аддон Remote Development, специально предназначенный для подобных случаев. Меня он не устраивал по нескольким причинам:


  1. Автоматическое подписание коммитов GnuPG из VSCode не заработало.
  2. Не заработал SSH-агент (вероятно, из-за отключенного проброса агента).
  3. Не заработало, казалось бы, имеющееся в RD открытие локальной директории на удаленной машине (часть нужных файлов не была включена в версионный контроль, а ручным копированием по сети каждый раз заниматься не хотелось).

Я пишу на Go, так что хак, который я буду описывать, предназначен для отладчика Delve. Сам подход меняется мало вне зависимости от языка программирования; аналогичное можно сделать с используемым в VSCode для Python ptvsd и любым другим отладчиком, позволяющим удаленные соединения.


TL;DR поста
  1. Пишем скрипт, собирающий бинарник с поддержкой отладки, копирующий ее на целевую машину по SCP и запускающий Delve.
  2. Создаем в VSCode профиль отладки, аттачащийся к целевой машине.
  3. Создаем в VSCode таск, запускающий скрипт из п.1 и добавляем его в зависимости профиля отладки.

Скриптуем сборку и запуск Delve


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


Для выполнения всей процедуры сборки/заливки/запуска dlv можно написать простой bash-скрипт или Makefile, но мне для их замены в таких случаях больше нравится Taskfile, поэтому приведу свой Taskfile.yml, который функционально мало чем отличается от shell-скрипта:


version: '2'tasks:  killall:    cmds:      # убиваем Delve на целевой машине,      # завершаемся успешно вне зависимости от того,      # был ли тот запущен      - ssh target_machine killall dlv || true  push:    deps:      - killall    cmds:      # собираем программу без оптимизаций      - go build -gcflags="all=-N -l" -o ./build/debug_binary ./cmd/program      # копируем бинарник на целевую машину      - scp ./build/debug_binary target_machine:/home/tdemin/Desktop/debug_binary  delve:    deps:      - push    cmds:      # запускаем dlv на целевой машине в режиме сервера на порту 64001;      # хак с tmux здесь предназначен для того, чтобы убрать в фон      # процесс dlv, оператор & или nohup с перенаправлением вывода      # здесь недостаточны      - ssh target_machine '(cd ~ && chmod +x Desktop/debug_binary && tmux new -d dlv --headless -l \[::\]:64001 exec ./Desktop/debug_binary)'

Весь процесс теперь можно запустить командой task delve; расставленные в Taskfile.yml зависимости обеспечивают завершение Delve (это необходимо делать перед SCP, потому что scp не позволит перезаписать в этот момент читаемый dlv бинарник), сборку/заливку и запуск нового процесса Delve в фоне на целевой машине.


Настройка профиля отладки


Файл .vscode/launch.json, определяющий профили отладки, здесь будет выглядеть следующим образом:


{    "version": "0.2.0",    "configurations": [        {            "name": "Attach to target",            // dlv использует API v1 по умолчанию,            // это можно изменить ключом --api-version            "apiVersion": 1,            "type": "go",            "request": "attach",            "mode": "remote",            // здесь это вроде бы не имеет значения; отладка, как            // показывает опыт, работает нормально вне зависимости от того,            // есть ли отлаживаемый исходник на целевой машине или нет            "remotePath": "${workspaceFolder}",            // зависимость от таска, таск будет запускаться каждый раз            // перед запуском отладки            "preLaunchTask": "Run Delve on target",            "port": 64001,            "host": "target_machine"        }    ]}

Соответствующий таск сборки в файле .vscode/tasks.json будет выглядеть следующим образом:


{    "version": "2.0.0",    "tasks": [        {            // название таска должно совпадать с preLaunchTask в launch.json            "label": "Run Delve on target",            "type": "shell",            // запускаем Taskfile            "command": "task delve",            "group": {                "kind": "test",                "isDefault": true            },            "presentation": {                // не открываем терминал каждый раз при запуске                // отладчика, это сильно раздражает                "reveal": "silent"            }        }    ]}

Отладка


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


Процесс отладки в VSCode


Этот способ работает, но у него есть одно большое ограничение: встроенный в VSCode терминал не показывает стандартный ввод/вывод отлаживаемого процесса. Если они нужны, после запуска отладки можно по SSH прикрепиться к сессии tmux, в которой запущена в фоне программа.


Ссылки


Подробнее..

Как за долгое время я вернулся на Windows (WSL)

25.11.2020 20:07:40 | Автор: admin

Совсем недавно я приобрёл себе Huawei Matebook d13 с предустановленной windows 10 home


WINDOWS #День первый


После моего старенького MSI, Huiwei показал себя с лучшей стороны.


  1. FingerPrint
  2. Тачпад с полной поддержкой жестов
  3. 2к экран
  4. Продолжительное время работы
  5. Зарядка от Type-c. Теперь заряжаю все свои устройства одной зарядкой

Я радовался, как маленький ребенок, но ноутбук был куплен для работы, а работать я привык на linux


KDE NEON, KUbuntu, Ubuntu


Я давно хотел попробовать кеды, но никак не решался, и вот с новым устройством у меня был карт-бланш на любые эксперименты. Я поставил себе KDE NEON и сразу столкнулся с отсутствием жестов и неработающим fingerPrint. С помощью танцев с бубном я завел некоторые жесты (отпечаток пальца не получилось). В браузерах жесты отказывались работать совсем.


Я снес всё, что было, и поставил Ubuntu. Ничего не поменялось, но тут все жесты не работали, как бы я ни старался.


Я снес всё, что было, еще раз и поставил KUbuntu. Ничего не поменялось!


И тут я вспомнил про WSL(Windows Subsystem for Linux)


Я снес linux и вернул windows




WSL


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


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


WSL 2


Удобно что версия WSL меняется одной командой.


По ощущениям у меня в комнате будто появился компьютер, к которому я подключаюсь по ssh.


Докер предложил мне синхронизироваться с WSL, я согласился.


Список подсистем пополнился


PS C:\Users\zawer> wsl -l -v  NAME                   STATE           VERSION* Ubuntu-20.04           Running         2  docker-desktop-data    Running         2  docker-desktop         Running         2

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


Я создал контейнер postgres, в котором файлы вынесены в wsl. Запускаю и все работает!


Дальше я клонировал рабочий проект(nodejs, typescript, redis, postgres) и по привычке написал в терминале code .. Открылся vscode, предложил поставить плагин, и все заработало, как будто бы я просто открыл проект на своей машине.


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


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


WINDOWS # месяц спустя


Я поставил запуск терминала на горячие клавиши(ctrl + alt+ t), запускает он сразу wsl, теперь я не страдаю от командной строки windows.


Скачал скрипт, который прописывает адрес wsl в hosts, ушло ощущение работы через ssh.


Работаю в привычном окружении, но со всеми удобствами.


Я наконец-то не переключаюсь с Ubuntu на Windows, чтобы запустить photoshop или игру. Если вы выбираете Wine или WSL. Мой ответ однозначно wsl.


Из неприятного все приложения запущенные в WSL должны отдавать информацию на 0.0.0.0 ip, иначе не достучишься.


В планах попробовать обновить ядро, сейчас стоит 4.19.128-microsoft-standard.


Для тех, кто будет пробовать


Выкладываю свои настройки, большинства проблем вы сможете избежать, если воспользуетесь этими конфигурациями /etc/wsl.conf


[automount]enabled = trueroot = /mntoptions = "metadata,umask=22,fmask=11"mountFsTab = true[interop]enabled = trueappendWindowsPath = true[network] generateResolvConf = false 

Заключение


Когда я узнал про существование wsl, посчитал это детской игрушкой.


Попробовав, я отказался от своих слов.


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

Подробнее..

Статьи это тоже исходный код

17.12.2020 12:23:08 | Автор: admin

Title


Открываю VS Code и начинаю набирать статью с самого начала. Но вот незадача формат маркдауна не совсем совместим с имеющимся форматом Хабра. Получается выхода нет и придётся возвращаться к встроенному редактору Хабра;


Или не придется?

В голову пришла идея написать утилиту, которая конвертирует разные форматы маркдаунов друг в друга, например, из формата GitHub в формат Habr;


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


Хотя я и использую множество плагинов VS Code, но мысли о неэффективном процессе написания статей не исчезли. Раз уж я набираю текст в VS Code, то почему бы сразу не делать коммиты контента в гит-репозиторий?


Это дало бы немало новых возможностей, которыми пользуются программисты: версионирование, бекапы на локальные носители или веб-сервисы, правки от редакторов и пользователей. А еще можно внедрить CD/CI;


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





Пишем {



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


Visual Studio Code


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


Интерфейс VS Code удобно разделён на окна: слева отображается код текста, а справа визуализация кода, работающая в реальном времени;


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


  • Проверка синтаксиса
  • Проверка форматирования
  • Форматирование таблиц
  • Генерация оглавления

Проверка синтаксиса


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


В VS Code, для проверки синтаксиса, я использую Code Spell Checker (русский словарь необходимо устанавливать отдельно), и Grammarly;


Проверка форматирования


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


Форматирование таблиц


Table Formatter


В Markdown громоздкий и не особо удобный синтаксис для описания таблиц. К счастью, существуют различные расширения, которые позволяют улучшить процесс создания и форматирования таблиц, например, расширение Table Formatter;


Генерация оглавления


Markdown TOC


Иногда возникает необходимость сгенерировать оглавление (Table of Content, TOC) для всего документа на основе заголовков, причем чтобы оглавление автоматически обновлялось. Для этого существует несколько расширений, но мне нравится плагин Markdown TOC. Данный плагин я использовал для генерации оглавления в этой статье;


Typora


Typora возможно понравится любителям визуального программирования, так как совмещает в себе плюсы WYSIWYG и текстовых редакторов и позволяет сразу увидеть финальное представление текста в документе. Typora поддерживает Markdown;


Typora


Веб-интерфейс как редактор


Можно писать статьи сразу в веб-браузере, используя, например, хабр, GitHub, stackedit.io, dillinger.io и другие сервисы. Хотя это не так удобно и не особо вписывается в процессы разработчика, зато дает возможность набирать текст хоть на планшете или телефоне;


Pandoc, как универсальный конвертер


Pandoc универсальная утилита, позволяющая конвертировать одни текстовые файловые форматы в другие. Можно использовать word или latex как основной текстовый редактор и в дальнейшем, с помощью пандока, конвертить один формат в другой. Pandoc поддерживает огромное количество форматов, например, md, docx, txt, rtf, pdf, html и другие. При этом, пандок очень прост в использовании и позволяет форматировать один файл в другой с помощью одной команды, например:


pandoc text.docx -o text.md

Также есть веб-версия, позволяющая воспользоваться возможностью конвертации в режиме онлайн;


}


Конвертируем {



После того как статья написана, её нужно сконвертировать в Markdown-формат хабра. Этого можно было бы избежать, если бы markdown-синтаксис хабра полностью сочетался с GitHub Flavored Markdown, который реализуется во многих других редакторах, в частности, в VS Code;


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


Есть и другие различия: реализация спойлеров, внутренних ссылок и.т.д;


Используем MarkConv


Конвертировать правильно можно с помощью утилиты MarkConv следующим образом:


  1. Устанавливаем .NET Core (если его еще нет).


  2. Устанавливаем .NET Tool следующим образом:


    dotnet tool install -g MarkConv.Cli --version 1.0.0 --add-source https://www.myget.org/F/mark-conv/api/v3/index.json
    

  3. Конвертируем статью в формат маркдаун-синтаксиса хабра следующим образом:


    markconv -f <article.md> -o Habr
    


Утилиту можно запускать и в batch-режиме из папки с md-файлами, что позволит запустить конвертацию сразу нескольких файлов одновременно;


По завершению процесса конвертирования статью можно публиковать на хабр;


Стоит отметить, что MarkConv конвертирует не только в формат хабра, но и в формат dev.to, а также делает другие полезные проверки и замены;


Проверка синтаксиса с помощью MarkConv


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


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


[INFO] Converting of file /home/appveyor/projects/articles/Modern-Presentations-Format/Russian.md...[WARN] Incorrect nesting: element </href> at [358,162..166) closes <a> at [358,14..15)

Ограничение на размер текста относительно тега cut


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


You need to insert <cut/> tag if the text contains more than 1000 characters

Проверка абсолютных ссылок


Использование ключа --checklinks позволит запустить утилиту MarkConv на проверку всех ссылкок вида http://;


На данный момент это работает с некоторой задержкой и не всегда корректно, возможно таким образом на внешних сервисах реализована защита от DDoS-атак;


Замена отображения локальных адресов ресурсов на абсолютные


Чтобы ресурсы не зависили от внешних сервисов (например, картинки), то имеет смысл использовать тег linkmap следующим образом:


<linkmap src=Markdown.svg dst=https://habrastorage.org/getpro/habr/post_images/a40/f88/64c/a40f8864c5f8db7888076cf30f5411f5.svg />

где: src адрес локального ресурса, а dst удалённого.


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


Посмотреть как это работает можно на примере одной из моих статей;


Этот метод также можно использовать для редиректа ссылок на локальные статьи одна статья будет всегда ссылаться на другую;


Кликабельная титульная картинка


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


<linkmap src=HeaderImageLink dst=http://personeltest.ru/aways/habr.com/путь-к-статье />

}


Храним {



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


  • Каждая статья хранится в определенной папке. Название этой папки перевод заголовка статьи, в котором пробелы заменены на дефисы, а запрещенные в url-символы игнорируются, например, для этой статьи названием будет являться следующее имя: Article-is-also-code;
  • Сам md файл внутри этой папки именуется языком, на котором эта статья написана, например, Russian.md или English.md;
  • Опционально. Локальные картинки и ресурсы хранятся либо в корневой папке статьи, либо в подпапке Images и маппятся с помощью утилиты MarkConv;

Использование такой структуры позволяет понять о чем статья и на каком языке она написана. Например, для этой статьи ссылка такая: https://gitlab.ptsecurity.com/writers/Articles/blob/master/Article-is-also-code/Russian.md;


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


Также имеет смысл хранить статью в приватном репозиторий до её публикации. А после публикации пушить ветку в зеркальный публичный репозиторий. В GitHub и GitLab такая возможность предоставляется бесплатно;


}


Вычитываем {



После того, как исходники статьи написаны и запушены, редакторы могут сделать "ревью" статьи, т.е. вычитку. Можно использовать знакомые для программиста инструменты: создавать issue, предлагать pull request и даже принимать участие в дискуссиях новой возможности GitHub;


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


}


Автоматизируем {



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


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


Я использую сервисы GitHub Actions и AppVeyor;


GitHub Actions


GitHub Actions удобно использовать когда вся разработка ведется на GitHub, к тому же он работает на приватных репозиториях даже в базовом бесплатном варианте;


В репозитории со статьями достаточно создать файл по аналогии с данным примером:


publish-articles.yml
name: Articles Converting and Publishingon: [push, pull_request]jobs:  build:    # Можно использовать и windows    runs-on: ubuntu-latest    steps:      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it      - uses: actions/checkout@v2      # Установка .NET Core      - name: Install .NET Core        uses: actions/setup-dotnet@v1        with:          dotnet-version: 3.1.101      # Установка .NET Core Tool      - name: Install MarkConv        run: dotnet tool install -g MarkConv.Cli --version 1.2.0 --add-source https://www.myget.org/F/mark-conv/api/v3/index.json      # Запуск утилиты MarkConv на все статьях в корневой папке      - name: Run MarkConv        run: markconv -f ./ -o Habr --checklinks      # Публикация сконвертированных статей      - name: Deploy Articles        uses: actions/upload-artifact@v2        with:          name: articles          path: ./_Output

AppVeyor


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


appveyor.yml
image:- Ubuntuversion: "{build}"skip_branch_with_pr: truebefore_build:- ps: |    dotnet tool install -g MarkConv.Cli --version 1.2.0 --add-source https://www.myget.org/F/mark-conv/api/v3/index.jsonbuild_script:- ps: |    markconv -f ./ -o Habr --checklinksafter_test:- ps: |    cd ./_Output    foreach ($file in Get-ChildItem ./)    {        Push-AppveyorArtifact $file.Name    }

}


Публикуем {



Артефакты получены, теперь можно копировать их на хабр и публиковать. К сожалению, этот шаг пока что невозможно автоматизировать, потому что "API Хабра закрыт на реконструкцию";


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


}


Заключение {


Итак, я пишу статьи в VS Code, храню их в Git, использую GitHub для разработки и автоматизирую с помощью GitHub Actions неплохой набор для программиста;


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


Чтобы понять, удобны ли данные наработки для вас, я подготовил несколько опросов, после которых станет понятней, стоит ли дальше развивать эту концепцию;


В следующей статье я хотел бы рассказать о том, как разрабатывалась утилита для конвертации MarkConv, о ее технических деталях и возможном развитии;


}

Подробнее..
Категории: Usability , Git , Github , Github actions , Habr , Vscode , Typora , Pandoc , Appveyor

GIT для новичков (часть 1)

07.02.2021 18:17:06 | Автор: admin

Что такое Git и зачем он нужен?

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

С помощью Git-a вы можете откатить свой проект до более старой версии, сравнивать, анализировать или сливать свои изменения в репозиторий.

Репозиторием называют хранилище вашего кода и историю его изменений. Git работает локально и все ваши репозитории хранятся в определенных папках на жестком диске.

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

Каждая точка сохранения вашего проекта название коммит (commit). У каждого commit-a есть hash (уникальный id) и комментарий. Из таких commit-ов собирается ветка. Ветка - это история изменений. У каждой ветки есть свое название. Репозиторий может содержать в себе несколько веток, которые создаются из других веток или вливаются в них.

Как работает

Если посмотреть на картинку, то становиться чуть проще с пониманием. Каждый кружок, это commit. Стрелочки показывают направление, из какого commit сделан следующий. Например C3 сделан из С2 и т. д. Все эти commit находятся в ветке под названием main. Это основная ветка, чаще всего ее называют master . Прямоугольник main* показывает в каком commit мы сейчас находимся, проще говоря указатель.

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

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

Установка

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

Но для начала, все же установим сам Git.

  • Windows. Проходим по этой ссылке, выбираем под вашу ОС (32 или 64 битную), скачиваем и устанавливаем.

  • Для Mac OS. Открываем терминал и пишем:

  • Windows. Проходим по этой ссылке, выбираем под вашу ОС (32 или 64 битную), скачиваем и устанавливаем.

  • Mac OS

#Если установлен Homebrewbrew install git#Если нет, то вводим эту команду. #После этого появится окно, где предложит установить Command Line Tools (CLT).#Соглашаемся и ждем установки. Вместе с CLT установиться и gitgit --version
  • Linux. Открываем терминал и вводим следующую команду.

# Debian или Ubuntusudo apt install git# CentOSsudo yum install git

Настройка

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

Открываем терминал (Linux и MacOS) или консоль (Windows) и вводим следующие команды.

#Установим имя для вашего пользователя#Вместо <ваше_имя> можно ввести, например, Grisha_Popov#Кавычки оставляемgit config  global user.name "<ваше_имя>"#Теперь установим email. Принцип тот же.git config  global user.email "<адрес_почты@email.com>"

Создание репозитория

Теперь вы готовы к работе с Git локально на компьютере.

Создадим наш первый репозиторий. Для этого пройдите в папку вашего проекта.

#Для Linux и MacOS путь может выглядеть так /Users/UserName/Desktop/MyProject#Для Windows например С://MyProjectcd <путь_к_вашему_проекту>#Инициализация/создание репозиторияgit init

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

#Добавим все файлы проекта в нам будующий commitgit add .#Или такgit add - all#Если хотим добавить конкретный файл то можно такgit add <имя_файла> #Теперь создаем commit. Обязательно указываем комментарий.#И не забываем про кавычкиgit commit -m "<комментарий>"

Отлично. Вы создали свой первый репозиторий и заполнили его первым commit.

Процесс работы с Git

Не стоит после каждого изменения файла делать commit. Чаще всего их создают, когда:

  • Создан новый функционал

  • Добавлен новый блок на верстке

  • Исправлены ошибки по коду

  • Вы завершили рабочий день и хотите сохранить код

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

Визуальный интерфейс

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

Но существуют и отдельные программы по работе с Git. Могу посоветовать эти:

Я не буду рассказывать как они работают. Предлагаю разобраться с этим самостоятельно.

Создаем свой первый проект и выкладываем на GitHub

Давайте разберемся как это сделать, с помощью среды разработки Visual Studio Code (VS Code).

Перед началом предлагаю зарегистрироваться на GitHub.

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

После открываем VS Code .

  1. Установите себе дополнительно анализаторы кода для JavaScript и PHP

  2. Откройте вашу папку, которую создали ранее

После этого у вас появиться вот такой интерфейс

  1. Здесь будут располагаться все файлы вашего проекта

  2. Здесь можно работать с Git-ом

  3. Кнопка для создания нового файла

  4. Кнопка для создания новой папки

Если ваш проект пустой, как у меня, то создайте новый файл и назовите его index.html . После этого откроется окно редактирование этого файла. Напишите в нем ! и нажмите кнопку Tab . Автоматически должен сгенерироваться скелет пустой HTML страницы. Не забудьте нажать ctrl+s чтобы файл сохранился.

Давайте теперь перейдем во вкладу для работы с Git-ом.

Откроется вот такое окно:

  1. Кнопка для публикации нашего проекта на GitHub

  2. После нажатия на кнопку 1 , появится всплывающее окно. Нужно выбрать второй вариант или там где присутствует фраза ...public repository

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

После того, как выбрали "Опубликовать на GitHub публичный репозиторий" (пункт 2), программа предложит вам выбрать файлы, которые будут входить в первый commit. Проставляем галочки у всех файлов, если не проставлены и жмем ОК . Вас перекинет на сайт GitHub, где нужно будет подтвердить вход в аккаунт.

Вы создали и опубликовали репозиторий на GitHub.

Теперь сделаем изменения в коде и попробуем их снова опубликовать. Перейдите во вкладку с файлами, отредактируйте какой-нибудь файл, не забудьте нажать crtl+s (Windows) или cmd+s (MacOS), чтобы сохранить файл. Вернитесь обратно во вкладу управления Git.

Если посмотреть на значок вкладки Git, то можно увидеть цифру 1 в синем кружке. Она означает, сколько файлов у нас изменено и незакоммичено. Давайте его закоммитим и опубликуем:

  1. Кнопка для просмотра изменений в файле. Необязательно нажимать, указал для справки

  2. Добавляем наш файл для будущего commit

  3. Пишем комментарий

  4. Создаем commit

  5. Отправляем наш commit в GitHub

Поздравляю, вы научились создавать commit и отправлять его в GitHub!

Итог

Это первая вводная статья по утилите Git. Здесь мы рассмотрели:

  • Как его устанавливать

  • Как его настраивать

  • Как инициализировать репозиторий и создать commit через консоль

  • Как на примере VS Code, опубликовать свой код на GitHub

Забегая вперед, советую вам погуглить, как работают следующие команды:

git help # справка по всем командамgit clonegit statusgit branchgit checkoutgit mergegit remotegit fetchgit pushgit pull

P.S. Для облегчения обучения, оставлю вам ссылку на бесплатный тренажер по Git.

https://learngitbranching.js.org/

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

Подробнее..
Категории: Git , Github , Новичкам , Vscode

В закладки Кунг-фу на клавиатуре. Искусство сочетать клавиши

11.04.2021 14:15:43 | Автор: admin

Сочетания клавиш для тех, кто хочет войти в IT и не только.

Содержание

Сочетания клавиш - это простые команды, позволяющие удерживать пальцы на клавиатуре, а не прыгать вперед и назад к мыши. Вы, вероятно, уже знаете такие распространенные сочетания клавиш, как CTRL + C для копирования и CTRL + V для вставки, но есть множество других сочетаний клавиш, которые позволяют делать что угодно на вашем компьютере или в конкретной программе. Говорят, что знание только основных сочетаний экономит вам 8 рабочих дней каждый год. Цель этой статьи - сэкономить вам ГОРАЗДО больше.

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

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

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

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

Если вы пользователь системы Windows, то вы обязаны дочитать до конца.

Поехали.

Базовые сочетания

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

Esc- aka Escape или Эскейп или Эскейт или... ладно, ладно. Тут все просто, она в основном используется для выхода из чего-либо или отмены чего-либо. Если все пошло наперекосяк и "Я что-то нажала и все уронилось", то скорее всего вам нужно будет обратиться к этой клавише.

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

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

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

Shift+/<key/>- так исторически сложилось, что Shift часто используется для инвертирования действия, выполненного сочетанием клавиш без Shift. Например Shift+Tab совершает действие, противоположное Tab. Keep in mind!

F1- вызов справки. Просто для справки.

Ctrl+W- закрыть окно, вкладку. Почти всегда работает в приложениях, где есть вкладки.

Ctrl+F- поиск. F - Find.

Ctrl+P. В большинстве программ вызывает меню печати.

Ctrl+S- сохранить. Что тут еще говорить.

Ctrl+Z- отменить действие.

Ctrl+Y/Ctrl+Shift+Z- повторить отмененное действие.

Ctrl+N. Открыть новое окно/файл.

Ctrl+(+)- приблизить/увеличить масштаб.

Ctrl+(-)- отдалить/уменьшить масштаб.

Ctrl+(?shift)+[|Ctrl+(?shift)+]- уменьшить | увеличить размер шрифта.

Shift+Enter- перевести курсор на начало новой строки. Это сочетание бывает необходимо, если нажатиеEnterделает что-то другое.

Графика

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

Ctrl+D- создать копию объекта. От слова Duplicate.

Ctrl+(?shift)+[- Переместить элемент на задний план. В некоторых программах требуется клавиша модификатор Shift.

Ctrl+(?shift)+]- Переместить элемент на передний план.

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

Эти сочетания мыши критичны для тех, кто работает с графическими элементами.

Ctrl+MouseScroll- увеличить / уменьшить масштаб.

Shift+MouseScroll- переместиться по горизонтали. Иногда весь контент не помещается в окне, и появляется горизонтальная полоса прокрутки. Данное сочетание позволяет перемещаться вправо или влево в таких ситуациях.

Shift+Click- выбрать группу элементов, если возможно.

Ctrl+Click- выбрать элементы, точечно.

Ctrl+(Dragging)- копировать элемент или группу элементов и переместить на позицию курсора. Работает не везде, но полезно помнить.

Терминал Linux

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

Tab- автодополнение команд.

Tab+Tab- вывести список возможных команд автодополнения.

Ctrl+C- послать сигнал прерывания процесса.

Ctrl+Z- приостановить процесс и перевести в фон.

Ctrl+D- удалить символ после курсора. Если строка пустая, то эта команда завершит работу терминала.

Alt+D- удалить слово после курсора.

Ctrl+W- вырезать слово перед курсором.

Alt+Backspace- удалить слово перед курсором.

Ctrl+A- перейти в начало строки.

Ctrl+E- перейти в конец строки.

Ctrl+B- переместиться на символ назад.

Ctrl+F- переместиться на символ вперед.

Windows

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

Парочка полезностей:

  • Поиск через "Start" в Windows работает так, что он быстро находит файлы, находящиеся в системных папках. Поэтому, если вам лень ходить по файловой системе, нажимаемWinи вводим имя файла - система быстро нам его найдет.

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

Сочетания

Win+D- скрыть все окна.

Win+M- свернуть все окна.

Win+Shift+M- развернуть все окна.

Win+X- открыть меню системных инструментов.

Win+P- открыть меню проекции на дополнительные дисплеи.

Win+Left/Right- переместить окно влево/вправо.

Win+Up- развернуть окно на весь экран.

Win+Down- открепить окно / свернуть.

Win+L- заблокировать систему.

Win+B- фокус на панель инструментов.

Win+Ctrl+Left/Right- переключиться между рабочими столами.

Win+(.)- открыть меню стикеров.

Alt+Tab- вы и так знаете. Переключаемся между активными окнами. Зажатый Shift двигает нас назад.

Alt+Enter- позволяет открыть некоторые окна в полноэкранном режиме.

Win+{1, 2, 3, ...}- открыть n-ное окно прикрепленное к панели задач. Обязательно к использованию!

Win+Shift+{1, 2, 3, ...}- открыть n-ное окно от имени администратора.

Win+Shift+S- сделать скриншот части экрана.

Ctrl+Shift+Esc- открыть диспетчер задач.

Alt+\<key\>- активирует навигацию в окнах многих программ. Например, сочетаниеAlt+V + H + Hпозволяет скрыть/показать скрытые файлы в проводнике.

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

Alt+PrintScreen- сделать скриншот окна.

Win+PrintScreen- сделать скриншот экрана и сохранить в папку "Изображения".

Проводник

F2- переименовать файл/папку.

Win+E- открыть проводник.

Alt+Enter- открыть свойства файла.

Ctrl+Enter- открыть папку в новом окне.

Ctrl+Shift+N- создать новую папку в текущей директории в проводнике.

Alt+Left/Alt+Right- предыдущая папка / следующая папка в истории.

Alt+Up. Переместиться на уровень вверх.

Утилиты

Magnifier

Win+(+)- увеличить часть экрана.

Win+(-)- уменьшить часть экрана.

Win+Esc- закрыть Magnifier.

Xbox Game Bar

Win+G- открыть игровое меню XBox.

Win+Alt+R- Начать/остановить запись текущего окна. R - Record.

Chrome

В хроме исправно работают многие из сочетаний, описанных вБазовые сочетания.

Ctrl+Shift+W- брат Ctrl+W. Позволяет закрыть все вкладки сразу.

Ctrl+Shift+N- открыть новое окно в режиме инкогнито. Если вам часто нужно открыть "чистое" окно браузера, то запомните это сочетание.

Ctrl+T- открыть новую вкладку и перейти к ней.

Ctrl+Shift+T- открыть ранее закрытую вкладку. В некоторых случаях это поможет восстановить историю вкладок, если браузер был принудительно закрыт.

Ctrl+Tab- перейти к следующей вкладке на панели.

Ctrl+Shift+Tab- перейти к следующей вкладке на панели.

Ctrl+{1, 2, ..., 8}- перейти к n-ной вкладке.

Ctrl+9- перейти к последней вкладке.

Ctrl+R- перезагрузить страницу.

Ctrl+Shift+R- перезагрузить страницу, без использования данных в кэше.

Ctrl+D- сохранить текущую страницу в закладках.

Ctrl+Shift+D- сохранить все открытые вкладки в закладках. Поосторожнее с этим!

Ctrl+L- фокус на адресную строку.

Сочетания мыши

MiddleMouseButton- открыть страницу по ссылке в новой вкладке.

Ctrl+Click- открыть страницу по ссылке в новой вкладке.

Ctrl+Shift+Click- открыть ссылку в новой вкладке и перейти к ней. Обычно это именно то, что нужно, если вы хотите быстро просмотреть информацию по другой ссылке.

Shift+Click- открыть ссылку в новом окне.

Меню

Ctrl+H- открыть историю браузера.

Ctrl+J- открыть страницу загрузок.

Shift+Esc- открыть диспетчер задач Chrome. Если вы не понимаете, какая страница сильно нагружает ваши ресурсы, то стоит сюда заглянуть.

Ctrl+Shift+O- открыть страницу закладок.

Developer tools

Developer tools - один из самых полезных инструментов в арсенале Web-разработчика. Посмотрим, как можно немного ускорить работу с ним в браузере Chrome.

Ctrl+Shift+J- открыть вкладку Console в инструментах разработчика

Ctrl+(backtick)- фокус на консоли. При открытом меню инструментов разработчика.

Ctrl+[,Ctrl+]- сменить вкладку на панели.

F2- редактировать элемент как html.

Ctrl+Shift+P- открыть панель команд. Сочетание, которое может заменить их все.

Ctrl+Shift+I/F12- открыть последнюю использованную вкладку в инструментах разработчика.

Ctrl+Shift+C- открыть панель элементов страницы.

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

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

Vimium

Чего мы хотим?Чего мы хотим?

Vimium- расширение для браузера, которое предоставляет сочетания клавиш для навигации и управления в духе редактора Vim.

Для работы с русской раскладкойнужно будет добавить "мэпы" в настройки вимиума.

Вот что это нам дает.

Переход по ссылкам черезF+<key>.Больше не нужно тянуться за мышкой, чтобы кликнуть по ссылке. Это сделает за вас Vimium. Нажмите клавишуFи на странице к каждой ссылке прикрепится название клавиши, которую нужно нажать далее, чтобы перейти по ней.

Перемещение через сочетания как в виме

Используйте привычные клавишиhjklдля движения по странице.

Панель поиска

  • Ищем везде черезo

  • Ищем в закладках черезb

  • Ищем в открытых вкладках черезT

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

Vimium hotkeysVimium hotkeys

AutoHotkey

Вначале будет многа букофф...

Хакерский редактор

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

Vim (сокр. от Vi Improved, произносится вим) кошмар для случайного пользователя. Если его удаётся в конце концов закрыть, то вздыхаешь с облегчением и твёрдой уверенностью, что больше не будешь запускать эту программу ни разу в жизни. (c) Материал из Викиучебника

Так что же в нем особенного? На Хекслете есть неплохаястатья, в которой рассказано, почему Vim - это хорошо.

Я тоже считаю, что вим - это хорошо и знать основные его команды очень пригодится. Так, например, упоминание этого редактора при разговоре с разработчиками даст вам +1 к крутости. А на многих сайтах (например YouTube) используются сочетания именно из этого редактора. Однако реальность такова, что Vim - не современный инструмент, а популярность его поддерживается лишь благодаря старичкам и тем, кто любит выпендриваться.

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

Главный аргумент в пользу вима -Vim позволяет писать эффективно

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

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

Используем AHK

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

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

На обычной клавиатуре зачастую есть такая замечательная, очень бесполезная клавиша, какCapsLock. Почему бесполезная? Да потому что единственная ее функция - зажимать вместо вас клавишуShift. Ее любят в основном тролли в интернете и те, кто часто пишут SQL запросы. Зато неудобств от нее куча. Сколько раз вы проверяли, включен ли у васCapsLockперед вводом пароля? Как минимум раз так точно, а этого уже достаточно, чтобы ночью видеть кошмары.

Вердикт - "капсу" можно найти лучшее применение.

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

Вот как выглядит часть моегоскриптадля AutoHotkey

SetCapsLockState AlwaysOff; Basic movementCapsLock & j::Send {blind}{Left}CapsLock & l::Send {blind}{Right}CapsLock & i::Send {blind}{Up}CapsLock & k::Send {blind}{Down}; Fast moveCapsLock & u::Send {blind}{Up 5}CapsLock & n::Send {blind}{Down 5}; Fast deleteCapsLock & Backspace::Send {blind}{Backspace 5}CapsLock & Delete::Send {blind}{Delete 5}; Delete wordsCapsLock & w::Send {blind}^{Backspace}CapsLock & e::Send {blind}^{Delete}

А вот что он делает

capsKeys keyboard layoutcapsKeys keyboard layout

Если в Vim сочетания клавиш опираются на семантику, то в этом скрипте я опирался на удобство.

Чтобы попробовать, вы можете:

или

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

Особенности

Никакого больше переключения регистра.Строчные буквы по умолчанию! Это которые маленькие.

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

  • Caps+J- влево

  • Caps+i- вверх

  • Caps+L- вправо

  • Caps+K- вниз

  • Caps+U- вверх пять раз

  • Caps+N- вниз пять раз

  • Caps+Y- страница вверх (PgUp)

  • Caps+B- Страница вниз (PgDn)

Зажатый капс работает как Ctrl в случае с символами X, C, V.Так просто удобнее!

Вызов контекстного меню.Caps + P- позволяет вызвать контекстное меню. Очень полезная комбинация.

Перемещаемся по словамЧерезCaps+LeftAltиCaps+Space. Одно из самых часто используемых мной сочетаний, особенно вместе с зажатым Shift. Однако здесь есть недостаток. Так как мы затрагиваем функциональную клавишу, это меняет поведение Alt. Например, мы хотим использовать сочетаниеAlt+Upв VSCode и делаем это конечно же через AHK. То естьCaps+Alt+Up, но вот проблема, как только мы зажимаем первые две клавиши, все идет к чертям. Что делать? Тут есть два варианта. Можно использовать правый Alt то естьCaps+RightAlt+Upили сначала нажимать Alt а потом остальную часть сочетания.

Удаляем эффективноВы знали, что сочетаниеCtrl+Backspace,Ctrl+Deleteудаляет целые слова вместо символов? Я тоже, до недавнего времени. В скрипте есть целая линия клавиш выделенная для удаления.

  • Caps+Q- удалить все символы слева от курсора

  • Caps+W- удалить слово слева от курсора

  • Caps+E- удалить слово справа от курсора

  • Caps+R- удалить все символы справа от курсора

Фишки

  • Caps+A- Скопировать текущую строку и вставить снизу

  • Caps+S- Выделить слово на позиции курсора

  • Caps+D- Скопировать строку и удалить. Украдено прямиком из вима.

Работает вездеРаботает как в вашем редакторе кода, так и в любом другом текстовом поле. Запомнил один раз - пользуйся везде.

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

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

VSCode

Когда дело доходит до выбора редактора кода, то тут все решают личные предпочтения. Однако есть редактор, который придется по вкусу практически каждому, и это Visual Studio Code.

VSCode - опенсорсное творение Microsoft, написанное при помощи фреймворков для JavaScript/TypeScript. Из коробки это простенький красивый редактор кода, который позволит вам в считанные секунды начать писать что вздумается. А если прикрутить к нему расширения, которые регулярно пишутся и поддерживаются огромным сообществом, то то эта малышка даст жару любой профессиональной IDE.

Навигация

Ctrl+Bоткрыть / закрыть боковую панель.

Ctrl+Shift+E- открыть меню навигации.

Ctrl+Shift+D- открыть меню запуска. Используется во время дебаггинга.

Ctrl+Shift+Fменю поиска. Позволяет искать текст по всем файлам.

Ctrl+Shift+H- открыть меню замены. Брат Ctrl+Shift+F, но с функцией замены.

Ctrl+Shift+G- открыть меню контроля версий. Если у вас установлено расширение GitLens, то оно может изменить это сочетание.

Ctrl+J- открыть/закрыть панель.

Ctrl+Shift+X- открыть меню расширений.

Ctrl+(backtick)- открыть терминал.

Ctrl+Shift+M- открыть панель ошибок.

Ctrl+Shift+U- открыть консоль вывода.

Ctrl+Shift+Y- открыть консоль отладки.

Простые сочетания

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

F2переименовать определение / переменную / функцию синхронно. Одна из самых приятных возможностей в VSCode. Если вы передумали с названием переменной, это позволит изменить все места где используется эта переменная, учитывая контекст.

F8- переместиться к следующему проблемному месту в коде.

Ctrl+.- быстрое исправление ошибки. Если вы допустили какую-то распространенную ошибку, VSCode может исправить ее за вас. Очень удобно использовать в сочетании сF8.

F9- поставить точку остановки для дебаггера.

Ctrl+P- перейти к файлу.

Ctrl+R- открыть недавний проект / файл.

Ctrl+(,)- открыть настройки редактора.

Ctrl+Q- перейти в другую панель.

Ctrl+/- закомментировать строку.

Ctrl+T- переместиться к функции или переменной во всех файлах.

Ctrl+Shift+Oпереместиться к функции или переменной в текущем файле.

Ctrl+Home- переместиться к началу файла.

Ctrl+End- переместиться к концу файла.

Ctrl+Shift+\переместиться к соответствующей скобке.

Ctrl+Shift+N- открыть новое окно VSCode.

Alt+Left/Alt+Rightпереместиться к предыдущей / следующей активной строке. Когда вы скачете со строки на строку, VSCode запоминает это в своей истории, и вы можете быстро переключаться между самыми горячими местами в коде.

Alt+Up/Down- переместить строку вверх/вниз. Must have!

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

Alt+Z- переключить режим переноса строк.

Shift+Alt+F- автоматическое форматирование текста. VSCode поддерживает автоматическое форматирование для большинства языков. Нажатие этой клавиши подгонит ваш код под стандарты, принятые в Code style вашего языка.

Shift+Alt+O- упорядочить импорты в соответствии со стандартами вашего языка.

Ctrl+C- скопировать текущую строку, если нет выделения, иначе работает как обычное копирование.

Ctrl+X- вырезать строку, если нет выделения, иначе работает как обычная операция Cut.

Ctrl+Shift+Up/Down- скопировать выделенные строки вверх/вниз. Полезно, если вам нужно повторить какой-то блок кода несколько раз.

Ctrl+Alt+Right- переместить активный файл в соседнюю группу редактирования. Это позволит вам параллельно просматривать два или более файлов.Ctrl+Alt+Leftдвигает его обратно.

Ctrl+0- фокус на боковую панель.

Ctrl+{1, 2, 3, ..}- фокус на первую/вторую/третью группу редакторов. Если вы параллельно просматриваете два или больше файлов, это сочетание поможет вам переключаться между ними. Однако по своему опыту скажу, что больше двух редакторов никто обычно не открывает. Поэтому у себя я поменял сочетание для работы с двумя окнами редактирования и двумя терминалами.

Alt+{1, 2,..., 8}- переключиться между активными вкладками в окне редактирования. Обязательно к запоминанию!Alt+0открывает последнюю вкладку.

Ctrl+Space- активировать автоподстановку.

Shift+Ctrl+Space- открыть подсказку для параметров функции.

Посложнее

Alt+Ctrl+Up/Down- добавить курсор на верхнюю/нижнюю строку. Одна из особенностей современных редакторов. Позволяет редактировать текст одновременно в нескольких местах. Суперфича!

Ctrl+D- добавить курсор в конец следующего вхождения данного слова.

Alt+Click- добавить курсор в позицию указателя мыши.

Shift+Alt+(Dragging)- добавлять курсоры по пути следования указателя мыши.

Shift+Alt+Right- выделение с учетом контекста. Например, у нас есть длинное выражение внутри скобок, данное сочетание позволит нам выбрать все, что находится внутри них. Последовательные нажатия расширяют область выделения.

Shift+Alt+Left- действие, противоположное Shift+Alt+Right.

Ctrl+Shift+[- свернуть блок кода. Если файл стал слишком большим, и перемещаться стало слишком сложно, то данное сочетание позволит свернуть блоки текста, которые вам сейчас не нужны.

Ctrl+Shift+]- развернуть блок кода. Противоположно Ctrl+Shift+[.

Следующее сочетание отсутствует в сборке для Windows, но я рекомендую установить его вручную. У меня этоCtrl+Shift+J.

Нет(Win) /Ctrl+J(Mac) - присоединить следующую строку к текущей. По сути, все, что делает данная команда, так это удаляет символ переноса с текущей строки. Очень удобно, если вдруг нужно сжать html файл или еще что-то.

Ctrl+Shift+L- выделить все одинаковые слова и переместить курсор к концу каждого. Сильная штука, позволяет редактировать все вхождения определенного слова. Но стоит быть аккуратнее, если это слово встречается в качестве подстроки, то оно тоже будет изменено.

Ctrl+K Z- Включить Zen Mode. Для настоящих гуру.

Демонстрация

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

Заключение

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

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

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

Также, если у вас есть идеи по поводу улучшения скрипта для AutoHotkey, буду рад видеть ваши pull request-ы настранице репозитория.

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

Полезные ссылки

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru