Как стать автором
Обновить
2
0
Vftdan @Vftdan

Пользователь

Отправить сообщение

Если покупка — это не владение, то пиратство — не воровство

Время на прочтение6 мин
Количество просмотров48K

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

https://longtail.typepad.com/the_long_tail/2004/12/is_drm_evil.html

Я публично ответил, сказав ему, что он неправильно меня понял. Дело было не в идеологической чистоте, а в добросовестности обзоров. Wired призывал покупать продукт, потому что у него имелись функции x, y и z, но в любой момент в будущем производитель мог отключить любые из этих функций:

https://memex.craphound.com/2004/12/29/cory-responds-to-wired-editor-on-drm/
Читать дальше →
Всего голосов 212: ↑225 и ↓-13+238
Комментарии627

Как слепой разработчик в одиночку создала синтезатор речи

Время на прочтение11 мин
Количество просмотров17K

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

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

Называется от RhVoice и упоминался в нескольких публикациях на Хабре. Но знаете ли вы, что многие считают его лучшим бесплатным синтезатором русской (и не только) речи, а написан он в одиночку полностью слепым разработчиком — Ольгой Яковлевой?

Сегодня восстанавливаем историческую справедливость и немного узнаем про сам синтезатор вообще, и Ольгу в частности.
Всего голосов 71: ↑70 и ↓1+69
Комментарии42

Призыв писать компактное ПО, версия 2024 года (с примером кода)

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров34K

Этот пост посвящён памяти Никлауса Вирта, первопроходца в сфере вычислительных наук, ушедшего от нас 1 января этого года. В 1995 году он написал важную статью A Plea for Lean Software, и в своём посте я постараюсь воспроизвести её почти тридцать лет спустя, с учётом современных кошмаров разработки ПО.

Очень короткая версия поста: современные способы разработки/сборки ПО смехотворны, они приводят к созданию пакетов на 350 МБ для рисования графиков, а простые продукты импортируют 1600 зависимостей неизвестного происхождения. Уровень безопасности ПО ужасен, ведь он зависит и от качества кода, и от его объёма. Многие из нас понимают, что ситуация нерациональна. К сожалению, многие программисты (и их руководство) никогда не работали как-то иначе. А остальным редко выделяют время, чтобы выполнять работу качественно.

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

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

Читать далее
Всего голосов 150: ↑147 и ↓3+144
Комментарии197

Я разработчик, а не компилятор

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров52K

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

Что такое полиморфизм?

В чём разница между List и Set? Когда стоит использовать первое, а когда второе?

Где можно столкнуться со взаимной блокировкой (deadlock)?

В чём разница между строгой и слабой типизацией?

В основном вопросы были вполне закономерными. Лично мне не нравится вопрос про полиморфизм, ведь он настолько тесно связан с большинством объектно-ориентированных языков и наследованием, что многие люди, используя его (например, при переопределении или перегрузке метода), даже не думают «О! Это же полиморфизм в действии!». Вместо этого я бы задал вопрос «Что такое наследование, и где оно используется», потому что в большинстве объектно-ориентированных языков для него есть ключевое слово или паттерн. Но это уже мои личные предпочтения, и я вполне понимаю логику проводившей собеседование компании.

Читать далее
Всего голосов 145: ↑136 и ↓9+127
Комментарии201

Вам [не] нужен свой игровой движок

Уровень сложностиПростой
Время на прочтение15 мин
Количество просмотров26K

