cat with many words

В Москве

Первые дни в Москве вызвали довольно странное впечатление. Как-то так получилось, что в России опять теория разошлась с реальностью, где-то слегка, а где-то основательно так.

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

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

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

Москва горячая, пыльная и очень-очень большая.

cat with many words

Временной аспект

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

Любая система живет во времени. В таблицах хранятся актуальные сущности. Вот у вас пользователь, у него такие-то свойства - имя, теги какие-нибудь. Допустим есть еще другие сущности - покупатели, продавцы, товары. Но есть еще и артефакты, которые эти сущности производят - транзакции, товары и т.д. И для них внезапно оказывается важно знать, в каком состоянии были эти сущности в момент создания артифката. Была ли скидка у пользователя, когда он купил товар? Был ли этот товар в продаже в ринципе?

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

Из этого два следствия - нельзя программировать только для нового состояния, всегда нужно прикидывать, что будет с существующей системой. Второе - при планировании изменений нужно продумывать, как сделать так, чтобы они не затянулись на бесконечность. Пример с api хороший - если оно публичное, то вообще мало шансов, что его получится отключить. Можно просто выключить, но что, если ваши клиенты - банки? Что, если ваши клиенты - не it компании, и интеграцию сделали контракторы, которых уже и след простыл?

cat with many words

Из прочитанного^Wнедочитанного. Выпуск 58

Решил протись по новой и не очень русской литературе

1) Третий роман писателя Абрикосова, Денис Драгунский

4 / 5

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

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

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

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

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

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

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

Буду ли я еще Драгунского читать? Скорее нет, чем да, но было интересно.

2) Библиотекарь, Михаил Елизаров

1 / 5

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

3) Российские фантасмагории

2 / 5

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

От Булгакова была Дьяволиада, и если вначале было смешно, то совсем скоро я совсем потерял нить и не нашел в себе интереса попробовать разобраться.

Зощенко - это просто Зощенко, хорошие смешные зарисовки. Если бы он жил сейчас, то наверняка был бы известным блогером.

Горького и других пропустил, т.к. стало понятно, что сборник не для меня.

4) Покров-18, Алескандр Пелевин

3 / 5

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

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

5) Леонид обязательно умрет, Дмитрий Липскеров

5 / 5

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

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

Читается как описание интересного пазла, в котором ты смотришь на разные детали, смотришь, смотришь, а потом раз, и сложилось.

В книге еще много секса, но довольно абстрактного. Не столько, чтобы было неприятно, и не так пошло, как в библиотекаре.

Отличная книга

cat with many words

c++, продолжение

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

