Как стать автором
Обновить
144
0
Александр Прохоров @Athari

Программист C#

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

Stack Overflow на русском: инструкция по убийству сообщества

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

Когда разнеслись новости не только об открытии Stack Overflow на русском языке, но и об импорте неизвестного мне тогда "Хэшкода", то я решил присоединиться. Чем чёрт не шутит? И знаете, мне понравилось. Небольшое, но сплочённое сообщество, возможность реально улучшить состояние сайта — всё это было глотком свежего воздуха после закостенелого механизированного большого Stack Overflow. Всем телом ощущалась атмосфера демократии. Я был как одним из самых активных отвечающих, так и одним из самых активных дворников; много писал на Мете, активно общался в чате, даже чуть не стал модератором.



Однако сейчас я сижу в бане на год, общаюсь в стороннем чате с бывшими (и не очень бывшими) активными юзерами RuSO. Вместе со мной и ушедший топ-юзер сайта, и опальные модераторы. Чат на самом RuSO практически заброшен, активность на Мете никакая. Долгое время мы пытались исправить ситуацию, но ничего не добились.


Учитесь, что называется.

Читать дальше →
Всего голосов 81: ↑50 и ↓31+19
Комментарии242

GitHub превращается… превращается GitHub… в элегантный Windows 95

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


В Твиттере какое-то время назад запостили шутку в честь приобретения Майкрософтом ГитХаба — страницу сайта, перестилизованную в стиле Windows 98. Я решил, что шутка слишком хороша, чтобы оставаться шуткой.

Давайте перекрасим GitHub!
Всего голосов 206: ↑202 и ↓4+198
Комментарии82

CsConsoleFormat: форматирование в консоли по-новому (.NET)

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

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


Код быстро превращается в нечитаемое месиво, в котором не разобрать, где логика, где текст, где форматирование. Это ужасно! Когда мы пишем GUI, у нас в распоряжении все прелести современной разработки: паттерны MV*, байндинги и прочие крутые штуки. После работы с GUI написание консольных приложений сродни возвращению в каменный век.


CsConsoleFormat спешит на помощь!

А что это?
Всего голосов 39: ↑39 и ↓0+39
Комментарии18

У Upwork проснулась монопольная жадность

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

Глубокой ночью ничто не предвещало беды… Но в четыре утра от фрилансерской биржи Upwork пришло письмо с радостным, выделенным полужирным начертанием сообщением:


Чем больше вы работаете с клиентом на Upwork, тем больше из заработанного вы оставляете себе!


Казалось бы, радоваться надо, но если вчитаться, то обнаруживаются некоторые детали: комиссию Upwork не уменьшил, а увеличил. Если раньше на все контракты распространялась комиссия 10%, то сейчас она становится ступенчатой: 20%, 10% и 5% при порогах в $0, $500 и $10 000.

Добро пожаловать в мир монополий!
Всего голосов 37: ↑28 и ↓9+19
Комментарии120

LINQ для PHP: скорость имеет значение

Время на прочтение18 мин
Количество просмотров16K
Если вы не знаете, что такое LINQ, и зачем он сдался на PHP, смотрите предыдущую статью по YaLinqo.

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

С остальными продолжаем. LINQ — это замечательно, но насколько проседает производительность от его использования? Если сравнивать с голыми циклами, то скорость меньше раз в 3-5. Если сравнивать с функциями для массивов, которым передаются анонимные функции, то раза в 2-4. Так как предполагается, что с помощью библиотеки обрабатываются небольшие массивы данных, а сложная обработка данных находится за пределами скрипта (в базе данных, в стороннем веб-сервисе), то на деле в масштабах всего скрипта потери небольшие. Главное — читаемость.

Так как со времени создания моей библиотеки YaLinqo на свет появилось ещё два конкурента, которые действительно являются LINQ (то есть поддерживают ленивые вычисления и прочие базовые возможности), то возникают позывы библиотеки сравнить. Самое простое и логичное — сравнить функциональность и производительность. По крайней мере это не будет избиением младенцев, как в прошлом сравнении.

