Как стать автором
Обновить
20
0
Леонид @SLenik

TeamLead/.NET Developer

Отправить сообщение

Один из вариантов пути, которым автор мог прийти к текущему коду при изучении EF Core

  1. Загуглить как пользоваться EF Core - вылез бы overview

  2. Увидеть там ТОЧНО ТАКИЕ ЖЕ примеры с using-ом контекста. Использовать их и на их основе писать статью.

А теперь давайте сравним этот код - и код из примера в другом разделе Get started with ASP.NET Core MVC

Случайно заметим, что _context там создаётся не в начале метода - а в конструкторе контроллера.

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

Вот так, постепенно, и можно собрать информацию на статью - максимально полное описание.

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

А я буду держать кулачки за то, чтобы автор продолжил свою работу по изучению интересных ему тем - и с каждым новым разом разборы получались чуть глубже ;)

Приветствую!

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

у руководителя что-то щелкнуло, меня "оградили" от этого

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

При наличии JavaScript - разумеется есть. Поищите: в интернете есть несколько проектов конвертеров md -> html.

Лично мне чисто по описанию понравился https://github.com/showdownjs/showdown. Его можно использовать как в бэкенде (node.js), так и прямо в браузере. Примеры есть в самом репозитории.

Увидев в статье, что автор разбирал камеру на чипе ANYKA AK3918EN080 я аж встрепенулся =)

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

  • чип ANYKA AK3918EN080,

  • WiFi Realtek RTL8188US,

  • флеш BH1634 25Q64CS16.

А вот так эта камера выглядит в неразобранном виде:

И это не шутка: коллекционка Mass Effect Andromeda сделана на базе поворотной камеры на чипе ANYKA - просто поворотный механизм заменили на приличной такой мощности двигатели.

API управления простой как три копейки (он по их приложению для Android реверс-инжинирится вообще без проблем). Но вот "влезть" в прошивку чтобы поменять поведение у меня пока руки пока не дошли (да и боюсь немного - дампа исходной прошивки пока нет).

Поэтому расскажите: не пробовали ли вы к текущему моменту собрать модифицированную прошивку? Если пробовали, не поделитесь ли инструкцией?

Или это просто был шаг обучения и продолжать работать именно с подобным устройством вы не будете?

UPDATE. Более подробное изучение темы показало, что venv будет менее удобен при наличии зависимостей от не python библиотек.

Например, использование того же плагина with-pdf требует наличия в системе пакетов pango, для русского языка ttf-ubuntu-font-family, а также некоторых других (полный список есть в статье) - и вот это всё придётся всё равно ставить в основную систему.

А в случае докера это всё-таки можно "спрятать" в образ.

не в тот тред добавил сообщение

Спасибо за вопрос!

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

Я предпочитаю класть картинки в подпапку ./images.

Посмотрите пример в нашем репозитории https://gitlab.com/Rostelecom-IT/help-camera-rt/-/tree/master/desktop-app/docs/application_modes:

В файле index.md есть, к примеру, ссылка на картинку shortcut_internet_mode.png, расположенную в подпапке images. И вот как выглядит добавление картинки в самом файле:

![Обычный режим (онлайн, оффлайн)](./images/shortcut_internet_mode.png)

Поверьте, автор не хотел ничем блеснуть =)

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

Поэтому благодарю за интересное предложение!

Наверное, можно предложить и разработчикам mkdocs добавить такой вариант прямо на страницу getting started - а не только сослаться на подобный метод в одном из абзацев раздела troubleshooting-а.

Где как на самом деле.


Замечу, что мы — команда разработки десктопных приложений для Windows, поэтому сборка и выкладка docker-образов пока что не про нас (вот ASP.NET Core команда — это другое дело, может скоро и их затащим).


В общем:


  1. Кое-где закидываем через SSH (job-а запускается под linux и scp-шкой закидывает нужные файлы).
  2. Кое-где кидаем через WebDAV (job-а запускается также под Linux и у нас кто-то, примонтировав через davfs2 закидывает rsync-ом, а кто-то типа меня через кастомный скрипт на powershell core).

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


