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


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

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

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

Кулуары VR. Библиотеки для отображения панорам 360*

Пятница, 22 Июля 2016 г. 16:20 (ссылка)





Всем привет! VR нынче в тренде, тема злободневная, различных проектов и способов реализовывать отображение трёхмерной картинки, кажется, скоро будет миллион. Сегодня у нас в гостях Михаил Вайсман, основатель компании по разработке мобильных приложений Trinity Digital. Он вызвался рассказать про работу с библиотеками для отображения 360-градусных панорам, за что мы выражаем ему признательность. Ладно, вы все пришли сюда за интересным опытом, а не за контентом до ката. ;)





Что здесь происходит?



Привет, Хабр! Представить меня уже успели, но правила есть правила. Я — Михаил Вайсман. Опыт работы с VR я приобрел, работая в Trinity Digital над проектом Airpano Virtual Travel вместе с командой Doubble. Airpano — приложение с возможностью просмотра VR фото- и видеопанорам. В процессе работы я столкнулся с проблемой: тема VR уже не первый год в тренде, но готовых библиотек, позволяющих качественно отобразить VR контент, нет. Пришлось выбирать между написанием с нуля собственного решения и применением того, что уже есть на рынке. Выбрали компромиссный вариант — взять имеющееся на рынке open source решение и дорабатывать под наши цели. У последного варианта есть свои плюсы, но и о минусах забывать не стоит. Мы попробовали три библиотеки, и вот что из этого вышло:



Krpano — библиотека на основе WebView



Мы начали работу с варианта, реализованного на основе WebView — с библиотеки krpano. Причиной выбора стали:




  • Быстрая возможность интеграции в проект;


  • Декларация поддержки всех Android устройства с версией не ниже 4.2;


  • Универсальность решения, возможность переиспользования для разных платформ.






В реальности с библиотекой krpano все оказалось не столь радужно, потому что у krpano браузерный движок. Начать можно хотя бы с того, что не на всех устройствах есть современные движки хрома, которые могут максимально эффективно реализовывать возможности данной библиотеки. Большинство не самых топовых устройств работали медленно с панорамами исключительно из-за использования webview, а на части из них библиотека и вовсе не работала. В качестве потенциального решения мы попробовали интегрировать в приложение движки от Chrome и Firefox (сначала один, потом другой — для тестов). В какой-то степени это помогло. Работала данная штука везде, вот только…



В итоге приложение занимало более 100 мегабайт — и это не наши файлы или код, а библиотека, плюс браузерный движок в проекте. Самое обидное, что даже эти извращения не помогли значительно оптимизировать качество и скорость работы — они оставались на непримлемо низком уровне. Решающим минусом krpano стала необходимость программировать на уровне xml-конфигураций (подобное конфигурирование проходит долго и увеличивает цену разработки для каждой панорамы).

https://habrahabr.ru/post/306246/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Между_вдохом_и_выдохом

Книги в интерьере: храним компактно и красиво

Пятница, 22 Июля 2016 г. 12:04 (ссылка)


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



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




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



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



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




Книги в интерьере: храним компактно, удобно и красиво




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

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

Простой, естественный вопрос: какие бывают библиотеки UWP?

Понедельник, 18 Июля 2016 г. 20:36 (ссылка)



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

Под катом о том, какие библиотеки, как и зачем можно использовать в приложениях UWP.



Библиотека классов — Class Library для приложений Windows Store



.Net библиотека с классами и методами, доступными для приложений Windows Store apps. Может быть использована только UWP приложениями, написанными на языках .Net. То есть, JavaScript, например, отпадает.

Заметьте, что обычные .Net библиотеки классов UWP приложение само собой использовать не может.

Список отличий и изменений, которые необходимо сделать при конвертации кода .Net в .Net для приложений Windows Store вы можете найти по ссылке: .NET for Windows Store apps overview



Изменений и различий довольно много, хотя наблюдается и определенное сходство. Зачастую отличаются только пространства имен, а методы и свойства остаются прежними. Это сделано для удобства портирования существующего кода. Разумеется, не весь функционал .Net доступен в приложениях Windows Store. Отчасти из соображений безопасности или же из-за того, что его концептуально не захотели дублировать в UWP.



Библиотека классов переносимая — PCL (Portable Class Library)



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







Эти целевые платформы можно изменить в любой момент в свойствах проекта.

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



Компонент среды выполнения Windows -Windows Runtime Component



Компонент, который может использоваться с любым из языков платформы WinRT. Расширение у компонента оканчивается на .winmd. Но пускай вас это не путает, компонент очень часто все-таки используется как библиотека, а метаданные, которые он содержит позволяют ему работать со всеми языками WinRT. Это и является основным плюсом.

