Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 309 сообщений
Cообщения с меткой

конструктор сайтов - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Тестируем асинхронный код

Вторник, 21 Июня 2016 г. 14:44 (ссылка)

Асинхронный код – сложный. Все это знают. Писать асинхронные тесты – еще сложнее. Недавно я починил мигающий (flaky) тест и хотел бы поделиться некоторыми мыслями по поводу написания асинхронных тестов.



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







Тестируем throttler



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



Вот простая реализация ограничителя (в своей основе это обертка вокруг класса Semaphore; в реальном мире тут может встречаться ожидание, повторные попытки и т.д.):

class ThrottledException extends RuntimeException("Throttled!")
class Throttler(count: Int) {
private val semaphore = new Semaphore(count)
def apply(f: => Unit): Unit = {
if (!semaphore.tryAcquire()) throw new ThrottledException
try {
f
} finally {
semaphore.release()
}
}
}


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

class ThrottlerTest extends Specification {
"Throttler" should {
"execute sequential" in new ctx {
var invocationCount = 0
for (i <- 0 to maxCount) {
throttler {
invocationCount += 1
}
}
invocationCount must be_==(maxCount + 1)
}
}
trait ctx {
val maxCount = 3
val throttler = new Throttler(maxCount)
}
}




Тестируем ограничитель асинхронно



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



Подготовка:

val e = Executors.newCachedThreadPool()
implicit val ec: ExecutionContext = ExecutionContext.fromExecutor(e)
private val waitForeverLatch = new CountDownLatch(1)

override def after: Any = {
waitForeverLatch.countDown()
e.shutdownNow()
}

def waitForever(): Unit = try {
waitForeverLatch.await()
} catch {
case _: InterruptedException =>
case ex: Throwable => throw ex
}


Объект ExecutionContext используется для конструкции Future; метод waitForever держит поток до момента, пока не обнулится счетчик waitForeverLatch – перед окончанием теста. В следующей за этим функции мы закрываем ExecutorService.



Упрощенный способ проверки многопоточного поведения ограничителя выглядит так:

"throw exception once reached the limit [naive,flaky]" in new ctx {
for (i <- 1 to maxCount) {
Future {
throttler(waitForever())
}
}
throttler {} must throwA[ThrottledException]
}


Здесь мы создаем потоки в количестве равном maxCount. В каждом потоке мы вызываем функцию waitForever, которая ждет до окончания теста. Затем мы пытаемся выполнить еще одну операцию, чтобы обойти ограничитель – maxCount +1. Предполагается, что в этом месте мы должны получить исключение ThrottledException. Однако, хотя мы ждем исключения, оно не наступает. Последний вызов ограничителя (с ожиданием) может произойти до запуска любого из future (это приводит к тому, что исключение бросается в этом экземпляре future, но не в рамках ожидания).



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

"throw exception once reached the limit [naive, bad]" in new ctx {
for (i <- 1 to maxCount) {
Future {
throttler(waitForever())
}
}
Thread.sleep(1000)
throttler {} must throwA[ThrottledException]
}


Хорошо, теперь наш тест будет почти всегда проходить. Но это неправильный подход, как минимум по двум причинам:

Длительность теста будет в точности равна установленной нами «разумной длительности».

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



Если вы все еще сомневаетесь, поищите в Google иные причины.

Более правильный подход заключается в синхронизации старта наших потоков (future) и нашего ожидания.



Будем использовать класс CountDownLatch из пакета java.util.concurrent:

"throw exception once reached the limit [working]" in new ctx {
val barrier = new CountDownLatch(maxCount)

for (i <- 1 to maxCount) {
Future {
throttler {
barrier.countDown()
waitForever()
}
}
}

barrier.await(5, TimeUnit.SECONDS) must beTrue

throttler {} must throwA[ThrottledException]
}