(А также появление конкурентов наконец-то мотивировало меня выложить документацию YaLinqo онлайн.)

Дисклеймер: это тесты «на коленке». Они не дают оценить все потери в производительности. В частности, я совершенно не рассматриваю потребление памяти. Отчасти потому что я не знаю, как это нормально сделать. Если что, pull requests are welcome, что называется.
Даёшь скорости!
Всего голосов 26: ↑19 и ↓7+12
Комментарии6

Прошу вернуть удалённые хабы

Время на прочтение1 мин
Количество просмотров5.8K
В давние времена на Хабре здравствовал славный хаб «Я негодую», в котором можно было поделиться нежданной болью с ближним и посочувствовать всевозможным мытарствам, на которые обрекает гиков злодейка-судьба в стране победившей стабильности. Хаб был жестоко удалён, а все топики без разбора перенесены с глаз долой в «Чулан».

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

Если вы считаете, что какой-либо из убиенных хабов также достоин воскрешения, то делитесь мнениями в комментариях. У меня не возникает сомнений, что умерщвлённых хабов несчесть, иначе не быть «Чулану» наипопулярнейшим хабом со ста тридцати девятью тысячами пятьюстами тридцатью девятью подписчиками.
Всего голосов 86: ↑75 и ↓11+64
Комментарии19

YaLinqo (LINQ to Objects для PHP) — версия 2.0

Время на прочтение6 мин
Количество просмотров15K
Что-что?

LINQ — это штука, которая позволяет писать запросы, чем-то похожие на SQL, прямо в коде. LINQ to Objects, собственно, позволяет писать запросы к объектам, массивам и всему тому, чем вы оперируете в коде.

Это ещё зачем?

Если у вас есть база, то у вас есть любимый ORM (или любимый голый SQL — кому как по вкусу). Но иногда объекты приходят из веб-сервисов, из файлов, да и вообще тьма тьмущая объектов может требовать нетривиальной обработки: преобразование, фильтрация, сортировка, группировка, агрегация… Применить бы привычный ORM или SQL — но базы-то нет. Тут на помощь приходит LINQ to Objects, в данном случае YaLinqo.

Что умеет?

  • Самый полный порт .NET LINQ на PHP, со многими дополнительными методами. Всего реализовано более 70 методов.
  • Ленивые вычисления, текст исключений и многое другое, как в оригинальном LINQ.
  • Детальная документация PHPDoc к каждому методу. Текст статей адаптирован из MSDN.
  • 100% покрытие юнит-тестами.
  • Коллбэки можно задавать замыканиями, «указателями на функцию» в виде строк и массивов, строковыми «лямбдами» с поддержкой нескольких синтаксисов.
  • Ключам уделяется столько же внимания, сколько значениям: преобразования можно применять и к тем, и к другим; большинство коллбэков принимает на вход и то, и другое; ключи по возможности не теряются при преобразованиях.
  • Минимальное изобретение велосипедов: для итерации используются Iterator, IteratorAggregate и др. (и их можно использовать наравне с Enumerable); исключения по возможности используются родные похапэшные и т.п.
  • Поддерживается Composer, есть пакет на Packagist.
  • Никаких внешних зависимостей.

Что случилось?

Прошёл год, как вышел PHP 5.5 со всякими вкусностями типа генераторов и исправленных итераторов. Так как на моей совести самый полноценный порт LINQ на PHP, то я решил, что настало время его обновить и воспользоваться новыми фичами языка.

Что нового?
Всего голосов 34: ↑29 и ↓5+24
Комментарии45

ВКонтакте: 451 Unavailable For Legal Reasons