Для примера могу показать вам как в созданном проекте Class Library через свойства можно выбрать Runtime Component в качестве результата построения:







Но в этом случае вы потеряете кросс-языковую совместимость и сможете работать с такой библиотекой только из C# и VB.



Runtime Component основан на COM. Выходит, что имеется возможность написать нативный Windows Runtime компонент на managed языке.

Во всех языках WinRT используются свои типы данных. Но в Runtime компоненте данные должны быть унифицированы.

Примитивные типы более-менее сходны во всех языках. Отличается большей частью только JavaScript.

Таблицу сопоставления можно найти по ссылкам:

Windows Runtime base data types

.NET Framework mappings of Windows Runtime types



Языки WinRT различаются и поэтому иногда необходимо приходить к какому-то общему знаменателю. Например, в .Net и JavaScript приложениях строки неизменяемые (immutable), а в C++ они mutable. В компоненте Windows Runtime строки immutable.



Ограничения/правила:


  • Публичные элементы должны быть обязательно запечатаны (sealed).

  • Публичные классы или интерфейсы не могут быть generic или реализовывать не WinRT интерфейс.

  • Публичные классы не могут быть производными от WinRT типов.

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

  • Коренное пространство имен должно соответствовать названию сборки и не может начинаться с «Windows».

  • WRC не поддерживает полиморфизм

  • Методы в Windows Runtime могут быть перегружены, но в случае одинакового количества параметров они должны быть помечены атрибутом. Официальный пример:



public string OverloadExample(string s)
{
return s;
}
[Windows.Foundation.Metadata.DefaultOverload()]
public int OverloadExample(int x)
{
return x;
}


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



Практический пример:



Если ваше UWP приложение использует WebView для отображения веб-сайтов, то у вас есть возможность использовать в приложении класс, который будет доступен из JavaScript-а загруженных веб страниц.

И вот этот класс должен находится внутри компонента Windows Runtime. Вот где необходима кросс-языковая совместимость.



Создается компонент, и из основного проекта, содержащего страницу WebView на него делается ссылка. Внутри компонента публичный класс или классы могут быть помечены атрибутом [AllowForWeb]. Все публичные методы таких классов будут доступны из JavaScript загруженной в WebView страницы. Необходимо только при начале навигации на страницу добавлять этот класс с помощью метода AddWebAllowedObject



Да, конечно, есть вариант использовать window.external.notify в коде JS, но имеются определенные ограничения безопасности, которые разрешают выполнение этих вызовов только с доверенных https сайтов.

Немного повторюсь и продублирую пример с MSDN. В класс WinRT компонента добавим метод SomeValueFromJS



using Windows.Foundation.Metadata;

namespace MyRuntimeComponent
{
[AllowForWeb]
public sealed class MyNativeClass
{
public void SomeValueFromJS(string value)
{

}
}
}


В XAML добавим WebView






И при начале навигации внедрим наш класс в JavaScript



private void webView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args) 
{
if (args.Uri.Host == "www.contoso.com")
{
webView.AddWebAllowedObject("csharpclass", new MyNativeClass());
}
}


Теперь из кода JS можно вызвать этот метод так:



csharpclass.nativeMethod("hello!");


Казалось бы все нормально, но вот незадача, зачастую может возникать необходимость передавать данные на страницу с WebView. Проект с WebView уже ссылается на WinRT компонент и поэтому обратную ссылку нам не добавить из-за циклической зависимости. Ограничения WRC не позволяют нам использовать некоторые варианты. В качестве решения можно создать промежуточный слой в виде библиотеки Class Library для приложений Windows Store у которой ограничений гораздо меньше. Ссылку на эту библиотеку содержащую класс с названием BridgeClass можно сделать и из основного проекта и с проекта компонента Windows Runtime.



Возможности .Net позволят нам создать доступный ивент



public static event Action


и подписаться на событие в основном проекте. Давайте рассмотрим в виде кода. Код класса BridgeClass:



    public class BridgeClass
{
public static event Action MessageReceived;

public static void Broadcast(string message)
{
if (MessageReceived != null) MessageReceived(message);
}
}


В основном проекте, в code-behind страницы с WebView подписываемся на событие:



BridgeClass.MessageReceived += ShowMessage;


И реализуем:



  void ShowMessage(string msg)
{
}


Теперь из метода, доступного для JS можем передать значение в C#:



  public void SomeValueFromJS(string value)
{
BridgeClass.Broadcast(value);
}

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

