Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему так не любят Delphi? 
:(
    Опции темы
Athari
Дата 4.5.2013, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@Alexeis

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

Относительно нормального стека получится тормозная фиговина. Создание в обычном стеке десятка переменных -- это один сдвиг указателя (собственно, вместе с вызовом функции он и сдвинется один раз, то есть цена нулевая). А тут будет вызов каких-то функций и прочее. Всё накроется медным тазом, если пуш/поп несимметричны окажутся, а в плюсах за это отвечает компилятор. Да и вообще -- ты предлагаешь весь класс ограничивать созданием на липовом стеке, а это бессмысленно.

Цитата
Ну в STL это сравнительно недавно появилось.

boost? http://www.boost.org/users/history/old_versions.html -- умный указатель появился в 1999-м, 14 лет назад. STL -- это, конечно, наше всё, но писать на плюсах, не пользуясь boost -- это странно. (И boost -- это не совсем "сторонняя" библиотека, в ней обкатываются новые фичи для стандарта.)

Цитата
Это язык на платформе .NET2.0 Имел максимальную совместимость с Delphi for Win32.

Ну то есть его нет. Можно было труп не выкапывать. smile 

@Beltar

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

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

Традиционный подход -- дублирование кода в SQL и в коде/конфигах (ORM). Есть подход с генерацией кода по конфигам. Есть подход с генерацией базы по коду (не знаю, есть ли такое для дельфи). Здесь предполагается наличие БД (SQL, конфиги, код и прочее ненужны; БД во время компиляции ненужна).
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
Alexeis
Дата 4.5.2013, 02:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(Beltar @  4.5.2013,  00:26 Найти цитируемый пост)
а то пока неясно, не для того же чтобы delete не писать его придумали. У Атари это плохо получается.

  Я думаю, что главной причиной стало как раз это. Но не в том смысле что лень писать, а в смысле, что когда лезут глубоко в позднее связывание со всякими абстрактными фабриками, когда объект становиться разделяемым, тем более если между программами или даже машинами, то уже не уследишь, когда он перестает быть нужным и как уже 100 раз говорили подсчет ссылок не спасает.
  Но мне нравиться и сам подход линейной обработки. Т.е. выделение происходит мгновенно, а освобождение ведется последовательных блоков, что позволяет устранить фрагментацию памяти. ПО с менеджером кучи, после недели непрерывной работы заметно замедлиться за счет кучи дыр и с этим ничего не поделать в связи с запретом на перемещение участков памяти. ПО на сборщике мусора будет работать сколь угодно долго не теряя в производительности. При правильной настройке сборщик должен работать быстрее. Возьмем, к примеру, простой объект типа строки созданный в подпрограмме. Элемент является корневым и не имеет никаких связей, следовательно обход графа связей будет тривиальным и область будет сразу помечена как свободная. Т.е. мы не затратили времени ни на выделение памяти ни на освобождение. В то время как эта же операция в куче потребовала бы обход списка блоков с поиском подходящего по размеру. Однако, в сложных случаях типа деревьев, кольцевых списков так прекрасно все работать не будет. Но зато после перового обхода все данные переместятся в другой блок, в котором их уже трогать не будут. По сути к объектам применяется своего рода статистический анализ и упорядочивание по времени жизни. Т.е. в некотором роде машина сама делает выбор за программиста где оптимальнее располагать данные в куче или стеке. Первоначально берется оптимистичный вариант стека. Теперь подумаем как действует программист на С++ . Если он не знает времени жизни объекта, то он почти наверняка создаст его в куче, потому что иначе объект уничтожится по выходу из блока, что недопустимо, а GC может себе позволить создать любой объект стеке, поскольку при необходимости он его может переместить на следующий уровень (аналог кучи). 
  Отсюда следует, что программист на С++ при написании качественного ПО со слабыми связями будет вынужден всегда действовать из пессимистических стратегий выделения памяти, тогда как GC может реализовать оптимистическую. Если GC не угадал с размещением, то он как бы устраняет ошибку, но только тех объектов, где он ошибся, С++ программист сразу же тратит время на размещение в куче. 
  Если рассмотреть случай, когда ПО очень редко создает и удаляет объекты, то преимущество GC еще более возрастает, потому что сборка мусора не будет производиться совсем, а выделение мгновенное.
  В худшем же случае он GC будет работать в несколько раз медленнее кучи, т.е. не возникнет существенных проблем.

Добавлено через 2 минуты и 3 секунды
Цитата(Beltar @  4.5.2013,  00:26 Найти цитируемый пост)
Насколько я понимаю сишники должны аналогичную операцию переопределения new и delete делать влегкую от рождения. 

  Они просто создают объект в стеке безо всяких new smile . 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 4.5.2013, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(Athari @  4.5.2013,  02:51 Найти цитируемый пост)
Относительно нормального стека получится тормозная фиговина. Создание в обычном стеке десятка переменных -- это один сдвиг указателя (собственно, вместе с вызовом функции он и сдвинется один раз, то есть цена нулевая). А тут будет вызов каких-то функций и прочее. Всё накроется медным тазом, если пуш/поп несимметричны окажутся, а в плюсах за это отвечает компилятор. Да и вообще -- ты предлагаешь весь класс ограничивать созданием на липовом стеке, а это бессмысленно.

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

Цитата(Athari @  4.5.2013,  02:51 Найти цитируемый пост)
STL -- это, конечно, наше всё, но писать на плюсах, не пользуясь boost -- это странно.
 Ты удивишься, но есть еще много людей, которые даже STL не используют, не то что boost . Но не в том дело. Пока что единственный компилятор, который поставляет с собой буст в комплекте это C++ Builder как ни странно smile . С++ это не только Windows и Linux. Кое где даже исключения не работают, а ты говоришь boost. boost это библиотечка для рафинированных мальчиков, которые сидят в тепленьких офисах и рисуют кнопочки под окошки. Как ты на своем бусте заведешь потоки если у тебя ваще нет операционной системы? 
  
Цитата(Athari @  4.5.2013,  02:51 Найти цитируемый пост)
Ну то есть его нет. Можно было труп не выкапывать.  

  Херсе батенька, вы зажрались. Если .NET2.0 закапывать, то Delphi с С++ нужно было закапать еще 10 лет назад. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Athari
Дата 4.5.2013, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@Alexeis

Цитата
С++ это не только Windows и Linux. Кое где даже исключения не работают, а ты говоришь boost. boost это библиотечка для рафинированных мальчиков, которые сидят в тепленьких офисах и рисуют кнопочки под окошки. Как ты на своем бусте заведешь потоки если у тебя ваще нет операционной системы?

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

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

Цитата
Херсе батенька, вы зажрались. Если .NET2.0 закапывать, то Delphi с С++ нужно было закапать еще 10 лет назад.

Я опросик на хабре недавно создавал: .NET Framework: Какую версию вы используете? Народ даже 1.0 использовать умудряется. smile 

Но в случае Delphi.NET проблема не в дотнете, а в дельфи. Дотнетовая дельфи никому нафиг не нужна. Она ж не труЪ. И это официально мёртвый продукт, сейчас на нём даже фанатики писать ничего не будут. В общем, приводить это нечто как пример "а вот дельфи умеет" считаю неуместным.

И... таки почему плюсы закапывать? Они, конечно, вяло развиваются, но новую версию родили же два года назад и дальше пилить продолжают. Всё вокруг тоже активно развивается.

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

Интересно ты поколения в стек и кучу превратил...
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
k0rvin
Дата 4.5.2013, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Akella @  3.5.2013,  13:54 Найти цитируемый пост)
>>type Ptr = ^Integer;
а зачем такое писать?

