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


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

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

«  Предыдущие 30 Следующие 30  »
rss_rss_hh_new

[Перевод] Мемоизация в JS и ускорение функций

Вторник, 04 Июля 2017 г. 15:31 (ссылка)

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



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







Функция вычисления факториала и кэширование



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



Например, вот функция factorial, которая вычисляет и возвращает факториал числа. Если не вдаваться в детали её реализации, выглядеть она будет так:



function factorial(n) {
   // Вычисления: n * (n-1) * (n-2) * ... (2) * (1)
   return factorial
}


Вызовем её следующим образом: factorial(50). Она, как и ожидается, найдёт и возвратит факториал числа 50. Всё это хорошо, но давайте теперь найдём с её помощью факториал числа 51. Компьютер снова выполнит вычисления, и то, что нам надо, будет найдено. Однако, можно заметить, что, при повторном вызове, функция выполняет массу вычислений, которые уже были выполнены ранее. Попытаемся функцию оптимизировать. Подумаем, как, имея значение factorial(50) перейти к factorial(51) без повторного вызова функции. Если следовать формуле вычисления факториала, окажется, что factorial(51) это то же самое, что и factorial(50) * 51.



При подобном подходе, однако, выигрыша в производительности получить не удастся. А именно, сначала, внутри функции factorial() производится полная цепочка вычислений для нахождения факториала 50, а потом то, что получилось, умножается на 51. То есть, при использовании подобной функции, вычисление факториала для числа 51 в любом случае выглядит как перемножение всех чисел от 1 до 51.



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



Основы мемоизации



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

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


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



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



// простая функция, прибавляющая 10 к переданному ей числу
const add = (n) => (n + 10);
add(9);
// аналогичная функция с мемоизацией
const memoizedAdd = () => {
 let cache = {};
 return (n) => {
   if (n in cache) {
     console.log('Fetching from cache');
     return cache[n];
   }
   else {
     console.log('Calculating result');
     let result = n + 10;
     cache[n] = result;
     return result;
   }
 }
}
// эту функцию возвратит memoizedAdd
const newAdd = memoizedAdd();
console.log(newAdd(9)); // вычислено
console.log(newAdd(9)); // взято из кэша


Анализ кода функции с мемоизацией



Проанализировав вышеприведённый фрагмент кода, можно сделать следующие выводы:




  • Функция memoizeAdd возвращает другую функцию, которую мы можем вызвать тогда, когда нужно. Такое возможно потому что функции в JavaScript — это объекты первого класса, что позволяет использовать их как функции высшего порядка и возвращать из них другие функции.




  • Переменная cache может хранить данные между вызовами функции, так как она определена в замыкании.




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




Написание функции с мемоизацией



Вышеописанный код работает как надо, но что если нам хотелось бы превратить любую функцию в её вариант с мемоизацией. Вот как писать такие функции. Этот код, опять же, есть на CodePen.



// простая чистая функция, которая возвращает сумму аргумента и 10
const add = (n) => (n + 10);
console.log('Simple call', add(3));
// простая функция, принимающая другую функцию и
// возвращающая её же, но с мемоизацией
const memoize = (fn) => {
 let cache = {};
 return (...args) => {
   let n = args[0];  // тут работаем с единственным аргументом
   if (n in cache) {
     console.log('Fetching from cache');
     return cache[n];
   }
   else {
     console.log('Calculating result');
     let result = fn(n);
     cache[n] = result;
     return result;
   }
 }
}
// создание функции с мемоизацией из чистой функции 'add'
const memoizedAdd = memoize(add);
console.log(memoizedAdd(3));  // вычислено
console.log(memoizedAdd(3));  // взято из кэша
console.log(memoizedAdd(4));  // вычислено
console.log(memoizedAdd(4));  // взято из кэша


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



Подобное можно написать самостоятельно, но существуют и библиотечные решения:





Мемоизация рекурсивных функций



Если попытаться передать рекурсивную функцию рассмотренной выше функции memoize, или функции _.memoize из Lodash, то, что получится, будет работать неправильно, так как рекурсивные функции вызывают сами себя, а не то, что получается после добавления возможностей по мемоизации. Как результат, переменная cache в такой ситуации не выполняет своего назначения. Для того, чтобы решить эту проблему, рекурсивная функция должна вызывать свой вариант с мемоизацией. Вот как можно добавить мемоизацию в рекурсивную функцию вычисления факториала. Код, как обычно, можно найти на CodePen.