https://habrahabr.ru/post/305674/

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

Бесплатные онлайн-библиотеки. Художественная литература. Ссылки.

Пятница, 15 Июля 2016 г. 22:56 (ссылка)

Это цитата сообщения Алевтина_Серова Оригинальное сообщение



 (700x134, 58Kb)

Если вы давно ищете, что бы такого почитать, то в представленном списке бесплатных ресурсов вы с легкостью сможете найти книгу по душе.
Читать - не перечитать!


Библиотека Максима Мошкова

Альдебаран - электронная библиотека книг

Библиотека русской религиозной и художественной литературы "Вехи"

Библиотека «Артефакт»

Электронная библиотека "ImWerden"

Библиотека CHM Книг

Библиотека TarraNova

Русская фантастика

Публичная электронная библиотека Евгения Пескина

Библиотека Янко Славы

Библиотека Старого Чародея

Интернет-библиотека Алексея Комарова

Литературный портал

Русская литература и фольклор

Президентская библиотека

Народная библиотека

Библиотека сканов старых газет

Национальный сервер современной прозы Проза.ру

Национальный сервер современной поэзии Стихи.ру

Американская поэзия в переводе на русский

Библиотека украинской литературы





Спасибо за ваши комментарии!



Серия сообщений "проза":

Часть 1 - Газеты и журналы можно читать Он-лайн.
Часть 2 - Для тех, кто любит читать газеты. Старые газеты.
...
Часть 12 - Детские книги, которые стоит перечитать взрослым. Читать онлайн. Ссылки (5).
Часть 13 - Классики о любви: Объяснение - художник Владимир Маковский. Чехов "Несчастье" Ссылка.
Часть 14 - Бесплатные онлайн-библиотеки. Художественная литература. Ссылки.


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

Последние новости о развитии C++

Среда, 13 Июля 2016 г. 19:19 (ссылка)

Недавно в финском городе Оулу завершилась встреча международной рабочей группы WG21 по стандартизации C++, в которой впервые официально участвовали сотрудники Яндекса. На ней утвердили черновой вариант C++17 со множеством новых классов, методов и полезных нововведений языка.







Во время поездки мы обедали с Бьярне Страуструпом, катались в лифте с Гербом Саттером, жали руку Беману Дейвсу, выходили «подышать воздухом» с Винцентом Боте, обсуждали онлайн-игры с Гором Нишановым, были на приёме в мэрии Оулу и общались с мэром. А ещё мы вместе со всеми с 8:30 до 17:30 работали над новым стандартом C++, зачастую собираясь в 20:00 чтобы ещё четыре часика поработать и успеть добавить пару хороших вещей.



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



if constexpr (condition)



В C++17 появилась возможность на этапе компиляции выполнять if:



template 
auto rget(const std::pair& p) {
if constexpr (I == 0) {
return p.second;
} else {
return p.first;
}
}


При этом неактиваная ветка ветвления не влияет на определение возвращаемого значения. Другими словами, данный пример скомпилируется и:


  • при вызове rget<0>( std::pair{} ) тип возвращаемого значения будет short;

  • при вызове rget<1>( std::pair{} ) тип возвращаемого значения будет char*.



T& container::emplace_back(Args&&...)



Методы emplace_back(Args&&...) для sequence контейнеров теперь возвращают ссылку на созданый элемент:

// C++11
some_vector.emplace_back();
some_vector.back().do_something();

// C++17
some_vector.emplace_back().do_something();


std::variant



Позвольте представить: std::variant — union, который помнит что хранит.

std::variant v;
v = "Hello word";
assert(std::get(v) == "Hello word");
v = 17 * 42;
assert(std::get<0>(v) == 17 * 42);


Дизайн основан на boost::variant, но при этом убраны все известные недочёты последнего:




  • std::variant никогда не аллоцирует память для собственных нужд;

  • множество методов std::variant являются constexpr, так что его можно использовать в constexpr выражениях;

  • std::variant умеет делать emplace;

  • к хранимому значению можно обращаться по индексу или по типу — кому как больше нравится;

  • std::variant не нуждается в boost::static_visitor;

  • std::variant не умеет рекурсивно держать в себе себя (например функционал наподобие `boost::make_recursive_variant>::type` убран).



Многопоточные алгоритмы



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

std::vector v;
v.reserve(100500 * 1024);
some_function_that_fills_vector(v);

// Многопоточная сортировка данных
std::sort(std::execution::par, v.begin(), v.end());