Что мне больше всего нравится в gamedev, так это что большая часть игр и каждый первый кастомный игровой движок бросают вызов устоявшимися стереотипам разработки. Иначе зачем начинать разработку такого сложного и комплексного софта, когда десятки похожих софтин есть вокруг. Конечно такие монстры как Unreal и Unity и десяток монстриков калибром поменьше существенно упростили разработку во многих отношениях, привлекли тысячи разработчиков к созданию множества великолепных игр с использованием готовых технологий, освободив их от ямы отчаяния пустого уровня. Но также не оставляет мысль, что еще больше игр они похоронили. Невзирая на весь функционал и мощь U/U люди часто застревают в рамках, о которых они даже не подозревали. На протяжении многих лет наблюдаю как оригинальный контент в большинстве случаев убивается ассетсторами, если там есть что-то близкое или похожее к нужному объекту, функционалу и виду. Не поймите мои слова неправильно, я обеими руками за магазины ассетов и любых других ресурсов, скриптов и технологий, но беря что-то в магазине за доллар, вы уже с большой вероятностью не сделаете свое. Или сделаете конечно, но позже, но до этого "позже" еще надо дожить, а пока что у вас будет всё как у всех: одинаковые паттерны, одинаковые текстуры, одинаковое поведение, одинаковые модели... и одинаковые игры? Что тогда остается своего - уникальные механики и впечатления. В другом случае не было бы игры, вот только проблема, что сначала люди видят картинку. Хорошо если игрок через полчаса-час доберется до уникальных механик, одинаковая картинка вызывает в памяти игры в которые вы уже играли, а уникальная механика так никогда может быть и не увидена в игре.

Хочешь сделать хорошо, сделай сам
Всего голосов 56: ↑53 и ↓3+50
Комментарии36

Моя любимая задачка по программированию для кодинг-интервью

Время на прочтение10 мин
Количество просмотров68K

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

С годами я выработал вопрос по кодингу, который мне самому очень нравится. Это до жути простой и в то же время заковыристый вопрос. Решение занимает не более 30 строк кода, но зато даёт мне все нужные сигналы для вынесения верной оценки кандидату. Кроме того, мой вопрос отлично масштабируется и подходит как стажёрам, так и опытным инженерам. Здесь я не стремлюсь доказать, что мой вопрос лучше какого-то другого. Я лишь хочу объяснить, как он помогает мне как интервьюеру и на что я обращаю внимание на собеседовании по программированию.

В этой статье будут вещи, с которыми вы можете не согласиться. Это нормально. Это просто моё мнение, а так как я уже вышел на пенсию, то больше не представляю опасности ни для интервьюеров, ни для инженеров Google при принятии решений о найме! ;-)

Читать далее
Всего голосов 77: ↑63 и ↓14+49
Комментарии344

Почему рукописную подпись считают надёжным способом аутентификации (и так ли это на самом деле)

Время на прочтение7 мин
Количество просмотров13K
image

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

Автограф должен подтверждать подлинность документа. Например, в банках сотрудники по-прежнему сравнивают подписи в документах и в паспорте.

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

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

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

И, кажется, подписи уже отживают своё.
Читать дальше →
Всего голосов 26: ↑26 и ↓0+26
Комментарии46

Проверяем Архитектурные стили на движке Factorio (часть 1)

Время на прочтение28 мин
Количество просмотров43K

Добрый день всем, дорогие читатели!

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

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

Как сказал мой добрый друг-программист про Factorio: "Эту игру создали программисты для программистов" и эти слова плотно въелись в мою память. И реально игра в эту игру очень сильно напоминает процесс разработки ПО: можно просто строить как попало и прийти к полностью запутанной и сложнообслуживаемой системе, а можно подойти к вопросу с умом изначально и в итоге получить производительную и легкую в обслуживании систему (Прям как в жизни!)

Читать далее...
Всего голосов 25: ↑25 и ↓0+25
Комментарии24

Анонимная сеть в 200 строк кода на Go

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров17K

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

Вследствие этого, можно сказать just-for-fun, у меня появился вопрос: можно ли реализовать анонимную сеть настолько малую, чтобы её программный код смог понять даже начинающий программист за короткое время?

Читать далее
Всего голосов 21: ↑20 и ↓1+19
Комментарии11

Пишем свою ОС: Выпуск 1

