Леонид Павлов. "It specialist's tricks"
14 subscribers
77 photos
7 videos
5 files
59 links
Keep calm, no spam.
Download Telegram
# Автогенерация версии через Git
В Git есть встроенная команда, которая берет ближайший тэг, отсчитывает кол-во коммитов с тех пор, и прибавляет sha1 текущего коммита.

итого, результат выполнения команды, на последнем коммите с sha1=foobar123, если ближайший tag был 15 коммитов назад, а название тэга было "v1.2.0"

$ git describe master
v1.2.0-15-foobar123


#protip #git #release #versioning
# Архив релиза
Как полезно использовать команду git describe? В совокупности с командой git archive.

$ git archive master --prefix='project/' | gzip > `git describe master`.tar.gz
v1.2.0-15-foobar123.tar.gz


На выходе получим архив с нашим проектом.
Для архивации в zip, нужно добавить аргумент --format=zip

#protip #git #release
# Changelog релиза
Можно собрать все сообщения ветки, в некую историю изменений, для отчетности или прикрепления к сообщению релиза.

$ git shortlog --no-merges master
Павлов Леонид (4):
Merged PR 8558: #6299 Проверка прав доступа при выполнении job
Merged PR 6958: #6289 Записывать и выдавать поле "Дата последнего изменения"
Merged PR 6956: #6192 Вынести логи с ошибками в отдельный файл
Merged PR 6941: #6166 Убрать поле TemplateId из метода GET

Еще можно взять только изменения, до предыдущего релиза (до определенного тэга)

$ git shortlog --no-merges master --not v1.2.0
Павлов Леонид (2):
Merged PR 8558: #6299 Проверка прав доступа при выполнении job
Merged PR 6958: #6289 Записывать и выдавать поле "Дата последнего изменения"

#git #protip #release #changelog #versioning
🔥1
# Split number to digits
Способы разделения int числа на цифры.

## Способ №1
Красивый.
Время выполнения: ~89.06ns
Время обработки ошибки: 2.130ns
Требования памяти: 248 B
public int[] Stack()
{
var list = new Stack<int>(32);
var remainder = digit;
do
{
list.Push(remainder % 10);
remainder /= 10;
} while (remainder != 0);

return list.ToArray();
}


## Способ №2
Быстрый.
Время выполнения: ~39.15ns
Время обработки ошибки: 0.861ns
Требования памяти: 64 B
public static int[] GetDigits(int n)
{
if (n == 0)
return new[] {0};

var x = Math.Abs(n);

var numDigits = NumberOfDigits(x);

var res = new int[numDigits];
var count = 0;

while (x > 0)
{
res[count++] = x % 10;

x /= 10;
}

Array.Reverse(res);

return res;
}