Мы используем CountDownLatch для барьерной синхронизации. Метод await блокирует главный поток до обнуления счетчика latch. При запуске других потоков (будем обозначать эти другие потоки как futures), каждый из этих futures вызывает барьерный метод countDown, чтобы снизить значение счетчика latch на единицу. Когда счетчик latch становится равным нулю, все futures располагаются внутри метода waitForever.

К этому моменту мы убедились, что ограничитель нагружен и содержит количество потоков, равное maxCount. Попытка другого потока задействовать ограничитель приведет к исключению. Таким образом, мы получили детерминированный порядок исполнения, при котором мы можем проверить поведение ограничителя в главном потоке. Главный поток может и будет продолждать выполнение в этой точке (счетчик barrier достигает нуля и CountDownLatch освобождает ожидающий поток).

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



Напоследок



При тестировании асинхронного кода достаточно часто есть потребность в определенном порядке потоков для определенного теста. Если не применять никакой синхронизации, получим нестабильные тесты, которые иногда отрабатывают, а иногда падают. Использование Thread.sleep снижает нестабильность тестов, но не решает проблемы. В большинстве случаев, когда нам необходимо определять порядок потоков в тесте, мы можем использовать CountDownLatch вместо Thread.sleep. Преимущество CountDownLatch в том, что мы можем указать, когда сбросить ожидание (удержание) потока, что дает нам два важных преимущества: детерминированное определение порядка и, благодаря этому, более стабильные тесты и более быстрое прохождение тестов. Даже для обычного ожидания, например, функции waitForever, мы могли бы использовать что-нибудь вроде Thread.sleep(Long.MAX_VALUE), но ненадежных подходов лучше всегда избегать.



Разработчик конструктора сайтов Wix,

Дмитрий Команов

Оригинал статьи: блог инженеров компании Wix
Original source: habrahabr.ru.

https://habrahabr.ru/post/301644/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
Сантория

Высококачественный хостинг.

Воскресенье, 05 Июня 2016 г. 22:40 (ссылка)

Компания «ProHoster.info» предоставляет услуги высококачественного хостинга по самым доступным ценам.
Хостинг – это понятие, которое определяет место жительства сайта в Интернете. Другими словами, хостингом называют предоставление места на сервере для размещения информации. Сервер постоянно находится в сети Интернет. Так же хостинг обеспечивает необходимое пространство для размещения оборудования клиента на территории провайдера с обеспечением беспрерывного подключения к Интернету.

В перечень услуг «ProHoster.info» входит:


- дешевый хостинг серверов;
- безлимитный хостинг сайтов;
- бесплатный конструктор сайтов;
- игровой хостинг;
- тестовые сервера;
- безабузные VPS;
- вспомогательные услуги.
Все услуги оказывают компетентные специалисты компании с помощью профессиональной техники, тем самым обеспечивая быструю и непрерывную работу сервера. Компания гарантирует надёжную работу выделенного канала. Важно отметить, что пользователям не следует волноваться насчёт исчерпания дискового лимита в неожиданный момент, так как безлимитный виртуальный хостинг действует по принципу «всё включено». Все клиенты независимы друг от друга. Хостинг максимально оптимизирован под мгновенную работу PHP. С такой скоростью сайты просто «летают» на серверах компании! Если Вы решите перенести сайт на хостинг компании «ProHoster.info», специалисты помогут Вам это сделать без простоя в работе. Кроме того, Вы получите месяц по выбранному тарифу абсолютно бесплатно! Благодаря новейшим технологиям, компания гарантирует уровень стабильности в Интернете – 99,9%. Сделайте первый шаг для достижения цели вместе с компанией «ProHoster.info»!

000 (575x469, 128Kb)
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
itast

Качественный хостинг по доступным ценам

Понедельник, 30 Мая 2016 г. 17:01 (ссылка)