Осторожно: если внутри алгоритма, принимающего ExecutionPolicy, вы кидаете исключение и не ловите его, то программа завершится с вызовом std::terminate():

std::sort(std::execution::par, v.begin(), v.end(), [](auto left, auto right) {
if (left==right)
throw std::logic_error("Equal values are not expected"); // вызовет std::terminate()

return left < right;
});




Доступ к нодам контейнера



Давайте напишем многопоточную очередь с приоритетом. Класс очереди должен уметь потокобезопасно сохранять в себе множество значений с помощью метода push и потокобезопасно выдавать значения в определенном порядке с помощью метода pop():






// C++11
void push(std::multiset&& items) {
std::unique_lock lock(values_mutex_);
for (auto&& val : items) {
// аллоцирует память, может кидать исключения
values_.insert(val);
}

cond_.notify_one();
}

value_type pop() {
std::unique_lock lock(values_mutex_);
while (values_.empty()) {
cond_.wait(lock);
}

// аллоцирет память, может кидать исключения
value_type ret = *values_.begin();
// деаллоцирует память
values_.erase(values_.begin());

return ret;
}
// C++17
void push(std::multiset&& items) {
std::unique_lock lock(values_mutex_);

// не аллоцирует память, не кидает исключения.
// работает намного быстрее (см. #2)
values_.merge(std::move(items));

cond_.notify_one();
}

value_type pop() {
std::unique_lock lock(values_mutex_);
while (values_.empty()) {
cond_.wait(lock);
}

// не аллоцирет память и не кидает исключения (см. #2)
auto node = values_.extract(values_.begin());
lock.unlock();

// извлекаем значение из ноды multiset'а
return std::move(node.value());
}


В C++17 многие контейнеры обзавелись возможностью передавать свои внутренние структуры для хранения данных наружу, обмениваться ими друг с другом без дополнительных копирований и аллокаций. Именно это происходит в методе pop() в примере:

// Извлекаем из rbtree контейнера его 'ноду' (tree-node)
auto node = values_.extract(values_.begin());

// Теперь values_ не содрежит в себе первого элемента, этот элемент полностью переехал в node
// values_mutex_ синхронизирует доступ к values_. раз мы вынули из этого контейнера
// интересующую нас ноду, для дальнейшей работы с нодой нет необходимости держать блокировку.
lock.unlock();

// Наружу нам необходимо вернуть только элемент, а не всю ноду. Делаем std::move элемента из ноды.
return std::move(node.value());

// здесь вызовется деструктор для ноды


Таким образом наша многопоточная очередь в C++17 стала:


  • более производительной — за счёт уменьшения количества динамических аллокаций и уменьшения времени, которое программа проводит в критической секции;

  • более безопасной — за счёт уменьшения количества мест, кидающих исключения, и за счет меньшего количества аллокаций;

  • менее требовательной к памяти.



Автоматическое определение шаблонных параметров для классов



В черновик C++17 добавили автоматическое определение шаблонных параметров для шаблонных классов. Это значит, что простые шаблонные классы, конструктор которых явно использует шаблонный параметр, теперь автоматически определяют свой тип:


















Было Стало
std::pair p(17, 42.0);
std::pair p(17, 42.0);
std::lock_guard lck(mut_);
std::lock_guard lck(mut_);
std::lock_guard lck(mut_);
auto lck = std::lock_guard(mut_);


std::string_view



Продолжаем эксурс в дивный мир C++17. Давайте посмотрим на следующую C++11 функцию, печатающую сообщение на экран:

// C++11
#include
void get_vendor_from_id(const std::string& id) { // аллоцирует память, если большой массив символов передан на вход вместо std::string
std::cout <<
id.substr(0, id.find_last_of(':')); // аллоцирует память при создании больших подстрок
}

// TODO: дописать get_vendor_from_id(const char* id) чтобы избавиться от динамической аллокации памяти


В C++17 можно написать лучше:

// C++17
#include
void get_vendor_from_id(std::string_view id) { // не аллоцирует память, работает с `const char*`, `char*`, `const std::string&` и т.д.
std::cout <<
id.substr(0, id.find_last_of(':')); // не аллоцирует память для подстрок
}


std::basic_string_view или std::string_view — это класс, не владеющий строкой, но хранящий указатель на начало строки и её размер. Класс пришел в стандарт из Boost, где он назывался boost::basic_string_ref или boost::string_ref.



std::string_view уже давно обосновался в черновиках C++17, однако именно на последнем собрании было решено исправить его взимодействие с std::string. Теперь файл может не подключать файл , за счет чего использование std::string_view становится более легковесным и компиляция программы происходит немного быстрее.



Рекомендации:


  • используйте единственную функцию, принимающую string_view, вместо перегруженных функций, принимающих const std::string&, const char* и т.д.;

  • передавайте string_view по копии (нет необходимости писать `const string_view& id`, достаточно просто `string_view id`).



Осторожно: string_view не гарантирует, что строчка, которая в нем хранится, оканчивается на символ '\0', так что не стоит использовать функции наподобие string_view::data() в местах, где необходимо передавать нуль-терминированные строчки.



if (init; condition)



Давайте рассмотрим следующий пример функции с критической секцией:

// C++11
void foo() {
// ...
{
std::lock_guard lock(m);
if (!container.empty()) {
// do something
}
}
// ...
}


Многим людям такая конструкция не нравилась, пустые скобки выглядят не очень красиво. Поэтому в C++17 решено было сделать всё красивее:

// C++17
void foo() {
// ...
if (std::lock_guard lock(m); !container.empty()) {
// do something
}
// ...
}


В приведенном выше примере переменная lock будет существовать до закрывающей фигурной скобки оператора if.



Structured bindings



std::set s;
// ...

auto [it, ok] = s.insert(42);
// Теперь it — интегратор на вставленный элемент; ok - bool переменная с результатом.
if (!ok) {
throw std::logic_error("42 is already in set");
}
s.insert(it, 43);
// ...


Structured bindings работает не только с std::pair или std::tuple, а с любыми структурами:

struct my_struct { std::string s; int i; };
my_struct my_function();
// ...

auto [str, integer] = my_function();


А ещё...



В C++17 так же есть:


  • синтаксис наподобие template struct my_class{ /*… */ };

  • filesystem — классы и функции для кросплатформенной работы с файловой системой;

  • std::to_chars/std::from_chars — методы для очень быстрых преобразований чисел в строки и строк в числа с использованием C локали;

  • std::has_unique_object_representations — type_trait, помогающий определять «уникальную-представимость» типа в бинарном виде;

  • new для типов с alignment большим, чем стандартный;

  • inline для переменных — если в разных единицах трансляции присутствует переменная с внешней линковкой с одним и тем же именем, то оставить и использовать только одну переменную (без inline будет ошибка линковки);

  • std::not_fn коректно работающий с operator() const&, operator() && и т.д.;

  • зафиксирован порядок выполнения некоторых операций. Например, если есть выражение, содержащее =, то сначала выполнится его правая часть, потом — левая;

  • гарантированный copy elision;

  • огромное количество математических функций;

  • std::string::data(), возвращающий неконстантый char* (УРА!);

  • constexpr для итераторов, std::array и вспомогательных функций (моя фишечка :);

  • явная пометка старья типа std::iterator, std::is_literal_type, std::allocator, std::get_temporary_buffer и т.д. как deprecated;

  • удаление функций, принимающих аллокаторы из std::function;

  • std::any — класс для хранения любых значений;

  • std::optional — класс, хранящий определенное значение, либо флаг, что значения нет;

  • fallthrough, nodiscard, maybe_unused;

  • constexpr лямбды;

  • лямбды с [this]( /*… */ ){ /*… */ };

  • полиморфные алокаторы — type-erased алокаторы, отличное решение, чтобы передавать свои алокаторы в чужие библиотеки;

  • lock_guard, работающий сразу со множеством мьютексов;

  • многое другое.





Напоследок



На конференции C++Siberia в августе мы постараемся рассказать о новинках С++ с большим количеством примеров, объяснить, почему именно такой дизайн был выбран, ответим на ваши вопросы и упомянем множество других мелочей, которые невозможно поместить в статью.



Расскажите о чём бы вам было интересно почитать
















































Проголосовало 11 человек. Воздержалось 3 человека.





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


Original source: habrahabr.ru.

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

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

Книжный магазин с черным зеркальным полом в Китае

Среда, 13 Июля 2016 г. 13:40 (ссылка)

Китайская студия XL-Muse создала проект еще одного впечатляющего книжного магазина в Янчжоу.



Книжный магазин с черным зеркальным полом в Китае


Продолжение поста...




ВКонтакте

Facebook

http://feedproxy.google.com/~r/etoday/~3/auRUeMU8JmQ/knizhnyy-magazin-s-chernym-zerkalnym-polom-v-kitae.php

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

Список электронных библиотек в Интернете

Четверг, 07 Июля 2016 г. 21:34 (ссылка)
liveinternet.ru/users/43734...393975738/




























Список электронных библиотек в Интернете



ИСТОРИЯ
Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

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

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

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