Время на прочтение1 мин
Количество просмотров33K
Когда вводились законы о цензуре, многие мечтали: «Вот ВКонтакте заблокируют — и все заметят, насколько законы вредны для Интернета, потому что это коснётся очень многих». Что ж, ВКонтакте прислали чёрную метку. И ВКонтакте заблокировал сообщества. Так что чуда не будет, расходимся.

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

Роскомнадзор отчитался, что сообщества «удалены», хотя на самом деле этого не произошло. Интересно, в курсе ли они. Вообще, сообщение 451 на ВК выглядит следующим образом:
Данный материал заблокирован на территории Российской Федерации решением Роскомнадзора №01КМ-7376 от 02.03.2014.
Код, к сожалению, 200 OK.

Читать дальше →
Всего голосов 108: ↑98 и ↓10+88
Комментарии41

Поправки к закону против интернета внесены!… хотя постойте…

Время на прочтение1 мин
Количество просмотров87K
ГосдураЗаконопроект № 342640-6
О внесении изменений в Граждански кодекс Российской Федерации, Гражданский процессуальный кодекс Российской Федерации, Арбитражный процессуальный кодекс Российской Федерации и Федеральный закон «Об информации, информационных технологиях и о защите информации»
НАХОДИТСЯ НА РАССМОТРЕНИИ
17.09.2013 10:52

Похоже, были правы те, кто предсказывал, что госдума скорее расширит действие закона, чем прислушается к РОИ (TODO ссылка на опрос). ПЖиВ в лице Роберта Шлегеля и Марии Максаковы изрыгнула законопроект по расширению антипиратского закона на защиту авторских прав музыкантов, литераторов и разработчиков компьютерных программ.

Что там внутри?
Всего голосов 199: ↑180 и ↓19+161
Комментарии298

Парсер CSS для .NET, написанный на C#

Время на прочтение4 мин
Количество просмотров14K
Понадобилось мне однажды распарсить CSS, чтобы вынуть @import, url(). Но для .NET были только разной степени кривоты поделки. Лучшей библиотекой была ExCSS, но она загибалась на таких тривиальных вещах, как медиа-запросы. Поэтому я решил заполнить пробел.

Были варианты: расковырять Chrome, расковырять Firefox, расковырять левую библиотеку. Нужно было гарантированное качество и регулярное обновление, поэтому последний вариант отпадал. В Chrome парсинг CSS и HTML генерировался на основе грамматик, и беглое изучение разнообразия инструментов для .NET повергло в уныние, что уж говорить о совместимости инструментов, поэтому Chrome отпал. Остался Firefox с вручную написанными парсерами.

Приступим!
Всего голосов 36: ↑28 и ↓8+20
Комментарии27

The Greenlight Supershow (Live 18:30 MSK)

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


В 18:30 MSK (10:30 AM EDT, 14:30 UTC) намечается The Greenlight Supershow.

Суть: эвент с рассказыванием и показыванием 25 игр со Steam Greenlight. Геймплей, специальные гости, вопросы и ответы, халява, секреты, печеньки* — прилагаются. Короче говоря, веселуха в компании разработчиков и игроков.

Описание здесь: robotloveskitty.com/supershow
Смотреть здесь: www.twitch.tv/robotloveskitty

* если принесёте свои

Подробностей нет
Всего голосов 13: ↑7 и ↓6+1
Комментарии3

.NET Framework: Какую версию вы используете?

Время на прочтение2 мин
Количество просмотров28K
Фреймворк .NET развивается очень быстро, в языки с каждой версией добавляется множество новых возможностей. Однако интересно, как быстро этими обновлениями удаётся воспользоваться.

Краткая историческая справка (неполная):

.NET 4.5 (Windows Vista SP2+): Metro, async/await, Unicode console, generics in MEF, IDN, EAI, ZIP; WPF: Ribbon control, async validation, VirtualizingPanel pixel scrolling, static properties bindings, live shaping, better weak events support.

.NET 4.0 (Windows XP SP3+): Parallel Extensions, Parallel LINQ, Task Parallel Library, dynamic dispatch and DLR, covariance and contravariance, named parameters, optional parameters, indexed properties, code contracts, BigInteger and Complex classes.

Углубиться в историю
Всего голосов 37: ↑32 и ↓5+27
Комментарии50

Альтернативный WPF язык JAML = XAML − XML + JSON

Время на прочтение7 мин
Количество просмотров18K
На дворе наступал Новый год, а из головы никак не выходила мысль, что XAML может быть лучше. И, чтобы ему быть лучше, ему нужно перестать быть. Так родилась затея написать альтернативу кошмарному и ужасному XAML'ю: без <Setter.Value>, без {Binding Path=Name, RelativeSource={RelativeSource AncestorType={x:Type Button}}, Converter={StaticResource Converter}}, без FirstValueEqualsToSecondValueOrThirdValueEqualsNullConverter, без <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions>, без <MultiDataTrigger> <MultiDataTrigger.Triggers> <DataTrigger> <DataTrigger.Binding> <MultiDataBinding>..., без xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml", без всего этого барахла, от написания которого в десятый раз возникают позывы нежно погладить компьютер табуретом и вспоминаются далёкие индусские родственники разработчиков WPF.

Читать дальше →
Всего голосов 53: ↑41 и ↓12+29
Комментарии103

Семь лет WPF: что изменилось?

Время на прочтение8 мин
Количество просмотров70K
Прим. перев.: это перевод статьи Six years of WPF; what's changed?, написанной 3 августа 2012 года. Сейчас WPF уже не шесть, а семь лет, однако ничего не изменилось.

До перехода в Octopus Deploy на полную ставку я провёл год за написанием на WPF системы оценки рисков для трейдеров в инвестиционном банке. До того я работал консультантом, по большей части фокусируясь на WPF. Последние шесть лет я жил и дышал технологией, и в этом посте я хочу поделиться некоторыми мыслями о прошлом и будущем WPF и XAML.

Шесть лет назад я написал статью про валидацию в WPF на Code Project. Ещё я написал свой error provider, который поддерживает IDataErrorInfo, потому что — вы не поверите! — WPF 3.0 не поддерживал IDataErrorInfo. Позже я работал над несколькими опенсорсными WPF проектами вроде Bindable LINQ (первоначального реактивного программирования для WPF, ещё до изобретения Rx) и Magellan (MVC для WPF а-ля ASP.NET). Я даже некоторое время состоял в клубе, посвящённому превозносению MVVM и киданию ссылок на Code Project, известном как WPF Disciples («Приверженцы WPF»).

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

Вот как в далёком 2006-м году выглядела разметка относительно простого окошка (код позаимствован из проекта, над которым я тогда работал):

	<Window x:Class="PaulStovell.TrialBalance.UserInterface.MainWindow"
	  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	  xmlns:tb="clr-namespace:PaulStovell.TrialBalance.UserInterface"
	  xmlns:tbp="clr-namespace:PaulStovell.TrialBalance.UserInterface.Providers"
	  xmlns:system="clr-namespace:System;assembly=mscorlib"
	  Title="TrialBalance" 
	  WindowState="Maximized"
	  Width="1000"
	  Height="700"
	  Icon="{StaticResource Image_ApplicationIcon}"
	  Background="{StaticResource Brush_DefaultWindowBackground}"
	  x:Name="_this">

Только взгляните на все церемонии! x:Class! Пространства имён XML! Почему бы не объявить всё это в одном месте, почему бы стандартные пространства имён не включать неявно?

К счастью, сейчас 2013-й год, и WPF был проделан огромный путь. Вот так код будет выглядеть сегодня:
Даёшь прогресс!
Всего голосов 76: ↑63 и ↓13+50
Комментарии226

Школьные поделки: Battlecruiser & DeathCraft