public static int NumberOfDigits(int n)
{
if (n >= 0)
{
if (n < 10) return 1;
if (n < 100) return 2;
if (n < 1000) return 3;
if (n < 10000) return 4;
if (n < 100000) return 5;
if (n < 1000000) return 6;
if (n < 10000000) return 7;
if (n < 100000000) return 8;
if (n < 1000000000) return 9;
return 10;
}
else
{
if (n > -10) return 2;
if (n > -100) return 3;
if (n > -1000) return 4;
if (n > -10000) return 5;
if (n > -100000) return 6;
if (n > -1000000) return 7;
if (n > -10000000) return 8;
if (n > -100000000) return 9;
if (n > -1000000000) return 10;
return 11;
}
}
# Энциклопедия численных последовательностей
https://oeis.org
Например:
По последовательности A005188, приводится следующая информация:
* Описание: Числа Армстронга (или плюсуперфектные, или Плюс совершенные, или нарциссические): m-значные положительные числа, равные сумме m-й степени их цифр.
* Формула (для Mathematica OEIS package): f[n_] := Plus @@ (IntegerDigits[n]^Floor[ Log[10, n] + 1]); Select[ Range[10^7], f[ # ] == # &]
* Формула программная, например для Python:
from itertools import combinations_with_replacement
A005188_list = []
for k in range(1, 10):
a = [i**k for i in range(10)]
for b in combinations_with_replacement(range(10), k):
x = sum(map(lambda y:a[y], b))
if x > 0 and tuple(int(d) for d in sorted(str(x))) == b:
A005188_list.append(x)
A005188_list = sorted(A005188_list)
А так же упоминания в книгах, научных статьях и применение в других алгоритмах последовательностей. Примеры последовательностей, комментарии к алгоритму.
Многие статьи wikipedia ссылаются в математических статьях, на этот сайт.
# L1, L2, L3 кэш процессора

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

Кэш процессора представляет собой промежуточную память, которая служит буфером между процессором и основной памятью компьютера. Он предназначен для хранения часто используемых данных и инструкций, что позволяет сократить время их доступа и увеличить общую производительность системы. Современные процессоры обычно имеют несколько уровней кэша: L1, L2 и L3, каждый из которых имеет свою специфику и предназначение.

L1 кэш - это самый быстрый и ближайший к процессору уровень кэша. Он используется для хранения данных и инструкций, к которым процессор обращается наиболее часто. Размер L1 кэша обычно составляет от 32 до 256 КБ и он разделен на две части: данные и инструкции.

L2 кэш - служит для хранения данных, к которым часто обращается процессор, но которые не находятся в L1 кэше. Этот уровень кэша находится на том же кристалле процессора, что и L1 кэш, и имеет размер от 256 до 512 КБ.

L3 кэш - является самым медленным уровнем кэша, но и самым большим. Он обычно располагается на другом кристалле, чем L1 и L2 кэши, и может иметь размер от 1 до 64 МБ. Этот кэш используется для хранения данных, которые нужны многим ядрам процессора одновременно, и позволяет увеличить общую пропускную способность системы.
# Node.js и многопоточность

Одной из основных проблем многопоточного программирования в Node.js является отсутствие истинной многопоточности. Вместо этого Node.js использует модель “event loop” (цикл событий), которая позволяет выполнять только один поток кода за раз. Это может привести к снижению производительности, особенно при выполнении длительных операций.

Event loop - это основной рабочий цикл в Node.js, который обрабатывает все входящие события и выполняет JavaScript-код. Он работает в одном потоке и не может быть заблокирован, чтобы не остановить обработку других событий.

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

Async/await не является истинной многопоточностью, так как JavaScript по-прежнему является однопоточным языком. Однако, использование async/await позволяет писать код более читаемым и удобным для понимания образом, имитируя многопоточность.
# C# и многопоточность

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

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

Использование пула потоков включает использование класса ThreadPool, а также вызов метода QueueUserWorkItem для использования ресурсов потоков.

ThreadPool.QueueUserWorkItem(Work, null);

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

WaitCallback callback = new WaitCallback(Work);
ThreadPool.QueueUserWorkItem(callback, null);
# async/await foreach

await foreach - это новый функционал, добавленный в C# 8.0, который позволяет асинхронно перебирать элементы коллекции, ожидая завершение асинхронных операций на каждой итерации.

Синтаксис await foreach выглядит следующим образом...

Читать далее...

https://wiki.lpavlov.site/en/CSharp/await_foreach
Решил интересную кату/задачу по проектированию FSM.
Отличная проверка архитектурного мышления.

Сама задача -> https://www.codewars.com/kata/54acc128329e634e9a000362

Мое решение -> https://www.codewars.com/kata/reviews/5d7c35e601af060001599d37/groups/654a88f4becce60001e47304

Что такое FSM (Finite State Machine) -> https://wiki.lpavlov.site/en/Концепты/FiniteStateMachine

#kata #задача #архитектура
Отличная задача на тренировку работы со строками, символами и индексами.

"Шифр Rail Fence используется для кодирования строки путем размещения символов по диагонали вдоль направляющих."

Например фраза It specialist's tricks by Leonid Pavlov с некоторой глубиной шифрования будет выглядеть так:
- depth 2: I pcaitstik yLoi alvtseils' rcsb endPvo
- depth 10: Iiltrcvo tkavs sPps e'bdctyiis naiLole
- depth 20: Ivto lsvpaePc idailniosetL' sy bt rsikc

Сама задача -> https://www.codewars.com/kata/58c5577d61aefcf3ff000081

Мое решение -> https://www.codewars.com/kata/reviews/5d712e8b19977500018f09f5/groups/654d0e3063e3da0001a39674

#kata #задача #строки #индексы
Знаете, какой будильник ставит себе ПМ, чтобы проснуться хоть в 4 утра?
Отложку на 04:01 с раскаткой релиза на прод, где точно есть критичный баг.

#fun_minute
🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
# Weekend coding
Написал тут для себя приложение для смарт-часов, для работы по 🍅 Pomodoro подходу.

🏳️ Статья с процессом и демонстрацией промежуточных результатов: -> https://wiki.lpavlov.site/en/Kotlin/Guides/PomodoroApp

💻 Исходники: -> https://github.com/Zefirrat/PomodoroWatch/blob/master/README.md

язык в копилочку (🖼️Kotlin)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Один из моих ответов догнал принятый ответ, по баллам.
Еще и под конец года держусь в топ 20% пользователей.
Неплохо!
🔥1
Привет! Я представляю вам свой горячий проект – умный Telegram-бот, основанный на передовой технологии GPT! 🌐

🚀 Молниеносные Ответы: Получайте мгновенные и точные ответы на ваши вопросы.
📚 Генерация Текстов: Создавайте уникальные и качественные тексты в один миг.
🌐 Многофункциональность: Будь то помощник в учебе, генератор идей или просто компаньон в разговоре – мой бот всегда рядом.
🤖 Технология GPT: Мой бот основан на передовой технологии GPT, гарантируя выдающуюся точность и контекстность.
🌟 Легкость Использования: Без сложных шагов или капч – просто отправьте запрос и получайте результат!

Присоединяйтесь к моему боту и откройте для себя новые горизонты текстового взаимодействия! 💬🚀

Напишите "Привет", чтобы начать! 🌟

https://t.me/TextCraftGptBot

PS. Да, это сообщение написано с помощью бота. Налетай, пока бесплатно!
🔥3
В новой версии магазина приложений Microsoft Store для Windows 10 и Windows 11 команда разработчиков Microsoft перешла с React на Shoelace, Lit и Vite на ASP.NET, заменив ими предыдущие технологии. Это изменение коснулось фронтенда и серверной части приложения.

В комментариях к одной из статей на Хабре пользователи обсуждают преимущества связки Vite и ASP.NET Core. Предполагают, что это может быть хорошим решением.
👍1🤯1
Boilerplate код — это повторяющиеся фрагменты программного кода, которые обычно используются в начале или в конце различных частей программы. Boilerplate код может включать в себя различные стандартные процедуры, такие как инициализация переменных, обработка ошибок, вывод на экран и другие.

Вот несколько примеров boilerplate кода:

- Инициализация переменных:
int x = 0;

x = 0


- Обработка ошибок:
try {
// код
} catch (error) {
console.log(error);
}

try {
// код
} catch (Exception e) {
System.out.println(e);
}


- Вывод на экран:
print("Hello, world!")

console.log("Hello, World!");
Не думал, что бэк может билдится дольше фронта, но когда нужно сделать билд под windows - все меняется...
Shebang — это последовательность символов, которая используется в Unix-подобных операционных системах для обозначения начала исполняемого файла. Она состоит из двух символов: #!, за которыми следует имя программы.
Например для shell:
- #!/bin/sh
- #!/bin/bash

Shebang позволяет операционной системе найти и запустить программу без указания полного пути к ней.
🔍 Давайте поможем людям найти кнопку скачивания, в 🌐 Internet Explorer
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1