#db
DSN (data source name)/URI for DB
general specification RFC-1738
https://www.ietf.org/rfc/rfc1738.txt
PostgreSQL
https://docs.sqlalchemy.org/en/20/core/engines.html
DSN (data source name)/URI for DB
general specification RFC-1738
https://www.ietf.org/rfc/rfc1738.txt
PostgreSQL
dialect+driver://username:password@host:port/database
https://docs.sqlalchemy.org/en/20/core/engines.html
#psy
Техника концентрации
Белый шум
https://youtu.be/h7Bdfv8Iagw?si=H_r1epGc62hTsETT
Шум в голове 🔻
Спокойствие ⏫
15 мин
https://youtu.be/mD3QwerSmLs?si=pWbgl1cZIuXDd0-X
Яндекс музыка
https://music.yandex.ru/users/music-blog/playlists/1956?utm_medium=copy_link
В YM под кнопкой паузы, через иконку таймера можно поставить время до отключения трека, чтобы включить белый шум и лечь спать в наушниках если требуется
Так же непроверенного, но если положить половины шарика для пинг-понга на глаза то можно начать видеть галлюцинации
Техника концентрации
Белый шум
https://youtu.be/h7Bdfv8Iagw?si=H_r1epGc62hTsETT
Шум в голове 🔻
Спокойствие ⏫
15 мин
https://youtu.be/mD3QwerSmLs?si=pWbgl1cZIuXDd0-X
Яндекс музыка
https://music.yandex.ru/users/music-blog/playlists/1956?utm_medium=copy_link
В YM под кнопкой паузы, через иконку таймера можно поставить время до отключения трека, чтобы включить белый шум и лечь спать в наушниках если требуется
Так же непроверенного, но если положить половины шарика для пинг-понга на глаза то можно начать видеть галлюцинации
#tt 1/∞ тестовое задание
Python dev + devops
Дали тз
1) подключить сервер по ssh через ключи, офнуть доступ по паролю
2) написать скрипт, которому можно передавать имена валют, которые он будет мониторить через coinmarketcap api, отправляя уведовления о перехождении указанных порогов стоимости актива
3) доп задание - Запустить блокчейн узел Morph.
доступа к пк не было, выполнял на терминале termius на айфоне
1) получил токен coinmarketcap api
2) наладил получение данных с ресурса
3) написал класс принимающий команду подписки на актив, и через список активов отправляет запрос получая данные сразу о нескольких валютах.
4) создал бота, научился запускать скрипт в фоновом режиме через & и контролировать запуск/установку скриптов через .sh
далее приступил к настройке через ssh, создал ключи по мануалу, но не проверил работают ли они и через конфиг отключил вхождение по паролю,
в итоге потерял доступ к серверу и ко всей написанной кодовой базе
детский мат
Выводы:
- научиться настраивать ssh
- сначала проверять работу ключей
- потом отключать доступ по паролю
- использовать SCV в любом кейсе при завершении работы(потерялись 1,5 дня разработки)
- в суперневажные задачи: просмотреть запуск Morph Node.
Python dev + devops
Основа:
Linux + Docker | Windows(bash, sudo)
python или JavaScript или TypeScript
Доп:
Опыт в Solidity, BAS(BrowserAutomationStudio), Zennoposter, GO, Rust, git, node.js, а также автоматизации браузерной работы.
Дали тз
1) подключить сервер по ssh через ключи, офнуть доступ по паролю
2) написать скрипт, которому можно передавать имена валют, которые он будет мониторить через coinmarketcap api, отправляя уведовления о перехождении указанных порогов стоимости актива
3) доп задание - Запустить блокчейн узел Morph.
доступа к пк не было, выполнял на терминале termius на айфоне
1) получил токен coinmarketcap api
2) наладил получение данных с ресурса
3) написал класс принимающий команду подписки на актив, и через список активов отправляет запрос получая данные сразу о нескольких валютах.
4) создал бота, научился запускать скрипт в фоновом режиме через & и контролировать запуск/установку скриптов через .sh
далее приступил к настройке через ssh, создал ключи по мануалу, но не проверил работают ли они и через конфиг отключил вхождение по паролю,
в итоге потерял доступ к серверу и ко всей написанной кодовой базе
детский мат
Выводы:
- научиться настраивать ssh
- сначала проверять работу ключей
- потом отключать доступ по паролю
- использовать SCV в любом кейсе при завершении работы(потерялись 1,5 дня разработки)
- в суперневажные задачи: просмотреть запуск Morph Node.
#教え
Видео 4/22 3:48 -> end
1) map, filter, reduce
генераторы работают быстрее map
но если мы не знаем до какого элемента придется перебирать список, то map будет эффективнее
2) декораторы
использовал его чтобы сравнить скорость map и list comprehention
как генерить списки для тестов
Видео 4/22 3:48 -> end
1) map, filter, reduce
генераторы работают быстрее map
но если мы не знаем до какого элемента придется перебирать список, то map будет эффективнее
2) декораторы
использовал его чтобы сравнить скорость map и list comprehention
python
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
f = func(*args, **kwargs)
end = time.time()
print(end - start)
return wrapper
как генерить списки для тестов
[random.randint(0, 100) for _ in range(31)]
.py
#psy Техника концентрации Белый шум https://youtu.be/h7Bdfv8Iagw?si=H_r1epGc62hTsETT Шум в голове 🔻 Спокойствие ⏫ 15 мин https://youtu.be/mD3QwerSmLs?si=pWbgl1cZIuXDd0-X Яндекс музыка https://music.yandex.ru/users/music-blog/playlists/1956?utm_…
#tt 2/∞ тестовое задание
pythonDev 80к
Компания разрабатывает аналитический сервис для торговых инфраструктур по типу мосбиржи
Дали костяк сервера, работающего через websocket нужно реализовать:
- отправку ордеров
- после размещения ордера дается задержка через sleep и возвращается случайный результат выполнения
- реализовать возможность отмены ордера пока действует задержка
- реализовать подписку/отписку на изменение валютного инструмента(приходит ордер, всем подписанным отправляются одновленные котировки)
- написать тесты
предлагали еще сделать фронт, но на бек потратил 6 дней, дальше жирно будет
первый раз писал тесты
логику вынес в отдельный модуль
для модуля создал собственный тип исключений
тестовое задание подтвердили, позвали на техническое собеседование
pythonDev 80к
Компания разрабатывает аналитический сервис для торговых инфраструктур по типу мосбиржи
Дали костяк сервера, работающего через websocket нужно реализовать:
- отправку ордеров
- после размещения ордера дается задержка через sleep и возвращается случайный результат выполнения
- реализовать возможность отмены ордера пока действует задержка
- реализовать подписку/отписку на изменение валютного инструмента(приходит ордер, всем подписанным отправляются одновленные котировки)
- написать тесты
предлагали еще сделать фронт, но на бек потратил 6 дней, дальше жирно будет
первый раз писал тесты
логику вынес в отдельный модуль
для модуля создал собственный тип исключений
выводы
- в гите после каждой микрозадачи коммит, для наглядности процесса
- найти паттерны тестирования, было неожиданным ступором вопрос, какие кейсы тестировать
- postman незаменим, функциональщина для запросов на сервер
- чем лучше программист вначале познал всю инфраструктуру проекта, тем быстрее он будет выполнять задачи в будущем, скурпулезное чтение кода маст хев
- + asyncio, pytest, fastapi, bidict(нужно узнать получше)
тестовое задание подтвердили, позвали на техническое собеседование
#git
git rebase
у тебя есть ветка feature, отпочковавшаяся от мастера,
в мастер внесли несколько коммитов,
закончив в feature, ты хочешь замерджить в мастер, но было бы круто чтобы вся разработка была в одну линию, не разветвляясь,
с помощью rebase ты можешь поменять коммит, от которого отпочковывалась feature изначально, на последний коммит в master, чтобы при merge он fastforward перекинул указатель мастера на feature
так же rebase позволяет изменять порядок коммитов и комментарии к ним перед rebase в режиме interactive
https://selectel.ru/blog/tutorials/how-to-rebase-commits-and-branches/
git rebase
у тебя есть ветка feature, отпочковавшаяся от мастера,
в мастер внесли несколько коммитов,
закончив в feature, ты хочешь замерджить в мастер, но было бы круто чтобы вся разработка была в одну линию, не разветвляясь,
с помощью rebase ты можешь поменять коммит, от которого отпочковывалась feature изначально, на последний коммит в master, чтобы при merge он fastforward перекинул указатель мастера на feature
так же rebase позволяет изменять порядок коммитов и комментарии к ним перед rebase в режиме interactive
https://selectel.ru/blog/tutorials/how-to-rebase-commits-and-branches/
#ti 2/∞ техническое интервью
после тестового задания позвали на интервью
созвон вели 2 разраба
рассказали про компанию, показали продукт, объяснили чем предстоит заниматься,
минимально спросили про опыт и учебу
во время разговора вскользь поговорили про выполненное тз, напомню что выполнялось оно около 6 дней, но как я понял смотрели его сквозь пальцы, что еще раз говорит о том что больше 2 дней тратить на тех задание не стоит, даже если оффер крутой, будут смотреть общую картину
далее задания в режиме livecoding
❗️разработка под надзором это большой стресс, если ты долгое время ее не практиковал, во время решения, когда ты сталкиваешься с затупом, мозг просто отключается и ты тупишь. Чтобы этого не случалось нужна практика❗️
1) бинарный поиск, знаю как он реализуется, но долго не практиковал, словил затуп на искуственном сужении окна поиска чтобы избежать зацикливание при 2х элементах(один из случаев), додуматься до этого в реале нереально, вывод - тщательно пройти базовые алгоритмы, добро пожаловать leetCode. Были вопросы по сложности алгоритма, так же стоит подумать в каких случаях твое решение может зациклиться.
2) Определить, какой текст будет выведен в результате вызова метода
в этой задаче я ответил правильно, по сути интерпретатор ищет слева направо у предков класса, но нужно повторить тему классов и в особенности ромбовидное наследование
3) Вопрос каким будет результат 0.1 + 0.1 + 0.1 == 0.3
видео про эту задачу я смотрел на кануне, ответ будет false, потому что 0.1 на самом деле является бесконечной дробью, из за несовершенства хранения десятичных дробей https://www.youtube.com/watch?v=JVvkBPhNGZY&t=18s
4) datetime
в этом задании я ответил что python такое может позволить, но позже при отработке я получил
используется этот паттерн для отладки если нужно воспроизвести что то на определенном промежутке времени, например когда есть код который работает днем и вечером по разному (как загрузка сбера)
похоже именно этот пример работать не будет но для этого есть отдельный модуль freezegun
Итог:
- тренировать livecoding
- повторить классы, datetime
- тщательно пройти алгоритмы
- на собеседовании стараться не сыпаться и более холодно вести себя как специалист
- выполнять тз край 2 дня
В оффере отказали под предлогом того что нужен более опытный специалист, но я уже чувствую почву под ногами
после тестового задания позвали на интервью
созвон вели 2 разраба
рассказали про компанию, показали продукт, объяснили чем предстоит заниматься,
минимально спросили про опыт и учебу
во время разговора вскользь поговорили про выполненное тз, напомню что выполнялось оно около 6 дней, но как я понял смотрели его сквозь пальцы, что еще раз говорит о том что больше 2 дней тратить на тех задание не стоит, даже если оффер крутой, будут смотреть общую картину
далее задания в режиме livecoding
❗️разработка под надзором это большой стресс, если ты долгое время ее не практиковал, во время решения, когда ты сталкиваешься с затупом, мозг просто отключается и ты тупишь. Чтобы этого не случалось нужна практика❗️
1) бинарный поиск, знаю как он реализуется, но долго не практиковал, словил затуп на искуственном сужении окна поиска чтобы избежать зацикливание при 2х элементах(один из случаев), додуматься до этого в реале нереально, вывод - тщательно пройти базовые алгоритмы, добро пожаловать leetCode. Были вопросы по сложности алгоритма, так же стоит подумать в каких случаях твое решение может зациклиться.
2) Определить, какой текст будет выведен в результате вызова метода
print() у объекта класса Main, учитывая наследование от классов Parent и Mixin, а также использование super(). class Parent:
def print(self):
print("A")
class Mixin(Parent):
def print(self):
print("B")
class Main(Parent, Mixin):
def print(self):
super().print()
print("C")
# What will be printed? Why?
Main().print()
# A
# B
# C
в этой задаче я ответил правильно, по сути интерпретатор ищет слева направо у предков класса, но нужно повторить тему классов и в особенности ромбовидное наследование
3) Вопрос каким будет результат 0.1 + 0.1 + 0.1 == 0.3
видео про эту задачу я смотрел на кануне, ответ будет false, потому что 0.1 на самом деле является бесконечной дробью, из за несовершенства хранения десятичных дробей https://www.youtube.com/watch?v=JVvkBPhNGZY&t=18s
4) datetime
import datetime
datetime.datetime.now = lambda: datetime.datetime(2017, 12, 12)
# Is it correct code? How it can be used?
в этом задании я ответил что python такое может позволить, но позже при отработке я получил
TypeError: cannot set 'now' attribute of immutable type 'datetime.datetime'
используется этот паттерн для отладки если нужно воспроизвести что то на определенном промежутке времени, например когда есть код который работает днем и вечером по разному (как загрузка сбера)
похоже именно этот пример работать не будет но для этого есть отдельный модуль freezegun
Итог:
- тренировать livecoding
- повторить классы, datetime
- тщательно пройти алгоритмы
- на собеседовании стараться не сыпаться и более холодно вести себя как специалист
- выполнять тз край 2 дня
В оффере отказали под предлогом того что нужен более опытный специалист, но я уже чувствую почву под ногами
#教え
Видео 6/22 start -> end
простые задачи, потренил написание тестов
Видео 6/22 start -> end
простые задачи, потренил написание тестов
from functools import reduce
def unit_and_sort_lists(lists):
if len(lists) > 1:
total_list = reduce(lambda x, y: x + y, lists, [])
else:
total_list = lists[0]
return sorted(total_list)
def factorial(num):
if num < 0:
return False
if num == 0:
return 0
result = 1
for el in range(1, num + 1):
result *= el
return result
arr_lists = [[1, 3, 5], [2, 4, 6], [7, 8, 9]]
assert_result = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(unit_and_sort_lists(arr_lists))
==========*тесты*=========
from src.tasks import factorial, unit_and_sort_lists
import pytest
@pytest.mark.parametrize(
"n, result",
[
(0, 0),
(1, 1),
(5, 120),
(-1, False),
]
)
def test_factorial(n, result):
assert factorial(n) == result
@pytest.mark.parametrize(
"lists, result", [
([[]], []),
([[1, 2, 3]], [1, 2, 3]),
([[1, 3, 5], [2, 4, 6], [7, 8, 9]], [1, 2, 3, 4, 5, 6, 7, 8, 9]),
([[1, 2, 3], [2, 4, 5], [1, 3, 6]], [1, 1, 2, 2, 3, 3, 4, 5, 6]),
([[-2, -1, 0], [1, 2, 3]], [-2, -1, 0, 1, 2, 3])
]
)
def test_unit_and_sort_lists(lists, result):
assert unit_and_sort_lists(lists) == result
.py
#ti 2/∞ техническое интервью после тестового задания позвали на интервью созвон вели 2 разраба рассказали про компанию, показали продукт, объяснили чем предстоит заниматься, минимально спросили про опыт и учебу во время разговора вскользь поговорили про…
#hw
дз по курсам
codereview у gpt.
Попробовал подход test-first
лучшее
- параметризация(разные кейсы)
- monkeypatch В кейсе внутри функции данные с консоли input(), в автотестах перехватываешь built in input и меняешь на возврат нужных параметров
дз по курсам
codereview у gpt.
Попробовал подход test-first
@pytest.mark.parametrize(
"num, result", [
(0, None),
(1000, 'millennium'),
(100000000000000, 'millennium'),
(-20000, 'millennium'),
(-19999, None)
]
)
def test_is_multiple_of_1000(num, result):
assert is_multiple_of_1000(num) == result
@pytest.mark.parametrize(
"input_data, result", [
(60, 'restaurant'),
(30, 'cafe'),
(5, 'home'),
(-20000, None),
(0, None),
]
)
def test_get_venue_by_guest_count(monkeypatch, input_data, result):
monkeypatch.setattr('builtins.input', lambda _: input_data)
guest_count = get_user_input()
assert get_venue_by_guest_count(guest_count) == result
@pytest.mark.parametrize(
"list_in, result", [
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [-2, -4, -6, -8, -10, -12, -14, -16, -18, -20]),
([-3, -5, 2, 13, -100, 1, 0], [6, 10, -4, -26, 200, -2, 0]),
([], []),
([0], [0]),
([1], [-2])
]
)
def test_multiply_by_neg2(list_in, result):
assert multiply_by_neg2(list_in) == result
@pytest.mark.parametrize(
"num_list, even_num_count", [
([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5),
([-3, -5, 2, 13, -100, 1, 0], 3),
([], 0),
([0], 1),
([1, 3, 13, 17], 0)
]
)
def test_get_even_num_count(num_list, even_num_count):
assert get_even_num_count(num_list) == even_num_count
@pytest.mark.parametrize("input_dict, expected_output", [
({'test': 'test_value', 'europe': 'eur', 'dollar': 'usd', 'ruble': 'rub'},
{'test4': 'test_value', 'europe6': 'eur', 'dollar6': 'usd', 'ruble5': 'rub'}),
({'key': 'value'}, {'key3': 'value'}),
({'empty': '', 'long_key': 'value'}, {'empty5': '', 'long_key8': 'value'}),
({'a': 'alpha', 'b': 'beta'}, {'a1': 'alpha', 'b1': 'beta'})
])
def test_add_dict_key_len_into_key(input_dict, expected_output):
assert add_dict_key_len_into_key(input_dict) == expected_output
# Параметризованные тесты для функции shift_left
@pytest.mark.parametrize("input_list, expected_output", [
([1, 2, 3, 4, 5], [2, 3, 4, 5, 1]), # Простой случай
([7, 8, 9], [8, 9, 7]), # Случай с 3 элементами
([10], [10]), # Случай с одним элементом
([], []), # Случай с пустым списком
([1, 2], [2, 1]), # Случай с двумя элементами
])
def test_num_list_shift(input_list, expected_output):
assert num_list_shift(input_list) == expected_output
@pytest.mark.parametrize("fib_list_count, expected_output", [
(1, [0]), # 1-е число Фибоначчи
(5, [0, 1, 1, 2, 3]), # [0, 1, 1, 2, 3] -> [1, 1, 2, 3, 0]
(8, [0, 1, 1, 2, 3, 5, 8, 13]), # [0, 1, 1, 2, 3, 5, 8, 13] -> [1, 1, 2, 3, 5, 8, 13, 0]
(15, [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]), # [0, 1, ..., 377] -> [1, 1, ..., 0]
(30, [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657,
46368, 75025, 121393, 196418, 317811, 514229]) # [0, 1, ..., 832040] -> [1, 1, ..., 0]
])
def test_get_fibonacci_sequence(fib_list_count, expected_output):
assert get_fibonacci_sequence(fib_list_count) == expected_output
лучшее
- параметризация(разные кейсы)
- monkeypatch В кейсе внутри функции данные с консоли input(), в автотестах перехватываешь built in input и меняешь на возврат нужных параметров
.py
#hw дз по курсам codereview у gpt. Попробовал подход test-first @pytest.mark.parametrize( "num, result", [ (0, None), (1000, 'millennium'), (100000000000000, 'millennium'), (-20000, 'millennium'), (-19999, None)…
#hw
в какую сторону библиотека decimal округляет по дефолту? Если в ответе нужна точность 6 цпз, какую указывать в рассчетах?
#Для заданного числа N составьте программу вычисления суммы
#S=1+1/2+1/3+1/4+...+1/N, где N – натуральное число.
def get_harmonic_series_sum(n):
if n <= 0:
return False
if n == 1:
return Decimal(1)
harmonic_sum = reduce(lambda x, a: x + (Decimal(1) / Decimal(a)), range(1, n + 1))
return harmonic_sum.quantize(Decimal('0.000001'), ROUND_FLOOR)
@pytest.mark.parametrize(
"num, exp_res", (
[1, Decimal(1.0)],
[2, Decimal(1.5)],
[3, Decimal('1.833333')],
[10, Decimal('2.928968')],
[100, Decimal('5.187377')],
[0, False],
[-5, False]
)
)
def test_get_harmonic_series(num, exp_res):
assert get_harmonic_series_sum(num) == exp_res
в какую сторону библиотека decimal округляет по дефолту? Если в ответе нужна точность 6 цпз, какую указывать в рассчетах?
#hw 5 lesson
"""
Для каждого натурального числа в промежутке от m до n вывести все делители,
кроме единицы и самого числа. m и n вводятся с клавиатуры.
"""
def get_interval_dividers(x, y):
dividers_dict = {}
for el in range(x, y + 1):
dividers_dict[el] = []
for divider in range(2, int(sqrt(el)) + 1):
if el % divider == 0:
dividers_dict[el].append(divider)
if divider != el // divider: # Добавляем сопряженный делитель
dividers_dict[el].append(el // divider)
return dividers_dict
def get_interval():
interval = list(map(int, input('press x y').strip().split(' ')))
if len(interval) != 2 or interval[0] >= interval[1]:
raise ValueError
return interval
def run_interval_dividers_script():
intervals = get_interval()
pprint.pprint(get_interval_dividers(*intervals))
"""
Создать список поездов. Структура словаря: номер поезда,
пункт и время прибытия, пункт и время отбытия. Вывести все сведения о поездах,
время пребывания в пути которых превышает 7 часов 20 минут.
"""
cities_us = [
"New York",
"Los Angeles",
"Chicago",
"Houston",
"Phoenix",
"Philadelphia",
"San Antonio",
"San Diego",
"Dallas",
"San Jose",
"Austin",
"Jacksonville",
"Fort Worth",
"Columbus",
"San Francisco",
"Charlotte",
"Indianapolis",
"Seattle",
"Denver",
"Washington, D.C.",
"Boston"
]
def generate_train_schedule(train_count):
trains_schedule = {}
now = datetime.datetime.now()
for _ in range(0, train_count):
arrival_time = datetime.datetime.combine(now.date(), datetime.time(randint(0, 23), randint(0, 59)))
departure_time = arrival_time + datetime.timedelta(hours=randint(1, 23), minutes=randint(1, 59))
trains_schedule[randint(1000, 9999)] = {
'arrival': {
'location': random.choice(cities_us),
'time': arrival_time},
'departure': {
'location': random.choice(cities_us),
'time': departure_time
}
}
return trains_schedule
def get_long_way_trips(trains_schedule):
return {
train_num for train_num in trains_schedule if
(trains_schedule[train_num]['departure']['time'] - trains_schedule[train_num]['arrival'][
'time']) > datetime.timedelta(hours=7, minutes=20)
}
#git
сок про git
https://proglib.io/p/git-for-half-an-hour
сок про git
https://proglib.io/p/git-for-half-an-hour
Общий конфиг, в одной команде, username, email, ссылки для репозиториев(git remote -v) и их названия и тд
git config --list
#tt 3/∞ тестовое задание
pythonDev 100к
Команда состоит из 5 человек
Компания заниматься (CRM, СКЛАД,
ПЛАНИРОВЩИК, HELPDESK, ЭДО,
УЧЁТ МАТЕРИАЛЬНЫХ ЦЕННОСТЕЙ, ПУТЕВЫЕ ЛИСТЫ, ОТЧЁТНОСТЬ, УПРАВЛЕНИЕ ПЕРСОНАЛОМ)
Задание: Реализация полосы чтения –> загрузки сообщений с почты. Необходимо продумать
гибкий функционал для импортирования в систему сообщений из “yandex.ru”,
“gmail.com”, “mail.ru”. Модели в django, прогресс бар, показывающий сколько сообщений проверено (чтобы найти последнее полученное и очертить линию получения новых сообщений в бд)
создал костяк, настроил базу данных, сверстал фронт, настроил imap
при нахождении последнего полученного сообщений мы получаем массив с uid сообщений, некоторые из них уже могли удалить поэтому это по сути упорядоченный массив из айдишников но идущих возможно не по порядку. Для поиска идеально подошел бинарный поиск.
далее настроил websocket соединение, настроил асинхронное поведение. Скрипт по сути сначала проводит аутентификацию и далее рендерит страницу которая через js запускает цепочку обработки через WS.
задание решалось очень долго, около 18 дней, время выделял во время марафона на основной работе. Нужно более структурицизованная и последовательная разработка. В этот раз тесты и оптимизацию не делал. Потратил очень много времени на тз, учитывая что делал для себя и глянут его мельком, для первого проекта на django считаю солидно. Type hints отсутствуют, обработка ошибок есть но посредственная.
https://github.com/nk-knvlv/comsoftlab
pythonDev 100к
Команда состоит из 5 человек
Компания заниматься (CRM, СКЛАД,
ПЛАНИРОВЩИК, HELPDESK, ЭДО,
УЧЁТ МАТЕРИАЛЬНЫХ ЦЕННОСТЕЙ, ПУТЕВЫЕ ЛИСТЫ, ОТЧЁТНОСТЬ, УПРАВЛЕНИЕ ПЕРСОНАЛОМ)
Задание: Реализация полосы чтения –> загрузки сообщений с почты. Необходимо продумать
гибкий функционал для импортирования в систему сообщений из “yandex.ru”,
“gmail.com”, “mail.ru”. Модели в django, прогресс бар, показывающий сколько сообщений проверено (чтобы найти последнее полученное и очертить линию получения новых сообщений в бд)
создал костяк, настроил базу данных, сверстал фронт, настроил imap
при нахождении последнего полученного сообщений мы получаем массив с uid сообщений, некоторые из них уже могли удалить поэтому это по сути упорядоченный массив из айдишников но идущих возможно не по порядку. Для поиска идеально подошел бинарный поиск.
далее настроил websocket соединение, настроил асинхронное поведение. Скрипт по сути сначала проводит аутентификацию и далее рендерит страницу которая через js запускает цепочку обработки через WS.
задание решалось очень долго, около 18 дней, время выделял во время марафона на основной работе. Нужно более структурицизованная и последовательная разработка. В этот раз тесты и оптимизацию не делал. Потратил очень много времени на тз, учитывая что делал для себя и глянут его мельком, для первого проекта на django считаю солидно. Type hints отсутствуют, обработка ошибок есть но посредственная.
https://github.com/nk-knvlv/comsoftlab
.py
#tt 3/∞ тестовое задание pythonDev 100к Команда состоит из 5 человек Компания заниматься (CRM, СКЛАД, ПЛАНИРОВЩИК, HELPDESK, ЭДО, УЧЁТ МАТЕРИАЛЬНЫХ ЦЕННОСТЕЙ, ПУТЕВЫЕ ЛИСТЫ, ОТЧЁТНОСТЬ, УПРАВЛЕНИЕ ПЕРСОНАЛОМ) Задание: Реализация полосы чтения –> загрузки…
#alg Бинарный поиск
Чтобы по настоящему знать этот алгоритм, нужно понимать не просто концепцию деления общей массы напополам с рекурсией, а какие частные случаи обрабатываются
Чтобы по настоящему знать этот алгоритм, нужно понимать не просто концепцию деления общей массы напополам с рекурсией, а какие частные случаи обрабатываются
def binary_search(numbers_list, target_num):
if not numbers_list: # пустой список
return -1
if len(numbers_list) == 1: # один элемент важно проверять на соответствие искомому
if numbers_list[0] == target_num:
return 0
else:
return -1
low = 0
high = len(numbers_list) - 1
while low <= high: #понять почему допускается = вместо строгого <
mid = (low + high) // 2 # как в python работает деление, почему 5//2=2, но -5//2=-3
if numbers_list[mid] == target_num: # должна ли проверка находиться до очередного деления mid или после
return mid
if numbers_list[mid] > target_num:
high = mid - 1 # почему уменьшаем
else:
low = mid + 1 # и увеличиваем
return -1
#alg bubble sort
def bubble_sort(num_list: list[int]) -> list[int]:
# border cases как [ ], [1], обработает range, отдельно писать не нужно
is_swap = True
while is_swap:
is_swap = False
for i in range(len(num_list)-1):
if num_list[i] > num_list[i + 1]:
num_list[i], num_list[i + 1] = num_list[i + 1], num_list[i] # python позволяет 1 строчкой менять элементы местами вместо temp переменной, техника называется кортежный своп(tuple swap)
is_swap = True
return num_list
#alg dumb sort - прадед bubble sort, не боевой алгоритм. Используется как пример "неэффективного алгоритма".
def dumb_sort(num_list: list[int]) -> list[int]:
is_swap = True
while is_swap:
is_swap = False
for i in range(len(num_list)-1):
if num_list[i] > num_list[i + 1]:
num_list[i], num_list[i + 1] = num_list[i + 1], num_list[i]
is_swap = True
continue
return num_list