Какое «такое»?

Цитата(Beltar @  3.5.2013,  15:51 Найти цитируемый пост)
Я правда не понял

К сожалению тебе это вообще не свойственно.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Akella
Дата 4.5.2013, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата
Все "классы" возникают прямо из БД. Магия dynamic в чистом виде.


Ну для Delphi есть fastscript и paxCompiler
Те же скриптовые языки, код который компилируется и выполняется "не лету" во время исполнения аппликации (run-time). Где ты будешь хранить код - твоё дело, хоть в базе.

PM MAIL   Вверх
k0rvin
Дата 4.5.2013, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Zloxa @  3.5.2013,  17:36 Найти цитируемый пост)
Но потом подумал что IRL, как правило, между созданием нескольких объектов таки производятся некоторые действия над первым соданым объектом, когда два объекта создаются последовательно - скорее вырожденный частный случай.

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

Цитата(Alexeis @  3.5.2013,  22:21 Найти цитируемый пост)
Я до сих пор пишу на VS2005 . Там такого нет.

Ну так, что тут удивительного?


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Akella
Дата 4.5.2013, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(Athari @  3.5.2013,  14:01 Найти цитируемый пост)
Я не дома, проверить не могу. Можно написать так? (На синтаксические ошибки внимания не обращать. Тип переменных и результатов функций принципиален.)

var a, b, c: variant;
a := TButton.Create;
b := TCheckBox.Create;
a.Enabled := !b.Enabled;
f(a, b);
f(a, bar);
procedure foo (a: TButton; b: TCheckBox); begin ... end;
procedure foo (a: TCheckBox; b: TButton); begin ... end;
function bar () : variant; begin Result := TCheckBox.Create; end;


Variant Invoke and RTTI
http://alex.ciobanu.org/?p=478

PM MAIL   Вверх
Akella
  Дата 4.5.2013, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Вот офисный пакет Kingsoft Office на delphi написан
http://www.ksoffice.net/
PM MAIL   Вверх
Akella
Дата 4.5.2013, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



здесь список софта, а ниже список компаний, активно использующих delphi
http://delphi.wikia.com/wiki/Good_Quality_...ilt_With_Delphi
PM MAIL   Вверх
Beltar
Дата 4.5.2013, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

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


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

Цитата

При правильной настройке сборщик должен работать быстрее.


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

Цитата

 Если рассмотреть случай, когда ПО очень редко создает и удаляет объекты, то преимущество GC еще более возрастает, потому что сборка мусора не будет производиться совсем


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

Цитата

Дотнетовая дельфи никому нафиг не нужна. Она ж не труЪ.


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

Цитата

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


В рекламных проспектах уже бог знает с каких времен пишут что-то вроде:

Цитата

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


Не то же самое?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
diadiavova
Дата 4.5.2013, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 4
Всего: 142



Цитата(Athari @  3.5.2013,  19:33 Найти цитируемый пост)
Зачем абстрактные примеры?

Пример скорее упрощенный. То, что ты привел, вряд ли кто-то изучать будет, а пару минут на изучение простого примера потратить можно.
Цитата(Akella @  3.5.2013,  20:24 Найти цитируемый пост)
в XE4 уже есть и сборщик мусора, и подсчет ссылок 

То-то Бельтар расстроится: столько сил потратил на то, чтобы доказать, что ГЦ - кака, а тут эта кака в его любимую дельфу проникла smile 
Цитата(Beltar @  4.5.2013,  00:26 Найти цитируемый пост)
Универсальный прокси-класс это конечно здорово, но чем-то это все начинает напоминать COM.

Ты хотел сказать ActiveX? Ну да, там похожий прием используется, но тут дело не в том, что динамические типы для таких задач предназначены, я просто упомянул, что на них это легко реализовать. Да и не только это. Вот еще пример с флюентом. В википедии есть пример реализации на разных языках, можешь посмотреть
http://ru.wikipedia.org/wiki/Fluent_interface
Между тем простейший пример с динамической оболочкой будет выглядеть так
Код

Public Class FluentDynamicWrapper
    Inherits DynamicObject
    Public Property WrappedObject

    Public Overrides Function TryInvokeMember(binder As InvokeMemberBinder, args() As Object, ByRef result As Object) As Boolean
        If binder.Name.StartsWith("set") AndAlso args.Length = 1 Then
            Dim prop = WrappedObject.GetType.GetProperty(binder.Name.Substring(3))
            If prop IsNot Nothing Then
                prop.SetValue(WrappedObject, args(0))
                result = Me
                Return True
            End If
        End If
        Return False
    End Function

End Class


Дальше создаем класс для тестирования
Код

Public Class Rect
    Public Property Top As Integer = 0
    Public Property Left As Integer = 0
    Public Property Height As Integer = 0
    Public Property Width As Integer = 0

    Public Shared Widening Operator CType(rect As Rect) As String
        Return String.Format("top={0}; left={1}; width={2}; height={3};", rect.Top, rect.Left, rect.Width, rect.Height)
    End Operator
End Class

Запускаем слудующий код
Код

   Sub Main()
        Dim rect As New Rect
        Dim fluent As Object = New FluentDynamicWrapper With {.WrappedObject = rect}
        fluent.setTop(10).setLeft(15).setHeight(20).setWidth(25)
        Console.WriteLine(rect)
        Console.ReadKey()
    End Sub
И получаем выходные данные
Код

top=10; left=15; width=25; height=20;
Причем заметь, это будет работать для всех типов и любых свойств, достаточно вызвать метод set<ИмяСвойства> и передать ему значение. Таких примеров много можно привести.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Alexeis
Дата 4.5.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(Athari @  4.5.2013,  05:48 Найти цитируемый пост)
Буст состоит из отдельных кусков же, не? Нужны умные указатели -- можно взять только их. Скорее всего, там для умных указателей вообще один заголовочный файл с шаблонами (не считая служебных включений).

  Пытался в свое время выудить. Там десяток включений всяких + куча дефайнов. Это всю кухню разрулить немалых сил будет стоить. 

Цитата(Athari @  4.5.2013,  05:48 Найти цитируемый пост)
Интересно ты поколения в стек и кучу превратил... 

  Ну 0е поколение можно рассматривать как стек, поскольку память выделяется мгновенно. 1е поколение живет уже долго и требует обход графа + копирование. Т.е. операции которые уже стоят ресурсов, но зато эти данные уже не затрагиваются при обходе 0го поколения. По затрате времени и ресурсов перенос в 1е поколение уже стоит кучи и по времени существования в программе тоже эквивалентно. 2е поколение эквивалентно уже статической памяти.

Цитата(Beltar @  4.5.2013,  13:14 Найти цитируемый пост)
В смысле выделение по самому большому адресу без перебора свободных блоков с рассчетом, что потом сожмется?

  После прохода 0го поколения его стек ведь очищается. Да и удаляешь ты все блоки одновременно, фактически переносишь только то, что нужно, остальное скорее всего будет занулятся. Ну делфи к этому не привыкать. Для каждого объекта созданного в куче память предварительно зануляется. + Расходы не обход графа. У меня вызывает сомнения только работа со списками большого размера. Там же ссылки только друг на друга. А вот на счет сотен мегабайт, я думаю что это вопрос настройки GC . Если стек нулевого поколения будет занимать 1-3 Мб, то сотни мегабайт будут по мере поступления переноситься в 1е поколение. Т.е. затраты будут сравнимы с кучей. 
  
Цитата(Beltar @  4.5.2013,  13:14 Найти цитируемый пост)
Причем тут тру/не тру, просто нет смысла делать VCL поверх библиотеки, которая делает то же самое.

VCL.NET это не тоже самое что Windows Forms . Возьмешься написать проект на 50-100 тыс строк кода на Windows Forms учитывая, что ты его не изучал толком и не знаешь подводных камней? Или все таки предпочтешь знакомый VCL в котором добавился GC, проверка границ массивов и т.д. ? Когда у тебя исключение переполнения возникает в момент его возникновения, а не в произвольном месте кода ты обращаешься по неверному адресу.  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 4.5.2013, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(diadiavova @  4.5.2013,  13:25 Найти цитируемый пост)
То-то Бельтар расстроится: столько сил потратил на то, чтобы доказать, что ГЦ - кака, а тут эта кака в его любимую дельфу проникла smile 


Это, скорее, реализовано для большей совместимости с мобильными платформами. А также теперь поддерживаются нуль-терминальные строки. В принципе, это можно отключить.
PM MAIL   Вверх
Bother
Дата 4.5.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 13.4.2013

Репутация: нет
Всего: нет



Цитата(Alexeis @  4.5.2013,  15:31 Найти цитируемый пост)
  Пытался в свое время выудить. Там десяток включений всяких + куча дефайнов. Это всю кухню разрулить немалых сил будет стоить. 
Для использования shared_ptr достаточно указать компилеру к boost. 
Цитата(Alexeis @  4.5.2013,  05:10 Найти цитируемый пост)
boost это библиотечка для рафинированных мальчиков, которые сидят в тепленьких офисах и рисуют кнопочки под окошки. Как ты на своем бусте заведешь потоки если у тебя ваще нет операционной системы? 
судя по всему ты его в глаза не видел.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1554 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.