// уже знакомая нам функция memoize
const memoize = (fn) => {
 let cache = {};
 return (...args) => {
   let n = args[0];
   if (n in cache) {
     console.log('Fetching from cache', n);
     return cache[n];
   }
   else {
     console.log('Calculating result', n);
     let result = fn(n);
     cache[n] = result;
     return result;
   }
 }
}
const factorial = memoize(
 (x) => {
   if (x === 0) {
     return 1;
   }
   else {
     return x * factorial(x - 1);
   }
 }
);
console.log(factorial(5)); // вычислено
console.log(factorial(6)); // вычислено для 6, но для предыдущих значений взято из кэша


Проанализировав этот код, можно сделать следующие выводы:




  • Функция factorial рекурсивно вызывает свою версию с мемоизацией.


  • Функция с мемоизацией кэширует результаты вычисления факториала, что, при её последующих вызовах, значительно улучшает производительность. То есть, в вышеприведённом примере оказывается, что вместо перемножения чисел от 1 до 6 для нахождения факториала числа 6, на 6 придётся умножить лишь то, что было возвращено предыдущим вызовом factorial(5).




О мемоизации и кэшировании



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



Итоги: когда стоит прибегать к мемоизации



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




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




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




  • Может показаться, что собственные реализации мемоизации стоит применять, например, при обращениях к неким API из браузерного кода. Однако, делать этого не нужно, так как браузер автоматически кэширует их, используя, в частности, HTTP-кэш.




  • Если вы работаете с React/Redux, можете взглянуть на reselect. Тут используется селектор с мемоизацией. Это позволяет выполнять вычисления только в том случае, если в соответствующей части дерева состояний произошли изменения.




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




Уважаемые читатели! Если у вас есть примеры использования мемоизации в реальных проектах — поделитесь пожалуйста. Уверены, многим будет интересно о них узнать.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332384/

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

[Перевод] JavaScript: многоликие функции

Пятница, 30 Июня 2017 г. 16:05 (ссылка)

https://habrahabr.ru/post/332020/

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

Demolition Derby 2 v 1.1.3 (Mod Money) » Клуб пользователей планшетов на ANDROID / Lenovo IdeaTab A2109 8GB / Samsung Galaxy Tab 2 7.0 / Asus Transformer TF700T / NVIDIA Tegra 3

Понедельник, 19 Июня 2017 г. 06:58 (ссылка)
lenov.ru/games/29463-demoli...money.html


Demolition Derby 2 - продолжение увлекательного гоночного проекта в котором геймеры снова будут состязаться в скорости, манёвренности и выживаемости своих автомобилей на различных аренах ради
Комментарии (0)КомментироватьВ цитатник или сообщество
vladk3

Все секреты клавиатуры компьютера

Пятница, 17 Июня 2017 г. 01:16 (ссылка)

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


Все секреты клавиатуры компьютера для начинающих или повторяем)

 









Все функции клавиатуры. Это надо знать!



загружено (494x280, 50Kb)

Читать далее










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

Многофункциональный диван.

Пятница, 16 Июня 2017 г. 13:50 (ссылка)

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

1 (600x450, 124Kb)

2 (600x450, 98Kb)

3 (600x450, 112Kb)

4 (600x450, 102Kb)

5 (540x405, 177Kb)

6 (540x405, 144Kb)

7 (600x450, 165Kb)

8 (453x604, 163Kb)

9 (600x450, 191Kb)

10 (604x453, 171Kb)

http://kolobok23.ru/post416764349/

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

Многофункциональный диван.

Пятница, 16 Июня 2017 г. 13:50 (ссылка)

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

1 (600x450, 124Kb)

2 (600x450, 98Kb)

3 (600x450, 112Kb)

4 (600x450, 102Kb)

5 (540x405, 177Kb)

6 (540x405, 144Kb)

7 (600x450, 165Kb)

8 (453x604, 163Kb)

9 (600x450, 191Kb)

10 (604x453, 171Kb)

http://kolobok23.ru/post416764349/

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

Многофункциональный диван.

Пятница, 16 Июня 2017 г. 13:50 (ссылка)

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

1 (600x450, 124Kb)

2 (600x450, 98Kb)

3 (600x450, 112Kb)

4 (600x450, 102Kb)

5 (540x405, 177Kb)

6 (540x405, 144Kb)

7 (600x450, 165Kb)

8 (453x604, 163Kb)

9 (600x450, 191Kb)

10 (604x453, 171Kb)

http://kolobok23.ru/post416764349/

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

Все секреты клавиатуры компьютера для начинающих или повторяем)

Пятница, 16 Июня 2017 г. 15:51 (ссылка)








Все функции клавиатуры. Это надо знать!



загружено (494x280, 50Kb)

Читать далее









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

Многофункциональный диван.

Пятница, 16 Июня 2017 г. 13:50 (ссылка)


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



1 (600x450, 124Kb)



2 (600x450, 98Kb)

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

