У Keybase тоже закрытый сервер. А вот у Matrix всё открыто и имеются групповые шифрованные E2E чаты. Не очень удобные пока что, но рабочие. Загружаемые файлы тоже шифруются.
Про исходники всё так, вся опенсорсность — просто баззворд. Почитайте, подход, мягко говоря, странный для любого свободного проекта. Потом посмотрите на дату последнего коммита в том же репозитории. Потом на сводку типичного коммита, например, этого: Showing 841 changed files with 62,880 additions and 47,763 deletions.
А ведь именно мобильный клиент, полагаю, наиболее популярен среди пользователей. И именно с ним вот такая ситуация.
Ещё есть такая фраза: «Текущие цены являются самыми справедливыми, так как в них уже учтены все возможные факторы – иначе по этой цене сделки бы не совершались.» Правда, это работает только при хороших объёмах.
Данные для анализа выбраны не самые лучшие, на валютных парах можно получать прибыль лишь от скальпинга или во время кризисов. Не самое интересное занятие, солидных трендов нет (посмотрите USD/RUB — за год изменение 0.37%). Интереснее было бы исследовать котировки акций, которые часто торгуются в трендах, и тут уже можно получать прибыль, ставя заявки на тейкпрофит/стоплосс, а максимизировать можно именно путём поиска точек разворота, чтобы купить максимально дешевле и продать максимально дорого. Акции успешных компаний могут за год сделать 30-60%, а то и удвоиться, если просто ничего не делать с ними (и если не бахнет кризис), то это и будет доход. Если всё же следить за процессом, можно на локальном росте-падении нарезать ещё немало, ТА работает как раз при отсутствии фундаментальных факторов, глупо списывать его со счетов.
На более простой вопрос мы тут попытались ответить раньше, tl;dr — мы не знаем, скорее всего, там отсутствует и время, и пространство, что может выглядеть (или не выглядеть) как угодно.
Есть такая штука, PAR2, думаю, как раз для таких случаев подойдёт, когда не хватает небольшого кусочка. Если сами куски стирать случайно у всех клиентов, то вероятность полного отсутствия фрагмента будет невелика, и её можно будет скомпенсировать этой информацией для восстановления.
Вот да. И написано хорошо, и сама автор отвечает в комментариях профессионально. Видно, что человек не просто сммщик уровнем чуть выше среднего, а живёт этим и любит свою работу!
Начнём с того, что move semantics так называется не ради красного словца. Помимо решения технической проблемы (исключение излишнего копирования), язык предоставляет нам новую семантику, смысл, который мы вкладываем в такую передачу аргумента. Когда значение передаётся по неконстантной ссылке, подразумевается, что функция будет изменять объект и, таким образом, оказывать влияние «вовне», т.е. её результат будет виден в месте, откуда функция вызывалась. Но это не всегда нужно, поэтому существует и передача по значению, когда функция получает собственный экземпляр объекта, и все операции над ним снаружи не окажутся (конечно, если функция как-либо явно не вернёт этот объект).
До C++11 не было промежуточного варианта, когда мы и копировать не хотим, и «делиться» объектом тоже нежелательно. Что если нам «снаружи» объект уже не нужен, и мы хотим его просто передать внутрь «навсегда»? Конечно, можно передать по ссылке и, если объект был создан в пределах текущего скоупа, он автоматически будет уничтожен при выходе из него. Но передача по ссылке не несёт семантики поведения функции, при чтении такого кода неясно, можно ли дальше пользоваться переданным объектом или он был «испорчен» функцией (здесь «порча» понимается в терминах move semantics, т.е. содержимое объекта меняется, но его состояние остаётся допустимым для корректного уничтожения). Конечно, можно создать временную копию и передать ссылку на неё, но это пустая трата ресурсов. std::move() нужен для передачи объекта из рук в руки, он явно обозначает, что объект был перемещён, и далее в скоупе вызова им пользоваться нельзя, теперь им владеет вызванная функция, и она несёт за него ответственность.
Хорошим примером будет unique_ptr. По своему смыслу, это уникальный, существующий в одном экземпляре указатель на объект. Тем не менее, им можно «поделиться» с помощью передачи по ссылке, но нельзя скопировать, копирующий конструктор удалён. А вот перемещающий конструктор есть, и он очень интересный: при перемещении указателя вызывается release() на аргументе конструктора, что приводит к обнулению указателя в этом аргументе. Пример:
#include <iostream>
#include <memory>
using namespace std;
class A {
};
void foo(unique_ptr<A> p) {
cout << "passed by value " << p.get() << endl;
}
int main(int argc, char* argv[]) {
auto a = make_unique<A>();
cout << "a was " << a.get() << endl;
foo(move(a));
cout << "a becomes " << a.get() << endl;
}
Выведет:
a was 0x555555a61290
passed by value 0x555555a61290
a becomes 0
Указатель переместился в функцию foo(), и снаружи неё его уже нельзя использовать! Использование std::move() явно говорит, что объект ушёл из этого скоупа куда-то дальше. Тут надо отметить, что если переписать сигнатуру foo как void foo(unique_ptr<A>&& p), то магия сломается, потому что перемещающий конструктор unique_ptr уже не вызовется, и для объекта такая передача будет полностью незаметна.
В целом, как и const, move semantics обозначает намерения программиста и обещания функций. Можно свести это в таблицу:
T — передача по значению, создастся копия, которая, возможно, будет меняться функцией; снаружи функции это не будет видно T& — передача по ссылке, объект, возможно, будет меняться функцией, и это будет видно снаружи const T& — передача по константной ссылке, объект не может меняться функцией (read-only доступ) T&& — передача по rvalue-ссылке, объект может меняться функцией, снаружи объект перестаёт существовать (или следует считать так, даже если он являлся lvalue и был перемещён с помощью std::move), копия не создаётся
Несколько хороших примеров о приёме по значению и по rvalue-ссылке, а также применение std::move() есть в этом вопросе на StackOverflow, не всё так однозначно и чаще упирается в логику и намерения разработчика, чем в какие-то технические вопросы.
Перемещение — это передача по значению, только без копирования. Это будет тот же самый объект, что и до перемещения, вплоть до адреса в памяти, и содержимое будет точно то же самое.
работаю веб-разработчиком
А на C++ пишу для себя — он как отдушина, красивый мощный язык.
У меня похожая ситуация, но можно попробовать сочетать одно с другим. Очень интересный фреймворк, похожий на GWT — весь код, включая клиентский, пишется на C++. Хотя он компонентно-ориентированный, т.е. больше подойдёт для разработки веб-приложений, а не сайтов.
Я бы ещё пояснил, что внутри функции T&& v эквивалентно T v (т.е. v передаётся по rvalue-ссылке, но принимается в обычное значение, а не в ссылку, типа T), так что чтобы прокинуть rvalue-ссылку дальше, нужен явный каст к T&&. std::forward имеет смысл только в шаблонах, насколько мне известно, т.к. в них применяется правило сжатия ссылок при выводе типа, так что такой шаблон можно использовать, как уже сказано, и для rvalue, и для lvalue. Если же мы явно укажем тип, то аргумент можно просто перемещать с помощью move, т.к. сжатие ссылок работать не будет.
Тут оптимальнее переложить создание копии на компилятор, раз уж он всё равно позволяет это делать автоматически (получаем аргумент по значению, а не по ссылке):
Вот ещё вариант, который гарантирует полное использование выделенного адресного пространства без повторений. Можно использовать в БД обычные id, а юзеру выдавать зашифрованное алгоритмом значение, ну и расшифровывать обратно при вводе. Я год назад интереса ради реализовал этот алгоритм, правда, не на PHP, а на C++. Из-за работы с большими числами скорость будет заведомо ниже, чем при случайной генерации, но зато эти функции и нужны лишь на вводе/выводе, что позволяет оставить традиционную логику взаимодействия с БД и ключами.
Ржавое ведро летает на квантовых эффектах не только в NASA, но и просто дома у самоделкиных
Тут я бы добавил, что у самоделкиных возникает нездорово большая тяга, которую можно замерить чуть ли не кухонными весами, тогда как в более научных условиях она становится на уровне погрешности измерений. Так что вполне может быть несколько причин этой тяги.
Да, новость плохая и мутная, но в других источниках всё более-менее такое же, только чуть другими словами. Тем не менее, это хоть что-то, а то с 2016 толком ничего нового про EmDrive не слышно в СМИ.
так как задержки на синхронизацию убьют потенциальную выгоду от многопоточности
Это если рассуждать с точки зрения скоротечных форм жизни типа людей. Но ведь время субъективно, и ничто не мешает существовать разумным формам жизни размером в сотни галактик, где «нервные импульсы» идут между нейронами размером со звезду сотни тысяч наших земных лет. Опять же, ну и что? Внешняя вселенная может быть в гугол раз больше и в 10^гугол раз старше, это вроде как не противоречит ничему. А наше время внутри течёт с такой вот скоростью лишь потому, что мы его так воспринимаем. Пусть наша наносекунда во внешнем мире симулируется миллион лет, это не имеет значения.
Это уже не симуляция будет, а дублирование реальности, этакая паравиртуализация. Но да, так можно оптимизировать симуляцию, только надо следить, когда учёные лезут в «сложную» область и создавать под них внешнюю песочницу с трансляцией действий в обе стороны, а остальной мир симулировать по-прежнему упрощённо. Вплоть до скайбокса вместо неба, пока никто не всматривается. Такое тоже засечь невозможно, т.к. для нас переключение с макросимуляции на микро будет происходить «мгновенно», никто же не запрещает «им» поставить всё на паузу, когда мы тянемся к микроскопу, чтобы запустить песочницу с атомами.
«Оно» — это что? Учёные доказали (если действительно доказали), что нельзя симулировать нашу Вселенную, находясь во внешней Вселенной таких же размеров и с такими же законами. Меня лично такое мало утешает, это слишком узкий класс ограничений. Примерно как если бы персонажи компьютерной игры выяснили, что в их полигональном мире с rigid body физикой невозможно симулировать такой же мир, потому что для этого потребовалось бы невероятное количество полупроводников и эмуляции электрических зарядов и полей, которое требует все существующие ресурсы их мира, так что вот от силы Minecraft in Minecraft, двумерный и тормозной, и это предел возможностей. А значит, они не в симуляции, ура! Ой, нет, подождите, это всего лишь означает, что если внешний мир существует, то он должен быть сложнее и больше, чем их собственный. Но поставить чёткий эксперимент, доказывающий отсутствие этого внешнего мира (нашего), они не могут, потому что в их мире вполне нормальна ситуация, когда умерший может бесконечно долго дёргаться среди ящиков или в итоге замереть с ногой, проткнувшей пол без каких-либо последствий для обоих. В общем, даже если мы поставим эксперимент, который раскроет ограничение симуляции, более чем вероятно, что мы не поймём, что это и есть ограничение. Может, квантовые эффекты — это оно и есть? Как это вообще можно проверить, если это данность?
В том и дело, что «реальность» — она в этом случае «снаружи», и там может быть вообще что угодно, буквально. Я не очень понимаю, как сама идея виртуальности Вселенной может считаться научной, т.к. она нефальсифицируема. Компьютер может быть сколь угодно сложным и работающим по любым законам или даже вовсе без законов, это по сути эквивалентно понятию бога, а потому нет смысла об этом рассуждать.
Что-то предметное появится, если принять как данность то, что внешняя Вселенная такая же, как и наша, и тогда уже можно говорить о возможности или невозможности симуляции конкретных явлений, поиска ограничений типа планковских расстояний и т.п. Но мне опять же непонятно, откуда эта данность берётся кроме нашего желания иметь какую-то точку отсчёта, которую можно осознать, исходя из нашего материального опыта.
У Keybase тоже закрытый сервер. А вот у Matrix всё открыто и имеются групповые шифрованные E2E чаты. Не очень удобные пока что, но рабочие. Загружаемые файлы тоже шифруются.
Про исходники всё так, вся опенсорсность — просто баззворд. Почитайте, подход, мягко говоря, странный для любого свободного проекта. Потом посмотрите на дату последнего коммита в том же репозитории. Потом на сводку типичного коммита, например, этого: Showing 841 changed files with 62,880 additions and 47,763 deletions.
А ведь именно мобильный клиент, полагаю, наиболее популярен среди пользователей. И именно с ним вот такая ситуация.
Ещё есть такая фраза: «Текущие цены являются самыми справедливыми, так как в них уже учтены все возможные факторы – иначе по этой цене сделки бы не совершались.» Правда, это работает только при хороших объёмах.
Данные для анализа выбраны не самые лучшие, на валютных парах можно получать прибыль лишь от скальпинга или во время кризисов. Не самое интересное занятие, солидных трендов нет (посмотрите USD/RUB — за год изменение 0.37%). Интереснее было бы исследовать котировки акций, которые часто торгуются в трендах, и тут уже можно получать прибыль, ставя заявки на тейкпрофит/стоплосс, а максимизировать можно именно путём поиска точек разворота, чтобы купить максимально дешевле и продать максимально дорого. Акции успешных компаний могут за год сделать 30-60%, а то и удвоиться, если просто ничего не делать с ними (и если не бахнет кризис), то это и будет доход. Если всё же следить за процессом, можно на локальном росте-падении нарезать ещё немало, ТА работает как раз при отсутствии фундаментальных факторов, глупо списывать его со счетов.
На более простой вопрос мы тут попытались ответить раньше, tl;dr — мы не знаем, скорее всего, там отсутствует и время, и пространство, что может выглядеть (или не выглядеть) как угодно.
Есть такая штука, PAR2, думаю, как раз для таких случаев подойдёт, когда не хватает небольшого кусочка. Если сами куски стирать случайно у всех клиентов, то вероятность полного отсутствия фрагмента будет невелика, и её можно будет скомпенсировать этой информацией для восстановления.
Вот да. И написано хорошо, и сама автор отвечает в комментариях профессионально. Видно, что человек не просто сммщик уровнем чуть выше среднего, а живёт этим и любит свою работу!
Начнём с того, что move semantics так называется не ради красного словца. Помимо решения технической проблемы (исключение излишнего копирования), язык предоставляет нам новую семантику, смысл, который мы вкладываем в такую передачу аргумента. Когда значение передаётся по неконстантной ссылке, подразумевается, что функция будет изменять объект и, таким образом, оказывать влияние «вовне», т.е. её результат будет виден в месте, откуда функция вызывалась. Но это не всегда нужно, поэтому существует и передача по значению, когда функция получает собственный экземпляр объекта, и все операции над ним снаружи не окажутся (конечно, если функция как-либо явно не вернёт этот объект).
До C++11 не было промежуточного варианта, когда мы и копировать не хотим, и «делиться» объектом тоже нежелательно. Что если нам «снаружи» объект уже не нужен, и мы хотим его просто передать внутрь «навсегда»? Конечно, можно передать по ссылке и, если объект был создан в пределах текущего скоупа, он автоматически будет уничтожен при выходе из него. Но передача по ссылке не несёт семантики поведения функции, при чтении такого кода неясно, можно ли дальше пользоваться переданным объектом или он был «испорчен» функцией (здесь «порча» понимается в терминах move semantics, т.е. содержимое объекта меняется, но его состояние остаётся допустимым для корректного уничтожения). Конечно, можно создать временную копию и передать ссылку на неё, но это пустая трата ресурсов. std::move() нужен для передачи объекта из рук в руки, он явно обозначает, что объект был перемещён, и далее в скоупе вызова им пользоваться нельзя, теперь им владеет вызванная функция, и она несёт за него ответственность.
Хорошим примером будет unique_ptr. По своему смыслу, это уникальный, существующий в одном экземпляре указатель на объект. Тем не менее, им можно «поделиться» с помощью передачи по ссылке, но нельзя скопировать, копирующий конструктор удалён. А вот перемещающий конструктор есть, и он очень интересный: при перемещении указателя вызывается release() на аргументе конструктора, что приводит к обнулению указателя в этом аргументе. Пример:
Выведет:
Указатель переместился в функцию foo(), и снаружи неё его уже нельзя использовать! Использование std::move() явно говорит, что объект ушёл из этого скоупа куда-то дальше. Тут надо отметить, что если переписать сигнатуру foo как
void foo(unique_ptr<A>&& p)
, то магия сломается, потому что перемещающий конструктор unique_ptr уже не вызовется, и для объекта такая передача будет полностью незаметна.В целом, как и const, move semantics обозначает намерения программиста и обещания функций. Можно свести это в таблицу:
T — передача по значению, создастся копия, которая, возможно, будет меняться функцией; снаружи функции это не будет видно
T& — передача по ссылке, объект, возможно, будет меняться функцией, и это будет видно снаружи
const T& — передача по константной ссылке, объект не может меняться функцией (read-only доступ)
T&& — передача по rvalue-ссылке, объект может меняться функцией, снаружи объект перестаёт существовать (или следует считать так, даже если он являлся lvalue и был перемещён с помощью std::move), копия не создаётся
Несколько хороших примеров о приёме по значению и по rvalue-ссылке, а также применение std::move() есть в этом вопросе на StackOverflow, не всё так однозначно и чаще упирается в логику и намерения разработчика, чем в какие-то технические вопросы.
Он вроде не для этого предназначен, а для кросс-компиляции уже существующих программ на C/C++, а Wt — это как Qt по духу, только для веба.
Перемещение — это передача по значению, только без копирования. Это будет тот же самый объект, что и до перемещения, вплоть до адреса в памяти, и содержимое будет точно то же самое.
У меня похожая ситуация, но можно попробовать сочетать одно с другим. Очень интересный фреймворк, похожий на GWT — весь код, включая клиентский, пишется на C++. Хотя он компонентно-ориентированный, т.е. больше подойдёт для разработки веб-приложений, а не сайтов.
Я бы ещё пояснил, что внутри функции
T&& v
эквивалентноT v
(т.е. v передаётся по rvalue-ссылке, но принимается в обычное значение, а не в ссылку, типа T), так что чтобы прокинуть rvalue-ссылку дальше, нужен явный каст к T&&. std::forward имеет смысл только в шаблонах, насколько мне известно, т.к. в них применяется правило сжатия ссылок при выводе типа, так что такой шаблон можно использовать, как уже сказано, и для rvalue, и для lvalue. Если же мы явно укажем тип, то аргумент можно просто перемещать с помощью move, т.к. сжатие ссылок работать не будет.Тут оптимальнее переложить создание копии на компилятор, раз уж он всё равно позволяет это делать автоматически (получаем аргумент по значению, а не по ссылке):
На StackOverflow есть очень подробное и понятное объяснение copy&swap idiom.
Вот ещё вариант, который гарантирует полное использование выделенного адресного пространства без повторений. Можно использовать в БД обычные id, а юзеру выдавать зашифрованное алгоритмом значение, ну и расшифровывать обратно при вводе. Я год назад интереса ради реализовал этот алгоритм, правда, не на PHP, а на C++. Из-за работы с большими числами скорость будет заведомо ниже, чем при случайной генерации, но зато эти функции и нужны лишь на вводе/выводе, что позволяет оставить традиционную логику взаимодействия с БД и ключами.
Тут я бы добавил, что у самоделкиных возникает нездорово большая тяга, которую можно замерить чуть ли не кухонными весами, тогда как в более научных условиях она становится на уровне погрешности измерений. Так что вполне может быть несколько причин этой тяги.
Да, новость плохая и мутная, но в других источниках всё более-менее такое же, только чуть другими словами. Тем не менее, это хоть что-то, а то с 2016 толком ничего нового про EmDrive не слышно в СМИ.
Это если рассуждать с точки зрения скоротечных форм жизни типа людей. Но ведь время субъективно, и ничто не мешает существовать разумным формам жизни размером в сотни галактик, где «нервные импульсы» идут между нейронами размером со звезду сотни тысяч наших земных лет. Опять же, ну и что? Внешняя вселенная может быть в гугол раз больше и в 10^гугол раз старше, это вроде как не противоречит ничему. А наше время внутри течёт с такой вот скоростью лишь потому, что мы его так воспринимаем. Пусть наша наносекунда во внешнем мире симулируется миллион лет, это не имеет значения.
И эта мысль совершенно не нова
Вчера появилась новость о разгадке природы EmDrive. Вроде, законы теперь не нарушаются, но и о практической применимости устройства не говорят.
Это уже не симуляция будет, а дублирование реальности, этакая паравиртуализация. Но да, так можно оптимизировать симуляцию, только надо следить, когда учёные лезут в «сложную» область и создавать под них внешнюю песочницу с трансляцией действий в обе стороны, а остальной мир симулировать по-прежнему упрощённо. Вплоть до скайбокса вместо неба, пока никто не всматривается. Такое тоже засечь невозможно, т.к. для нас переключение с макросимуляции на микро будет происходить «мгновенно», никто же не запрещает «им» поставить всё на паузу, когда мы тянемся к микроскопу, чтобы запустить песочницу с атомами.
«Оно» — это что? Учёные доказали (если действительно доказали), что нельзя симулировать нашу Вселенную, находясь во внешней Вселенной таких же размеров и с такими же законами. Меня лично такое мало утешает, это слишком узкий класс ограничений. Примерно как если бы персонажи компьютерной игры выяснили, что в их полигональном мире с rigid body физикой невозможно симулировать такой же мир, потому что для этого потребовалось бы невероятное количество полупроводников и эмуляции электрических зарядов и полей, которое требует все существующие ресурсы их мира, так что вот от силы Minecraft in Minecraft, двумерный и тормозной, и это предел возможностей. А значит, они не в симуляции, ура! Ой, нет, подождите, это всего лишь означает, что если внешний мир существует, то он должен быть сложнее и больше, чем их собственный. Но поставить чёткий эксперимент, доказывающий отсутствие этого внешнего мира (нашего), они не могут, потому что в их мире вполне нормальна ситуация, когда умерший может бесконечно долго дёргаться среди ящиков или в итоге замереть с ногой, проткнувшей пол без каких-либо последствий для обоих. В общем, даже если мы поставим эксперимент, который раскроет ограничение симуляции, более чем вероятно, что мы не поймём, что это и есть ограничение. Может, квантовые эффекты — это оно и есть? Как это вообще можно проверить, если это данность?
В том и дело, что «реальность» — она в этом случае «снаружи», и там может быть вообще что угодно, буквально. Я не очень понимаю, как сама идея виртуальности Вселенной может считаться научной, т.к. она нефальсифицируема. Компьютер может быть сколь угодно сложным и работающим по любым законам или даже вовсе без законов, это по сути эквивалентно понятию бога, а потому нет смысла об этом рассуждать.
Что-то предметное появится, если принять как данность то, что внешняя Вселенная такая же, как и наша, и тогда уже можно говорить о возможности или невозможности симуляции конкретных явлений, поиска ограничений типа планковских расстояний и т.п. Но мне опять же непонятно, откуда эта данность берётся кроме нашего желания иметь какую-то точку отсчёта, которую можно осознать, исходя из нашего материального опыта.