Время на прочтение8 мин
Количество просмотров72K
ОСТОРОЖНО! Концентрированная ностальгия! Описанное здесь морально устарело много-много лет назад. Более того, оно устарело до того, как было реализовано. Из статьи вы не узнаете ничего нового.
В давние-давние времена, когда Embarcadero CodeGear Borland Delphi RAD Studio C++ Builder был версии 4, когда Autodesk 3ds Max Discreet 3dsmax 3D Studio Max был версии 3, когда 80 Гб и 200 МГц были не в холодильниках, а в компьютерах, когда Интернет был неведомым и таинственным существом, каждое прикосновение к которому было магическим… я учился в старших классах школы и учился программировать. А также моделировать. И ещё всякое-разное по мелочи.
Подозрительный скриншот:


Много картинок и ностальгии
Всего голосов 275: ↑261 и ↓14+247
Комментарии115

Бот для браузерки Angry Pets

Время на прочтение6 мин
Количество просмотров11K
Предупреждение: бот прост до безобразия. Вы вряд ли научитесь чему-то новому. Статья just for fun.

Решил, что спустя год можно поглядеть, чем френды вконтакте развлекаются. Кроме традиционных тонн политоты, картинок с котятами и прочих непотребств обнаружил ссылку на браузерку Angry Pets. В браузерки никогда не играл, поэтому решил посмотреть, что это за зверь такой. Выяснилось следующее: картинки кавайнейшие (милые котики, пингвинчики и белочки бьют друг другу морды), донат анальнейший (за деньги доход умножают в 8 раз), сюжет, стратегия, безбажность, мануал и прочие привычные удобства отсутствуют.

Игра чуть менее, чем полностью, состоит из следующих нехитрых операций: построить здание, подождать 10 минут, построить юнитов, подождать 10 минут, найти жертву, отправить юниты в атаку, подождать 10 минут, найти жертву, отправить юниты в атаку, подождать 10 минут… (10 минут на высоких уровнях растут экспоненциально. За ускорение — отдельная плата.)

Что делать с такой игрой? Правильно, писать бота. Не играть же в это, честное слово.

Приступаем к делу!
Всего голосов 54: ↑42 и ↓12+30
Комментарии17

LINQ для PHP. Часть 2. Если гора не идёт к Магомету, Магомет идёт к горе

Время на прочтение9 мин
Количество просмотров5.3K
Как можно было заметить из моей предыдущей статьи со сравнением библиотек LINQ для PHP, библиотек много, а качества мало: ленивые вычисления не реализованы ни в одной библиотеке, тесты есть в половине случаев, типы коллбэков ограничены, а иногда и вовсе незнамо что выдаётся за LINQ. Поэтому я написал свою библиотеку. Встречайте:

YaLinqo — Yet Another LINQ to Objects for PHP

Возможности:

  • Самый полный порт .NET LINQ на PHP, со многими дополнительными методами. Некоторые методы отсутствуют, но работа ведётся. Всего реализовано более 70 методов.
  • Ленивые вычисления, текст исключений и многое другое, как в оригинальном LINQ.
  • Детальная документация PHPDoc к каждому методу. Текст статей адаптирован из MSDN.
  • 100% покрытие юнит-тестами.
  • Коллбэки можно задавать замыканиями, «указателями на функцию» в виде строк и массивов, строковыми «лямбдами» с поддержкой нескольких синтаксисов.
  • Ключам уделяется столько же внимания, сколько значениям: преобразования можно применять и к тем, и к другим; большинство коллбэков принимает на вход и то, и другое; ключи по возможности не теряются при преобразованиях.
  • Минимальное изобретение велосипедов: для итерации используются Iterator, IteratorAggregate и др. (и их можно использовать наравне с Enumerable); исключения по возможности используются родные похапэшные и т.п.

Пример кода:

// Отфильтровать продукты с ненулевым количеством, поместить в соответствующие категории,
// отсортированные по имени. Продукты отсортировать сначала по убыванию количества, потом по имени.