Время на прочтение6 мин
Количество просмотров265K
Данный цикл статей посвящён низкоуровневому программированию, то есть архитектуре компьютера, устройству операционных систем, программированию на языке ассемблера и смежным областям. Пока что написанием занимаются два хабраюзера — iley и pehat. Для многих старшеклассников, студентов, да и профессиональных программистов эти темы оказываются весьма сложными при обучении. Существует много литературы и курсов, посвящённых низкоуровневому программированию, но по ним сложно составить полную и всеохватывающую картину. Сложно, прочитав одну-две книги по ассемблеру и операционным системам, хотя бы в общих чертах представить, как же на самом деле работает эта сложная система из железа, кремния и множества программ — компьютер.

Каждый решает проблему обучения по-своему. Кто-то читает много литературы, кто-то старается поскорее перейти к практике и разбираться по ходу дела, кто-то пытается объяснять друзьям всё, что сам изучает. А мы решили совместить эти подходы. Итак, в этом курсе статей мы будем шаг за шагом демонстрировать, как пишется простая операционная система. Статьи будут носить обзорный характер, то есть в них не будет исчерпывающих теоретических сведений, однако мы будем всегда стараться предоставить ссылки на хорошие теоретические материалы и ответить на все возникающие вопросы. Чёткого плана у нас нет, так что многие важные решения будут приниматься по ходу дела, с учётом ваших отзывов.
Читать дальше →
Всего голосов 293: ↑282 и ↓11+271
Комментарии223

Минимальный геном как операционная система

Время на прочтение8 мин
Количество просмотров4.8K

Как знают мои постоянные читатели, кроме основного блога я веду на Хабре ещё один, где публикую переводы с английского, посвящённые строгим IT-темам. 21 января я вывесил там материал об игре «Жизнь» Джона Конвея, рассказывающий о создании минимальной жизнеспособной единицы по правилам этой игры. Активное обсуждение статьи, в котором поучаствовал даже уважаемый Павел Гранковский @Pavgran, коммиттер игры, упоминаемый в посте, вернуло меня к мыслям о сборке минимально жизнеспособного биологического генома. Очевидно, что современные возможности секвенирования ДНК и амплификации генов переводят такую задачу в разряд решаемых. На пути к созданию полностью синтетических организмов следовало бы освоить создание полусинтетических, основой для которых мог бы послужить именно такой минимальный геном. Ниже я расскажу о перепрограммировании геномов, искусственном и естественном редуцировании геномов, а также о перспективах таких исследований.

Читать далее
Всего голосов 48: ↑45 и ↓3+42
Комментарии14

Почему десктопные приложения работают на веб-платформе?

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров35K

Где мы свернули не туда? Как получилось, что современный десктопный GUI по умолчанию использует платформу HTML/CSS/JavaScript, которая изначально не предназначена для нативной работы на десктопе? Она создана конкретно для браузера и веба. Зачем из нативного софта делать веб-страницы в браузерной оболочке?

Джефф Этвуд (автор Stack Overflow) предсказал этот феномен ещё в 2007 году. Он тогда сформулировал так называемый закон Этвуда:

Любое приложение, которое можно написать на JavaScript, будет в итоге написано на JavaScript.

Так и вышло.
Читать дальше →
Всего голосов 107: ↑93 и ↓14+79
Комментарии261

Неожиданная полнота по Тьюрингу повсюду

Время на прочтение13 мин
Количество просмотров60K
Каталог программных конструкций, языков и API, которые неожиданно являются полными по Тьюрингу; последствия этого для безопасности и надёжности. Приложение: сколько компьютеров в вашем компьютере?

Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp. — Десятое правило Гринспена

Полнота по Тьюрингу (Turing-completeness, TC) — это свойство системы при некотором простом представлении ввода и вывода реализовать любую вычислимую функцию.