Обновлятор при запуске ПО и/или раз в некоторый интервал времени лезет на сервер, смотрит нет ли новой версии и, если есть, скачивает её инсталлер и даёт пользователю выбор: запустить сразу или запустить после закрытия программы (эта же идея, к примеру, в Paint.NET реализована).

И да: там важно переключить окружение в Developer Powershell не только из-за msbuild, но и чтобы другие утилиты Visual Studio стали доступны. Например, signtool для подписи файлов.

И насчёт того, что у Nuke есть интеграция с semver.


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


Поэтому и решили остаться на текущем варианте.

Большое спасибо за отличный вопрос!


Про портянки: здесь сложилось отсутствие в markdown оформления без переноса строк, а также моё желание "схлопнуть" весь код в с подробными комментариями в один файл (для удобства понимания).


Если открыть файл .gitlab-ci.yml в репозитории, можно убедиться, что файл без комментариев о структуре со сборкой, вызовом unit-тестов, git describe а также отправкой результатов в Telegram (упс, спойлер) занимает всего 84 строки.


Согласен, некоторые строки длинные. Тот же SonarQube требует передачи ему семи параметров с длинными мнемоническими именами (например, /d:sonar.cs.opencover.reportsPaths="$env:OPENCOVER_REPORT_FILE_PATH").


Но всё равно код достаточно простой, читаемый. И главное: его можно нарезать кусочками и добавить в любой уже рабочий Gitlab CI без подтягивания лишних зависимостей.


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


Почему мы её не использовали сразу? Дело в том, что для нашего проекта CI/CD создавался по моим шаблонам ещё в 2018 году, а о Nuke и его презентации на dotNext в 2017м, мы, к сожалению, услышали чуть позже.


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


  • нашим специалистам DevOps удобнее поддерживать код Powershell, чем C#,
  • существует PowerShell Gallery, в которой модно выкачать модули с очень полезными командлетами. И добавление этих модулей проще.

    Например, для того, чтобы отправлять сообщения в слак, надо:
  • один раз установить модуль командой Install-Module PSSlack
  • дописать в код проверку наличия модуля и отправку сообщений (код примерный):
    if (Get-Command "Send-SlackMessage") {
    Send-SlackMessage -Uri "$env:SLACK_URI_WEBHOOK" -Text "Сборка ветки $env:CI_COMMIT_REF_NAME.`n`nСкачать $env:CI_JOB_URL.`n`nИзменения $env:CI_PROJECT_URL/blob/$env:CI_COMMIT_REF_NAME/CHANGELOG.md""
    }

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


В этот момент мы можем свалиться в холивар "на чём удобнее писать скрипты — на C# или Powershell", поэтому я не буду продолжать эту тему)


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


Про ужас с поиском исполняемого файла VS отвечу: так Nuke точно также ищет msbuild если ему это требуется =)

  • Если вы пользуетесь браузером с синхронизацией вкладок между устройствами (Opera, Safari) — вы передаёте информацию о посещениях нанятым разработчиками браузера людям, которые могут и проанализировать эти данные.
  • Если вы пользуетесь браузером со встроенным блокировщиком рекламы или устанавливаете его самостоятельно — вы передаёте информацию о посещениях нанятым разработчиками блокировщика людям, которые могут и проанализировать эти данные.
  • Если вы заходите на сайт, на котором есть авторизация через сервисы гугла, яндекса или иные — вы передаёте информацию о посещении нанятым разработчиками механизма авторизации людям, которые могут и проанализировать эти данные.
  • Забыли деавторизоваться в соц. сети? — через кнопочку "поделиться" (просто потому, что она там есть, а не когда вы её нажимаете) вы передаёте информацию о посещении нанятым разработчиками соц.сети людям, которые могут и проанализировать эти данные.
  • Не стоит забывать о том, что сама ОС может собирать анонимную статистику.
  • Ну и вишенка на торте — поверхностный анализ (иди даже модификация) трафика вашим провайдером.

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