from($categories)
    ->orderBy('$v["name"]')
    ->groupJoin(
        from($products)
            ->where('$v["quantity"] > 0')
            ->orderByDescending('$v["quantity"]')
            ->thenBy('$v["name"]'),
        '$v["id"]', '$v["catId"]', 'array("name" => $v["name"], "products" => $e)'
    );

Детальное описание, обсуждение архитектуры, ссылки
Всего голосов 63: ↑52 и ↓11+41
Комментарии24

Я ненавижу опросы, потому что…

Время на прочтение1 мин
Количество просмотров682
Решил, что при карме 50 можно с чистой совестью слить половину кармы, но всё-таки узнать ответ на давно мучающий меня вопрос. Дамы и господа, минусуйте на здоровье, только карму больше, чем на −30, не опускайте, пожалуйста — я ещё топики про PHP писать хотел и ещё немного по разработке игр.

(К моему предыдущему опросу это не относится — он действительно безынтересный, и минусы ожидаемы. Однако я видел множество заминусованных интересных опросов.)
Всего голосов 83: ↑21 и ↓62-41
Комментарии20

Если мне надо скачать галерею deviantART, канал YouTube, плейлист VKontakte и т.п., то я использую…

Время на прочтение1 мин
Количество просмотров5.3K
Есть позывы написать софтинку: вводишь URL, по нему предлагаются соответствующие варианты, что качать (галерею, избранное, избранное друзей, избранное друзей друзей), куда качать (как распихать по папкам, возможно, как записать в базу), как качать, когда качать и т.п. Размещение данных на сайте (где на странице какой блок информации), связь между ними (граф — что с чем какое имеет отношение) и т.п. задаются декларативно (XPath, RegEx и т.п. в иерархии) и частично скриптами (Lua, JS и т.п.). Хочу универсальный инструмент: с одной стороны, чтобы было глубокое понимание структуры сайта, как у специализированных качалок; с другой стороны, чтобы была мощь настроек универсальных качалок. Хочу, чтобы был нормальный режим проверки обновлений (не надо заново проверять всю галерею, чтобы скачать два добавившихся файла).

Опрос создаю для того, чтобы прощупать почву: нужно оно кому-нибудь или нет.
Всего голосов 51: ↑19 и ↓32-13
Комментарии22

LINQ для PHP. Часть 1. Я его слепила из того, что было, а потом, что было, то и полюбила

Время на прочтение9 мин
Количество просмотров8.1K
Сказ о том, как LINQ на PHP портировали. Сравнение ныне существующих библиотек с табличками, но без графиков — прилагается.

Картинка код для привлечения внимания (картинок не дождётесь!)
echo Phinq::create($people)
  ->groupBy(function($person) { return $person->residence->region; })
  ->select(function($grouping) {
    $obj = new stdClass();
    $obj->people = $grouping;
    $obj->region = $grouping->getKey();
    return $obj;
  })->orderBy(function($obj) { return $obj->people->count(); }, true)
  ->aggregate(function($current, $next) {
    $count = $next->people->count();
    return $current . sprintf(
      "%d %s (%s) live in the %s region\n",
      $count,
      $count === 1 ? 'person' : 'people',
      $next->people->aggregate(function($current, $next) {
        if ($current !== null) {
          $current .= ', ';
        }
        return $current . sprintf('%s [%s]', $next->name, $next->residence->code);
      }),
      $next->region
    );
  });
Кто видел C# или любой функциональный язык — при виде этого шедевра закатит глаза (если они предварительно не вылетят из орбит). И, наверное, будет прав. Но можно ещё вот так:
$lowNums =
	from('$n')->in($numbers)->
	where('$n < 5')->
	store($digits)->into('digits')->
	select('$digits[$n]');
А как ещё можно? Осторожно, много текста!
Всего голосов 54: ↑44 и ↓10+34
Комментарии55
1

Информация

В рейтинге
Не участвует
Откуда
Казань, Татарстан, Россия
Дата рождения
Зарегистрирован
Активность