Search
Write a publication
Pull to refresh
43
0
Валерий Дмитриев @rotor

Пользователь

Send message

Это ни ко мне вопрос. Я просто кратко пересказал текст по ссылке. Сам я Монгой вообще не пользуюсь

Вот нагуглил некоторое объяснение истоков проблемы: https://habrahabr.ru/post/221221/
Если кратко, то до определенной версии MongoDB шла открытой по умолчанию. И пользователи, неожидавшие такой засады, ничего не подозревая, таковой ее и оставляли.

Итераторы в LevelDB делают его очень гибким.
В вашем случае, возможно, стоит еще обратить внимание на RocksDB
Это доработанный LevelDB. Он оптимизирован для SSD и подходит для больших размеров БД. Не нужны лишние конвертирования — можно хранить бинарные данные. Ну и скорость нaaaамного выше. Три дня, что-то уж совсем перебор.
Короче, LevelDB/RocksDB — то что вам нужно.

Тоже всегда искренне удивляюсь, когда вижу как кто-то открывает issue в открытом проекте со свободной лицензией и недружелюбно высказывает претензии.
Ну ёмоё! Это же открытый код! Если тебя что-то не устраивает, пришли Pull Request! Ну или хотя бы аккуратно оформленный баг-репорт.

Это такая защита от не правильного использования. std::forward предполагает использование именно с шаблонным параметром, но если кто-то вдруг захочет странного и напишет что то вроде этого:


std::forward<int&>(5)

то сработает защита. В этом случае аргумент является rvalue, поэтому компилятор выбирает вторую перегрузку, но тип ссылка на lvalue. пример

Совсем нет. Сравните: С-style-cast и std:forward


1) When the C-style cast expression is encountered, the compiler attempts to interpret it as the following cast expressions, in this order:
a) const_cast<new_type>(expression);
b) static_cast<new_type>(expression), with extensions: pointer or reference to a derived class is additionally allowed to be cast to pointer or reference to unambiguous base class (and vice versa) even if the base class is inaccessible (that is, this cast ignores the private inheritance specifier). Same applies to casting pointer to member to pointer to member of unambigous non-virtual base;
c) static_cast (with extensions) followed by const_cast;
d) reinterpret_cast<new_type>(expression);
e) reinterpret_cast followed by const_cast.

Возможная реализация для std:forward (g++ bits/move.h):


template<typename T>
constexpr T&& forward(typename std::remove_reference<T>::type& t) noexcept
{
    return static_cast<T&&>(t);
}
template<typename T>
constexpr T&& forward(typename std::remove_reference<T>::type&& t) noexcept
{
    static_assert(!std::is_lvalue_reference<T>::value, "template argument substituting T is an lvalue reference type");
    return static_cast<T&&>(t);
}

Видите разницу?


Дополнително: 1 2 3 4

На самом деле, почти всегда лучше писать


for (auto&& item: someContainer)

Если someContainer::iterator::operator*() возвращает ссылку или константную ссылку, то item таковым и будет, если rlalue ссылку то возвращаемое значение будет перемещено в item без создания временного объекта.

Зачем? std::map::begin() всегда возвращает iterator или const_iterator.
Если через какое то время вы поменяете сигнатуру функции f на


void f(const TextValueMap& tvmap)

то вам придется изменять также строку


TextValueMap::iterator Uter = tvmap.begin();

на


TextValueMap::const_iterator Uter = tvmap.begin();

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

У вас по всему тексту встречаются такие вот конструкции:


template<typename... Types>
constexpr Container<Types...> Auto(Types&&... args) {return Container<Types...>((Types&&)args...);}

Что вы хотели сказать вот этим: ((Types&&)args...)?
Мне кажется, в данном случае будет уместнее использовать std::forward:


template<typename... Types>
constexpr Container<Types...> Auto(Types&&... args) {return Container<Types...>(std::forward(args)...);}

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


Все аргументы передаются в качестве rvalue аргументов до самого конечного получателя Value, чтобы не потерять ссылки.

Явно свидетельствует, что вы путаете rvalue и универсальные ссылки.

Вы не знаете, есть какой-то способ единообразно генерировать Precompiled-Headers для clang и gcc?
Что бы в Makefile можно было просто заменить CPP = g++ на CPP = clang++?

Формулу расчета можно сильно упростить. Необходимость менять дверь легче объяснить по другому:

Если изначально принять стратегию выбора неправильной двери, то вы делаете свой выбор (выбираете неправильную дверь) с вероятностью 2/3. После того, как одна из неправильных дверей открыта, вы не меняете свой выбор относительно неправильной двери и открываете единственно возможную при первоначальном выборе правильную дверь.
мене, мене, текел, упарсин
Не сразу увидел ваше дополнение. Да, кажется, доступ к статическим полям не реализован. Его, кстати, не так уж и сложно реализовать. Я примерно представляю как это можно сделать. Просто это никому не было нужно.
Что касается вашего примера, то у вас статическое поле торчит наружу. Это не очень хорошо с точки зрения архитектуры. И, возможно, требуется рефакторинг. Попробуйте в вашем примере заменить static $a на private static $a и проблема сразу исчезнет.
А вообще, опишите исходную задачу, попробую накидать решение.
В настоящий момент в библиотеке есть практически все для решения основных задач, возникающих при написании расширений.
например отсуствие возможности устанавливать статические переменные

так вы попробуйте в документацию заглянуть.
#include <phpcpp.h>
class YourCustomClass : public Php::Base {};
extern "C" {
    PHPCPP_EXPORT void *get_module() {
        static Php::Extension ext("YourCustomExtention", "1.0");
        Php::Class<YourCustomClass> cl("YourCustomClass");
        cl.property<YourCustomClass>("staticProperty", std::nullptr, Php::Static);
        ext.add(std::move(gtk));
        return ext;
    }
}

<?php 
class YourCustomClass {
   static $staticProperty = null;
}

Этот БД будет выплачиваться из налогов реально работающих людей?
Опять решили в социализм поиграть.

Раз уж речь о высокопроизводительном решении, то совсем не обязательно, что будет использована внешняя БД.
БД может быть встроенной. Или это вообще могут быть данные размещенные в памяти.
Ну и потом, вы учитывайте, что в режиме однопоточного сервера (он ведь однопоточный?) ответы должны быть очень быстрыми. И отказ от исключений в том случае, когда без них легко обойтись, таки имеет смысл.
Если кто пропустил, то в статье речь об этой заметке: https://habrahabr.ru/company/pushall/blog/280218/
Автору браво за развернутое объяснение.

Information

Rating
11,018-th
Location
Уфа, Башкортостан(Башкирия), Россия
Date of birth
Registered
Activity