Продвинутая работа с Google Analytics (2016) Видеокурс » SoftLabirint.Ru: Скачать бесплатно и без регистрации - Самые Популярные Новости Интернета

Вторник, 23 Мая 2017 г. 22:59 (ссылка)
softlabirint.ru/video/video...okurs.html


Продвинутая работа с Google Analytics (2016) Видеокурс

Этот курс для: Маркетологов, SEO и PPC специалистов — для решения задач по анализу эффективности рекламных кампаний. UX-специалистов — для формирования гипотез изменений поведения пользователей.



Владельцев бизнеса— для контроля и правильной постановки задач. Всех, кто хочет получить профессию веб-аналитика.



Вы научитесь:

-Рассчитывать эффективность рекламных кампаний

-Понимать эффективность сайта и страниц

-Узнавать больше о вашей аудитории



Вы изучите такие темы:

-Администрирование Google Analytics

-Основные инструменты Google Analytics

-Расширенные функции Google Analytics

-Общение с внешним миром в Google Analytics

-Введение в Google Tag Manager



Программа курса:



Администрирование Google Analytics

-Структура аккаунта Google Analytics

-Фильтры в представлениях Google Analytics

-Управление пользователями Google Analytics

-Поиск по сайту

-Настройка целей



Основные инструменты Google Analytics

-Фильтры в отчетах

-Сегменты

-Кастомные отчеты

-Эксперименты

-События

-Колл-трекинг



Расширенные функции Google Analytics

-Пользовательские параметры/переменные

-Вычисляемые показатели

-Модели атрибуции

-Ассоциированные конверсии

-Электронная торговля (+ расширенная)



Общение с внешним миром в Google Analytics

-Выгрузка в Google SpreadSheet

-Импорт данных

-Measurment Protocol

-Связь с другими продуктами Google



Введение в Google Tag Manager

-Тэги, триггеры, переменные

-Тэг Google Analytics

-Администрирование контейнера

-Datalayer

-Отслеживание кнопок/форм

-Отладка

-Настройка своих тегов

 



Продвинутая работа с Google Analytics (2016) Видеокурс



Продвинутая работа с Google Analytics (2016) Видеокурс



Продвинутая работа с Google Analytics (2016) Видеокурс






Информация о видео

Название: Продвинутая работа с Google Analytics

Автор: Андрей Осипов

Год выхода: 2016

Жанр: Видеокурс

Язык: Русский

Продолжительность: ~5 часов



Файл

Формат: AVI

Видео: AVC, 1280x720, ~3770 Kbps

Аудио: MP3, 320 Kbps, 48.0 KHz

Размер: 1.84 Gb



Скачать: Продвинутая работа с Google Analytics (2016) Видеокурс



Скачать | Download | TurboBit.net

http://turbobit.net/j43z3d562e32/Prod_rabot_v_google_ana.rar.html



Скачать | Download | HitFile.net

http://www.hitfile.net/FyLdaJ8/Prod_rabot_v_google_ana.rar.html



Скачать | Download | Файлообменник.рф

http://файлообменник.рф/3n73n6q6dcos/Prod_rabot_v_google_ana.rar.html



Скачать | Download | UniBytes.com

http://www.unibytes.com/lMjvylFkSsQLqw-Us4P3UgBB/Prod-rabot-v-google-ana.rar.html



Скачать | Download | DepFile.com

http://kyc.pm/jCp1us24E/Prod_rabot_v_google_ana.rar



 





Не пропустите








 

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

Гаджеты: Утонченные гаджеты: 13 потрясающих украшений, сочетающих в себе красоту и высокие технологии

Вторник, 16 Мая 2017 г. 15:04 (ссылка)




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

Подробнее..

http://www.novate.ru/blogs/160517/41341/

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

CHEATS ASPHALT 8 prank v 1.0 » Клуб пользователей планшетов на ANDROID / Lenovo IdeaTab A2109 8GB / Samsung Galaxy Tab 2 7.0 / Asus Transformer TF700T / NVIDIA Tegra 3

Воскресенье, 14 Мая 2017 г. 07:25 (ссылка)
lenov.ru/programs/29070-che...-v-10.html


CHEATS ASPHALT 8 prank - крайне интригующее и необычное во всех смыслах приложение предлагающее фанатам одной очень популярной гоночной игры получить фейковые читы призванные облегчить жизнь игроков.
Комментарии (0)КомментироватьВ цитатник или сообщество
Доктор_Дымов

Что такое гомоцистеин?

Пятница, 28 Апреля 2017 г. 23:38 (ссылка)


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



Читать далее



 



 



 



 


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

Acronis True Image 2017 New Generation Build 6206 BootCD (Multi/Eng/Rus) » SoftLabirint.Ru: Скачать бесплатно и без регистрации - Самые Популярные Новости Интернета

Понедельник, 10 Апреля 2017 г. 21:57 (ссылка)
softlabirint.ru/soft/system...ngrus.html


Acronis True Image 2017 New Generation Build 6206 BootCD (Multi/Eng/Rus)

Acronis True Image - комплексное приложение для всех видов локального и онлайн резервного копирования важных данных и системы в целом. Надежное и защищенное резервное копирование, максимально интегрированное с облаком Acronis Cloud.



Основные возможности:

• Полное и добавочное («инкрементное») резервное копирование системы на локальных носителях и в облаке Acronis Cloud - двойная защита для всей системы в случае, если локальная копия повреждена, потеряна или украдена.

• Резервное копирование данных, отдельных файлов и папок - как в облаке, так и в локальном хранилище.

• Инкрементное восстановления из облака - быстрое восстановление все системы, без необходимости в локальном хранении.

• 5 Гб защищенного облачного хранилища Acronis Cloud бесплатно включено в течение одного года (с возможностью расширения за дополнительную плату в интерфейсе приложения) - пользователи могут загружать свои самые важные данные и иметь доступ к ним из любой точки мира.



Новые функции Acronis True Image 2017:

Защита нескольких устройств

· защита всех цифровых данных на всех ваших устройствах;

· удобная панель управления для удаленного и централизованного контроля над системой резервного копирования;

· Облачное резервное копирование для мобильных устройств на платформах Android и iOS.

Поддержка Windows 10

· Acronis True Image 2017 оптимизирован для работы в Windows 10.

Улучшено удобство использования системой резервного копирования

· Создание и изменение резервных копий стало еще более простой задачей.

· Улучшена доступность.

Мультиязыковая поддержка

· С легкостью переключайте язык интерфейса Acronis True Image.

Возвращение функции "Try and Decide"

· Безопасно устанавливайте новые приложения, посещайте сомнительные сайты и открывайте подозрительные файлы.



Загрузочный носитель используется для следующих целей:

• восстановление операционной системы, которая не запускается;

• доступ к данным, сохранившимся в поврежденной системе и их резервное копирование;

• развертывание операционной системы на «голое железо»;

• создание основных и динамических томов на «голом железе»;

• посекторное резервное копирование диска с неподдерживаемой файловой системой;

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

• работающими приложениями или по любой другой причине.



What's New in Acronis True Image 2017 New Generation:

- Acronis Active Protection™

- Acronis Notary™

- Mobile backup encryption

- Mobile backup to Windows and MacOS

- Facebook backup encryption

- View mobile backups on Windows and Mac

- Acronis ASign Digital Signatures

- Facebook recovery

 



Acronis True Image 2017 New Generation Build 6206 BootCD (Multi/Eng/Rus)



Acronis True Image 2017 New Generation Build 6206 BootCD (Multi/Eng/Rus)



Acronis True Image 2017 New Generation Build 6206 BootCD (Multi/Eng/Rus)






Системные требования:

· Windows XP SP3 32-bit *

· Windows Home Server

· Windows 7 SP1 (all editions)

· Windows 8 (all editions)

· Windows 8.1 (all editions)

· Windows 10

It is possible for the software to work on other Windows operating systems, but it is not guaranteed.

* New features have limited support in Windows XP.



Контрольные суммы:

CRC32: 30EDE4C3

MD5: EDF4FCBC54B6B4A8B7795E1C19B310CB

SHA-1: 26D69E7EF28D97BE9D73004A1371CFB538278892



Год выпуска: 2017

Разработчик: acronis.com

ОС: Windows® XP/7/8/8.1/10

Язык интерфейса: Multilanguage / English / Русский

Лекарство: Не требуется

Размер: 604.19 MB



Скачать: Acronis True Image 2017 New Generation Build 6206 BootCD (Multi/Eng/Rus) >>>



 



Подписка на новости сайта…

http://feeds.feedburner.com/Soft-Labirint

http://feeds.feedburner.com/Soft-Labirint?format=xml

https://feedburner.google.com/fb/a/mailverify?uri=Soft-Labirint



 



 

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

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

Четверг, 06 Апреля 2017 г. 05:41 (ссылка)

ФУНКЦИИ БОГА ШИВЫ
Подробнее тут - http://narzullaev.ru/section/theosophy


Сайт Геннадия Нарзуллаева
E-mail: narzullaev@yandex.ru

https://vk.com/gennadij_narzullaev

Skype: ngg1967
http://narzullaev.ru/section/theosophy

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

«  Предыдущие 30 Следующие 30  »

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

Страницы: 1 ..
.. 3 4 [5] 6 7 ... 10

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