Очень хорошие пояснения есть в статье Docker performance on Azure Pipelines agents: несколько образов я собрал для внутреннего использования и они сделаны на основе mcr.microsoft.com/windows/servercore:ltsc2019 и mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2019.
DanIgnatov
среда, 13 ноября 2024 г.
Какие любопытные грабли случаются в работе с Docker образами: вроде тот docker образ, а оказывается что не тот
пятница, 1 ноября 2024 г.
Javascript: ниндзя-код в javascript с помощью "hoisting"
Декларация языка javascript позволяет сделать очень много комбинаций из разнообразных выражений и по мнению компилятора/интерпретатора все они будут вполне законны и будут выполняться без ошибок.
Некоторые из них хорошо описаны в статье Ниндзя-код, но пару дней назад мне попался не знакомый мне вариант, который заставил меня усомниться в моих знаниях javascript
Вот этот код (страничка в браузере):
<body>
<script>
window.myproj = {};
window.myproj.func1 = () => {
alert(getFirstName());
}
</script>
<script>
window.myproj.func2 = () => {
myproj.func1(
getFirstName = () => { return "Alex"; },
);
}
</script>
<script>
window.myproj.func2();
</script>
</body>
Можно ли по коду сказать что покажет в диалоге func2?
Я не смог.
четверг, 24 октября 2024 г.
Функции должны возвращать код ошибки (или "throw new Exception")
Например, функция должна сделать выделение строки в гриде:
public CollectionView SelectRow(int index) {
var gridElement = driver.FindElementWithWait(_xPath);
var rowElements = gridElement.FindElements(By.CssSelector(".collection-row"));
if(rowElements.Count > index)
rowElements[index].Click();
return this;
}
четверг, 11 июля 2024 г.
Отрефакторить или написать с нуля?
Попался любопытный фрагмент кода, который должен реализовать копирование из одного двумерного массива в другой:
let selection = null; const func1 = (s, e) => { switch (e.command) { case 'paste': { destSelection = s.getSelection(); sourceSelection = { ...selection }; do { i = 0; do s.SetCellValue(destSelection.leftColumnIndex + (i++), destSelection.topRowIndex, s.getCellValue(sourceSelection.leftColumnIndex, sourceSelection.topRowIndex) ?? ''); while (sourceSelection.rightColumnIndex > sourceSelection.leftColumnIndex++); destSelection.topRowIndex++; sourceSelection.leftColumnIndex = selection.leftColumnIndex; } while (sourceSelection.bottomRowIndex > sourceSelection.topRowIndex++); } break; case ... } };
Добавлено много граблей в коде копирования значений между массивами.
понедельник, 18 апреля 2022 г.
Stripe в стартапе: какой вариант интеграции выбрать?
Stripe (https://stripe.com/) - это не только платежная система со своим апи, но и готовые UI элементы и готовый web интерфейс для работы с платежами. Можно сделать удобный/красивый/функциональный платежный сервис прямо на своем сайте и на все платежные сценарии (включая refund).
суббота, 16 апреля 2022 г.
Любопытные грабли в JS: что вернет конструкция () => { name: 'my name' } ?
Мне было лень написать return и вокруг всего ставить еще одну пару фигурных скобочек, поэтому я решил сэкономить на них.
И получил 'null'.
Для меня это оказалось неожиданностью и я тщательно проотлаживал весь код вокруг этой функции в поисках ошибки или опечатки... И опечатка действительно есть, только она оказалась внутри этой анонимной функции: компилятор считает, что фигурные скобки открывают тело функции, внутри которой нет никакого 'return value'. Действительно должен быть null.
Что бы все таки получить из функции объект и при этом не писать явный return и новые фигурные скобки нужно написать так:
() => ({ name: 'my name' })
В новом варианте компилятор правильно решит, что мне лень написать фигурные скобки и 'return' и он сделает мой объект результатом выполнения функции.