Почему-то очень многие путают два разных понятия: работник на краткосрочном контракте со сдельной оплатой (фрилансер) и постоянный работник, который работает дистанционно…
Уже много раз слышал от знакомых выражения, где эти два понятия использовались как синонимы. Но это совершенно не так.
Можно работать дистанционно, но при этом быть постоянным штатным сотрудником с зарплатой. По крайней мере до пандемии, найти такую позицию было сложнее, чем короткий контракт, но потом всё было значительно проще. На фрилансе, нужно постоянно искать новых заказчиков, браться за проекты, причём часто параллельно, чтобы не упустить заказ. Это совсем не тоже самое, что просто работать из дома на постоянной работе
Чтобы результаты тестов скорости можно было сравнить, надо взять тесты корректности оригинальной версии wc, написать на хаскеле программу, которая все оригинальные тесты пройдет. То есть будет иметь точно такой же функционал. А только потом имеет смысл сравнивать скорость.
Иначе как в прошлый раз, так и сейчас, сравниваются яблоки с апельсинами
Проблема не только в Startup, ещё есть места, где требуется вызов async кода в синхронных методах. И везде в таких случаях использование GetResult может вести к дедлокам
Недавно решал такую же задачу. Сначала очень хотелось сохранить асинхронность вызовов, делал всякие хаки типа вызова конфигурации после создания хоста, но до его старта. Это даже работало. Но как правильно упомянули — это не очень понятно для тех, кто потом будет читать код.
В итоге сделал элементарную обёртку:
public static class RunSyncUtil
{
private static readonly TaskFactory factory = new
TaskFactory(default,
TaskCreationOptions.None,
TaskContinuationOptions.None,
TaskScheduler.Default);
public static void RunSync(Func<Task> task)
=> factory.StartNew(task).Unwrap().GetAwaiter().GetResult();
}
И в нескольких местах проекта, где раньше вызывался GetAwaiter().GetResult() заменил на такой вызов. Таким оразом мы явным образом берём поток из ThreadPool и уже на нём выполняем блокировку GetResult
Делать это пришлось не только из-за эстетических соображений, но ещё потому что у нас зависали интеграционные тесты. Дело в том, что сам по себе asp.net core не устанавливает никакой специальный SynchronizationContext, поэтому в нём можно без последствий вызывать GetAwaiter().GetResult(). Но XUnit применяет свой хитрый контекст для контроля параллельного выполнения теста и тут мы легко приходим к дедлоку.
Кстати, есть баг, который описывает потенциальное решение проблемы github.com/dotnet/aspnetcore/issues/5897 но пока его не хотят исправлять и это печально
Хочется увидеть описание реального проекта, где ручное создание потока с нестандартным приоритетом решило проблему, по сравнению с простым запуском того же потока через Task.Start
Очень длинно и подробно описаны приоритеты потоков, но совершенно не раскрыто зачем это всё нужно знать программисту на C#? Точнее, я ещё хоть как-то могу понять зачем внутри своей программы создавать потоки с разными приоритетами, но зачем знать их приоритет с потоками других процессов ума не приложу. Более того, мне действительно сложно представить ситуацию где практически будет полезно создавать потоки и управлять их приоритетом в современном C# приложении. Было бы очень полезно, чтобы цикл статей начинался именно с обоснования зачем это нужно. Иначе не ясно, почему бы не использовать Task.Start везде и не думать о потоках
Например потому что, в компании может быть принята политика сквозного шифрования и этот сертификат применяется не только снаружи, но и внутри кластеров
В целом согласен, надо будет почитать их post mortem. Даже если сертфикаты лежат в волте и в случае такого инцидента можно зайти и руками поменять, то так просто всё равно не сработает, т.к. нужно чтобы сервисы перечитали сертификаты, они это делают либо по таймеру, либо при запуске. Значит нужно «нажать кнопку CI», только для тысячи серверов это означает подождать пару суток. Ведь нельзя просто перезагрузить все сервера в один момент, деплой идёт волной, обычно не более 5% сервисов одного типа обновляются, после обновления система ждёт некоторое время, чтобы увидеть зелёный мониторинг. В итоге, полная выкатка релиза на все окружения вполне может занимать несколько дней, это не ручная работа, всё полностью автоматизировано, с проверками и автоматическим откатом в случае проблем. Чтобы выпустить хотфикс за 5 часов и ничего не сломать придётся что-то хитрое сделать
То что такой инцидент допустили это несомненно большая проблема и её тоже будут решать. А вот, то что на сервис с 20млн активных пользователей и сотнями, а если не тысячами серверов смогли выпустить фикс за 5 часов, это значит что работа команды разработки и развёртывания проделана на отлично. Тимс это не домашняя страничка на ПХП, куда можно просто зайти терминалом, подменить один файлик и перезапустить сервер
Ещё один факт о большом или небольшом спросе на программистом. Я поступал в университет в 2000 году, в тот год во всех институтах Москвы был рекордный конкурс на специальности связанные с математическим обеспечением, информационными системами и так далее. Например на мою специальность проходной балл был 44 из 60 (4 экзамена по 15 баллов). Хотя в другие годы балл был в районе 35. Так что у нас уже в 99-2000 специальность программиста была популярна.
Про Дельфи у меня был забавный опыт. Как и многие в то время, я начинал учить программирование с Паскаля и было вполне логично дальше учить Дельфи, т.к. я уже знал основы синтаксиса и надо было только научиться делать формочки.
Но где-то в 2001 году к нам привезли новый шкаф купе и пока ребята собирали его, я разговорился с одним из них. С его слов, он был программистом на Дельфи, рассказывал как и что там учить, куда развиваться… Но в середине буднего дня почему-то занимался сборкой шкафа купе у меня дома :) В общем, впечатление о Дельфи он у меня испортил.
Во первых зарплаты Питера и Москвы не так уж сильно отличаются. Точно не в 10 раз. Во вторых, в статье в пример приводится найм разработчика на аутсорс американской компанией. Опять же, им всё равно в каком городе сидит разработчик.
Скорее типичная ошибка, это брать среднюю зарплату по городу за ориентир. Программисты и тогда и сейчас получали гораздо больше средней зарплаты. Сейчас в Москве средняя в районе 60000р, а теперь смотрим на вакансии здесь же в боковой табличке: 100-150тыр легко, мидл или сеньор дев с опытом лет 5-6, то есть возраст 25-30 лет, смотря когда начал работать. Причем многие позиции не в Москве
В зарплатах ошибка на порядок. Я лично вышел на свободу первую в жизни работу внутри института, с возможностью отлучаться на учебу и после испытательного срока платили 6000р, то есть 200$. Это был 2002 год. Мои одногруппники, которые вышли на полный день в коммерческие компании типично получали по 400$, то есть уже около 12000р. И это были зарплаты студентов 2-3 курса. Опытные программисты легко могли получать 2000$, тем более при работе на американских заказчиков
По качеству чтения меня всё полностью устраивает. Китайский модуль может выдать не больше 120 чтений в секунду, это в два раза меньше, чем alien, но самый важный параметр — разрыв между последовательными чтениями такой же — 30мс в среднем. Проводил уже 3 тестовых заезда, всё отлично читается. За счёт использования orange pi удалось сделать компактную систему, которая работает от батареи
Вот такой модуль http://chafon.com/productdetails.aspx?pid=669
Купил за 13000р без блока питания, без тестовой платы, только то что на первом фото.
Там же можно скачать документацию на протокол и тестовый код.
Мой софт поддерживает этот ридер, я не реализовал все команды, т.к. не все мне нужны. Например не сделана запись данных на метки, но это легко добавить, весь базовый код общения с ридером есть.
Чтобы модуль заработал, нужно его к чему то подключить по ttl 3.3v, и подать питание 5 вольт 2 Ампера. У меня он например от usb порта ноутбука работает. Для подключения к ноутбуку заказывал адаптер на cp201… что-то там. Но они потерялись по дороге :( в итоге модуль работает в связке с orange pi prime на armbian. Для отладки с компьютера написал микроскопическую программу, которая слушает на tcp сокете и передаёт сырой поток байтов туда обратно в последовательный порт. Внезапно оказалось, что именно так и работает китайская оригинальная программа. То есть их демо софт скачанный с сайта спокойно подключается и работает с моим туннельчиком по сети. Это сильно облегчило жизнь, потому что вначале приходилось сниффить последовательный порт для уточнения некоторых деталей протокола, а это не так удобно.
В условиях гонки невозможно считывать метку в 100% случаев, очень хороший результат это 90%
Гонка это не склад и не конвейер :) Там есть грязь, вода, физические повреждения меток.
Опять же оборудование установлено не стационарно, оно разворачивается в поле за пару часов до начала заедов и потом обратно убирается в коробки, это тоже сильно влияет на надёжность. Свободно висящие провода, питание от прикуривателя автомобиля. Есть куча вариантов, почему связь с ридером может оборваться
Уже много раз слышал от знакомых выражения, где эти два понятия использовались как синонимы. Но это совершенно не так.
Можно работать дистанционно, но при этом быть постоянным штатным сотрудником с зарплатой. По крайней мере до пандемии, найти такую позицию было сложнее, чем короткий контракт, но потом всё было значительно проще. На фрилансе, нужно постоянно искать новых заказчиков, браться за проекты, причём часто параллельно, чтобы не упустить заказ. Это совсем не тоже самое, что просто работать из дома на постоянной работе
Чтобы результаты тестов скорости можно было сравнить, надо взять тесты корректности оригинальной версии wc, написать на хаскеле программу, которая все оригинальные тесты пройдет. То есть будет иметь точно такой же функционал. А только потом имеет смысл сравнивать скорость.
Иначе как в прошлый раз, так и сейчас, сравниваются яблоки с апельсинами
Проблема не только в Startup, ещё есть места, где требуется вызов async кода в синхронных методах. И везде в таких случаях использование GetResult может вести к дедлокам
В итоге сделал элементарную обёртку:
И в нескольких местах проекта, где раньше вызывался GetAwaiter().GetResult() заменил на такой вызов. Таким оразом мы явным образом берём поток из ThreadPool и уже на нём выполняем блокировку GetResult
Делать это пришлось не только из-за эстетических соображений, но ещё потому что у нас зависали интеграционные тесты. Дело в том, что сам по себе asp.net core не устанавливает никакой специальный SynchronizationContext, поэтому в нём можно без последствий вызывать GetAwaiter().GetResult(). Но XUnit применяет свой хитрый контекст для контроля параллельного выполнения теста и тут мы легко приходим к дедлоку.
Кстати, есть баг, который описывает потенциальное решение проблемы github.com/dotnet/aspnetcore/issues/5897 но пока его не хотят исправлять и это печально
Давно хочу написать статью на эту, только немного подробнее
Ведётся, например я работаю в Москве и занимаюсь проектом Azure Notification Hubs.
Но где-то в 2001 году к нам привезли новый шкаф купе и пока ребята собирали его, я разговорился с одним из них. С его слов, он был программистом на Дельфи, рассказывал как и что там учить, куда развиваться… Но в середине буднего дня почему-то занимался сборкой шкафа купе у меня дома :) В общем, впечатление о Дельфи он у меня испортил.
Во первых зарплаты Питера и Москвы не так уж сильно отличаются. Точно не в 10 раз. Во вторых, в статье в пример приводится найм разработчика на аутсорс американской компанией. Опять же, им всё равно в каком городе сидит разработчик.
Скорее типичная ошибка, это брать среднюю зарплату по городу за ориентир. Программисты и тогда и сейчас получали гораздо больше средней зарплаты. Сейчас в Москве средняя в районе 60000р, а теперь смотрим на вакансии здесь же в боковой табличке: 100-150тыр легко, мидл или сеньор дев с опытом лет 5-6, то есть возраст 25-30 лет, смотря когда начал работать. Причем многие позиции не в Москве
В зарплатах ошибка на порядок. Я лично вышел на свободу первую в жизни работу внутри института, с возможностью отлучаться на учебу и после испытательного срока платили 6000р, то есть 200$. Это был 2002 год. Мои одногруппники, которые вышли на полный день в коммерческие компании типично получали по 400$, то есть уже около 12000р. И это были зарплаты студентов 2-3 курса. Опытные программисты легко могли получать 2000$, тем более при работе на американских заказчиков
По качеству чтения меня всё полностью устраивает. Китайский модуль может выдать не больше 120 чтений в секунду, это в два раза меньше, чем alien, но самый важный параметр — разрыв между последовательными чтениями такой же — 30мс в среднем. Проводил уже 3 тестовых заезда, всё отлично читается. За счёт использования orange pi удалось сделать компактную систему, которая работает от батареи
Вот такой модуль http://chafon.com/productdetails.aspx?pid=669
Купил за 13000р без блока питания, без тестовой платы, только то что на первом фото.
Там же можно скачать документацию на протокол и тестовый код.
Мой софт поддерживает этот ридер, я не реализовал все команды, т.к. не все мне нужны. Например не сделана запись данных на метки, но это легко добавить, весь базовый код общения с ридером есть.
Чтобы модуль заработал, нужно его к чему то подключить по ttl 3.3v, и подать питание 5 вольт 2 Ампера. У меня он например от usb порта ноутбука работает. Для подключения к ноутбуку заказывал адаптер на cp201… что-то там. Но они потерялись по дороге :( в итоге модуль работает в связке с orange pi prime на armbian. Для отладки с компьютера написал микроскопическую программу, которая слушает на tcp сокете и передаёт сырой поток байтов туда обратно в последовательный порт. Внезапно оказалось, что именно так и работает китайская оригинальная программа. То есть их демо софт скачанный с сайта спокойно подключается и работает с моим туннельчиком по сети. Это сильно облегчило жизнь, потому что вначале приходилось сниффить последовательный порт для уточнения некоторых деталей протокола, а это не так удобно.
Гонка это не склад и не конвейер :) Там есть грязь, вода, физические повреждения меток.
Опять же оборудование установлено не стационарно, оно разворачивается в поле за пару часов до начала заедов и потом обратно убирается в коробки, это тоже сильно влияет на надёжность. Свободно висящие провода, питание от прикуривателя автомобиля. Есть куча вариантов, почему связь с ридером может оборваться