Тимофей Мартынов
Тимофей Мартынов личный блог
12 февраля 2016, 17:14

Программирование и я. Что я умею?

Последний раз я писал про свои успехи в программировании 10 дней назад. За эти 10 дней я:
  • потратил еще 18 часов чистого времени изучения. (Маловато, всего 1 час 48 минут в день в среднем получается)
  • всего потрачено 75 часов.
  • продвинулся по книге Изучаем C# со стр. 304 до стр. 492.
  • написал и отправил на ютуб ещё 8 программок
Итак, что я до сих пор не знаю?
  • не знаю как работать с параллельными вычислительными потоками
  • не знаю как работать с графическим интерфейсом вообще
  • не совсем понимаю как работать с большими объемами данных и как их лучше хранить 
  • интерфейс WPF
  • я не знаю чего я ещё не знаю в силу своей недостаточной компетенции. Чем больше я буду узнавать, тем больше я буду понимать, что я этого не знаю
Что я теоретически уже освоил?
  • интерфейс Windows Forms
  • синтаксис C#
  • типы данных, преобразование типов, массивы
  • все виды циклов
  • понятие объектов
  • классы, методы, поля, конструкторы, свойства
  • наследование классов, полиморфизм классов, инкапсуляция
  • использование базы SQL
  • запись текста в файл в формате txt, сохранение объекта в файл
  • обработка исключений
  • дебаггинг программы

Пример решения последнего ребуса на try-catch


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

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

Первая практическая задача = научиться через smartCom обрабатывать свою статистику торговли онлайн.
То есть получать инфу о совершенных сделках и определенным образом её обрабатывать.
Вторая практическая задача = перестроить стакан определенны способом + настроить график текущей цены определенным способом.

Сейчас дочитаю книгу и вернусь к тестовому коннектору смарткома. Что мне осталось изучить?

  • события, делегаты, обратный вызов
  • визуализация, PictureBox, UserControl, Graphics, Bitmap.
  • убийство объектов
  • LINQ
Интересно, чего я ещё не буду знать о C# после прочтения этой книги?))

Блин, самое сложное во всех этих вещах — это как и в трейдинге, засунуть куда подальше нетерпеливость и последовательно методично заниматься предметом. Ведь хочется всё и сразу и именно поэтому ничего не получается. 
Хм. Зато чем дальше я двигаюсь (хоть и очень медленно), у меня прям уважение к самому себе растет, если я что-то начинаю понимать:))
69 Комментариев
  • Константин Анохин
    12 февраля 2016, 17:19
    Тоже в процессе изучения только я начал свой путь с VBA.
  • sortarray sortarray
    12 февраля 2016, 17:26
    • все виды циклов

    Все виды циклов сводятся(являются частными случаями) к GOTO:)
      • sortarray sortarray
        12 февраля 2016, 17:33
        Тимофей Мартынов, просто был такой свободный ящик, я не заморачивался, просто сделал копипаст:)
      • Евгений Черных
        12 февраля 2016, 18:25
        Тимофей Мартынов, В частности, многие люд советуют решать конкретные практические задачи и так учиться программированию
        Вот это дельный совет. Сам так и учился. В памяти все в разы лучше откладывается. А все что я прочитал, но не использовал в итоге -забылось очень быстро!
  • sortarray sortarray
    12 февраля 2016, 17:31
     
    • типы данных, преобразование типов, массивы

    Тут перечисление лишнее, если ты освоил *типы данных* ты освоил и массивы, так как массив — это тип данных.

    Вообще конечно, понятие тип данных — это, по большому счету, баззворд, нет никаких типов данных, данные ничем не отличаются от программы, возможно это до тебя дойдет когда-нибудь:) Это во многом ключ к пониманию программирования вообще.
    • Антон Денисков (Fry)
      12 февраля 2016, 19:39
      sortarray sortarray, не дойдёт. Это нужно только хакерам. Дисциплинированным программистам такое юзать не положено.
  • StockChart.ru
    12 февраля 2016, 18:25
    Ну а чего ты ожидал? Что бы иметь систему, надо 5 лет учится в вузе. Если будешь уметь кодировать как ПТУшник это уже хорошо. Систему с наскока ты один хрен не осилишь. 
       Хотя даже если смотреть на то что изучаешь системы немногим меньшче, чем никакой. В одну бочку запихал LINQ и BITmap. Пипец.


  • Господин Ливермор
    12 февраля 2016, 18:54
    как освоишь, учить будешь? ;) 
  • SMT
    12 февраля 2016, 18:57
    Главное уметь оперировать знаниями.  
    Бывают знатоки, которые простейшие задания типа сортировки массива сделать с трудом еле могут. ) Зато синтаксис знают.
  • Брахман Пилорама
    12 февраля 2016, 19:28
    Напоминает, как начинающий автомобилист, учится вождению по книге. ))

    Это возможно. Но зачем? Ничего путного с таким обучением написать невозможно. Быдлокодеров обученных по  книгам и не представляющих как вообще все работает — пруд пруди. Написать робота или использовать API биржи — это же слезы будут. Только на уровне студенческой практики… А время?  А другие, более интересные занятия?

    Стать программистом — это не значит прочитать даже все книги, понять и порешать задачки. Программист — это человек который с детства этим занимается, те кто пишут реально классный код, строят торговые системы — они в 90-х писали програмульки под Спектрум на ассемблере и взламывали чужой код. Если в команде есть такой чел — проект будет легким а софт быстрым. Если этого не было с детства, если это не интересовало, то взять сесть и стать хоть что-то вменяемое писать — сродни чуду. В обратном случае мы видим делфи-подобные поделия типа МТ или Quik.

    Из книг — почитайте Кнут Искусство Программирования. Это наверное лучая книга по этой теме. И да, программеру без разницы на каком языке писать. Дело нескольких дней переключится с C на фортран или на что другое. Главное понять принцип.
    • 🗝Багатенький Буратина
      12 февраля 2016, 20:49
      Брахман Пилорама, Кнута ни в коем случае нельзя читать!
      • usertrader
        13 февраля 2016, 01:07
        Багатенький Буратина, что такого Кнут написал плохого?

    • usertrader
      13 февраля 2016, 01:12
      Брахман Пилорама, все так как пишите. Кнута не читал — не довелось поэтому не могу ничего сказать. 
  • Антон Денисков (Fry)
    12 февраля 2016, 19:51
    Я думаю это не очень хорошо, потому что так ты будешь как птушник, который конечно может там чего-то настругать, но при этом не имеет глобального видения и знания для системного решения проблем.

    Допустим, ты решил заниматься танцами. Прочитал книгу, изучил теорию. Весь фундамент знаешь теоретически… Ну ты понял — вопрос яиц остаётся открытым =)

    Главная мысль такой деятельности как трейдинг или программирование заключается в том, что лишь практическая задача на пути её ПРАКТИЧЕСКОГО решения возбуждает нужный ход мыслей, чтобы задавать правильные теоретические вопросы и правильно формировать свою базу знаний.
    Никогда по книгам ты не станешь профи!

    Я открыл пример программы коннектора для smartComа и у меня взорвался мозг. Сейчас я дочитаю книгу и..
    И у тебя снова взорвётся мозг. Прям один в один будет ситуация. И тогда ты поймёшь, что проблема не в книге =)
  • Максим Виссарионович
    12 февраля 2016, 20:04
    Надо выбрать или wpf (лучше), или winforms, нет смысла их друг за другом учить, это разная реализация одного и того же.
  • ...
    12 февраля 2016, 20:11
    Тимофей, молоток. опять же одни мифы вокруг программирования что это для избранных. на самом деле программирование нужно учить всех обязательно, программирование, алгоритмизацию и математику хоть на базовом уровне. не слушай что тебе говорят всякие «умники», иди своим путем на пролом. а то что программирование это не раз и выучил или научился, тут развитие идет постоянно, как среды разработчиков, Фреймворки, методологии, техники, синтаксис, точнее синтактический сахар. тот же С# от версии к версии иногда значительно а иногда не очень меняется. многопоточное программирование в C#1,2 совсем не такое как в 3.5, 4 и 5. когда-то надо было делать всё руками, создавать потоки и разруливать их, потом появился TPL, ну а теперь распаралелить цикл сможет любой с помощью plinq или parallel.foreach в одну строку =). мне повезло когда-то, я отучился в лицее с уклоном в информатику, в инсте был курс по программированию и алгоритмам, но это мелочь по сравнению с практикой, работой с профессионалами когда ты можешь у них спрашивать, задавать вопросы. даже на СЛ думаю найдутся те кто может ответить на твои вопросы, главное задавай их
  • nxt
    12 февраля 2016, 20:18
    Тимофей, я бы тебе рекомендовал сразу писать в Web на ASP.NET MVC. Desktop приложения это хорошо, но будущее однозначно за web и мобильными приложениями. WinForms уже давно устаревшая технология.
    • sortarray sortarray
      12 февраля 2016, 20:26
      nxt, если будущее за веб, то почему бы сразу не писать на нейтив-веб языках, таких как PHP, javascript, и соответствующих фреймверках например? Зачем сюда NET за уши притягивать?
      • nxt
        12 февраля 2016, 20:28
        sortarray sortarray, в ASP.NET MVC на C# пишется только серверная часть, клиентская на HTML/Javascript. Кроме того с недавних пор последний ASP.NET 5 кроссплатформенный.
        • sortarray sortarray
          12 февраля 2016, 20:34
          nxt, то есть, NET надо тащить только ради того, чтобы иметь *счастливую* возможность писать бекэнд на *непревзойденном* С#?
          • nxt
            12 февраля 2016, 20:37

            sortarray sortarray, да можно писать на чем угодно, смотря какие задачи стоят. Кому-то больше по душе тот же Node.js.

            Суть моих комментов в том, что если и изучать C#, то лучше сразу фокусироваться на Web. 

            • sortarray sortarray
              12 февраля 2016, 20:46
              nxt, Я с Вами согласен, что сейчас стоит фокусироваться на WEB, десктоп скоро вообще здохнет. Проблема в том, что статически-типизированные языки очень хреново подходят для веба, не случайно, почти все используемые в вебе языки данамические. А скорость для сервер-сайд не важна, там гораздо важней возможность масштабирования.
              • Максим Виссарионович
                12 февраля 2016, 20:53
                sortarray sortarray, какие-то глупости пишите.
                • sortarray sortarray
                  12 февраля 2016, 20:54
                  Максим Виссарионович, Ваше мнение очень важно для нас, оставайтесь на связи.
              • nxt
                13 февраля 2016, 02:31

                sortarray sortarray, скорость не важна? Вы в каком мире живете?

                Если web приложение обслуживает полтора юзера, может и не важна. Сами почитайте что написали.

                • sortarray sortarray
                  13 февраля 2016, 03:31
                  nxt, Я еще раз повторяю, не важна. В нормальном приложении запросы обрабатываются асинхронно, сервер никогда на берет на себя тяжелые вычисления, он только диспетчеризует запросы и реализует логику. Не заставляйте меня подозревать, что вы живете в мире тупых число*бов.
      • nxt
        12 февраля 2016, 20:33
        sortarray sortarray, кроме того, C# на сервере будет работать гораздо быстрее чем тот же PHP.
      • nxt
        14 февраля 2016, 14:14

        Тимофей Мартынов, ASP.NET MVC — технология для разработки web приложений, на базе шаблона Model-view-controller. Суть в том, что в приложении должно быть четкое разделение на:

        1. Model — обрабатываемые данные, модели данных, база данных

        2. View — web страницы, UI, куда выводится вся информация

        3. Controller — логика web приложения.

  • nxt
    12 февраля 2016, 20:20
     Да, и лучше сразу поставить себе ReSharper для рефакторинга.
      • nxt
        14 февраля 2016, 14:19

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

        Reshaper помогает оптимизировать многие процессы связанные с рефакторингом. Можно погуглить.

  • KNK
    12 февраля 2016, 20:26
    Тимофей,  рекомендую тебе взять API хоть Велса, хоть ТСлаба и начать уже писать робота используя это АПИ. Я на своей шкуре убедился что вопрос синтаксиса и команд это вообще дело 3-е, ставь Решарпер он за тебя все сам сделает)), важнее всего как заставить все это заработать, а для этого нужна практика. Опишу по шагам свой путь 1) Логика робота готова, вопрос — откуда котировки брать в реальном времени. 2) Как ставить заявки 3) Как получить обратную связь о том, что заявки сработали. 4) Как сделать так чтобы не контролировать действия робота в реальном времени и не использовать на это ресурсы собственного компьютера 5) Как сделать так чтобы роботы сами делили депозит между собой

    • sortarray sortarray
      12 февраля 2016, 21:01
      KNK, 
      вопрос — откуда котировки брать в реальном времени

      Вот этот вопрос очень интересный. Не поделитесь, как Вы его решили для себя?
      • KNK
        12 февраля 2016, 21:16
        sortarray sortarray, TSLab. Да, пока так))
    • Кремлебот
      13 февраля 2016, 23:51
      KNK, «Как сделать так чтобы роботы сами делили депозит между собой»

      6) Как сделать, что бы роботы сами выводили прибыль и сами её тратили.

      7) Как сделать, что бы роботы тратили деньги на что-то полезное, а не только на шлюх и блэкджек.
  • Oleg Vazhnev
    12 февраля 2016, 20:52
    старенько но смешно
  • neophyte
    12 февраля 2016, 21:00

    Чего не будешь знать изучив книгу?

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

  • evgen000
    12 февраля 2016, 23:15
    Да, молодец. Еще 10 дней и можно смело программить )
    ,
  • Brad Tick
    12 февраля 2016, 23:18
    выложил бы че в открытый доступ из написанного, так подсказали бы что там не так
  • Русский
    13 февраля 2016, 00:30
    После изучения языка, надо будет учится писать на нем «стихи»… т.е. учить математику, паттерны архитектуры… а вообще, похвально… тяга к знаниям штука полезная.
    • evgen000
      13 февраля 2016, 01:39
      Алексей Иванов, да какие уж паттерны, до этого не дойдет ). Уверен что даже до «фабрики» дело не дойдет ). Подергает методы и на этом закончит.
        • evgen000
          14 февраля 2016, 01:26
          Тимофей Мартынов, это один из паттернов проектирования. Не знание паттернов это одна из причин почему ничерта не понимаешь что происходит когда смотришь чужой код.
  • Счастливый Конец
    13 февраля 2016, 01:29

    Тимофей, как программист-программисту, отвечу:
    "•не знаю как работать с параллельными вычислительными потоками" Предположим есть цикл
    int[] result = new int[10];
    for(int i = 0; i < 10; i++) {
      // Тут какая то мощная вычислительная задача, где i допустим день за который надо посчитать данные
      result[i] = i * i * i;
    }
    Если запускать именно так, то сначала посчитается за 1 день, потом за второй и т.д., программа по сути займет одно ядро процессора. Современные бытовые процессоры типа Core i7 обычно 4 ядра (8 потоков), т.е. выполняя этот цикл процессор будет загружен на 1/8 (12.5%). Остальные 87.5% мощности процессора — отдыхают. Как перделаем: добавим:
    using System.Threading.Tasks; и перепишем цикл вот так:
    Parallel.For(0, 10, i => {  
      // Тут какая то мощная вычислительная задача, где i допустим день за который надо посчитать данные
      result[i] = i * i * i;
    });
    теперь загрузка процессора возрастет многократно! Нюанс: создавать большие объекты внутри Parallel.For крайне не рекомендуется (загрузка процессора упадет).

    "•не знаю как работать с графическим интерфейсом вообще" Если это картинка, то надо копать в PictureBox (она показывает Bitmap). А рисовать надо на Bitmap, вот типа так:

    Bitmap bmp = new Bitmap(100, 100, PixelFormat.Format24bppRgb); using (Graphics g = bmp.GetGraphics()) {   g.Clear(Color.White);   g.Draw… и рисуешь   g.Flush(); } this.pictureBox.Image = bmp; вот и все.

    "•не совсем понимаю как работать с большими объемами данных и как их лучше хранить " Большие массивы лучше хранить в 64-битном приложении (x64), т.к. 32-битные (x86) быстро дадут OutOfMemoryException. Лучше всего работать с массивами фиксированного размера int[] bigdata = new int[100*1000*1000]; лучше работать с целочисленными данными (тип byte, short, int, long), они всегда быстрее считались чем вещественные (float, double). Строки хранить крайне не рекомендуется (долго работает). Ну и правильно выбирать размер элемента, byte=1байт, short=2байта,int=4байта,long=8 байт Т.е. 100млн элементов типа int займет в памяти 400МБ, а лимит в .Net составляет 2ГБ на объект (т.е. 500млн элементов типа int, или 250млн типа long). Но тут еще одно ограничение — массив индексируется переменной типа int, а значит всего в массиве может быть только 2^32-1 элементов. Хотя можно создать 10массивов каждый по 2ГБ, и тогда приложение съест 20ГБ памяти :) Проверено. Если хочется очень большой массив, то гуглить в gcAllowVeryLargeObjects  (надо в app.config добавить), тогда можно создать массив который займет 16ГБ памяти, вот так: long[] l1 = new long[2000 * 1000 * 1000]; Есть нюанс: в C# работает с массивами не так быстро, особенно плохо работает с массивами byte[] (тормозит!), такие массивы лучше обрабатывать в DLL (пишутся на C++) и вызывать из C#. Вот написание и вызов внешних DLL наверное выпало из вашего плана ;)

    "•интерфейс WPF" не нужен, если вы не коммерческий разработчик, а для себя. Windows Forms вас удовлетворит на 100% в ближайшие 5 лет.

    LINQ, PLINQ — тоже не особо нужны, хватит и простых конструкций

    • sortarray sortarray
      13 февраля 2016, 14:33
      Счастливый Конец, по-моему, то что Вы рассказали про параллелизм — это вещь самооочевидная, и понятная даже человеку, который от прогрммирования далек. Ваш пример — это чистый рафинад, который не даст представления о параллелизме и конкурентности на проф уровне, например, о проблемах работы с шаред-ресурсами. Гораздо полезней рассматривать параллелизм с точки зрения реализации, а не с точки зрения того, «как это работает на уровне интерфейса пользователя". Скажем, полезно будет реализовать потоки в однопоточной среде, при помощи сопрограмм.

      Вообще, по теме конкурентных вычислений рекомендую почитать о модели Акторов Карла Хьюитта
      • Счастливый Конец
        14 февраля 2016, 00:06
        Тимофей Мартынов, хм, тут не вижу такой зависимости. HFT не подразумевает 100% загрузку ядер. Если алгоритм хороший, то и ядра он грузит редко. Короче, когда будет написан робот с NxM, то проще проверить сколько ему реально нужно ядер. А так, да, если алгоритм грузит ядро на 100%, то потребуется NxM ядер, но это очень плохой случай.
  • Здравствуй Коля
    13 февраля 2016, 15:38
    Тимофей Мартынов
    кругом кодеры 
    в написать пост  и в форме ответа не хватает кнопки «код» с подсветкой синтаксиса
    неудобно листинги читать

    вот пример
    www.mql5.com/ru/forum/72893/page3
    можно сравнить с подсветкой кода и без
  • shpazhist
    13 февраля 2016, 17:08
    Тоже сейчас изучаю coding, начал по сути с 0, но выбрал Swift.

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

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

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

    Кстати, наверное, самым большим личном прорывом для меня была самосочиненная/придуманная прога-application на iphon'е, т.к. проблема включала в себя и интерфейс, и массивы, и функционал, и If statement'ы, и делегирование итд + алгоритм. кот. нужно было самому придумать итд. Хочу сейчас сделать видео, кстати, выложить на youtbub'e для таких же чайников как я и рассказать о своем опыте, что изучал, что смотрел, какие подводные камни встретились на пути, хорошее и плохое о различных видео в паблике итд итп, ну и чтобы комментили и какую-либо информацию для себя по предмету получить в дальнейшем.

      • shpazhist
        14 февраля 2016, 00:00
        Тимофей Мартынов, Новый эппловский язык взамен ObjectiveC. Что-то вроде микса C++ и Python. Синтакс Swift'а намного проще всевозможных C языков (наподобии Python), но и есть возможность черпать ресурс ObjectiveC, кот. уже 20+ лет.

        developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson2.html#//apple_ref/doc/uid/TP40015214-CH5-SW1

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

        Ну и app'ы на iphon'е можно легко стругать если есть навыки Swift.
         
  • Суперхимик
    13 февраля 2016, 22:18

    Сейчас дочитаю книгу и вернусь к тестовому коннектору смарткома. Что мне осталось изучить?

    • события, делегаты, обратный вызов
    • убийство объектов
    • LINQ
    Это самое вкусное)
    • визуализация, PictureBox, UserControl, Graphics, Bitmap.
    Это нахер не нужно. Лучше WPF осваивай.
      • Счастливый Конец
        14 февраля 2016, 00:11
        Тимофей Мартынов, если вы не хотите быть проф. программистом, а хотите по минимуму иметь возможность написать свое приложение, то WPF вам никогда не нужен будет. Все что вам нужно чтобы показать на экране картинку это положить на форму PictureBox, кнопку и по нажатию кнопки сгенерировать Bitmap и показать его в PictureBox. Это все Windows Forms.
      • Суперхимик
        14 февраля 2016, 09:05
        Тимофей Мартынов, потому что эти темы с наскока вряд ли удастся освоить, в основном на практике. И такие вещи как LINQ, события, лямбда выражения используются везде в реальных приложениях. WPF я бы по курсам советовал осваивать и, опять же, много практики.
  • Desmo
    22 февраля 2016, 02:48
    Тимофей Мартынов Блин, вдохновил твой пост. Ты проделал нереальную работу. Жаль только, что практического применения этому будет очень мало. понимать многопоточность полезно, но это реально на столько широкая тема.

    Быстрая обработка больших данных? Быстро это массив на 1000 элементов агрегировать за 2 секунды пятью разными функциями?
    Или в 3х летней тиков находить уровни за секунду? ;)

    Неоднократно написали другие username-ы, начинай писать что-то практическое. Я когда в первый день только задумался о трейдинге как таковом, сразу же начал зачитываться литературой. Изучал матчасть. Наслушался кучу всего о психологии. И о том как люди «заигрываются». Через полгода такой умный был, сам от себя охеревал. А когда решил первый раз заявку на реале отправлял, чуть не обделался был весьма озадачен. Я к чему веду. Я программист уже почти десять лет. В практике возникают такие проблемы и задачи, которые тебя заставляют порой изменить в корне взгляд на само программирование. Так, что берись за практику. 

    ЗЫ Чуть не забыл. В список того что изучить, добавь юнит тесты. Вот они тебе реально деньги и нервы в будущем сэкономят.

    ЗЗЫ Сегодня чето опять слушал Бодо Шефера. Вот он там все твердит «Вам нужен наставник». Так вот это не только Шефер такое твердит ;)

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн