Колба с шариками: Шарики и колбы — Прогулки по воде — ЖЖ

Содержание

Шарики и колбы — Прогулки по воде — ЖЖ

Задача, которой прочат популярность и эффектность «самолёта на беговой дорожке».

На весах стоят две колбы, в колбах два шарика. Один (слева) — для пинг-понга, второй (справа) — стальной. Один крепится при помощи нити к подвесу, другой — ко дну колбы. Вопрос, как поведут себя весы?

Должен отметить, что задача составлена с изрядной изобретательностью и эксплуатирует целый ряд плохоосознаваемых фактов «простой физики»: например, физический смысл закона Архимеда и разницу между точками приложения сил. Я от этой задачи даже на время впал в замешательство и сначала машинально сделал неправильное предположение о сохранении равновесия. Запись правильного решения я тоже осилил не с первого раза, и только после того, как понял, на чём в этой задаче ловятся люди (включая меня), я понял и как правильно следует объяснять решение.

Поскольку мне хотелось бы не просто запротоколировать ответ, но ещё и разъяснить эти вышеупомянутые плохоосознаваемые факты, в статье будут пространные отступления от непосредственно решения. А поскольку я ещё и ориентируюсь на уровень людей, для которых физика не профессия, то некоторые вещи будут довольно подробно разжёвываться, хотя физикам они почти очевидны.

Для начала, что именно заставляет весы склоняться в одну или в другую сторону? Вес стоящих на них чаш. Что такое «вес»? Вес — это та сила, с которой тело действует на опору или подвес.

Что давит на чаши весов? Колбы. Не вода, не шары, не нити — только колбы соприкасаются с чашами, следовательно, только они и давят.

Правда, давят они не только своей массой — ведь на них, в свою очередь, давит, например, вода, но на весы, повторюсь, давят именно они. Почему нам это так важно? Потому что первым желанием (после попыток «угадать» решение) у тех, хотя бы немного помнит физику, будет «расписать все силы». А после расписывания всех сил у нас получится примерно следующая картинка.

Вместо «сила тяжести, воздействующая на тело», я иногда для краткости буду писать «сила тяжести тела», хотя сила тяжести, она на самом деле конечно не тела, а Земли.

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

На первый взгляд всё круто, но на самом деле тут круто далеко не всё. Что же не так?

Не так две вещи.

Первая из них — «расписанные силы» на самом деле воздействуют на разные объекты. Поэтому попытка скалярно просуммировать силы в области какой-то из колб приведёт к провалу: сумма этих сил на самом деле не является искомым весом колбы. И даже если вспомнить, что реакция опоры в положении равновесия равна весу, то и сумма оставшихся сил не даст решения.

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

Вторая вещь, которая тут не так: нескольких сил на самом деле не хватает. И то, что их забыли (рисунок, собственно, и иллюстрировал то, что в данном случае многие забывают), напрямую связано с попыткой «расписать все силы»: эти силы несколько неочевидны, поэтому при подобного рода «полном расписывании» их забудут практически наверняка.

Что это за силы?

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

Вообще, здравый смысл должен подсказать, что да, поменяется — к системе добавился шарик. Но поменяется за счёт чего? Ведь шарик выталкивает архимедова сила. Если он не тонет, то эта сила равна силе тяжести, действующей на шарик. Сумма сил равна нулю…

Хм. Тогда наверно ничего не поменяется — быть может, здравый смысл тут нас обманул.

Однако проведём другой мысленный эксперимент: положим на поверхность колбы вместо шарика — атомный ледокол. Если и тут весы не покажут изменений, то уже наоборот надо будет спросить себя, что за мистическая сила удерживает на чашке бытовых весов не только колбу с водой, но ещё и огромный корабль? Ледокол, как и шарик, тоже плавает на поверхности воды, погружаясь в неё лишь отчасти, но ведь вода не обладает антигравитационными свойствами, поэтому чуда таких масштабов очевидно не произойдёт — колба вместе с ледоколом должна сломать весы, стол, на котором они стоят, а потом проломить пол, все этажи и, не исключено, фундамент дома.

Тут ответ уже гораздо более очевиден. Однако вряд ли есть какой-то физический закон, который не меняет вес колбы, если в ней плавает шарик, но радикально меняет, если его заменить на ровно так же плавающий ледокол. Чаша весов, следовательно, сдвинется вниз — что с шариком, что с ледоколом на поверхности колбы. Однако что за сила добавилась к силе тяжести колбы и воды в ней, ранее составлявших вес колбы? Ведь сила тяжести шарика или ледокола уравновесилась силой Архимеда, что за новая сила?

Фокус как раз в вышеупомянутом: нельзя для оценки веса колбы суммировать силы, приложенные к шарику (или к ледоколу). Сумма сил, действующих на шарик, равна нулю. Но это не значит, что сам шарик никоим образом не воздействует на другие тела́ — в частности, на воду.

Да, это не совсем очевидная штука.

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

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

Следовательно вес воды — та сила, с которой она давит на колбу — равен силе тяжести воды плюс сила тяжести шарика.

Эти силы, толкающие воду вниз из-за того, что вода выталкивает шарики, пропущены на первом рисунке с расписанными силами.

Кроме них пропущены ещё реакции опоры. Точнее, реакции опоры вроде бы указаны, но только те, которые удерживают колбы на весах. А есть ведь ещё и те силы, которыми дно каждой из колб удерживает воду.

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

Вес воды в этом примере — с шариком на поверхности колбы — не равен силе тяжести, воздействующей на воду: к ней надо прибавить ещё и вес шарика.

Да, это так. Вес часто путают с массой тела, хотя это разные величины (даже размерности у них разные). Однако это — простая ошибка. Более сложная — когда вес путают с силой тяжести. Если тело просто стоит на весах, то вес и сила тяжести действительно равны по величине. Но если мы надавим на тело сверху рукой, то действующая на него сила тяжести не изменится, однако вес тела поменяется — на ту силу, с которой мы на него давим.

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

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

Изменит ли это вес колбы?

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

Вес воды равен силе тяжести воды плюс выталкивающая шарик сила.

Сила натяжения нити равна силе, выталкивающей шарик, минус сила тяжести шарика.

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

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

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

Взглянем теперь на правую колбу.

Шарик в правой колбе тяжелее как шарика в левой, так и воды — ведь шарик в левой надо удерживать снизу (он пытается всплыть), а в правой — сверху (он пытается утонуть).

Мы уже знаем, что к силе тяжести воды и колбы в левом случае добавляется ещё сила тяжести шарика. Что будет в правой?

В правой колбе шарик сила тяжести тянет вниз, архимедова сила — вверх, но сила тяжести больше архимедовой, поэтому состояние покоя ему обеспечивает сила натяжения нити, равная разности между силой тяжести и архимедовой.

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

То есть вес воды равен силе тяжести воды плюс сила противодействия архимедовой силе, выталкивающей шарик. Как и в левом случае.

Однако в отличие от него на колбу уже действует только сила тяжести и вес воды — нить прикреплена не к ней, а потому не может тянуть её вверх.

Итого вес колбы равен силе тяжести колбы, плюс сила тяжести воды, плюс архимедова сила, воздействующая на шарик.

Судя по рисунку, правая колба идентична левой и в ней столько же воды, поскольку мы видим, что объёмы шариков одинаковы, а поверхности воды в каждой колбе находятся на одной и той же высоте.

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

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

Однако вопрос стоит не о числах, а о равновесии. Можем ли мы на него ответить, не зная чисел?

Вообще говоря, можем. Левый шарик, как нам известно, пытается всплыть (чему препятствует прикрепление ниткой к дну колбы). Следовательно, архимедова сила, которая его выталкивает, больше его силы тяжести. Поскольку шарики имеют одинаковый объём, на них должна действовать одинаковая выталкивающая сила. То есть архимедова сила, воздействующая на правый шарик, больше силы тяжести левого.

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

Что, кстати, иллюстрируется вот этим видео. В нём, правда, левый шарик плавает на поверхности, но мы уже знаем, что вес колбы не поменяется от того, где именно в ней находится шарик и соединён ли он с ней нитью — главное, чтобы он не был соединён с чем-то вне колбы.

doc-файл

Взламываем Ball Sort Puzzle / Хабр

Определение кружочков при помощи OpenCV

Ball Sort Puzzle — это популярная мобильная игра на IOS/Android. Суть её заключается в перестановке шариков до тех пор, пока в колбах не будут шарики одного цвета. При этом шарик можно перетаскивать либо в пустую колбу, либо на такой же шарик.

Так случилось, что я в неё залип. Очнулся примерно через месяц, на 725 уровне. Он мне никак не давался — насколько бы глубоко я ни пытался продумать свою стратегию. В итоге — с этим вопросом я вышел в интернет, и заодно выяснил несколько интересных особенностей головоломки.

Во-первых, — игра бесконечна почти бесконечна. По крайней мере уже сейчас на YouTube есть прохождения всех уровней вплоть до 5350, а в телеграмме гуляют скриншоты 10к+ уровней. Вторая особенность, и вот это уже некрасиво, — не у всех уровней есть решение.

Ну это ни в какие ворота — против нас играет коварный ИИ. Нужно действовать соответственно!

Под катом мы:

  • Придумаем алгоритм, решающий эту головоломку (Python)

  • Научимся парсить скриншот игры, чтобы скармливать алгоритму задачки (OpenCV)

  • Напишем телеграм бота, который будет принимать скриншоты и возвращать решения

  • Выстроим CI/CD через GitHub Actions и задеплоим бота на Яндекс.Функции

Погнали!


Алгоритмическое решение задачи

Решать такую задачу было весьма занимательно. Поэтому предлагаю заинтересованному читателю попробовать решить её самостоятельно.

Я же в первую очередь решил побить проблему на сущности. Это сделает алгоритм чуть более элегантным, а также поможет в будущем парсить скриншоты игры:

class Color
class Color:
    def __init__(self, symbol, verbose_name, emoji):
        self.symbol = symbol
        self.verbose_name = verbose_name
        self.emoji = emoji

    def __repr__(self) -> str:
        return f'Color({self})'

    def __str__(self) -> str:
        return self.emoji
Beta-редактор хабра ломается на рендеринге emoji :poop:class Ball
class Ball:
    def __init__(self, color: Color):
        self.color = color

    def __eq__(self, other: 'Ball'):
        return self.color is other.color

    def __repr__(self):
        return f'Ball({self.color.verbose_name})'

    def __str__(self) -> str:
        return str(self.color)
class Flask
class Flask:
    def __init__(self, column: List[Color], num: int, max_size: int):
        self.num = num
        self.balls = [Ball(color) for color in column]
        self.max_size = max_size

    @property
    def is_full(self):
        return len(self.balls) == self.max_size

    @property
    def is_empty(self) -> bool:
        return not self.balls

    def pop(self) -> Ball:
        return self.balls.pop(-1)

    def push(self, ball: Ball):
        self.balls.append(ball)

    def __iter__(self):
        return iter(self.balls)

    def __getitem__(self, item: int) -> Ball:
        return self.balls[item]

    def __len__(self) -> int:
        return len(self.balls)

    def __str__(self) -> str:
        return str(self.balls)
class Move
class Move:
    def __init__(self, i, j, i_color: Color):
        self.i = i
        self.j = j
        self.emoji = i_color.emoji

    def __eq__(self, other: 'Move') -> bool:
        return (self.i, self.j) == (other.i, other.j)

    def __repr__(self) -> str:
        return f'Ball({self})'

    def __str__(self) -> str:
        return f'{self.i} -> {self.j}'

Для решения будем использовать метод поиска с возвратом (Backtracking).

Решение задачи методом поиска с возвратом сводится к последовательному расширению частичного решения. Если на очередном шаге такое расширение провести не удается, то возвращаются к более короткому частичному решению и продолжают поиск дальше. Данный алгоритм позволяет найти все решения поставленной задачи, если они существуют.

В случае с нашей игрой это метод применяется так: мы рекурсивно обходим все возможные перестановки шариков (move) до тех пор, пока

  • Либо нас не выкинет наш критерий остановки — решённый пазл

  • Либо в нашем хранилище состояний (states) не будет всех возможных перестановок — в таком случае решения нет

    def solve(self) -> bool:
        if self.is_solved:
            return True

        for move in self.get_possible_moves():
            new_state = self.commit_move(move)
            if new_state in self.states:  # Cycle!
                self.rollback_move(move)
                continue

            self.states.add(new_state)
            if self.solve():
                return True
            self.rollback_move(move)

        return False

Алгоритм достаточно прямолинейный и далеко не всегда выдаёт оптимальное решение. Тем не менее он справляется с решением большинства задачек из игры за 1 сек.

Проверим алгоритм на чём-нибудь попроще:

def test_3x3():
    data_in = [
        [color.RED, color.GREEN, color.RED],
        [color.GREEN, color.RED, color.GREEN],
        [],
    ]

    puzzle = BallSortPuzzle(data_in)
    result = puzzle.solve()
    assert result is True
    play_moves(data_in, puzzle.moves)
Алгоритм в действии

Полная версия программы доступна на github.

Распознавание скриншотов игры

Мы будем работать с .jpg картинками двух видов

Скриншоты уровней игры

Каждый чётный раунд игры состоит из 11 колб и 36 шариков, а нечётный — 14 колб и 48 шариков. Чётные и нечётные раунды отличаются расположением колб, но на счастье всё остальное у них одинаковое — по 4 шарика в колбе, 2 колбы пустые, цвета используются одни и те же.

Первое, что хочется сделать — это обрезать рабочую область, оставив только колбы с шариками. В противном случае наша программа за шарики может принимать элементы управления, фон или рекламу. Для этого отрежем по четверти сверху и снизу изображения.

class ImageParser:
    def __init__(self, file_bytes: np.ndarray, debug=False):
        self.image_orig = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
        self.image_cropped = self.get_cropped_image(self.image_orig)

    @staticmethod
    def get_cropped_image(image):
        height, width, _ = image.shape
        quarter = int(height / 4)
        cropped_img = image[quarter : height - quarter]
        return cropped_img
Рабочая область

Теперь будем искать кружочки. В библиотеке OpenCV ровно для этих целей существует метод HoughCircles. Чтобы его использовать нужно перевести изображение в чёрно-белый вид, а также «эмпирически подобрать» параметры поиска. Чтобы найденные кружочки потом расфасовать по колбам, нормализуем и отсортируем их.

    @staticmethod
    def normalize_circles(circles):
        last_y = 0
        for circle in circles:
            if math.isclose(circle[1], last_y, abs_tol=3):
                circle[1] = last_y
            else:
                last_y = circle[1]
        return circles

    def get_normalized_circles(self) -> List[Any]:
        image_cropped_gray = cv2.cvtColor(self.image_cropped, cv2.COLOR_BGR2GRAY)
        circles = cv2.HoughCircles(image_cropped_gray, cv2.HOUGH_GRADIENT, 2, 20, maxRadius=27)
        if circles is None:
            raise ImageParserError("No circles :shrug:")

        circles = np.round(circles[0, :]).astype("int16")
        ind = np.lexsort((circles[:, 0], circles[:, 1]))
        circles = circles[ind]
        circles = self.normalize_circles(circles)
        ind = np.lexsort((circles[:, 0], circles[:, 1]))
        circles = circles[ind]
        return circles
Отсортированные шарики слева-направо, сверху-вниз

Дальше будем определять цвет шарика.

Из-за того, что Telegram жмёт картинки мы не можем просто взять цвет центрального пикселя — он может быть артефактом компрессии. Поэтому найдём доминирующий цвет, — тот который в кружочке встречается чаще всего.

    @staticmethod
    def get_dominant_color(circle) -> Color:
        colors, count = np.unique(circle.reshape(-1, circle.shape[-1]), axis=0, return_counts=True)
        dominant = colors[count.argmax()]
        return dominant
Найденные кружочки

Этот доминирующий цвет мы будем сравнивать с изначально заданными цветами, и искать ближайший. В данной задаче нам на помощь приходит Евклидово расстояние и теорема Пифагора: если представить цвет точкой в трёхмерном пространстве, то расстояние до любой другой точки этого пространства:

Посчитаем такое расстояние до каждого из изначально заданных цветов и найдём минимальное

RBG_TO_COLOR = {
    (147, 42, 115): VIOLET,
    (8, 74, 125): BROWN,
    (229, 163, 85): L_BLUE,
    (68, 140, 234): ORANGE,
    (196, 46, 59): BLUE,
    (51, 100, 18): GREEN,
    (35, 43, 197): RED,
    (87, 216, 241): YELLOW,
    (125, 214, 97): L_GREEN,
    (123, 94, 234): PINK,
    (16, 150, 120): LIME,
    (102, 100, 99): GRAY,
}
COLORS = np.array(list(RBG_TO_COLOR.keys()))

def get_closest_color(color: np.ndarray) -> Color:
    distances = np.sqrt(np.sum((COLORS - color) ** 2, axis=1))
    index_of_smallest = np.where(distances == np.amin(distances))
    smallest_distance = COLORS[index_of_smallest].flat
    return RBG_TO_COLOR[tuple(smallest_distance)]  # type: ignore

Далее нам остаётся только распределить шарики по колбам. Итоговый class ImageParser доступен на github.

Преобразуем программу в Telegram Bot

Узнать про то, как сделать телеграм бота на Python можно сразу из нескольких статей на хабре. Я лишь опишу пару нюансов, с которыми столкнулся.

Так как наш бот хостится на Яндекс.Функции — триггером к его запуску будет запрос на заданный нами webhook.

Whenever there is an update for the bot, we will send an HTTPS POST request to the specified url, containing a JSON-serialized Update.

Если в сообщении есть массив photo, то можно увеличить вероятность распознавания шариков выбрав фотографию с максимальным весом:

if photos := message.get('photo'):
    # here photos is an array with same photo of different sizes
    # get one with the highest resolution
    hd_photo = max(photos, key=lambda x: x['file_size'])

Чтобы скачать картинку, придётся сделать 2 запроса к Telegram API

# Получение данных о файле, нас интересует ключ ответа file_path
GET https://api.telegram.org/bot{BOT_TOKEN}/getFile?file_id={file_id}
# Получение самого файла
GET https://api.telegram.org/file/bot{BOT_TOKEN}/{file_path}

В остальном же всё просто — получаем картинку, скармливаем её парсеру и затем алгоритму-решателю.

main.py
def handler(event: Optional[dict], context: Optional[dict]):
    body = json.loads(event['body'])  # type: ignore
    print(body)
    message = body['message']
    chat_id = message['chat']['id']

    if photos := message.get('photo'):
        # here photos is an array with same photo of different sizes
        hd_photo = max(photos, key=lambda x: x['file_size'])  # get one with the highest resolution
        try:
            file = telegram_client.download_file(hd_photo['file_id'])
        except TelegramClientError:
            text = "Cant download the image from TG :("
        else:
            file_bytes = np.asarray(bytearray(file.read()), dtype=np.uint8)
            try:
                image_parser = ImageParser(file_bytes)
                colors = image_parser.to_colors()
            except ImageParserError as exp:
                text = f"Cant parse image: {exp}"
            else:
                puzzle = BallSortPuzzle(colors)  # type: ignore
                solved = puzzle.solve()
                if solved:
                    text = get_telegram_repr(puzzle)
                else:
                    text = "This lvl don't have a solution"
    else:
        return {
            'statusCode': 200,
            'headers': {'Content-Type': 'application/json'},
            'body': '',
            'isBase64Encoded': False,
        }

    msg = {
        'method': 'sendMessage',
        'chat_id': chat_id,
        'text': text,
        'parse_mode': 'Markdown',
        'reply_to_message_id': message['message_id'],
    }

    return {
        'statusCode': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': json.dumps(msg, ensure_ascii=False),
        'isBase64Encoded': False,
    }

Отмечу ещё один нюанс: телеграм очень строго следует политике экранирования спецсимволов. Для Markdown это:

To escape characters ‘_’, ‘*’, ‘`’, ‘[‘ outside of an entity, prepend the characters ‘\’ before them.

Любой такой неэкранированный символ — и вы не увидите ответа в телеграм-чате. И останется только гадать — является ли это ошибка интеграции или вот такой коварный баг. Будьте осторожны.

Деплой бота в Яндекс.Функцию

Про создание Я.Функции также есть отличная статья от @mzaharov. Там подробно описан процесс заведения функции, а также установки вебхука для телеграмм бота.

Я расскажу как сделал Continuous Delivery при помощи GitHub Actions. Каждая сборка мастера увенчивается деплоем новой версии функции. Такой подход заставляет придерживаться модели разработки GithubFlow с его главным манифестом

Anything in the master branch is always deployable.

Каждая сборка мастера состоит из 3ёх этапов

  • lint (black, flake8, isort, mypy) — проверка кода на соответствие всем стандартам Python 2020

  • test — тестируем программу с помощью pytest, поддерживая качество и покрытие кода

  • deploy — непосредственно заливаем новую версию приложения в облако

Деплоить будем с помощью Yandex-Serveless-Action — уже готового Action для использования в своих пайплайнах

  deploy:
    name: deploy
    needs: pytest
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/master'
    steps:
      - uses: actions/checkout@master
      - uses: goodsmileduck/yandex-serverless-action@v1
        with:
          token: ${{ secrets.YC_TOKEN }}
          function_id: ${{ secrets.YC_FUNCTION_ID }}
          runtime: 'python38'
          memory: '256'
          execution_timeout: "120"
          entrypoint: 'main.handler'
          environment: "\
            TELEGRAM_BOT_TOKEN=${{ secrets.TELEGRAM_BOT_TOKEN }}"
          source: 'app'

Переменные окружения программы и сборки спрячем в GitHub Secrets на уровне репозитория.

Результат

Пример работы @ballsortpuzzlebot

Бота можно найти в telegram по позывному @ballsortpuzzlebot.

Все исходники — на Github.

Присоединяйтесь к маленькому community любителей этой игры в telegram. Бот был добавлен в группу и внимательно следит за всеми отправленными картинками.

Бонус! Уровни, у которых нет решенияLvl 4091Lvl 6071

Мой алгоритм умывает руки — говорит что перебрал все возможные комбинации и решения нет. Возможно это баг алгоритма.. или QA-отдел мобильной игры просто забил на эти уровни, так как не предполагал, что кто-то так далеко зайдёт)

Заключение

Для меня это был интересный опыт скрещивания технологий (Telegram API + Python + OpenCV + Lambda). Надеюсь он окажется полезен кому-нибудь ещё.

Найденные баги, предложения по оптимизации алгоритма, или даже PR в репозиторий крайне приветствуются

С новым годом!

Сертификаты

      
   Сертификаты OSRAM-LEDVANCE
     Лампы и ПРА
  1. Диммеры
  2. Лампы галогенные OSRAM
  3. Лампы люминесцентные FC и трубчатые
  4. Лампы люминесцентные FC и трубчатые 2
  5. Лампы люминесцентные компактные без ПРА OSRAM
  6. Лампы люминесцентные компактные без ПРА OSRAM 2
  7. Лампы люминесцентные компактные с ПРА Osram
  8. Лампы люминесцентные компактные с ПРА Osram 2
  9. Лампы люминесцентные трубчатые Смоленск
  10. Лампы металлогалогенные
  11. Лампы металлогалогенные 2
  12. Лампы накаливания общего назначения Смоленск
  13. Лампы накаливания общего назначения и декоративные
  14. Лампы накаливания общего назначения, типа R, декоративные
  15. Лампы натриевые высокого давления VIALOX PLANTASTAR SUPER
  16. Лампы натриевые высокого давления VIALOX PLANTASTAR SUPER 2
  17. Лампы натриевые высокого давления VIALOX Смоленск
  18. Лампы натриевые высокого давления типа NAV и PLANTASTAR
  19. Лампы натриевые типа SON
  20. Лампы ртутные
  21. ЭПРА для люминесцентных ламп
  22. ЭПРА для газоразрядных ламп
  23. Стартёры для люминесцентных ламп OSRAM импортные
  24. отказное письмо на накал, галоген 2016
  25. Лампы бактерицидные
  26. Трансформаторы для галогенна
        Светодиодная продукция
  1. Лампы G9 светодиодные
  2. Лампы G9 светодиодные 2
  3. Лампы светодиодные Classic и Ретрофит
  4. Лампы светодиодные Classic и Ретрофит 2
  5. Лампы светодиодные Classic и типа R
  6. Лампы светодиодные GX53
  7. Лампы светодиодные LEDinestra
  8. Лампы светодиодные LEDinestra 2
  9. Лампы светодиодные MR16
  10. Лампы светодиодные MR16 2
  11. Лампы светодиодные MR16 3
  12. Лампы светодиодные MR16 4
  13. Лампы светодиодные PAROTHOM
  14. Лампы светодиодные PAR16 2
  15. Лампы светодиодные типа CLASSIC DIM, Ретро
  16. Лампы светодиодные типа DULUX D
  17. Лампы светодиодные типа MR11, MR16
  18. Лампы светодиодные типа PARATHOM DIM, типа HQL, HQI
  19. Лампы светодиодные типа R и Classic 2
  20. Лампы светодиодные трубчатые и типа DULUX
  21. Лампы светодиодные трубчатые
  22. Лампы светодиодные трубчатые 2
  23. Светильники светодиодные
  24. Светильники светодиодные 2
  25. Светильники светодиодные 3
  26. Светодиодные аварийные светильники декларация соответствия
  27. Светодиодные аварийные светильники пожарный сертификат
  28. Светодиодные аварийные светильники
  29. Светодиодные прожекторы
Сертификаты на PHILIPS
  1. Лампы металогалогенные
  2. Лампы металогалогенные 2
  3. Лампы  люминесцентные одноцокольные
  4. Лампы светодиодные
  5. Стартеры
  6. ПРА для МГЛ
  7. Светильники стационарные
  8. Светильники встраиваемые
  9. Светильники стационарные (потолочные, подвесные)

Сертификаты на SYLVANIA
  1. Сертификат на продукцию SYLVANIA
  2. Бактерицидные лампы Ozon free
Сертификаты GE, Tungsram
  1. Лампы люминесцентные
  2. Лампы светодиодные 
  3. Лампы металлогалогенные Лампы металлогалогенные2
  4. Компактные люминесцентные Компактные люминисцентные 2
  5. Пускорегулирующие аппараты
Сертификаты Ecola

     1. Лампы светодиодные с цоколем GU10, E14, E27
     2. Светильники линейные
     3. Светильники встраиваемые MR16, GX53, GX70
     4. Лампы светодиодные с цоколем GX70
     5. Лампы светодиодные с цоколем GX53
     6. Лампы светодиодные с цоколем G4 и G9
     7. Лампы светодиодные T8

Сертификаты General

  1. Светодиодные лампы
  2. Высокомощные светодиодные лампы
  3. Трековые светильники
  4. Светильники Highbay
  5. Панели GLP
  6. Встраиваемые светильники GX53 и MR16
  7. Контроллер для лент 12 вольт
  8. Источники постоянного напряжения (драйверы)
  9. Аварийные светильники AWEX
  10. Отказное письмо ленты светодиодные 12 и 24 вольт
  11. Отказное письмо ленты светодиодные 12 серия PRO
  12. Отказное письмо шнур питания с вилкой для лент 12 Вольт и 24 Вольт
  13. Отказное письмо заглушки, скобы, профиль
  14. шнур питания для лент и неона 220 Вольт
Сертификаты TM TECHNOLOGIE
  1. Пожарный сертификат на светильники ONTEC
  2. Аварийные светильники ONTEC

Вакуум при производстве CPU. Зачем он нужен? Разбор

Сложно ли наклеить пленку на экран телефона? В целом, процедура то довольно простая — протер экран и быстро наклеил пленку! Но как же много пленок оказалось в помойке из-за маленьких частичек пыли, которые оказались между экраном и пленкой, при этом образовав отвратительный маленький пузырик воздуха!

Уверен, что такая ситуация знакома очень многим зрителям нашего канала. И мы тут говорим о том, чтобы просто наклеить пленку на телефон.

А теперь представьте, что вам надо нанести слой всего в несколько нанометров! Или нанести на кремниевую пластину рисунок будущего процессора с помощью экстремальной УФ литографии! Тут дело уже не только в пыли: любая неточность уже критична!

Чтобы не было дефектов должна быть идеальная чистота и абсолютно контролируемые условия. Как же это достигается? Как сделать условия осаждения контролируемыми? Это действительно сложная задача и частично ей занимается область под названием Вакуумная техника!

Что такое вакуум?

Давайте для начала поймем, что такое вакуум, что такое давление газа и как они связаны?

Представим себе стеклянную камеру идеально изолированную от внешней среды, где давление воздуха внутри такое же как снаружи, то есть 1 атмосфера. Что это значит?

Газ — это такое состояние вещества, когда молекулы движутся в каком-то объеме свободно, при этом занимая весь доступный объем. Эти молекулы газа находятся в постоянном и хаотичном движении — они как бешенные летают туда-сюда и сталкиваются друг с другом.

Но не только между собой — они еще и сталкиваются со стенками нашего стеклянного сосуда! Когда одна молекула стукается о стенку, то ничего особенного не происходит, но вот когда этих молекул много, то эти триллионы столкновений становятся уже существенными! Это и есть давление газа.

Я просто напоминаю что в одном кубическом метре газа при атмосферном давлении примерно 1 атм — это 2 на 10 в 25 степени молекул газа!

Вот столько: ≈ 26 875 000 000 000 000 000 000 000

Но когда эти столкновения внутри сосуда и снаружи равны, то это и значит что давление одинаковое! Столкновения снаружи и внутри друг друга компенсируют!

Но вот мы начинаем этот газ откачивать из нашей колбы и в идеальном случае, в идеальном вакууме, откачиваем до тех пор, пока газа в этом сосуде совсем не остается, то есть убрали все молекулы из объема.

При этом давление внутри стало равно нулю, а снаружи молекулы все также стукаются о внешние стенки нашей колбы, то есть наше стекло начинает сжиматься, потому что разница давления стала равна 1 атмосфере! Или равно примерно 1 кг на 1 квадратный сантиметр!

И если этот сосуд достаточно крепкий, то он выдержит это давление, а если нет, то происходит взрыв…

Также справедливо и обратное — если накачать слишком много газа в объем, то он может не выдержать, прямо как воздушный шарик с гелием, который надули слишком сильно. В общем, тут то мы и приходим к тому, что такое вакуум — это среда, где газа сильно меньше чем в атмосфере, то есть давление сильно меньше, чем атмосферное!

Зачем нужен вакуум?

Ну а зачем вакуум вообще нужен и при чем тут производство процессоров?

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

Если вы помните, то вакуум нужен для электронных микроскопов и для гигантских установок экстремальной ультрафиолетовой литографии, ведь ультрафиолетовое излучение рассеивается в воздухе, как и луч электронов в электронном микроскопе.

Не говоря уж о научном оборудовании, которое может выглядеть как-то так. Внутри всех этих железяк нужно создать очень низкое давление.

Вообще идеальным примером тут может служить обычная лампа накаливания. Внутри первых ламп был вакуум! То есть инженеры пытались максимально продлить срок службы вольфрамовой нити, максимально избавив ее от любого газа, с которым она может взаимодействовать!

Современные же лампы накаливания заполнятся избыточным инертным газом, то есть таким газом, который с Вольфрамовой нитью не взаимодействует.

Поняли к чему я клоню?

Это и есть создание контролируемых условий для проведения определенных процессов. Сначала из колбы убрали воздух со всей той гадостью, которую он в себе несет: с грязью, пылью и самое главное — убрали кислород. Ведь именно он реагирует с Вольфрамом, и при нагреве нить просто сгорит.

Так вот при производстве процессоров надо сделать тоже самое — надо либо полностью убрать любой газ, а в особенности кислород из объема, либо сначала убрать, а потом заполнить рабочий объем специальным газом!

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

Тут кстати вакуум играет не самую важную роль, гораздо лучше в этом помогает сделать так называемые «чистые комнаты»!

А кислород вообще главный враг! Ведь при осаждении различных материалов используются пары и активные ионы различных металлов, а они только и мечтают как бы с этим кислородом связаться, то есть как бы им окислиться!

Вот осаждаете вы алюминий, а он бац и стал оксидом алюминия, и уже вместо проводника он стал изолятором, тем самым испортив вам контакт транзистора! В общем, надо максимально избавиться от воздуха в установках на производстве, а как?

Как создается вакуум?

Ну вот наконец-то мы и переходим к самому интересному. Как создать вакуум?

Тут то вы очевидно ответите, что все очень просто — надо просто откачать газ: подключил насос и выкачивай свой воздух сколько влезет! Частично вы правы, но все, как обычно, чуть-чуть сложнее.

Мы не зря тут вам напоминали, что такое газ и давление, и что газ занимает весь объем, доступный ему. Если у нас полностью изолированная колба, чтобы уменьшить в ней давление надо увеличить ее объем! Тогда образовавшийся новый объем мгновенно занимает газ, равномерно распределялась. Соответственно на единицу площади стенки в среднем попадает меньше молекул газа!

Вы ровно так и дышите между прочим! Грудные мышцы расширяют ваши легкие — увеличивая их объем, давление в легких понижается и воздух через нос или рот заполняет легкие. Потом мышцы сжимают легкие, давление повышается и газ выходит наружу.

А попробуйте зажать нос и закрыть рот, а потом вдохнуть или выдохнуть — вот поздравляю — вы создали изолированную колбу, о которой мы вам тут рассказываем!

То есть для откачки или иначе говоря для создания вакуума надо сначала увеличить объем, а потом этот объем просто изолировать!

И на производствах для этого используются специальные вакуумные насосы, которые ровно так и работают — посмотрите на пример так называемого мембранного насоса.

Мембрана выгибается в одну сторону и объем увеличивается, заполняется газом из той области, которую мы откачиваем, потом мембрана выгибается в другую сторону, и газ выталкивается уже наружу, так как доступ обратно в камеру уже перекрыт.

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

Есть целая куча различных роторных насосов, но в целом принцип у них один и тот же — увеличили объем, отсекли его и выбросили газ с другой стороны!

Но тут мы сталкиваемся с новой проблемой!

Глубокий вакуум

Такие насосы могут откачать газ только до определенных давлений, а они, мягко говоря, все еще великоваты. Слишком много всякой ненужной гадости будет у вас в камере. Примерно в десять тысяч раз больше, чем хотелось бы! Надо создать более глубокий или иначе говоря высокий вакуум.

Кстати, оцените таблицу типов вакуума — в производстве обычно используется высокий вакуум, а например для детектора гравитационных волн LIGO надо было создать Экстремальный вакуум!

И тут человечество пошло на много разных хитростей, но сейчас мы расскажем вам о двух самых классных для создания высокого вакуума.

Первые — это так называемые турбомолекулярные насосы! Они не создают новый объем, как это было с роторными насосами. Объем остается таким же!

Но как же он тогда качает?

А дело все в том, что он работает как вентилятор! Молекулы газа стукаются о его лопасти и отскакивают от них только в определенных направлениях, то есть их просто как шарики выбивают из рабочей камеры!

Только для того, чтобы это начало работать — лопасти этого вентилятора надо раскрутить очень быстро.

Современные турбины крутятся со скоростями до полутора тысяч оборотов в секунду! Их даже стали делать на специальном магнитном подвесе, то есть лопасти просто висят на магнитной подушке и крутятся на бешеной скорости.

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

Использование турбин — это самый популярный метод откачки до высокого вакуума — именно он и используется в установках ASML для литографии! Мы такую турбину можем даже увидеть на рендере.

А какой же второй способ? Это так называемый крионасос. Иногда это специальный насос, а иногда это в общем-то даже не совсем насос как таковой.

Работает по принципу бокала с пивом, о котором мы вам уже рассказывали в материале о магии создания процессоров! На холодной поверхности водяной пар конденсируется! А если поверхность охладить очень сильно, то конденсироваться будет уже не только вода, но и все остальные газы из воздуха, в том числе и кислород. Он будет просто застревать на стенках!

Для этого часто применяют обычно жидкий азот у которого температура почти -200 градусов по цельсию, который закачивают в стенки специальной камеры. Молекулы газа, которые летают в объеме долетая до этой стенки просто на ней застревают и все.

Вот такое вот элегантное и простое решение! Но само собой, что если перестать охлаждать, то весь газ вернется обратно в объем.

Выводы

И конечно есть еще другие типы насосов — есть ионные и диффузионные насосы. Но они уже не такие популярные в целом, хотя выполняют все ту же функцию — понижают давление в камере.

При этом как и с лампочкой накаливания, зачастую после откачки рабочий объем в камере потом заполняется так называемым рабочим газом, то есть газом который необходим для проведения определенного технологического процесса! И иногда это кислород! Тот самый кислород, от которого мы изначально хотели избавиться. Просто первичная откачка позволяет добиться правильных условий процесса, ведь мы можем контролировать давление, концентрацию и поток кислорода. Все ради контроля процесса! И так на каждом этапе производства!

И без этих сложных и крутых технологических решений, о которых мы вам рассказываем в этой серии разборов, современный мир, которым мы его знаем сейчас, был бы совсем невозможен. Никаких процессоров и экранов!

Post Views: 610

her little world, chemistry outside the classroom — фанфик по фэндому «Genshin Impact»

пов: Сахароза       На часах старого, полу разбитого и чудом ещё работающего телефона было 7:30. Рано. Возможно даже слишком рано. Но эта мысль посетила Сахарозу только когда она не без усилий открывала тяжелую школьную дверь, не желая проводить даже лишней минуты в холодной и одинокой квартире. Безусловно, девушка очень ценила и восхищалась своими родителями которые работали днями и ночами, что бы оплатить переезд жильё и учебу в Москве, что бы помочь ей осуществить мечту детства, но.. Но лишь Сахароза достанет из уха наушник или же немного отвлечься от очередной энциклопедии как на душе становится холодно и тоскливо. В такие моменты она ощущала себя котёнком, выброшенным в холодный осенний день. И словно этот котёнок в коробке, она сжимается в клубок, боясь подумать что её ждёт дальше. Всем известно, что большинство таких котят не выживают, либо замерзнув, либо умерев с голоду . Но в каждом брошенном котёнке живет крохотная надежда, которую он лелеет до последнего вздоха. Надежда о том, что где-то там, на другом конце серой и равнодушной улицы идет тот самый человек, который найдет этого котёнка, полюбит и заберет к себе. Вот только.. Какова вероятность, что ты окажешься в не большом числе спасённых котят? Если котёнок так и продолжит сидеть в коробке, ожидая чуда, то вероятность почти нулевая. А если он найдет в себе силы выбраться из своей картонной тюрьмы? Если выйдет в центр улицы и начнёт мяукать? Так вероятность быть замеченным возрастает в десятки раз. Но ведь люди тоже разные. Вместе с вероятностью найти своего человека растёт вероятность встретить больного на голову человека, который может просто разорвать беднягу в клочья если он так захочет. И пусть после содеянного этот псих подвергнется массовому осуждению и будет обсужен вдоль и поперёк, ни один пост в интернете, ни одна статья, ни один штраф или психотерапевт не вернут этого котёнка к жизни. Какой-бы путь не выбрал этот брошенный зверёк, нигде нет стопроцентной гарантии на спасение. Сахароза много раз думала над этой делемой котёнка и вывела для себя для себя свой путь. Она выходит из коробки, но не кричит. Так она вроде бы и не бездействует и вроде бы не обращает на себя внимание. Она не хочет кричать. Или же не может?       Ученица 10г класса зашла в небольшую комнату школьной раздевалки и в нос сразу ударил до тошноты противный запах сигарет. Этот запах был здесь всегда и воспринимался как что-то само самбой разумеющееся. Но к сожалению менее приятным он от этого не становился. Взглядом пробежавшись по именам под крючками Сахароза нашла своё и вдруг услышала как её окликнули. — Сахароза? Не ожидал тебя здесь увидеть. Здравствуй. Что-то ты сегодня рановато. — Спокойный теплый и такой знакомый голос донесся где-то из-за спины, заставляя витающую в облаках девочку дернуться и обернуться. В дверном проёме стоял учитель алхимии и по совместительству классный руководитель химико-биологического класса. — М.. Мистер Альбедо? Здравствуйте.. Вы, как я вижу, тоже.. — Сахароза смотрела на учителя немного удивленно. Дело в том, что учитель не славился пунктуальностью от слова совсем и не редки случаи когда он входил в класс позже самых опаздывающих учеников, из-за чего постоянно извинялся, но на следующий день всё повторялось. Поэтому видеть его в школе в такое время было своего рода чудом. Сахароза даже запереживала, а не ночевал ли он в школе. Пока что таких случаев, конечно же, не было, но кто знает, что у него в голове. — Да, есть немного.. Решил нарушить традицию и прийти немного пораньше.. — Альбедо слегка улыбнулся. — Немного, это за час до урока? Что-то вы не совсем в ладах со временем, Мистер Альбедо.. — На мгновение уголки тонких губ скакнули вверх, но уже в следующее мгновение их обладательница неловко отвела глаза. — простите.. Это наверное звучало слишком грубо.. Я не… Простите..       Сахароза всегда боялась показаться показаться бестактной и грубой. Казалось, что стоит ей один раз сказать что-то не то, как все начнут её ненавидеть и презирать. И может быть среди этих злых и бессердечных взглядов она увидит те самые глаза, которые увидеть в этой группе она боялась больше всего. Нет. Этому не бывать. Она этого не допустит. — Эй.. Эй, всё нормально! Не стоит из-за такой мелочи извиняться! Ты права, время не мой друг. Ну и ладно.. — снова лёгкая, но такая нужная улыбка со стороны учителя. — слушай.. До урока ещё времени много, а я думаю что стоять здесь ни тебе, ни мне не хочется. — зелёные глаза Альбедо смотрели на Сахарозу, ожидая согласия или опровержения его слов. — Да.. то есть нет.. то есть.. да, не хочется! — Мысленно ученица дала себе подзатыльник, за свою полную несобранность. — Так вот… — мужчина продолжил, слегка театрально отводя взгляд в сторону — может лучше пойти в лабораторию? На прошлом уроке я не ответил на пару твоих вопросов. Могу это сделать сейчас и даже кое-что показать наглядно. — Правда? Конечно, я была бы только за! — в одну секунду эмоции на лице Сахарозы сменились со страха, на интерес и даже некий азарт. Мысленно она уже сто раз (если не тысячу) поблагодарила Альбедо, за это, казалось бы обычное предложение. На её памяти он был единственным человеком, способным заставлять её то волноваться до дрожжи в коленках, то радоваться обычным мелочам как в последний раз. К чему бы это — Вот как. Тогда прошу за мной. — оба направились в кабинет-лабораторию. ***       Кабинет химии был любимой локацией Сахарозы во всей школе. По сравнению с другими классами он казался настоящей лабораторией, в которой можно проводить очень интересные и опасные эксперименты, по ходу которого что-нибудь задымится да взорвется, а по итогу можно было бы получить какой-нибудь говорящий цветок-сахарок иди танцующую мяту. Однако ещё в сентябре, на первом уроке, посвящённом технике безопасности Альбедо чётко сказал, что все препараты в лаборатории вполне безопасны, а взрывоопасных нет и вовсе. Эта информация огорчала не только Сахарозу, но и добрую половину класса, в особенности Эмбер — соседку по парте и по совместительству лучшую подругу Сахарозы. Однако недовольное мычание учеников вряд ли изменит правила техники безопасности и телепортирует в школу какой-нибудь гексоген, так что оставалось только мечтать и фантазировать. — Почему ты так сильно интересуешься биохимией? — Что? — голос Альбедо заставил Сахарозу, увлеченно рассматривающую разноформенные колбы и пробирки на другом конце класса, вздрогнуть. — Ты больше других увлечена моим предметом, а когда мы дошли до раздела с биохимией ты знала абсолютно всё, что я собирался рассказать. Должен признать, поиск информации, которой можно было бы тебя удивить стал настоящим приключением. Однако, когда я начал говорить о биохимии в генетике ты прям просияла. Очевидно, что тебе эта тема не безразлична. Так почему? — Альбедо поднял свой взгляд на ученицу, продолжая расставлять оборудование для предстоящего эксперимента. — А.. Это на столько заметно? — получив в ответ фразу «ты даже не представляешь как» девушка неловко опустила голову и почесала затылок — просто… Вы наверное будете смеяться… — Клянусь этой лабораторией, что смеяться не буду, что бы ты не сказала — Альбедо по детски приложил руку к сердцу, давая нерушимую клятву. — Ну.. — Сахароза всё равно не до конца была уверенна, стоит ли говорить, однако просто всё время отнекиваться было бы не прилично. — в детстве.. В моём родном городе ещё… Я с подругами нашла одну книгу.. Вы наверное знаете сказку «Алиса в стране чудес»? Хотя, вы её точно знаете, что это я? — последнюю фразу она сказала тихим шепотом, как бы делая себе замечание. — Так вот.. Мы нашли эту книгу. И эта страна чудес нас зацепила. Очень сильно. После этого мы постоянно искали тот самый путь туда, мечтали, только о ней и говорили. Эта книга стала для нас смыслом жизни. своеобразной целью. — рассказчица и не заметила, как на лице её появилась улыбка — вот только… Одна подруга переехала в другой город и постепенно потеряла с нами связь. А вторая.. — ученица почувствовала, как глаза начали щипать от подступающих слёз — у неё в семьё горе было. Отец умер.. И вскоре после этого она перестала со мной общаться. Мне иногда кажется, что в смерти отца виновата я, но.. Но ведь этого не может быть.. Я его и не видела ни разу.. В общем.. я осталась совсем одна.. И.. для них, наверное, эта страна чудес так и осталась детской сказкой.. Но.. для меня это по прежнему мечта и цель.. Конечно, я понимаю, что её не существует, но.. Я ведь могу и сама её создать… Только это немного сложнее и дольше.. Но я должна создать её.. Хотя бы в память о нашей дружбе.. — слезы текли по щекам девочки уже минуты две, но заметила их она только сейчас. Разревелась на глазах учителя. Молодец. От беспомощности и обиды чуть ли не трясло. Единственное что удалось выдавить из себя это хриплое и дрожащее «простите». Что теперь он думает о ней? Что она плакса? Тряпка? Неудачница? Или же всё сразу? Как ей теперь вообще в глаза ему смотреть? Лучше сквозь землю провалиться. Зачем она вообще начала говорить об этом? Глупо. — Мистер Альбедо я.. — Сахароза подняла голову и замерла. Она и не заметила как учитель оказался перед ней. — Спасибо что сказала.. И прости, мне всё таки не стоило спрашивать.. Больная тема, да? Слушай.. Ты ведь и сама понимаешь, что твоей вины во всей этой ситуации нет. Я знаю это тяжело, но постарайся отпустить эту ситуацию. Это уже в прошлом. — теплая рука учителя потрепала девочку по плечу, словно товарища. — А цель у тебя хорошая. Интересная. Знаешь.. если над этим будешь работать ты, то кто знает, может страна чудес сможет стать реальной. — зелёные глаза игриво сверкнули.        Повисла тишина. Но не неловкая. Эта тишина не была напрягающей. Наоборот успокаивала. Нужная тишина. Оба стояли, смотря друг на друг и не произнося ни слова. В глазах одной было непонимание в перемешку с переживанием, у второго же просто спокойствие, с нотками толи сочувствия, толи ещё чего-то. Странная тишина. К счастью или к сожалению, но долго молчание не продержалось. — Давай я покажу то, что собирался в следующий раз. Подожди минутку, у меня где-то был чай. Я сейчас… — Альбедо, с еле уловимым волнением перевел тему и направился в сторону двери, ведущей в небольшую учительскую комнатку, оставляя Сахарозу стоять и переваривать полученную информацию. — Мистер Альбедо.. спасибо. — Не за что меня благодарить.

***

— И после этого ты, как ни в чем не бывало, просто пила с ним чай?! — Эмбер сказала это громче, чем следовало, привлекая внимание людей, сидящих за последней партой. — Эй! Чего смотрите? Урок слушайте, а не чужие разговоры! — Эмбер, прошу тебя, говори потише.. На меня теперь все смотрят… — Сахароза опустила голову ближе к парте, прячась за учебником. Где-то в глубине души она уже пожалела, что начала этот диалог не на перемене, когда каждый занят своим делом и не пытается подслушать чужие переговоры. Однако что сделано, то сделано и жалеть уже поздновато. — Ой, прости. Ну так что? Просто так? Ничего себе. А из-за чего хоть плакала? — соседка по парте перешла на шепот. — Да так.. Что-то накопилось.. Не знаю — Сахароза не рассказывала Эмбер ни про страну чудес, ни про подруг. В её планы в принципе не входило делиться с кем-то этой историей, тем более характер соседки по парте Сахароза знала прекрасно и вместе с этим знала, что на любую историю Эмбер будет реагировать максимально эмоционально, так что говорить об этом с ней в общественном месте равносильно объявлению в громкоговоритель. Она расскажет ей, но не сейчас. Потом. Наверное. — Сахароза! Эмбер! Что за шушуканье там? Для кого я тут распинаюсь и разжёвываю материал? История это наука серьёзная! Ещё одно замечание и я вас рассажу. — Джинн недовольно посмотрела на девочек, сидящих за предпоследней партой и покачала головой. Любой ученик после этого бы напрягся и тут же перестал двигаться, а заодно и дышать. Учительница истории была как раз тем самым типом учителей, которого очень сложно разозлить, но если это происходит, то остается надеяться только на милость Господа Бога.       До недавнего времени это были только неподтвержденная информация, которую рассказали три-четыре года назад старшеклассники. Но вот 2 недели назад… Никто толком и не понял, что именно стало причиной взрыва. То ли просто кто-то случайно кинул записку в неё, толи пошутил не очень остроумно, толи ещё что-то.. Но уже через минуту ор слышался на весь коридор. Казалось, ещё чуть-чуть и можно с жизнью прощаться. И так скорее всего и было, если бы не случилось чудо. А чудом этим являлась никто иная как Эмбер. Она спокойно подошла к разъяренной Джинн и что-то тихо сказала ей на ухо, после чего обе вышли в коридор. Что именно произошло в коридоре история и спасительница класса умалчиваю. Однако после этого Эмбер стала любимицей и отличницей по предмету истории. Эта новость быстро облетела всю школу, создавая множество слухов, один страшнее другого. Кто-то говорил, что Эмбер даёт Джинн взятки, другие на полном серьёзе утверждали, что Спасительница Класса обладает черной магией, а третие и вовсе с пеной у рта доказывали, что Джинн и Эмбер состоят в любовных отношениях. Сама же героиня лишь с интересом слушала и кивала головой на каждую теорию, как бы говоря «ну-ну, что ещё вы там напридумывали?» — Эй, Сахароза, ты чего так напряглась? — Эмбер вновь вернулась к беседе, как только учительница отвернулась. — Ой, ты что, серьёзно её боишься? Я уже сто раз повторяла, что она нормальная. Просто была слегка на эмоциях, вот и не сдержалась. Что вы из мухи слона все делаете? — Тебе то легко говорить. После того случая она в тебе души не чает. А ты даже не хочешь рассказывать как именно ты добилась такого результата за 2-3 минуты, когда вы были в коридоре. — слова соседки по парте не сильно убедили Сахарозу и она говорила всё максимально тихо, то и дело с опаской поглядывая на Джинн. — Хорошо. Я скажу. Но только если ты скажешь почему ты на самом деле плакала. — Что? — Сахар, ты не умеешь врать. Ну вообще нет. — Эмбер посмотрела на подругу, доставая из пенала фруктовую жвачку. — Но… Я.. Ладно.. Рассажу. Но потом. Ты первая. — мысленно Сахароза пыталась придумать ложную своих слёз, но на ум ничего толкового не приходило. Хоть она сама понимала, что в искусстве лжи она не преуспевала, признавать это не хотелось. Хотя с другой стороны, такая репутация может быть даже выгодной. — Ну ладно.. — Эмбер прищурила глаза, пытаясь понять, чистосердечно ли обещание подруги — Так вот. Я… Ничего ей не говорила, почту не наводила, мы не встречаемся а про деньги даже комментировать не буду. Мне не всегда на булочку в столовой хватает, какие взятки? Всё намного проще. Я просто выслушала её. — В каком плане? — В плане того, что я дала ей выговориться. Если вкратце, то у неё была тяжелая неделька и накопились эмоции. Это когда ты всё время держишь эмоции в себе, а потом твои нервы как шарик лопаются из-за какой-нибудь ерунды. Можно сказать, нам просто не повезло оказаться той самой «вишенкой» на торте эмоций, вот и всё. На самом деле Мисс Джинн очень добрая и хорошая, а вы судите о ней по тому недоразумению. В общем вы все бессердечные школьники! — Спасительница класса и нервной системы Джинн театрально надула губы, изображая высшую степень обиды, вывев этим самым соседку по парте на тихий смешок — Ну а если серьёзно, то перестаньте бояться её. Кроме того, что она учитель, она в первую очередь человек.        Забавно, что только после того, как Эмбер озвучила эту до смеху простую истину, Сахароза осознала, что учителя такие же люди как они. Не какие-то полу роботы. Не инопланетные существа или кто-то ещё. Просто люди. У которых тоже есть свои желания, мечты, чувства. Но удивляло больше то, что ученик и учитель могут иметь общие интересы и темы для разговора. Быть друзьями и общаться на равных. Хотя, разве не у Сахарозы примерно такие отношения с учителем по химии? Тогда чему тут удивляться, ведь если даже она, полный ноль в социализации, смогла построить подобные отношения с учителем. Эмбер по жизни была очень общительной и идущей на контакт, поэтому вполне ожидаемо, что у неё могут быть дружеские отношения с учителем. Хотя вряд ли она ходит вместе с мисс Джинн по паркам и кафешкам, бесконца обсуждая кто-когда-кого-и-с-кем. Или же Сахароза чего-то не знает.        Раздался звонок. Джинн, смирившись, что дорассказать тему всё равно не получится, вздохнула и быстро черканув на доске домашнее задание, покинула кабинет. Стулья зашумели и ученики повставав, разбрелись по не самой большой комнате класса. — …Ну тогда спроси у неё, мне то откуда знать? Да и зачем? — вечно усталая Цици недовольно посмотрела на соседку по парте, которая активна её донимала какими-то вопросами. Они с Ху Тао наверное самая странная пара друзей если не в школе, то в классе точно. По началу Ху Тао просто бегала и приставала к невысокой девочке, что бы убить время и кинуть не самую безобидную шуточку из-за чего последняя не слабо прокачала свой скилл в догонялках и прятках. Не редко Цици откровенно жаловалась на своего «сталкера» при чем зачастую в весьма грубой форме. Однако со временем обе начали к этому привыкать и постепенно общаться. Когда Ху Тао заболела, Цици ходила ещё более мрачная, чем обычно, хотя подруги не было всего три дня. И как бы обе не отрицали этого, всем было видно, что непримиримые враги ( так назвала Цици её с Ху Тао дружбу, после того как последняя целый день предлагала закопать девочку на заднем дворе, аргументируя это тем, что Цици выглядит как ходячий труп) подружились. Они ходили домой вместе, периодически что-то обсуждали, помогали друг другу с уроками и больше не обижались на колкие фразочки друг друга. Конечно их дружба не была похожа на ту самую дружбу с детской книжки, но вполне имела место быть. — Эй, Сахароза — протяжный голос Ху Тао заставил напрячься. По тону было понятно, что девушка собирается что-то спросить, а вопросы по типу «какой следующий урок?» Тао никогда не задавала. — А с кем это ты как ни в чем ни бывало пила чай? Неужели у тебя кто-то появился? — подошедшая пристально посмотрела на остолбеневшую Сахарозу, которая в момент потеряла дар речи. Как бы она не пыталась, не получалось вымолвить даже несчастное «нет».        Цици, противореча своим словам словам тоже остановилась, ожидая услышать ответ допрашиваемой, но сделала вид, что что-то читает в учебнике по истории, что выдавало её ещё больше. Всему классу известно, что у девочки очень плохая память и запоминать какую либо информацию ей было невероятно сложно. А история вообще была для неё как страшный сон, поэтому она оставила все попытки выучить хоть что-то. — А тебе какая разница? Ревнуешь что-ли? — голос Эмбер разорвал нагнетающее молчание и привлек внимание Тао на себя. — Хаха, нет конечно. Сахароза конечно милашка, но моё сердце на веки отдано писателям серебряного века! — Дай угадаю, тебя в них привлекает тот факт, что они уже мертвы? — Цици наконец подала голос, заставляя остальных опустить голову вниз. Хоть и Сахароза, и Эмбер, и Ху Тао были вполне невысокого роста, по сравнению с малышкой Цици все они были теми ещё великаншами. — В точку! — Тао как ни в чем ни бывало с улыбкой ответила на колкость подруги. — Я и с тобой по этой же причине дружу. Ты же выглядишь как маленький зомби! Такая бледная, худая. И синяки под глазами. И голос такой тихий, мрачный, как не от мира сего. Синь Янь каждый раз шугается, когда ты к ней подходишь. — С физикой тебе я больше помогать не буду. — маленький зомби спокойно убрал учебник по истории в рюкзак и медленно направился к выходу из класса. — Эй, ну ты чего? Обиделась что-ли? Эй, ну ты куда? — Ху Тао побежала за своей подругой, оставляя Эмбер и Сахарозу. Девушки проводили глазами убегающих. На лицах обоих была лёгкая улыбка, которая всегда при виде этой парочки. По непонятной причине эти взаимоотношения казались не странными и грубыми а наоборот милыми. Они были похожи на сестёр, но, как ни забавно, в роли старшей сестры выступала бы Цици. — Спасибо тебе.. Я опять испугалась и не смогла ничего ответить.. — Ой, да ладно тебе, пустяки. — Эмбер накинула на плечо лямку рюкзака — просто в следующий раз будь немного увереннее и всё. Будь немного увереннее. Легко сказать. Сахароза всю свою жизнь пытается быть немного увереннее и как никто другой знает, что это не просто. Неужели есть люди, которые вот так становятся увереннее после этой фразы. Бред. Однако, Сахароза поняла, что имела в виду Эмбер. «быть немного увереннее»

Мульча сосновая – хороша ли мульча из сосновых шишек?

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

Особенности и польза мульчи из сосновых шишек

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

Использование мульчи из сосновых шишек

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

Недостатки мульчи из сосновых шишек

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

Рекомендации использования сосновой мульчи и мульчи из сосновых шишек

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

По материалам www.ehow.com

получили мячи? Нержавеющая сталь 6 унций. Фляга: Фляги


Цена: 3,95 $ 3,95 $ + 8 долларов.04 перевозки
Материал Нержавеющая сталь
Цвет Зеленый
Марка Мыс Берег

Стресс-шар для химической колбы

Стресс-мяч для химической колбы

ПОЛУЧИТЕ СКИДКУ 5% ПО КОДУ «GIVEME5» ПРИ ЧЕККОТЕ

Имя элемента: Напорный шар для химической колбы
Номер предмета: SB-1118
Размер элемента: 3-3 / 8 дюйма диам.х 4 дюйма
Материал: Полиуретан

Описание позиции

The Chemical Flask Stress Ball — отличная рекламная раздача. Стресс-мячи выделят вас на любом мероприятии. Получите самые низкие цены на мячи для снятия стресса в магазине Stress Balls 360 сегодня и используйте эту замечательную акцию на следующей выставке, конференции или в качестве корпоративного подарка.

Площадь отпечатка: 1-1 / 4 «x 1-1 / 2» стороны
Метод печати: Pad

Рейтинг товара

Отзывы клиентов

Для этого товара нет обзоров.

Добавьте сюда свой отзыв

Зарегистрируйтесь и сэкономьте до 50 долларов СЕГОДНЯ!

Шаровая дробилка с колбой GD-6678b

Это Sensation Ball Flask и дробилка — подробности см .: //www.sourcingmetals.com/ball-crusher-with-flask-10198192

Диаметр: 2,25 дюйма x 2,25 дюйма Сертификация: ISO Твердость: 316L Место происхождения: Пакистан
Фирменное наименование: German Diagnostics Номер модели: GD-6678b

Прецизионная высококачественная хирургическая нержавеющая сталь.Чрезвычайно высокое качество.

Extreme Play Устройство для дробления шариков прецизионно сделано из 3-х важных частей
1) Поворотный винт
2) Шаровой шарнир
3) Грузик (прикрепляется к дну шаровой колбы)

Размеры:
Диаметр шариковой колбы: 2,25 Глубина «& 2,25»
Масса шара: отверстие 1 7/16 «, закрепленное прилагаемым шестигранным ключом

Указания: поверните винт, чтобы обеспечить максимальное отверстие в колбе с шариком. Отвинтите груз шарика от дна колбы.Шарико-винтовая передача представляет собой 2 полукруга и разбирается с помощью прилагаемого шестигранного ключа. Поместите 2-х компонентный шариковый груз и закрепите на верхней части мошонки над шариками и закрепите винтами с шестигранной головкой. После того, как шары закреплены в шаровой гири, поместите шары на дно открытой опоки для шаров, затем закрепите шаровой груз на месте и закрепите 2 винтами с шестигранной головкой. Медленно и осторожно поворачивайте винт, который опускает прецизионную пластину к яичкам. Будьте осторожны и будьте осторожны с этим устройством, которое необходимо использовать с осторожностью.

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

Сведения об упаковке: требуется клиентам
Сведения о доставке: в зависимости от заказа

Сопутствующий продукт для шаровой дробилки с колбой

Колба с острием иглы для теннисного мяча

Перейти к основному содержанию

ВСЕ ТОВАРЫ ДОСТУПНЫ ДЛЯ РОЖДЕСТВЕНСКОЙ ДОСТАВКИ

    Детали

    Принимаете ли вы активное участие в теннисе или любите ли вы быть сторонним зрителем в этом виде спорта; мы знаем, что вам понравится наша колба для игл с теннисным мячом.Красиво сшитый и законченный, с изображением знакомого вам теннисного мяча зеленовато-желтого цвета!

    Характеристики

    • Free Monogram (в порядке: первый, последний средний FLM (фамилия больше) или первый средний последний FML (все одинакового размера)
    • )
    • Ручная игла
    • Кожа Top Grain

    Детали колбы

    Мы используем 100% натуральную кожу для отделки и фляжки из нержавеющей стали на 5 унций. Наши фляги 4 дюйма в ширину x 4.5 дюймов в высоту и 1,25 дюйма в глубину и может вместить до 5 унций жидкости.

    Сроки

    Наши флаконы прошиты вручную, и нам понадобится 7-12 недель, чтобы сшить и закончить ваш бумажник для вышивки. Пожалуйста, не торопитесь, просматривая монограмму.

    Фляга с острием иглы фамильного герба

    Детали «Фамильный герб» часто называют «гербом».Задолго до того, как фамилии стали стандартом для обозначения семьи, использовался герб. Закажите собственное острие иглы для семейного гребня на заказ …

    Фляжка для игры в покер

    Детали Есть так много разновидностей покера; Техасский Холдем, Омаха, Семикарточный Стад, Открытый ананас и многое другое.В следующей игре, независимо от того, какая версия вам больше нравится, мы знаем, что вы будете …

    Крабовая фляжка с острием иглы

    Детали Прекрасный пловец, который действительно восхитителен! Мы разработали персональную фляжку для следующего кипячения краба и гарантируем, что ваша семья и друзья будут завидовать этому уникальному продукту…

    Кошелек для карточек с теннисным мячом Needlepoint Card

    Детали Любовь, 15, 30, 40, игра, матч! Принимаете ли вы активное участие в теннисе или любите ли вы быть сторонним зрителем в этом виде спорта; мы знаем, что вам понравится использовать этот бумажник для карточек с иглами …

    Ремень для теннисных ракеток с острием иглы

    Детали Принимаете ли вы активное участие в теннисе или любите ли вы быть сторонним зрителем; мы знаем, что вам понравится носить этот пояс для вышивки.Уникальный игривый подарок …

    Кошелек для карточек с теннисным мячом Needlepoint Card

    Детали Любовь, 15, 30, 40, игра, матч! Принимаете ли вы активное участие в теннисе или любите ли вы быть сторонним зрителем в этом виде спорта; мы знаем, что вам понравится использовать этот бумажник для карточек с иглами…

    Кошелек для лыжных карт Needlepoint

    Детали Пусть идет снег, пусть идет снег, пусть идет снег. . . чем больше идет снег, тем лучше катание! Этот бумажник для карточек идеального размера, чтобы положить его в карман лыж …

    Кошелек для карт Aztec Needlepoint

    Детали Идеальный аксессуар! Этот дизайн бумажника для карточек отличается стильным четким геометрическим рисунком и классическими дополнительными цветами.Функции Иглы от руки Кожа Top Grain Кошелек …

    Игольная фляга для пляжного волейбола

    Детали Шишка, постановка, шип. . . Сегодня идеальный день для игры в пляжный волейбол! Позвольте нам создать сшитую вручную колбу с острием иглы для каждого члена вашей команды! Функции Бесплатная монограмма (дюйм…

    Ошейник для собак Sunflower Needlepoint

    Детали «В подсолнухе есть изобилие и блеск, как единственный солнечный луч в теплый летний день». — неизвестный То же самое можно сказать и о вашей собаке. . . эта милая улыбка …

    Теннисный пояс с острием иглы

    Детали Любовь, 15, 30, 40, игра, матч! Вы любите теннис! Активно ли вы играете на кортах или любите быть сторонним зрителем; мы знаем, что вам понравится наш теннисный ремень с острием.Уникальный и …

    Ремень с острием иглы из пальмовой пустыни

    Детали Испытайте жизнь в пустыне в Palm Desert! Расположен к востоку от Палм-Спрингс в долине Коачелла, Калифорния. В этом городе круглый год светит солнце, есть приключения на свежем воздухе и много культурного …

    Ремень Brewster Custom Needlepoint

    Детали Самый особенный ремень с острием иглы — тот, который сделан специально для вас.Ремень Brewster Custom Needlepoint на 100% будет разработан на основе изображений, которые вы нам отправляете, и интерпретирует их …

    Ремень Tee Time Needlepoint

    Детали Вы когда-нибудь замечали, что после партии в гольф, как правило, приходите домой с большим количеством футболок, чем вначале? Зарезервируйте время на футболку и не забудьте надеть эту спортивную одежду…