Но если вы:


  • поставили себе Linux с отключенной аналитикой,
  • сидите через шифрованный VPN-туннель со всех устройств (включая мобилки),
  • везде поставили браузер, не отправляющий никуда лишней статистики,
  • везде поставили плагин, который обрезает "следящие" кнопки, а также рекламу (при этом не делая запросы вообще куда-либо кроме сервиса для обновления списка рекламных ссылок),

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


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

Ещё пару предложений из моего опыта (напишу тезисно):


  1. Проверять DPI скринов. Все скриншоты должны быть сняты с мониторов одним и тем же DPI.
  2. Подписи к картинкам (alt) — это крайне важная штука для понимания.
  3. Ссылки внутри документации. По умолчанию следует добавить/сгенерировать на каждый заголовок уровней H1-H2.
  4. Термины и определения. Если подобное требуется, либо выносим в отдельный раздел + добавлять ссылку на каждое использование термина. Либо выделите первое/каждое вхождение в статье термина — и пусть по нажатию/наведению появляется всплывающее окно с текстом определения.

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


Также много интересных фишек можно подсмотреть в руководстве по написанию документации на docs.microsoft.com (https://docs.microsoft.com/ru-ru/contribute/markdown-reference)

NWOcs, посмотрев на исходный код проверок запусков процесса, кажется, может быть ещё один достаточно простой способ обхода: переименовать исполняемый файл блокируемого ПО (так как проверки завязаны на него, а не на заголовки окон ClassName-ы). Например, переименовать Skype.exe в Explorer.exe (проверил: скайпу всё равно как называется его исполняемый файл).


PS. К сожалению, с данным софтом не знаком от слова совсем — потому не могу оперативно проверить сам.

mayorovp, прошу прощения, я привёл неверный пример. lair в комментарии ниже привел правильный.

Наверное, мои вопросы будут скорее к оригиналу, нежели к Вашему переводу. Но всё же.


  1. Отсутствует полный исходный код примеров. В частности, что в оригинале, что в переводе отсутствует код метода PassTheTime.


  2. Асинхронность в .net, к большому сожалению не настолько проста, как описывается в статье =(( Наверное, стоило бы в заключение дать ссылки либо на другие примеры использования, либо на более глубоко разбираемые примеры по async-await.



В приведенном примере синхронного кода если, например, внутри метода BakeCake() вывалится Exception — это прервет выполнение всех последующих методов.


А вот для асинхронного кода уже начинаются вариации. Похожий пример описан в блоге Stephen Cleary: https://blog.stephencleary.com/2016/12/eliding-async-await.html (раздел Exceptions).


Поясню на примере.


Пусть код метода BakeCakeAsync выглядит так:


public static async Task<bool> BakeCakeAsync(bool isPreheated)
{
  if (!isPreheated)
    throw new InvalidOperationException("before 1st await");
  var result = await InnerBakeCakeAsync(isPreheated).ConfigureAwait(false);
  if (isPreheated)
    throw new InvalidOperationException("after await");
  return result;
}

Так вот: если метод вызовется isPreheated = true, то исключение в основном методе "поймается" на строке


Task<bool> bakeCakeTask = BakeCakeAsync(isPreheated);

И AddFrostingIngredients не будет вызван.


А вот если вызвать BakeCakeAsync вызовется с isPreheated = false, то исключение "поймается" уже только на строке с await-ом:


bool isBaked = await bakeCakeTask;

И получается, что AddFrostingIngredients вполне себе успеет выполниться


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

Большое спасибо за перевод! Чисто из любопытства: почему не сдали делать 1 туториал=1 статья?


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


Также вы, кажется, пропустили в первом туториале сноску


Тут фишка в том, что для удобства (в том числе и, наверное, чтения кода), в свежем ffmpeg-е функцию avcodec_decode_video2 даже заменили на пару функций:


  • avcodec_send_packet() [скормить пакет в ffmpeg] и
  • avcodec_receive_frame() [получить декодированный кадр].

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


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

1

Информация

В рейтинге
Не участвует
Работает в
Зарегистрирован
Активность