Тьюринг-полнота — фундаментальное понятие в информатике. Она помогает ответить на многие ключевые вопросы, например, почему невозможно создание идеальной антивирусной программы. Но в то же время она является поразительно распространённым явлением. Казалось бы, компьютерной системе трудно достичь такой универсальности, чтобы выполнять любую программу, но получается наоборот: трудно написать полезную систему, которая немедленно не обратится в полную по Тьюрингу. Оказывается, что даже небольшой контроль над входными данными и преобразованием их в результат, как правило, позволяет создать тьюринг-полную систему. Это может быть забавным, полезным (хотя обычно нет), вредным или чрезвычайно небезопасным и настоящим подарком для хакера (см. о «теоретико-языковой безопасности», которая изучает методы взлома «странных машин»1). Удивительные примеры такого поведения напоминают нам о том, что полнота по Тьюрингу таится повсюду, а защитить систему чрезвычайно сложно.
Читать дальше →
Всего голосов 54: ↑53 и ↓1+52
Комментарии15

JSON pipes в шелле

Время на прочтение4 мин
Количество просмотров23K
Чем больше я пишу однострочники в шелле, тем больше я прихожу к двум важным идеям:
  1. Это очень мощное средство для «непосредственного программирования», то есть указания компьютеру, что делать.
  2. Большая часть однострочника посвящена grep/awk/cut/tr, которые каким-то образом выковыривают и приводят в человеческий вид вывод предыдущих утилит.

При том, что модель pipe'ов восхитительна, совершенно грязные хаки по отлову нужных полей в выводе во втором пункте («а вот тут мы можем выделить нужное нам по характерной запятой с помощью awk -F, '{print $2}'...) делают процедуру спорной по удовольствию, и уж точно нечитаемой.

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

При этом есть враждебная и не очень хорошо написанная среда — powershell (винды). В которых взяли хорошую идею (пайпы передают не текст, а объекты), но испортили её двумя вещами:
  1. Неэргономичной консолью виндов (Shift-PgUp где, а? говорят, Ctrl-PdUp в новых версиях)
  2. предложением пойти и выучить .net для того, чтобы нормально с методами работать.
  3. Отсутствием под большинство операционных систем


Хочется иметь объекты в пайпе в тёплом ламповом линуксовом шелле. С hand-candy (мало печатать), eye-candy (приятно смотреть) и общей эргономичностью процесса использования. Ещё хочется иметь возможность сочетать „новый подход“ со старым, то есть обычным текстовым pipe'ом.

Идея


Надо написать набор инструментов, которые позволят в pipe-style оперировать с структурированными данными. Очевидным выбором является XML JSON.
Нам нужно:
  1. Утилиты, которые примут типовые форматы на вход и сконвертируют их в json.
  2. Утилиты, которые позволят в pipe'е манипулировать с json'ом.
  3. Утилиты, которые приведут json в „обычный“ формат.

В этом случае человек не будет видеть json на экране, но будет иметь возможность работать с ним.

Для затравки


(для понимания я буду писать длинные имена утилит, в реальной жизни это будут короткие сокращения, то есть не json-get-object, а что-то типа jgo или jg)

Выводит только файлы, для которых file сумел определить тип:
ls -la | ls2json | json-filter 'filename' --exec 'file {} >/dev/null' | json-print

Выкачивает с некоторого сайта токен для авторизации, выковыривает его из json'а и выставляет в переменные среды окружения, после чего скачивает список и отфильтровав по регэкспу поле „автор“ выкачивает все url'ы:
curl mysite/api.json | env `json-get-to-env X-AUTH-TOKEN`;curl -H X-AUTH-TOKEN $X-AUTH-TOKEN mysite/api/list.json | json-filter --field 'author' --rmatch 'R.{1,2}dal\d*' | json-get --field 'url' | xargs wget

Парсит вывод find -ls, сортирует по полю size, вырезает из массива элементы с 10 по 20, выводит их в csv.
find . -ls | ls2josn | json-sort --field 'size' | json-slice [10:20] | json2csv
Читать дальше →
Всего голосов 64: ↑58 и ↓6+52
Комментарии133

Tree — убийца JSON, XML, YAML и иже с ними

Время на прочтение11 мин
Количество просмотров172K
Здравствуйте, меня зовут Дмитрий Карловский и я… много думал. Думал я о том, что не так с XML и почему его в последнее время променяли, на бестолковый JSON. Результатом этих измышлений стал новый стандарт формат данных, который вобрал в себя гибкость XML, простоту JSON и наглядность YAML.