Компания ProHoster предоставляет качественный хостинг по самым низким ценам. Перечень услуг охватывает все сферы: безлимитный хостинг сайтов, бесплатный конструктор сайтов, игровой хостинг, vds windows, безабузные сервера, администрирование и все сопутствующие услуги. Современный хостинг - это услуга по предоставлению места для физического размещения информации на сервере. Сервер должен быть постоянно подключен к интернету. А так же это фактическое размещение оборудования заказчика на территории провайдера с беспрерывным доступом к интернету.
Все перечисленные услуги предоставляются квалифицированными специалистами с использованием современного оборудования. Безлимитный хостинг предоставляется по принципу "все включено". Хостинг оптимизирован под максимальную скорость, а значит все операции будут выполняться мгновенно. Есть услуга абузоустойчивые VPS - это те которые игнорируют жалобы на их содержимое. Если вы выбираете компанию ProHoster, то перенос вашего сервера с другого ресурса бесплатно. В подарок вы получаете один месяц услуг согласно выбранному тарифу бесплатно. Выбирайте профессионалов - это ваш первый шаг к успеху!


Метки:   Комментарии (2)КомментироватьВ цитатник или сообщество
Портал_Солнцево

Скидка 30% на тариф «Премиальный» Конструктора сайтов! Только 23 мая!

Суббота, 21 Мая 2016 г. 09:00 (ссылка)
domain-rf.ru/?p=761


Если вы давно хотели воспользоваться тарифом «Премиальный» Конструктора сайтов REG.RU, 23 мая вы можете сделать это со скидкой 30%. Для этого необходимо

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Портал_Солнцево

Конструктор сайтов Wix — ваша личная веб-студия в несколько кликов!

Четверг, 12 Мая 2016 г. 09:54 (ссылка)
domain-rf.ru/?p=740


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

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Масштабирование Wix до 100 миллионов пользователей. Начало

Среда, 23 Марта 2016 г. 16:37 (ссылка)

Привет! Сегодня мы начинаем серию постов от наших инженеров о масштабировании Wix. Наша аудитория росла динамично: конструктор сайтов Wix был создан в 2006-м году, в 2009-м году аудитория нашего сервиса составила 1 миллион пользователей, а сегодня эта цифра достигла уже 80 миллионов. О нашей архитектуре на каждом этапе разработки расскажет в серии постов о масштабированиии главный архитектор программного обеспечения Wix Йоав Абрахами.





Когда мы в 2006 году запускали Wix, не было четкого понимания, какая именно реализация конструктора Flash-сайтов окажется рабочей, и что на самом деле означает сделать WYSIWYG конструктор сайтов. Мы были заняты разработкой двух Flash-приложений: одно для редактирования сайтов (оно создавало представление сайта в виде XML-документа) и другое для отображения сайтов (на основе XML-документа). Большая часть разработки велась на Flash. Помимо этого, нам также был необходим сервер для хранения и обработки XML-файлов на основе шаблона URL или домена сайта. Наш первый бэкенд-инженер построил этот сервер на Tomcat, Hibernate, Ehcache и MySQL. Кроме того, в основе нашего сервера был его собственный фреймворк, который генерировал файлы-сущности Java из HBM-файлов Hibernate, что делало возможным добавление нового кода путем наследования из сгенерированных классов.



Исходная архитектура



В первый день моей работы в Wix в 2006 году меня попросили прокомментировать эту структуру:





Я сказал: «Для начала это отличный вариант, но в течение 2-3 лет ее потребуется заменить».



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



В 2008 году один из основателей сказал мне: «Ты говорил, что к этому времени нам пора будет менять серверную часть. Единственное, что ты забыл упомянуть, насколько сложно это будет». За эти два года сервер Wix превратился в артефакт, поддерживающий всевозможные сервисы от хранения XML-файлов и их обработки до загрузки медиафайлов и управления модулем комментариев.



Метод сохранения может все… даже варить кофе!



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



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



В 2008 году мы постепенно занялись заменой этого сервера. Окончательно он был остановлен в 2012 году. Миграция с исходного сервера на нашу нынешнюю архитектуру заняла 4 года, потому что мы продолжали разрабатывать наш продукт и преобразовывать его из конструктора сайтов на Flash в конструктор сайтов на HTML5.



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



Уроки, которые нам удалось извлечь



Первый урок, который мы выучили в начале работы над Wix, заключается в том, что, когда мы начинаем проект или стартап и не знаем, какой вариант продукта сработает (а большинство стартапов этого не знают), нужно двигаться быстро. Следует приспосабливаться, использовать любые знакомые нам инструменты, невзирая на масштабы и правильные методологии (такие как TDD). И да, долг кодинга будет накапливаться.



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



Подводя итог



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



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

Йоав Абрахами


Оригинал статьи: блог инженеров компании Wix



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/279903/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
VitalyanU

LanldingPro - простой конструктор мини-сайтов

Вторник, 15 Марта 2016 г. 10:34 (ссылка)
veb24.ru/vintajis/ms1


Визитка, поздравление, подписная, страница захвата и множество мини-сайтов за 3 минуты!

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Dmitriykn

1minute.website – бесплатный конструктор интернет-магазина с хорошим функционалом

Понедельник, 14 Марта 2016 г. 12:47 (ссылка)
ktonanovenkogo.ru/joomla/vi...nalom.html


1minute.website – бесплатный конструктор интернет-магазина с хорошим функционалом | KtoNaNovenkogo.ru - создание, продвижение и заработок на сайте





Как создать интернет-магазин за минуту? Оказывается это возможно, если воспользоваться бесплатным конструктором 1minute.website
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
KtoNaNovenkogo

Бесплатный конструктор интернет-магазина с хорошим функционалом

Понедельник, 14 Марта 2016 г. 12:43 (ссылка)
ktonanovenkogo.ru/joomla/vi...nalom.html

1minute.website – бесплатный конструктор интернет-магазина с хорошим функционалом | KtoNaNovenkogo.ru - создание, продвижение и заработок на сайте



Как создать интернет-магазин за минуту? Оказывается это возможно, если воспользоваться бесплатным конструктором 1minute.website

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Hope_always

Бесплатный конструктор сайтов с красивыми шаблонами

Суббота, 13 Февраля 2016 г. 21:26 (ссылка)

Это цитата сообщения ravingdon Оригинальное сообщение

Бесплатный конструктор сайтов с красивыми шаблонами



http://xrub.ru/shablony-saitov.html






Уже давно задумывались о собственном сайте? Но вам до сих пор кажется что это очень сложно и вы никогда не освоите эту сложную науку сайтостроения? Бесплатный конструктор сайтов XRUB убедит вас в обратном! Сегодня создать сайт своими руками, причем довольно качественный, проще простого и главное бесплатно. В онлайн конструкторе ИКСРУБ представлено большая подборка шаблонов на разные тематики http://xrub.ru/shablony-saitov.html с самыми интересными и оригинальными вариантами дизайна. Онлайн программа предлагает выбрать вам один из 1000 шаблонов по тематике именно вашего сайта, и самостоятельно очень быстро, а главное просто натянуть его на ваш сайт. Буквально в один клик. В итоге, затратив всего несколько часов времени вы получите очень красивый сайт сделанный бесплатно своими руками.



 

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
ravingdon

Бесплатный конструктор сайтов с красивыми шаблонами

Пятница, 12 Февраля 2016 г. 15:51 (ссылка)
xrub.ru/shablony-saitov.html




Уже давно задумывались о собственном сайте? Но вам до сих пор кажется что это очень сложно и вы никогда не освоите эту сложную науку сайтостроения? Бесплатный конструктор сайтов XRUB убедит вас в обратном! Сегодня создать сайт своими руками, причем довольно качественный, проще простого и главное бесплатно. В онлайн конструкторе ИКСРУБ представлено большая подборка шаблонов на разные тематики http://xrub.ru/shablony-saitov.html с самыми интересными и оригинальными вариантами дизайна. Онлайн программа предлагает выбрать вам один из 1000 шаблонов по тематике именно вашего сайта, и самостоятельно очень быстро, а главное просто натянуть его на ваш сайт. Буквально в один клик. В итоге, затратив всего несколько часов времени вы получите очень красивый сайт сделанный бесплатно своими руками.



 

Метки:   Комментарии (5)КомментироватьВ цитатник или сообщество
KtoNaNovenkogo

Конструктор сайтов Wix.com — функционально, креативно, но совершенно бесплатно

Четверг, 11 Февраля 2016 г. 12:09 (ссылка)
ktonanovenkogo.ru/joomla/fu...latno.html

Конструктор сайтов Wix.com — функционально, креативно, но совершенно бесплатно | KtoNaNovenkogo.ru - создание, продвижение и заработок на сайте


wix

Какие варианты создания сайта существуют? Как можно все это реализовать самостоятельно? И чем в этом нам может помочь бесплатный конструктор сайтов Wix?

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Dmitriykn

Конструктор сайтов Wix.com — функционально, креативно, но совершенно бесплатно

Четверг, 11 Февраля 2016 г. 12:04 (ссылка)
ktonanovenkogo.ru/joomla/fu...latno.html


Конструктор сайтов Wix.com — функционально, креативно, но совершенно бесплатно | KtoNaNovenkogo.ru - создание, продвижение и заработок на сайте



 






  1. Как же создать собственный сайт?


  2. Первые шаги на Wix


  3. Работа с текстом и картинками


  4. Боковое меню редактора Викс


  5. Инструменты продвижения сайта


  6. Платные сервисы wix


  7. Новый конструктор


  8. Сайт готов!



wix Какие варианты создания сайта существуют? Как можно все это реализовать самостоятельно? И чем в этом нам может помочь бесплатный конструктор сайтов Wix?

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
mvasia

Без заголовка

Пятница, 29 Января 2016 г. 21:14 (ссылка)
admin.lp.altclub.biz/konstr...?_utl_t=li


konstruktor

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Как сделать сайт адаптивным с помощью MobilizeToday

Понедельник, 28 Декабря 2015 г. 14:32 (ссылка)




Привет, друзья! Хотим поздравить с новогодними праздниками и поделиться опытом создания мобильных версий сайтов на основе наших выполненных проектов. Это особенно актуально с изменениями в индексации сайтов и ростом мобильной аудитории.

По данным исследования TNS Web Index доля эксклюзивных пользователей мобильного Интернета в России 100 000+ за год выросла на 90%.
Если вы впервые на нашем блоге, рекомендуем прочитать — «Тотальная мобилизация c MobilizeToday». Прежде чем начать давайте рассмотрим распространенные вопросы и технические аспекты.

Читать дальше →

http://habrahabr.ru/post/271561/

Комментарии (0)КомментироватьВ цитатник или сообщество
nvoronova

Сайт своими руками_бесплатно...

Вторник, 15 Декабря 2015 г. 10:51 (ссылка)
admin.lp.altclub.biz/konstr...?_utl_t=li


konstruktorСоздай свой сайт сам с удовольствием_причем бесплатно....

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Husuk

Что лучше CMS или конструктор сайтов

Пятница, 11 Декабря 2015 г. 07:27 (ссылка)
dlp.by/chto-luchshe-cms-ili...tor-saytov


Что лучше CMS или конструктор сайтов



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



Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
VitalyanU

С праздником друзья! http://vk.cc/4tLorO 👏❄

Вторник, 01 Декабря 2015 г. 05:59 (ссылка)
m7u.ru/unykwuh?p=pozdv1


Включи свой денежный станок!

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<конструктор сайтов - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda