wingblack

wingblack

На Пикабу
145К рейтинг 204 подписчика 239 подписок 123 поста 31 в горячем
Награды:
За заезд из Калининграда За неравнодушие к судьбе Пикабу Взять и собраться: вернем Пятничное [мое]! За победу в продуктовом сёрфинге 5 лет на Пикабу
4

Видео запеченное с данными, вам с каким соусом подавать?

Приветствую жителей уютного мира Пикабу и людей которые решили на меня подписаться.

Пишу в продолжение к моему предыдущему посту о программе для запихивания и извлечения произвольных файлов (данных) внутрь видео файлов.

Предыдущий пост http://pikabu.ru/story/vpikhivaet_lyubyie_dannyie_v_video_il...

Цель данного поста - спросить у вас что вы хотели бы в данную программу добавить, а что изменить.


На данный момент я заканчиваю переписывать внутреннюю структуру алгоритма с бOльшим упором на модульность под вдохновением используемой в некоторых программах системы нод. Конечно, до структур как в Blender или UE4 мне еще далеко. Получается что-то вроде как на этой картинке.

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

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


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

Так же я решил избавить пользователя от выбора формата пикселей (теперь по умолчанию используется YUV420P, но внутренности все еще позволяют его изменять) и добавить новые опции - выбор пресета кодирования H264 (влияет на соотношение скорость/размер/качество) и выбор режима постоянного битрейта или постоянного качества (те кто занимался перекодированием видео или стримом игр уже знакомы с этими настройками)

Ах да, еще один пункт добавился. Реализованный ранее алгоритм позволяет запихнуть в квадрат 8х8 лишь несколько (Density) бит информации и только один раз. Но я тут пыхнул правильной травы переосмыслил прочитанные ранее алгоритмы используемые для несколько иной задачи и сделал заготовку для использования дискретного косинусного преобразования (DCT), и тут получается что в квадрате 8х8 появляется сразу несколько ячеек (Cell Count) куда можно вставить наши биты (Density). При числе ячеек = 1 будет использоваться предыдущий алгоритм, если > 1 то алгоритм c DCT

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

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

Собственно, после проверки работоспособности данного алгоритма и я собираюсь выпустить следующую версию программы.


А теперь вопросы к вам, дорогие читатели:


Добавить сжатие? А надо ли? Думаю, пользователь и сам может заранее сжать файл если хочет. Ну, так то можно опционально (по выбору пользователя) делать поблочное сжатие входного файла каким-нибудь ZIP.


Как вы думаете как будет лучше сделать визуализацию оценки возможной ошибки для показа пользователю? В последней версии пользователю выводилась только максимальная из всех найденных оценок ошибки в виде дробного числа от 0 (лучше некуда) до 1 (скорее всего есть ошибки).

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

Например, можно сделать шкалу распределения шума в файле, но нужны ли такие сложности...


Восстановление ошибок - да, я помню, в комментариях к прошлому посту мне советовали его реализовать, в планах добавить (опциональный) код Рима-Соломона или что-то другое. Займусь этим после реализации алгоритма с DCT.


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


Что-то еще визуализировать? Как это должно выглядеть?

Добавить еще что-то полезное или интересное в алгоритм?

Показать полностью 3
260

Впихивает любые данные в видео (или творчество программиста)

Художники создают картинки, музыканты - музыку, но и программистам не чужд зуд творчества.

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


В один прекрасный день ко мне пришла мысль - а как бы так сделать чтобы хранить данные в видео файлах? И речь идет не о скрытом хранении (стеганографии) которое не позволит впихнуть большой объем информацию, а о вполне очевидном для постороннего глаза использовании кадров видео для этих целей.

Конечно, аналогичная мысль приходила не мне одному - в интернете нашлось несколько решений, но по тем или иным причинам мне они не понравились - не в последнюю очередь из-за появления ошибок в данных после того как такое видео было перекодировано, а ведь видео обязательно будет перекодироваться в сервисах подобных Youtube.

Поэтому я решил сделать сам.

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

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

Множество таких квадратов и составляет кадры видео. В "цветном" режиме цветные квадраты соответственно являются суммой квадратов разных цветов с разной яркостью

Как результат, кадр видео выглядит примерно так

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

А вот и видео, и я вас уже предупредил.

В данном видео сохранена следующая картинка

На предмет потыкать - качать здесь.

https://bitbucket.org/Filarius/videofy/downloads/Videofy%200...

Ужаснуться рукожопности автора читая исходники и для параноиков - идти сюда https://bitbucket.org/Filarius/videofy/src


Работает на OS Windows с установленным .Net Framework 4.6

Написано в качестве самообучения C# в VS 2015.

Задействовано:

- FFmpeg (кадры <---> видео)

- OpenCV (оптимизация некоторых действий)

- Livestreamer (скачивание видео с Youtube, другие сервисы поддерживаемые Livestreamer'ом не тестировались)


Плюсы:

- можно "сконвертировать" любой файл в видео и обратно (только для видео созданных данной программой)

- если полученный видео файл позже был повторно сконвертирован (youtube и т.д.), то исходный файл все еще можно извлечь без повреждений (если видео изначально создан с настройками рассчитанными на такое грубое обращение)

- если файл не требуется выкладывать на Youtube или перекодировать, то можно увеличить скорость обработки за счет настроек с большим количеством различных цветов (меньше цветов - лучше коррекция ошибок, но меньше скорость обработки).


Минусы:

- ОЧЕНЬ долго обрабатывает даже небольшие файлы (заметно уже на файлах больше 1 Мбайта)

- размер видео больше исходного файла в 3-8 раз (зависит от настроек)

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

- сомнительная полезность (да кому вообще это нужно?)


P.S. Я думал, что данную идею можно развить добавив режим прямой трансляции или возможность задействовать лишь отдельный участок видео для внедрения данных, но пока что я не вижу чтобы данная тема была кому-либо интересна.

P.S.S. Я рассматривал и более сложные методы "конвертации" данных в видео, но с появлением работающего прототипа я исчерпал свой творческий зуд, да и "кому вообще это нужно?".

Показать полностью 7 1
274

Как сделать "авиарадар" дома

В данном посте я расскажу как я сделал "авиарадар" дома из соплей и палок будучи в опе мира.

Точнее - как сделал свой маленький независимый филиал ада аналог сервиса FlightRadar24

Думаю, первым делом следует сказать как вообще это работает.

Прежде всего - это не радар, от слова совсем.

Самолеты сами сообщают в радиоэфир свои текущие координаты, скорость, направление, высоту, а также свой позывной, по которому в интернете можно найти некоторую другую информацию, например тип самолета. Причем это информация открытая и не шифруется. Это называется ADS-B (автоматическое зависимое наблюдение-вещание, https://ru.wikipedia.org/wiki/ADS-B ).

Для начала нужен радиоприемник. Поскольку у меня не было особого желания тратить не маленькие деньги на игрушку которую я могу забросить через месяц (а такие игрушки есть на любой кошелек, есть модели которые могут не только принимать, но и передавать сигнал, со списком устройств можно ознакомиться по ссылке https://en.wikipedia.org/wiki/List_of_software-defined_radio...), то подойдет и самый простой и дешевый вариант:


RTL-SDR донгл RTL2832U (желательно с обозначением R820T2, у него чувствительность немного лучше). У этой модели немного плавает настройка на частоту при изменении температуры (а греется он весьма ощутимо), есть модели подороже с гораздо меньшим люфтом, у них в названии добавляется слово "TCXO", но для моего случая это не существенно. Да, это устройство продают как DVB-T тюнер, но умельцы заметили, что его можно использовать как радиоприемник, если заменить драйвера на самопальные от сообщества радиолюбителей.


RTL2832U я брал на Ebay. К слову, за бОльшую цену с тем же названием (если не добавилось TCXO) вы получите точно такой же по качеству, просто продавцы хотят нажиться на неосмотрительных покупателях, данный приемник стал популярен из-за своей низкой цены и наличия альтернативных драйверов для использования не только как DVB-T тюнера.

(Впрочем, как DVB-T мне его настроить так и не удалось, может потому что в РФ после аналогового ТВ решили запускать сразу DVB-T2 ?)

Далее, когда вы получите ваш приемник

можно приступать к установке программ и драйверов

(Не устанавливайте родные драйвера с диска купленного приемника!)

Качаем SDR# http://airspy.com/download/ (хорошая программа для прослушивания эфира)

Распаковываем, запускаем install-rtlsdr.bat  (скачивает необходимое для это приемника)

Устанавливаем драйвера в винду через программу zadig.exe которая скачалась на предыдущем шаге.

После установки драйвера перезапустить компьютер.


Альтернативную инструкцию по пройденному этапу можно посмотреть тут http://www.rtl-sdr.ru/page/instrukcija-po-ustanovke-sdrsharp


Теперь нужны программы которые будут использовать радиоприемник и показывать нам самолетики и наводить на них ракеты.

Сначала - чтение данных из радиоэфира.

Для этого нужна программа RTL1090, взять последнюю (сейчас это Build 151 - 11 JAN 14) версию здесь http://rtl1090.com/

Распаковать, в папку с программой скопировать файлы rtlsdr.dll и libusb-1.0.dll из папки ранее скачанной SDR#

Открыть программу, нажать START, программа может зависнуть на некоторое время пока стартует

Запомнили что порт "31001" (написан в самом низу окна).

(В качестве альтернативы данной программы можно использовать ADSB плагин для SDR#).


Теперь нужна программа которая будет показывать информацию о самолетах и рисовать их на карте. С этим хорошо справляется бесплатная и не очень сложная программа Virtual Radar Server http://www.virtualradarserver.co.uk/Download.aspx

Устанавливаем, запускаем, лезем в настройки  Tools > Options

Выключаем все старые источники данных (у меня не получилось увидеть информацию с предустановленного в настройках сайта, только с своего приемника) и добавляем RTL1090.

Не забываем запустить сервер и щелкнуть по ссылке.

Откроется браузер с гугло-картой где будут показываться обнаруженные возле вас самолеты (картинка из интернета).

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

Есть не мало типов антенн, можно купить, можно попробовать сделать самостоятельно.

Качество антенны - один из основных факторов влияющих на дальность обнаружения.

Более подробно с темой антенн можно ознакомиться погуглив "ADS-B antenna"


Поскольку я планировал просто попробовать "как оно там работает" и потратить на данный вопрос минут 5, то с антенной  не стал заморачиваться, нашел простой вариант - антенна Франклина, и согнул кое-как из подвернувшейся проволоки ориентируясь на следующую картинку.

В итоге я смог обнаруживать пролетающие гражданские самолеты в радиусе до 100 км (согласно последнему тесту)  при этом имея весьма неблагоприятные условия:

- расположен в низине

- кривая антенна (фото внизу), без усилителя, установлена внутри помещения, в 2-х метрах от земли

- витая пара без экранизации в качестве кабеля

- самый дешевый приемник из возможных


Поэтому, если вы хотите чтобы у вас был хороший радиус охвата, то:

- отнесись к делу ответственно, не будь как wingblack


Экран рукожопа

Антенна рукожопа

Коннектор рукожопа

P.S.


Данный способ не может определить самолеты на которых ADS-B отсутствует или выключен (обычно это самолеты с менее чем 100 пассажиров, большинство вертолетов и военных самолетов, старьё, или просто владельцы посчитали что устанавливать ADS-B не нужно)


Вот здесь можно посмотреть на то, что получилось у других с помощью программы Virtual Radar Server и кто решил что этим нужно поделиться с интернетом http://www.virtualradarserver.co.uk/Directory.aspx


Сервис https://www.flightradar24.com/ работает (в том числе) за счет волонтеров у которых стоит оборудование от этого сервиса (или кто-то настроил свой приемник и решил поделиться). Можно попытаться получить их оборудование бесплатно, если пообещаете что у вас хорошее расположение и вы можете обеспечить работу точки 24/7, и если рядом с вами нет других волонтеров. Впрочем, если я не ошибаюсь то это оборудование заточено под их сервис и больше ничего кроме слежения за самолетами толком не умеет (но, думаю, кулхацкеры не спят). Страничка для заявок на бесплатное оборудование https://www.flightradar24.com/apply-for-receiver


Если где ошибся, прошу понять и простить .

Показать полностью 16
89

Как я копался в сохраненке кубической песочницы.

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

В посте приведены данные годичной давности.


Год-два назад я увлекался игрой в такую кубическую песочницу как Starmade.

Игру пишут на Java (номер версии игры до сих пор не переступил цифру 1.0), графический движок LWJGL, и это можно было бы назвать клоном Minecraft (движок тот же и тот же "кубизм"), если бы это не было космической песочницей с свободой передвижения по всем трем осям.

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

Рекомендую ознакомиться с официальными и неофициальными трейлерами от сообщества хотя бы ради общего интереса.


Сразу скажу, что программист из меня тот еще - раз в пол года по интересу делаю что-нибуть уровня логера веб-чата. Ранее для одного из серверов StarMade на PHP делал генератор страницы с рецептами крафта на основе конфига сервера для облегчения жизни игроков.

Случилось мне пересечься с группой таких строителей.

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


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

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


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


Перейдем к разбору.


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

ServerName.properties - список с идентификаторами (именами) и номерами блоков

ServerName.xml - файл XML формата с описанием, наверное, всего что клиенту игры следует знать, сюда включается описания свойств каждого используемого типа блоков на сервере: иконка, текстура, масса, max HP, броня, геометрия, можно ли блок включить и большое число других малопонятных свойств. В этом файле блоки обозначаются по имени, а игра хранит блоки как цифры, поэтому предыдущий файл тоже важен.

На основе этих двух файлов я формирую массив информации о блоках который поможет правильно привести сырые данные по блокам в удобный для программы вид.


В игре отстроенный корабль можно сохранить в виде Blueprint-а, и потом его можно либо заспавнить админскими командами, либо "купить" за ресурсы или игровую валюту.

Основным моим объектом интереса и были блюпринты.

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

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

Для моих целей были интересны header.smbph (файл статистики) и DATA (сами блоки). Кроме папки DATA также могут быть папки с "вложенными блюпринтами" - на корабле могли быть турели, которые по сути сами являются отдельными кораблями. По ТЗ такой случай не рассматривался.


header.smbph

Тип объекта - поддерживаются такие объекты как: планета, астероид, станция, корабль, магазин, "неизвестно".

Границы - координаты стен "коробки" в которую поместится корабль, центр корабля и коробки находится в блоке с координатами (0,0,0), это первый блок корабля при постройке и является его ядром.

Массив статистики, собственно, содержит информацию о типе и количестве блоков в корабле.

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


logic.smbpl

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

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


meta.smbpm

Тут хранится информация о пристыкованных объектах (турели и доки).

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


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


Cама большая работа была с папкой DATA

Тут хранятся файлы-чанки с информацией о блоках.

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

имя.X.Y.Z.smd2

Такая структура разбивает кубик 256^3 на 16^3 кубиков со стороной в 16 блоков.

Индексы чанков  - показывают чанк с каким номером должен быть в этом месте, -1 если пусто.

Timestamp - время последнего изменения.

Размер чанка и Размер сжатого чанка - чанк всегда имеет размер 5120 байт (для рассматриваемой версии игры), при этом "лишнее" место оставшееся после сжатия забивается нолями.

Данные с блоками - после распаковки дает массив размера 16^3 с элементами по 3 байта.


Лично меня структура файла немного смутила - на лицо дублирование значений да и вдруг сжатый чанк не уместится в отведенное место. Возможно это был компромиссный вариант на то время.


В зависимости от типа блока его кодирование немного отличается.

В первом 3 бита отвечают за направление "лица" блока.

Во втором и третьем два бита отвечают за поворот "лица" по часовой стрелке, остальные - за его направление.


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

Также некоторые проблемы были с приведением системы координат блюпринта (файл-чанк-блок) к единому знаменателю.

И еще о координатах - в Blueprint блок с координатами (0;0;0) находится в центре чанка.


На этом обзор формата хранения я заканчиваю.


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

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

Итог:

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

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

В сухом остатке - файл с константами и типами данных , и файл с функциями для вытаскивания и запихивания данных.


Если кому интересно, то можно вот тут посмотреть описание формата Blueprint данной игры на английском языке (часть информации могло устареть)

http://www.starmadewiki.com/wiki/File_format

https://starmadepedia.net/wiki/Blueprint_File_Formats

Показать полностью 11

Перчатки с Али ты немного подожди

Подсмотрел у знакомого кевларовые перчатки, говорит ни стекло не берет, ни ракушка, брал на Али.

Нашел на Али что-то похожее, заказал самый дешевый вариант - $2.8, две пары (тут нюанс, одну пару можно заказать с бесплатной доставкой, но если выбрать две пары в один заказ - доставка автоматом переключается на платную, этот момент чуть не проворонил - разбил на два разных заказа).

Перчатки вообще-то одинаковые, просто фото криворук делал.


Не обошлось без переживания за доставку. Продавец отправил сразу, а вот на въезде в Россию посылка зависла.

24 дня посылка висела в где-то в отстойнике, впрочем как обычно. Всего посылка доставлялась 32 дня.

Чтобы не превращать пост в очередной плачь - короткий обзор.


Приятная резинка (хи-хи), руке комфортно.

Снаружи, правда, торчат небольшие петельки и пеньки в количестве 3-5 на перчатку. В целом впечатление о качестве хорошее (по такой-то цене).

Перчатка сделана из вроде бы обычной нити с вплетением проволоки.

Проволока толщиной в 0.1 мм, не могу сказать настоящий ли это кевлар и есть ли вообще возможность или смысл его подделывать.

Испытания пока не проводились.

Ссылка на перчатки https://ru.aliexpress.com/item/1-Pair-kevlar-Gloves-Proof-Pr...

Показать полностью 5

"Символ России". Сочи накручивает голоса через школы.

Недавно на Пикабу уже была новость о том почему на публичном голосовании "Символ России"  Казань резко выбилась вперед.


Сегодня в школах Краснодарского края пройдет (по объективным данным в некоторых уже прошла) линейка с одной единственной целью - попросить учащихся и их родителей проголосовать за Сочи и Дальний Восток. За Дальний Восток тоже - чтобы дать Казани меньше шансов.


Скорее всего, это устное распоряжение Министерство образования и науки Краснодарского края.


На данный момент Сочи опережает Казань менее чем на 700 голосов.

Недопонимание

Имена и некоторые события изменены.


Позднее утро, Васю вызывает один из начальников.

- Вася, пойди в 35-тый, настрой там чтобы все работало.

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

- Так это, начальник, подсобка закрыта, а Маша (владелец кабинета и единственный держатель ключей от подсобки с режимным содержимым) сегодня не работает.

- Вась, ты сегодня к Маше поедешь? А то бы чуть пораньше съездил пообедать, заодно и ключи у неё взял.

- Нет, я тут обедаю.

- Ну я тогда сам попрошу её занести, ей как раз сегодня на заказ мимо проезжать нужно будет.

По правде сказать, Вася иногда заходил к ней столоваться и это было известно всем. Обеденный перерыв позволял, а ехать недалеко. Остальные сотрудники или также выходили поесть кто куда, или брали с собой и обедали на месте.

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

Через час Васе звонит Маша.

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

Показать полностью
Отличная работа, все прочитано!