Из прочитанного мне показалось, что основная сложность в с++ происходит в частности из:

  • Автоматического приведения типов. Дело не только в потере точности, хотя и в этом. В отдельных местах подобное приведение просто усложняет понимание того, что происходит. Меня весьма впечатлил пример в главе про перегрузку операторов, где при наличии функции a(double, double) и a(long&, long&), но вызов функции с параметрами a(static_cast<long>(a_int), static_cast<long>(b_int) приведет к вызову первой функции. Я прочитал объяснение, ок.

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

  • Ключевое слово friend, как и mutable показались адскими хаками. Если семантика языка не позволяет - то, конечно, нельзя, но если хочется, то можно. Если кратко, то в приватные поля класса лазить нельзя, но если определить функцию как friend, то ей можно! А если объект определен как const, то в нем менять ни одно поле нельзя, но если определить его как mutable, то можно!

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

  • Перегрузка операторов. Прекрасная идея, но по факту от нее только проблемы. Даже в примере, где автор показывает перегрузку оператора сравнения для двух объектов, он дальше же и рассказывает, что для сложных объектов (в его случае был класс Box - коробка), сравнение будет субъективным (допустим, по объему, но вдруг надо по длинной стороне?), в результате не получается так элегантно, как хотелось бы, зато сложности - хоть отбавляй. По моему опыту просто еще один метод в сто раз понятнее любой перегрузки операторов - во-первых можно назвать метод понятно - biggerByVolume или biggerByLongSide, во-вторых не ломается семантика языка. Там же автор рассказывает, что хотя булевы операторы тоже можно перепределить, но это сразу сломает семантику операторов (короткое замыкание, когда остальные аргументы в выражении не вычисляются, если результат уже понятен). Зачем тогда это делать? Можете себе представить, как это все работает вместе с неявным приведением типов.

  • Последнее - это придирка не к с++, а скорее к ООП в том виде, как она в языке реализована. Когда его писали, казалось, что наследование - это серебряная пуля. На практике же чаще всего это наименее гибкое решение. Если хочется полиморфизма - то лучше интерфейсы, а так лучше композиция.

Теперь понятно, откуда ноги росли у дизайна go, у них скорее всего был такой же список вещей, которые они не хотели тащить в язык. И у них получилось! Если в этой книге длиной в 700 страниц даже были сноски, что мы тут вам не про все рассказали, а вот продвинутые фичи языка смотрите отдельно, то в го практически нечего изучать при отличной выразительности. Дженериков нет, ну и ладно.

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

Начинаю хендбук по расту. Сравнение будет нечестным, конечно, хотя бы из-за разницы в возрасте языков, ну да какая разница.

cat with many words

c++

Читаю сейчас Beginning c++ from Novice to Professional, впечатления невероятные. C++ оказался именно таким языком, каким я его и представлял по обрывочным впечатлениям там и сям. До реально сложных вещей я еще не дошел, сейчас глава про references (как их там по-русски), но предыдущего введения уже хватило, чтобы составить впечатления. Интереса ради отмечаю в книге места, где автор предупреждает об очередном месте, где можно выстрелить себе в ногу.

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

Например:

  • Есть три разных способа инициализации переменной, часть с приведениями типа, часть нет
  • При передаче массива в качестве аргумента, теряется возможность узнать его размер, при этом объявить желаемую размерность можно. Если массив двумерный, то у второго измерения размер узнать или указать можно, будет работать.
  • Строки надо использовать std::string, они вроде бы конкатенируются через плюс, но не всегда, чтобы работало и литералами, нужно, чтобы один из аргументов был std::string, а то сломается.

Например,

"this" + "that" + some_str

по словам автором должно сломаться, т.к. литералы будут типа char*, и их сложение не определено. А вот так, например, работать будет

"this" + ("that" + some_str)

  • Строки можно складывать и с символами, но и тут есть засада. Если сделать так:

str += ',' + ' ';

то к строке прибавится не запятая с пробелом, а другой символ. Почему? Да потому что char - это численный тип, хоть и представляется литералами. В данном примере мы видим сумму двух char, так что компилятор их сложит как числа, а потом уже перегруженный оператор для строк добавит конечное значение char в строку. Каково? Меня взобдрило как следует

  • Ссылку на переменную надо очищать с помощью delete, ссылку на массив - с помощью delete[], но т.к. во многих местах массив даже передается как ссылка на элемент, точасто просто невозможно узнать, какой именно вызов делать, а перепутать нельзя.

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

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

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

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

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

cat with many words

О смертных грехах

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

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

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

Все это, но только в кубе подходит к интерфейсам в веб браузере. Среди всех священных заповедей для дизайнера первой должна быть такая: "Никогда, НИКОГДА не делай нестандартные элементы ввода". Почему? Да потому что нужно монументальное усилие, чтобы сделать замену хотя бы отдаленно напоминающую встроенный элменты по функционалу. Нарисовать-то ты его нарисовал, но знаешь ли ты, как новый элемент управления должен работать во всех ситуациях? В скринридерах? Без мыши? Как он должен реагировать на Tab? Что там про встроенную валидацию? Автозаполнение форм от браузера тоже поддерживает? Работает ли он с разными браузерными расширениями для фриков типа Vimium? И еще, еще.

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

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

Фу такими быть.

cat with many words

Любимые места

За семь лет в Нидерландах (семь лет, черт возьми) оказалось, что у меня здесь не так много мест, где я бы прямо хотел бы бывать раз за разом. Центр Амстердама хорош для туристов, но не больше, большинство городов кроме Роттердама может выглядят жутко похоже. В том нет вины, российские города тоже не так просто различить со всеми их спальными панельными районами, но тем не менее.

Из всех музеев нам больше всего в итоге понравились два - авиамузей в Лелистаде и большой музей под открытым небом в Арнеме. Оба на большой территории, а Арнеме так еще и трамвай внутри ходит, на территорию перенесли невероятное количество домов из разных эпох с разных частей Нидерландов, дейстительно интересно гулять и смотреть. Мы там уже были раз пять, полностью весь до сих пор не обошли.

Если говорить про сам Амстердам, то очень здорово гулять по Флигенбосу и за ним - между Ijplein и заводом Albermarle. Раньше тут была промзона, сейчас она и есть, но ее быстро осваивают хипстеры и разные креативные конторы, вид на город фантастический, но при этом сюда еще не добрались руки современных архитекторов, поэтому много диковатых уголков, в которых прятно гулять. А если переплыть реку, то кусок города между Ньюмарктом, Ijtunnel, зоопарком и Waterlooplein тоже весьма и весьма хорош. А вот кольцо каналов я вообще бы проигнорировал.

cat with many words

Проехались

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

Солнышко светило, день начинался позитивно, Бельгия в лице Антверпена выглядела потрясающе - не так прилизано, как Нидерланды, живая. Что меня поразило в Брюсселе когда-то, повторилось здесь - 300 метров от центрального вокзала, и мы оказались в самом обычном жилом районе. На перекрестке две кафешки напротив друг друга. В одной сели мы выпить кофе, в другой все местные пенсионеры и не только собрались на утренний бокал пива. А потом поехали через парк, где уже было много людей, а потом через скейтпарк, где было реально много детей, которые трнировались с самокатами, а также их родителей - кто просто снимал, кто ставил свое чадо на скейтбоард и рассказывал как надо. Довольно интересная особенность по сравнению с Нидерландами - в Бельгии клали большой болт на однородность и вылизанность. Улицы города застроены самыми разными домами, многие из которых в отдельности может и некрасивые, но все это разнообразие придает городу динамизм, по нему просто интересно было ехать и рассматривать. Конкретно этот район, где мы ехали, в Амстердаме был бы давно засроен/отремонтирован и джентрифицирован, а тут нет еще вроде.

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

Из города мы выехали на север через немного менее ламповые спальные районы, а потом пересекли шоссе и поехали через доки. Порт в Антверпене есть и большой, но с Роттердамом сложно сравнивать. После доков ехали вдоль каналов и решили целиться в Ouddorp. До него была сотня, но почему бы и нет. Канал был бесконечен, когда он закончился, началась мегадлинная дамба, вокруг которой сначала были какие-то особо охраняемые пески для особо охраняемых птиц, которых нигде не было видно, а потом пошел очень длинный дикий пляж. На сам пляж шло не так много людей, большей часть располагались прямо на парковке со своими стульями и едой. Никогда бы не подумал, но очевидно, что место популярное. К слову сказать, в Нидерландах почему-то не принято делать навесы от солнца. Если это пляж, парк или детская площадка, можно смело ожидать огромных открытых пространств без единой возможности укрыться. Почему так, не знаю. Предположу, что это генетическая память про дождливые годы, но даже с учетом этого непонятно.

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

В Оуддорп приехали к шести вечера, купили еды на вынос и пошли искать, где ее съесть. Вторая особенность Нидерландов - лавочки и общественные туалеты здесь не везде, даже скорее довольно редко. Например, в этом Оуддорпе (а это туристический городок, между прочим), мы не нашли ни одной лавки, в итоге сели в траве на бывшей-крепости-теперь-холме. Пока мы ели, мимо нас робко пробегали местные дети с автоматами из фанеры. Вид чужаков их видимо так удивил, в Зеландии вообще похоже что детям хорошо и привольно, а чужаки больше по резервациям.

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

Где-то к десяти вечера на подъезде в Розенбургу мы оказались внутри порта. Огромные резервуары, развязки, трубы, трубы, баржи на стоянке, огромный комплекс, внутри которого вполне обычный город Розенбург. К парому приехали за минуту до отправления, еле успели купить билет и покатили в сторону Maassluis. Оттуда идет метро в сторону Роттердама, но мы еще не совсем умирали от усталости и в итоге решили ехать до Роттардама так. Эта часть поездки получилась довольно атмосферная, т.к. было уже темно, велодорога шла вдоль и через промзону, людей почти не было. Я ехал, и думал, что если бы я был бандитом, то это было бы отличное место для засады :)

В Роттердам на возкал приехали и сразу прыгнули в поезд на 23:42. В итоге поездка получилась на 160+ километров (за день!), мой личный рекорд, так же это был самый длинный заезд - 14 часов, включая перерывы на обед и кофе, отличная получилась поездка, но я сильно сгорел, а на следующий день мои ноги не переставили болеть весь день и я скорее переползал от одной точки к другой, чем полноценно ходил, предположу, что еще пару дней этого удовольствия еще.

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

cat with many words

Почти как

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

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

Интересная весна.