image Tree — двумерный бинарно-безопасный формат представления структурированных данных. Легко читаемый как человеком так и компьютером. Простой, компактный, быстрый, выразительный и расширяемый. Сравнивая его с другими популярными форматами, можно составить следующую сравнительную таблицу:
Больше — лучше JSON XML YAML INI Tree
Человекопонятность 3 1 4 5 5
Удобство редактирования 3 1 4 5 5
Произвольная иерархия 3 3 3 1 5
Простота реализации 3 2 1 5 5
Скорость парсинга/сериализации 3 1 1 5 5
Размер в сериализованном виде 3 1 4 5 5
Поддержка поточной обработки 0 0 5 5 5
Бинарная безопасность 3 0 0 0 5
Распространённость 5 5 3 3 0
Поддержка редакторами 5 5 3 5 1
Поддержка языками программирования 5 5 3 5 1
Читать дальше →
Всего голосов 275: ↑168 и ↓107+61
Комментарии629

Изучение комбинаторных парсеров с Rust

Время на прочтение40 мин
Количество просмотров12K

Привет, Хабр! Представляю вашему вниманию перевод статьи "Learning Parser Combinators With Rust".


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

Читать дальше →
Всего голосов 43: ↑43 и ↓0+43
Комментарии17

В этой одежде системы распознавания будут считать вас животным

Время на прочтение4 мин
Количество просмотров45K
У Рэйчел Дидеро интересный набор навыков: несколько степеней в области дизайна одежды (полученные в школах трех разных стран) и докторская степень в области машинного обучения Миланского политехнического университета.

Эти знания позволили ей выпустить коллекцию — довольно уродливой — одежды Manifesto. Она страшная и безвкусная, зато в ней вы становитесь нераспознаваемые для ML-алгоритма детектирования Yolo, активно используемого для работы с уличными камерами.



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

Читать дальше →
Всего голосов 78: ↑76 и ↓2+74
Комментарии254

Неужто так сложно передать зашифрованный файл? Эволюция формата пакетов NNCP

Время на прочтение10 мин
Количество просмотров3.9K
Расскажу про эволюцию формата зашифрованных пакетов в store-and-forward утилитах NNCP, о которых я уже писал на Хабре. Что может быть проще, чем передать пакет данных в зашифрованном виде? Но всё возникающие дополнительные потребности и пожелания пользователя, заставляют усложнять и исхитряться с форматом пакета.

Читать дальше →
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Когда интернет-архив забывает

Время на прочтение6 мин
Количество просмотров7.7K


В интернете есть определённые организации, на работу которых мы привыкли ежедневно полагаться в надежде предотвратить превращение правды в эластичную или неопределённую субстанцию. Не обязательно таким методом, к которому стремятся такие глупые проекты, как Verrit, но, по крайней мере, способом, способным подтвердить, что вы не сходите с ума, что старый пост или статья, которую вы вроде бы читали, реально существует. Это может быть такое поверхностное действие, как чтение быстро удалённого твита через кэш Google, или же такое глубокое погружение в контент, как изучение архива ныне почившего сайта через Wayback Machine. Но что произойдёт, если архив становится менее надёжным и по якобы убедительным причинам решает прогнуться и удалить спорный материал, попавший в архив?
Читать дальше →
Всего голосов 22: ↑18 и ↓4+14
Комментарии3

Апгрейд не нужен, если техника 20 лет работает и не ломается

Время на прочтение6 мин
Количество просмотров46K
На этот 486SX поставили веб-сервер mTCP HTTPSERV.exe. Он немножко поработал в онлайне

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

Длительное использование некоторой техники — это не страх перемен или нехватка денег. Иногда просто случайность. О каком-нибудь сервере (или сотруднике) могут банально забыть, потому что он за эти годы не завис ни разу (не обратил на себя внимания). Никто не помнит, где он и как выглядит. Работает — и работает, ок.
Читать дальше →
Всего голосов 152: ↑146 и ↓6+140
Комментарии348
1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность