Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Лямбда выражения и функторы в стандартных алгоритмах

#cpp #алгоритм #лямбда_выражение


Опишите пожалуйста плюси и минусы  вариантов  для конкретно этого примера(применение
в std::for_each) , и когда и почему лямбда имеет преимущество(или наоборот)  по отношению
к функтору:

 ...
void f(const int value)
{
    cout << value << endl;
}

int main()
{    
    vector v{1, 2, 3, 4, 5};
    function op(&f) ; // функтор
    auto p = [](const int i) { return f(i + 5); }; // лямбда
    for_each(v.begin(), v.end(), op); // первый вариант
    for_each(v.begin(), v.end(), p);   // второй вариант
    ...
}

    


Ответы

Ответ 1



В качестве вишенки :) Создаю вектор и иже с ним: void f(int value) { sum += value; } const int Count = 100000000; vector v(Count); generate(v.begin(),v.end(),g); function op(&f); Затем просто суммирую в глобальную переменную: for_each(v.begin(),v.end(),f); for_each(v.begin(),v.end(),[](const int i) { sum += i; }); for_each(v.begin(),v.end(),op); VC++2017 дал на моей машине следующие времена (в мс) - 187, 41 и 208 соответственно. Ideone дает примерно те же результаты. P.S. Явное создание struct Sum { void operator()(int value) { sum += value; } }; как и следовало ожидать, от лямбды ничем не отличается.

Ответ 2



Ну, во-первых, в такой ситуации вы можете передавать в алгоритм прямо сразу f. Никакой оболочки вокруг f из лямбды или из std::function тут формально не требуется. (Разумеется, если вы хотите прибавить 5 к аргументу, то лямбда - именно то, что надо.) Во-вторых, при создании, удалении и на каждом вызове std::function тянет за собой накладные расходы, связанные с затратами на type erasure внутри std::function. Поэтому передавать std::function лучше только туда, где на входе требуется именно std::function. std::function предназначен в первую очередь для устранения зависимости принимающего алгоритма от шаблонного параметра, описывающего тип функтора. В вашем случае, т.е. для std::for_each, никакой речи о таком устранении не идет: в std::for_each тип функтора уже присутствует в списке шаблонных параметров, никто его не устранял и устранять не собирается. И поэтому платить накладные расходы за std::function нет никакого смысла. Лямбда тут будет работать эффективнее. Это относится ко всем стандартным алгоритмам: у них у всех типы функторов, предикатов, компараторов и т.п. вынесены в список параметров шаблона. В такой ситуации нет смысла использовать std::function без каких-то дополнительных/посторонних на то причин.

Как использовать Qt в C++ без QtCreator?

#cpp #qt


Как я могу использовать Qt без QtCreator?

Я только начал знакомиться с C++, поэтому мне не очевидно что я должен скачать и
подключить, что бы самостоятельно компилировать приложения с Qt. У меня есть windows
7, g++ и другие компоненты MinGW, cmake и мой текстовый редактор. Я не нашел гайдов
о том, где мне взять заголовочные и другие файлы Qt или хотя бы как это называется.

Везде описывается только разработка в QtCreator, который неплох, но мне совершенно
не нужен. Подскажите где взять SDK Qt и куда его ложить.

Сейчас при попытке сборки, cmake ругается так:


  Could not find a package configuration file provided by "Qt5Widgets"
  with   any of the following names:

Qt5WidgetsConfig.cmake
qt5widgets-config.cmake

  
  Add the installation prefix of "Qt5Widgets" to CMAKE_PREFIX_PATH or
  set   "Qt5Widgets_DIR" to a directory containing one of the above
  files.  If   "Qt5Widgets" provides a separate development package or
  SDK, be sure it has   been installed.


Кстати, я правильно понимаю, что если мне понадобится глобальная видимость заголовочных
файлов (например для того, что бы использовать их в разных проектах без копирования),
я могу скопировать их куда-то в cmake? Или нужно в MinGW? На этот вопрос не обязательно
отвечать, он просто к месту.
    


Ответы

Ответ 1



Описать в деталях как пользоваться cmake'ом на win-платформе я не смогу, так что дам в общих чертах последовательность действий: Cоздаёшь CMakeLists.txt, за основу можно взять это: cmake_minimum_required(VERSION 3.1.0) project(testproject) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) find_package(Qt5Widgets CONFIG REQUIRED) set(helloworld_SRCS mainwindow.ui mainwindow.cpp main.cpp ) add_executable(helloworld ${helloworld_SRCS}) target_link_libraries(helloworld Qt5::Widgets) main.cpp и mainwindow.{cpp,h} пишешь в своём редакторе, по необходимости форму mainwindow.ui создаёшь в designer'е (идёт вместе с Qt) или, если страдаешь излишней суровостью, то вручную — это xml-файл. Создаёшь отдельный каталог сборки (назовём его build) и вызываешь в нём cmake путь/к/каталогу/исходников При этом надо сообщить cmake'у пути до тулчейна (gсс/g++/make/ld) и Qt (на сколько-то уровней вверх от каталога с файлами Qt*.cmake, аналогично этому описанию). Какой предпочтительный/удобный способ сделать и то и другое на win-платформе — я не скажу. Также возможно потребуется передать другие аргументы вроде -G "MinGW Makefiles". Смотришь чтобы cmake отработал без ошибок, после чего получишь дерево сборки с гоовыми Makefile'ами и собираешь их обычной командой: make Также в качестве альтернативы, можно пользоваться qmake'ом или возможно писать Makefile'ы самостоятельно.

Ответ 2



Для Microsoft Visual studio существует аддон в их маркете (https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools-19123) После установки аддона необходимо указать там используемые версии кьют и можно использовать прямо из студии. В самом проекте классы придется разделить на обычные и классы кьют, т.к. им требуется мета-компиляция. Также возможно редактирование файлов форм через QT Designer и все плюшки вроде qt translator и т.п.

Ответ 3



SDK берем тут только я не нашел там сборку под Mingw может лучше взять MSVC компилятор, чтобы не морочится со сборкой qt. Вам в любом случае понадобится QtDesigner, который входит в состав Creator'a, возможно есть отдельные сборки. Кроме того не уверен, что удастся обойтись без qmake так как он генерирует исходники форм. Посему я бы рекомендовал Использовать инструментарий Qt. Дабы сосредоточится на изучении Qt. Если Вам не нужен на данном этапе UI, то лучше ограничится средой CodeBloks или VSCode(Но ИМХО Creator или студия были бы лучше, они лучше поддерживают современные стандарты плюсов). PS Отделяете мух от котлет рекомендую изучать в следуюущем порядке С++ cmake UI(qt)

Ответ 4



Решение найдено Как я могу использовать Qt без QtCreator? Всё просто, нужно скомпилировать Qt из исходников. Большинство задач покрывается QtBase. Можно использовать официальный установщик, что бы поставить необходимые компоненты, но у меня возникли проблемы с этим вариантом. Онлайн инсталятор выдавал непонятную ошибку соединения на первом шаге установки, а оффлайн версия принудительно устанавливает QtCreator. Итак, сборка QtBase занимает примерно 3 часа на среднем ПК с Win7. Если это тебя не остановит или нужна не стандартная сборка (например статическая или с файлами для отладки), вот что нужно сделать. Скачать набор компиляторов MinGW. Например здесь или тут Скачать исходные коды Qt с этой страницы Распаковать папку qtbase и выполнить в ней configure.bat и mingw32-make для сборки После этого Qt будет установлена в директорию по умолчанию. Советую после установки Qt так же собрать и установить QtDesigner, для удобного и быстрого конструирования стандартных окон. Он находится в директории qttools, для конфигурирования нужен qmake, который находится в поддиректории bin, установленной Qt. Важно упомянуть, что для корректной сборки на windows, при конфигурировании необходимо использовать параметр -opengl desktop, в противном случае, обязательно должен быть установлен ANGLE, иначе компиляция будет прервана сообщением об ошибке. Так же, если нужно изменить директорию установки Qt, можно использовать параметр --prefix В общем случае, для конфигурации Makefile достаточно выполнить следующую команду configure.bat --prefix=C:\Qt\MyBuild -opensource -confirm-license -opengl desktop

В переменную int некорректно записывается произведение двух больших чисел

#cpp #типы_данных #арифметика


long long int var=100000*100000;


В var оказывается 1410065408, хотя 100000^2=10 000 000 000. Почему так?
    


Ответы

Ответ 1



Потому что числа - int, умножаются, как int, и дают в результате int с урезанным переполнением: 10000000000 в шестнадцатеричной записи - 2540BE400. Обрезая до 4 байт, имеем 540BE400, или 1410065408. Попробуйте явно указать, что вы умножаете long long'и - не пожалеете :) long long int var=100000ll*100000ll;

Ответ 2



В таких ситуациях для избежания переполнения и обеспечения типонезависимости кода можно порекомендовать реализовывать операцию умножения в два этапа long long int var = 100000; var *= 100000; Это позволить вам избежать ненужного повторения явной типизации, т.е. явной привязки ваших констант к конкретным типам. Альтернативным вариантом, уместным в некоторых контекстах, будет перенести явную типизацию в правую часть auto var = 100000ll * 100000;

Асинхронный map [дубликат]

#nodejs #async_await #backend


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Как выполнить последовательно несколько асинхронных фунций
в Javascript без коллбэков?
                                
                                    (3 ответа)
                                
                        
                                Закрыт 1 год назад.
            
                    
Пишу бекенд на node (v 8.11.4)

Сервер общается с vk api. У vk есть ограничение - 5 запросов с секунду.

Чтобы не уперется в ограничение было решено сделать функцию sleep:

export default (ms) => {
    return new Promise(resolve => setTimeout(resolve, ms));
};


Далее есть мой метод (туда импортирую функцию sleep):

app.post(path, (req, res) => {
    [1,2,3].map(async item => {
        await sleep(1000);
        console.log(item);
    })
})


Здесь я ожидаю что console.log будет срабатывать раз в секунду. Но этого не происходит.
Проходит 1 секунда и console.log выводится 3 раза.
    


Ответы

Ответ 1



Все дело в том что этот код: [1,2,3].map(async item => { await sleep(1000); console.log(item); }) Тоже самое что и этот let foo = async item => { await sleep(1000); console.log(item); } foo(); foo(); foo(); Все три функции вызываются сразу. Каждая ждет по секунде и затем одна за другой выводят item в консоль. Так как начинают ждать они одновременно, то и заканчивают тоже, поэтому вы видите что сообщения выводятся сразу все. Можно сделать так: const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const foo = async (item, i) => { setTimeout(() => { return console.log(item); }, 1000 * i); // 1000 - это ваша задержка между вызовами } numbers.map(foo); Можно ставить устанавливать задержку после каждого вызова: const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const delayLoop = (array, delay) => { let i = 0; const loop = () => { setTimeout(() => { console.log(numbers[i]); if (++i < numbers.length) { loop(); } }, delay); }; loop(); } delayLoop(numbers, 1000); Можно сделать пример выше более универсальным, добавив callback: const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const delayLoop = (array, delay, handler) => { let i = 0; const loop = () => { setTimeout(() => { handler(numbers[i]); if (++i < numbers.length) { loop(); } }, delay); }; loop(); } const count = (value) => { console.log(`counter: ${value}`); } delayLoop(numbers, 1000, count);

Ответ 2



Если я правильно понял инужно выводитьв консоль значения из массива с заданным интервалом, то можно сделать так - const sleep = (ms) => { return new Promise(resolve => setTimeout(resolve, ms)); }; const array = [1, 2, 3]; array.reduce(async(result, current) => result.then(() => sleep(1000).then(() => console.log(current))), Promise.resolve());

Ответ 3



Возможно, такие циклы проще делать с помощью for..of циклов: app.post(path, async (req, res) => { for (const item of [1,2,3]) { await sleep(1000); console.log(item); }) })

Как происходит сравнение ссылок у Integer? [дубликат]

#java #integer


        
             
                
                    
                        
                            На этот вопрос уже дан ответ здесь:
                            
                        
                    
                
                        
                            Как работает оператор проверки на равенство (оператор ==)
                                
                                    (1 ответ)
                                
                        
                                Закрыт 1 год назад.
            
                    
Наткнулся на очень интересный пример:

Integer a1 = 127;
Integer a2 = 127;
Integer a3 = 128;
Integer a4 = 128;
System.out.println(a1 == a2); //true
System.out.println(a3 == a4); //false


Почему?
    


Ответы

Ответ 1



Данные от -128 до 127 находятся в кеше и, при инициализации таким способом, новый объект не создается. Внутри Integer есть private class IntegerCache, там в javadoc можно почитать поподробнее.

Ответ 2



Согласно документации Integer данные от -128 до 127 (включительно) кешируются для Integer, т.е. для этих значений будет возвращена одна и та же ссылка на объект, поэтому сравнение как == работало, т.к. оно для объектов проверяет не равенство значения, а равенство ссылок. Если поискать, то можно найти реализацию метода, который и выполняет то кеширование: public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } В том же классе Integer можно найти реализацию внутреннего приватного класса IntegerCache, в котором задаются границы кеширования.

Как я могу сделать этот hover transition?

#css #css3 #html5 #css_animation


Я пытаюсь повторить этот transition с сайта uber.design:  



Дело в том, что я застрял в обратном transition:   



.un {
  display: inline-block;
}

.un:after {
  content: '';
  width: 0px;
  height: 2px;
  display: block;
  background: black;
  transition: 300ms;
}

.un:hover:after {
  width: 100%;
Underlined Text



    


Ответы

Ответ 1



Все хорошо, но лучше такое решать через before и after, есть возможность перемещать объекты, навешивать анимации итп. Если сделать два псевдокласса то можно сделать так как будто рамка растет вокруг и пропадает также. Описание подходов решения (варианты не единственные это только примеры): Вводное: Все объекты, а именно div и span преобразованы в inline-block, что позволит встраивать их в любое место, без переноса строк, а также добавлены padding для отступов, курсор ассоциируется в poiner и самое главное для этих примеров задано относительное позиционирование position: relative Далее по отдельным примерам: Добавляем блоку псевдоэлемент after который позволит создать далее варианты анимации (1,2,3) этот объект позиционируется absolute слева внизу с шириной в 2px и длинной на весь объект. После остается добавить только вариант анимации, для того чтобы анимация была плавной используем transition задав время анимации в 300ms и отслеживая только свойство transform которое и будет производить анимацию. Последним действием навешиваем transform: scaleX(0) что уменьшит объект на 0 по оси абсцисс (X) для того чтобы анимация была из угла в угол зададим трансформацию от правого нижнего угла(точнее им закончится) transform-origin: right bottom. Последний шаг добавим действия при наведении мышки на родителя, путем задания scaleX(1) и для того чтобы казалось что процесс идет с противоположного угла пока мышка над родителем задается точка трансформирования нижний левый угол. Пример тот же что и первый за исключением того что правый угол верхний склуглен и задана высота 100%. Что позволило сделать эффект выползания и уползания червя ))) Третий пример повторяет второй, только не имеет скругления и позиционируется вверху. Чуть более усложнен, добавлен еще один элемент before который анимируется уже по вертикали. Что позволяет сделать рост их угла. Это еще один вариант решения, в котором для выполнения анимации добавлены 4 элемента span, данных элементов может быть и больше все зависит от задачи. Данные элементы прижаты к краям поочередно, т.к. не задан transform-origin они растут изменяю размер относительно своего центра. div, span{ display: inline-block; position: relative; cursor: pointer; padding: .5rem 1rem; } div::after{ content: ''; position: absolute; bottom: -2px; left: 0; width: 100%; height: 2px; background-color: red; transform: scaleX(0); transform-origin: right bottom; transition: transform 300ms; } div:hover::after{ transform: scaleX(1); transform-origin: left bottom; } div.second::after{ height: 100%; border-top-right-radius: 0; border-top-left-radius: 100%; } div.second:hover::after{ transform: scale(1, 0.1); border-top-right-radius: 100%; border-top-left-radius: 0; transform-origin: left bottom; } div.third::after{ transform-origin: right top; height: 100%; } div.third:hover::after{ transform: scale(1, 0.1); transform-origin: left top; } span.four::after, span.four::before{ content: ''; position: absolute; bottom: -2px; left: 0; width: 100%; height: 2px; background-color: red; transform: scale(0, 1); transform-origin: right bottom; transition: transform 300ms; } span.four::before{ width: 2px; height: 100%; transform: scale(1, 0); transform-origin: righ bottom; left: auto; right: 0; } span.four:hover::after, span.four:hover::before{ transform: scale(1); } span.five span{ transition: transform 300ms; background-color: red; position: absolute; padding: 0; display: block; transition: transform 300ms; } span.five span:nth-child(odd){ width: 2px; height: 100%; bottom: 0; transform: scaleY(0); } span.five span:nth-child(even){ width: 100%; height: 2px; bottom: 0; transform: scaleX(0); } span.five span:nth-child(1){ left: 0; } span.five span:nth-child(2){ left: 0; } span.five span:nth-child(3){ right: 0; } span.five span:nth-child(4){ right: 0; top: 0; } span.five:hover span{ transform: scale(1, 1); }
try me
try me2
try me3

квадрат квадрат

Ответ 2



Можно сделать бордер при помощи псевдоэлемента after, и изначально сделать его нулевой ширины и прижать к правому краю right: 0, а при ховере уже left: 0 и изменять ширину на 100%. Таким образом произойдет следующее: при наведении бордер нулевой ширины прижмется влево и начнет плавно увеличиваться до 100% при уведении курсора бордер вновь прижмется вправо и плавно уменьшится обратно до 0 соответственно, если поменять left и right местами, то эффект будет в обратную сторону .un { display: inline-block; position: relative; } .un:after { content: ''; position: absolute; width: 0; right: 0; bottom: -2px; height: 2px; background: black; transition: 300ms; } .un:hover:after { width: 100%; left: 0; } Underlined Text

Ответ 3



Вы можете использовать градиент и отрегулировать background-position с задержкой, чтобы получить такой эффект: .un { display: inline-block; padding-bottom:2px; background-image: linear-gradient(#000, #000); background-position: 0 100%; /*OR bottom left*/ background-size: 0% 2px; background-repeat: no-repeat; transition: background-size 0.3s, background-position 0s 0.3s; /*change after the size immediately*/ } .un:hover { background-position: 100% 100%; /*OR bottom right*/ background-size: 100% 2px; } Underlined Text Если вам нужна непрерывная анимация при наведении, вы можете попробовать это: .un { display: inline-block; padding-bottom:2px; background-image: linear-gradient(#000, #000); background-position: right -100% bottom 0; background-size: 200% 2px; background-repeat: no-repeat; } .un:hover { background-position: left -100% bottom 0; transition: background-position 0.5s; } Underlined Text Для более подробной информации вы можете прочитать ответ о том, как выполняется вычисление другого значения: https://stackoverflow.com/a/51734530/8620333

std::string vs const std::string& vs std::string_view

#cpp


Что правильнее передавать как аргумент функции(например в конструктор), если там
эта строка будет просто скопирована?
    


Ответы

Ответ 1



Использование любого из альтернативных средств очень сильно зависит от ситуации, и выбирается исходя из конкретных условий. И это относится не только к std::string и std::string_view Для начала определимся с реализацией наших сущностей. Пусть std::string построен на трех указателях по 4 байта каждый (или указатель и два размера): class string { //... pointer * m_begin; //Начало строки pointer * m_end; //Указатель за последний элемент pointer * m_end_of_storage; //Указатель за конец выделенной памяти }; std::string_view при этом реализован с помощью двух указателей (или указатель и размер): class string_view { //... pointer m_data; //Указатель на начало данных pointer m_end; //Указатель за конец данных }; Упрощенно рассмотрим три версии простого кода: void other(std::string); //<-- функция, в которую всегда передается копия. void run(string_view v) //<-- Функция, которая вызывает функцию other { //т.е. эта функция делает ту самую копию объекта other(v); } void general(string str) { //А из этой функции в функцию run передается строка other(str); } Что будет сгенерировано компилятором и как рассматривать не будем, т.к. это сильно зависит от компилятора и параметров компиляции, но постараемся посмотреть что может быть и как. В нашем случае other передает копию string_view, т.е. general копирует два указателя (не говорим о возможности вызова конструктора копирования, подразумевая, что он самый тривиальный и в результирующем коде приведет просто к копированию двух членов класса). Затем строка копируется из string_view. Ничего сложного. Теперь возьмем тот же код, но при этом run будет принимать ссылку на string. void run(string const & v) { other(v); } void general(string str) { other(str); //str используется, её нельзя перемещать в other } Да, Вы правы, передача ссылки в функцию run - быстрая операция, можно считать, что это копирование указателя. Но у передачи ссылки есть и минусы. Один из них - функция run обращается к строке через ссылку, т.е. появляется дополнительный уровень косвенности, который может вылиться в большие затраты, чем "лишнее" копирование указателя в версии функции, принимающей string_view. Теперь рассмотрим третий вариант функции run: void run(string v) { other(std::move(v)); } В данном случае копирование строки происходит еще в функции general (причем мы не перемещаем параметр str, т.к. он где-то там еще нужен далее). Затем функция run перемещает объект v в параметр функции other, а это в нашем случае приводит к копированию трех указателей и занулению старых. Очевидно, что в этом случае операций намного больше, чем со string_view, и, вполне вероятно, что косвенное обращение будет тоже быстрее. То есть это может быть самым тормознутым вариантом. А теперь представим, такую ситуацию: void run(string const &); //<-- имеется такая run void run(string_view); //или такая, нам без разницы class SomeClass { string m_text; mutex m_mutex; void SomeClass::call() { //Мы знаем, что run делает копию строки, //и запускает поток для её обработки lock_quard locker;//объект у нас защищен мьютексом run(m_text);//Где-то там строка копируется и запускается новый поток //мы не знаем точный момент, когда строка скопируется, //поэтому вынуждены ждать выполнения run под защитой мьютекса, //т.к. в other содержаться указатели на защищенные члены нашего класса. //Вполне вероятно, что в этот момент другие //потоки уже хотят работать с нашим объектом, //но не могут, т.к. мьютекс захвачен. } }; Я в комментариях описал проблему. А теперь возьмем ситуацию с копированием и перемещением: void run(string); //<-- теперь run принимает копию class SomeClass { //.. void SomeClass::call() { //Мы знаем, что run принимает копию строки //и запускает поток для её обработки unique_lock locker;//объект у нас защищен мьютексом string text_copy = m_text;//Под защитой выполняем копирование строки locker.unlock();//И разблокируем мьютекс, т.к. run(std::move(text_copy));//нам уже без разницы что-том делает run, //копия данных для него уже создана и другим потокам можно дать доступ к объекту } }; У string_view при этом тоже имеются свои прелести. string_view в принципе не привязан к string - это просто данные и их размер. Т.е. string_view может работать не только с string: void run(string_view v); void general(string str) { other(str);//ok } void general(char const * str, size_t len) { other(string_view(str, len));//ok } void general(char const * str) { other(string_view(str));//ok } void general(std::vector const & v) { other(string_view(v.data(), v.size()));//ok } В случае передачи ссылки придется сделать лишнюю копию строки, в случае передачи копии строки это не страшно, т.к. копия будет перемещена, но это всё равно может быть дороже. Однако, копия строки с перемещением может быть дешевле string_view, если, например для создания string_view потребуется сначала создать строку или какой-то другой буфер с данными. В таком случае будет лучше создать строку и переместить её. Но оптимизации также могут перевернуть всё с ног на голову. Когда нужно сделать копию строки, кажется, что это приведет к аллокации памяти и всё это будет медленно. В общем случае это верно, но есть такая штука, как SSO (small string optimization), которая позволяет хранить маленькие строки прямо в объекте string, используя сам объект как буфер для строки. В случае применения такой оптимизации копирование может оказаться равноценно или даже дешевле перемещения. То есть создав копию в вызывающей функции и переместив строку в вызываемую функцию, Вы если и потеряете скорость, то очень немного. Но это всё относится к ситуации, когда нужна копия на вызываемой стороне. Если же копия не нужна, то вариантов также масса. а для чего тогда стоит использовать string_view? string_view нужен как раз тогда, когда копия строки не нужна, но нужно сослаться на какое-то место и с ним работать как со строкой. Ранее нужно было либо писать свою "обертку" подобную string_view, либо копировать нужные данные из исходной строки и работать с ними. Всё сказанное выше весьма условно и служит только для демонстрации различных ситуаций. Как видите, применение того или иного средства полностью зависит от конкретных условий использования, применяемых алгоритмов, оптимизаций компилятора, устройства библиотеки, платформы на которой всё это работает и т.д., поэтому закончу тем, с чего начал - использование любого из альтернативных средств очень сильно зависит от ситуации, и выбирается исходя из конкретных условий.

Ответ 2



Просто std::string. А потом вместо компирования - перемещать через std::move.

Ответ 3



Если строка будет "просто скопирована", то вам следует реализовывать либо "ленивый" вариант семантики перемещения (передавать std::string по значению и затем делать из него перемещение), либо "полный" вариант семантики перемещения (писать две перегруженных функции: для const std::string & и для std::string &&), либо, возможно, реализовать forwarding (писать шаблонную функцию, принимающую универсальную сслыку и делающую std::forward в вашу копию). См. https://ru.stackoverflow.com/a/822789/182825 std::string_view уместен везде, где вы будете просто анализировать строку, т.е. он является заменителем const std:string & в ситуациях, когда копирование не будет делаться.

Запрос строки из БД выводит нечитабельные символы вместо кириллических

#sql #oracle #кодировка #клиент


Пытаюсь в клиентской программе с помощью запроса к БД:

select 'АБВГДЕЙКА' from dual; 


вывести кирилические символы, но получаю или:  


  ??????????????????


, или квадратики, а так-же другие кракозябры.

Какие пути решения проблемы? 
    


Ответы

Ответ 1



TL;DR Почти без исключений проблема кроется в различных кодировках (charachter set) установленных в программе-клиенте (далее клиент) и в БД. Если кодировки не совпадают, то после получения символьных данных из БД в клиенте производится неявная перекодировка этих данных из кодировки установленной в БД в кодировку установленную в клиенте. Неверно установленная кодировка в клиенте приведёт к неверному отображению символов. Когда перекодировка в кириллицу возможна? Если кодировка в клиенте является подмножеством кодировки в БД, т.е. все символы кодировки на клиенте содержаться в кодировке БД. Например, если в БД установлены: US7ASCII (только 7-ь бит), EE8MSWIN1250 или EE8ISO8859P2 (восточноевропейские языки) и подобные им, то перекодировка невозможна. Многосимвольные кодировки: AL32UTF8, AL16UTF16 и т.п. - не должны вызывать проблем. Как узнать, какая кодировка установлена в БД? select value from nls_database_parameters where parameter = upper ('nls_characterset'); Как установить нужную кодировку в клиенте? Зависит собственно от клиента, но в большинстве случаев, т.к. используют одни и те же библиотеки доступа к БД (OCI, JDBC), действуют установки в следующей последовательности (последовательность важна, из нескольких последняя выиграет): (Только Windows) в реестре: HKLM\SOFTWARE\ORACLE\KEY_[Client_home1]: NLS_LANG=.CL8MSWIN1251 В переменной окружения NLS_LANG WIN: Свойствa системы -> Дополнительно -> Переменные среды или в командном интерпретере: set NLS_LANG=.CL8MSWIN1251 UNIX: ~/.profile или в терминале: export NLS_LANG=.CL8MSWIN1251 Программа-клиент может иметь свои собственные установки, которые перепишут все выше описанные. Значение NLS_LANG состоит из 3-х независимых друг-от-друга частей и имеет форму: language_territory.characterset, например NLS_LANG = AMERICAN_RUSSIA.CL8MSWIN1251. В данной теме интересна последняя часть после точки. Кодировка в клиенте установлена правильно, но увы, куда смотреть дальше? В программе или терминале не установлена поддержка кириллических символов. WIN: в командном интерпретере вывод chcp совпадает с желаемой кодировкой? Попробуйте изменить, например: chcp 1251 UNIX: проверте переменную окружения: env | grep LANG В программе могут быть специальные установки для поддержки различных кодировок, например в SQL Developer: Preferences -> (+) Environment -> Encoding: [ ... ] Установленный шрифт не поддерживает кириллические символы. Попробуйте заменить шрифт по-умолчанию. Кодировка в клиенте изменнена после того, как с предедущей кодировкой были произведены операци изменения (или вставки). Все измененые в БД данные, содержащие кириллические символы - "мусор". Удалите изменения и повторите их после установки правильной кодировки в клиенте. Подробнее в офф. документации.

Как в pandas преобразовать строки в столбцы (PIVOT) по заданным элементам?

#python #pandas #dataframe #numpy #pivot


При решении статистической задачки получаю таблицу CSV с примерно такими данными:

expr  Therapy
100   A
98    B
87    C
97    D
102   C
96    B
92    D
88    A


Преобразовываю в dataframe, чтобы потом оттуда делать графики через matplotlib. Но
перед этим мне надо посчитать статистические показатели для четырех выборок (A, B,
C, D). Можно ли в pandas преобразовать исходную структуру таблицы и получить такую?

A   B   C   D
100 98  87  97
88  96  102 92


Или проще сначала прочитать csv в переменную, сделать словарь, в нем посчитать все
показатели (медиану, внутригрупповой квадрат и т.п.), а потом уже отправлять все в
dataframe?        
    


Ответы

Ответ 1



Попробуйте так: In [7]: res = (df.assign(idx=df.groupby('Therapy').cumcount()) .pivot_table(index='idx', columns='Therapy', values='expr', aggfunc='sum')) In [8]: res Out[8]: Therapy A B C D idx 0 100 98 87 97 1 88 96 102 92 Пошагово: для того чтобы воспользоваться методом DataFrame.pivot_table() нам понадобятся значения, которые будут выступать в качестве индекса строк в результирующей выборке - создаем "на лету" новый столбец idx: In [10]: df.assign(idx=df.groupby('Therapy').cumcount()) Out[10]: expr Therapy idx 0 100 A 0 1 98 B 0 2 87 C 0 3 97 D 0 4 102 C 1 5 96 B 1 6 92 D 1 7 88 A 1 теперь можно воспользоваться pivot_table(): In [11]: df.assign(idx=df.groupby('Therapy').cumcount()).pivot_table(index='idx', columns='Therapy', values='expr', aggfunc='sum') Out[11]: Therapy A B C D idx 0 100 98 87 97 1 88 96 102 92

Ответ 2



Для того, чтобы расчитать различные статистики с группировкой по Therapy необязательно разворачивать DataFrame: In [20]: df.groupby('Therapy')['expr'].agg(['median', 'sum', 'std']) Out[20]: median sum std Therapy A 94.0 188 8.485281 B 97.0 194 1.414214 C 94.5 189 10.606602 D 94.5 189 3.535534

Как при сохранения данных в CSV добавить текущее время в имя файла?

#python #python_3x #datetime


Я сохраняю данные в CSV:

exact = pd.DataFrame(exact, columns=['dicclientid','code', 'user_name','action_date'])
exact.to_csv('exact.csv', sep=';')


Как в название файла всегда добавлять текущее время?
    


Ответы

Ответ 1



Например: from datetime import datetime ... # Пример: exact_02042019_130203.csv file_name = 'exact_{}.csv'.format(datetime.now().strftime("%d%m%Y_%H%M%S")) exact.to_csv(file_name, sep=';') Таблицу с форматами даты можно посмотреть тут: https://docs.python.org/3.6/library/datetime.html#strftime-and-strptime-behavior

Ответ 2



Еще один вариант похожий на ответ @gil9red, но с использованием Literal String Interpolation (PEP 498) для Python 3.6+: In [287]: from datetime import datetime as DT In [288]: file_name = f'exact_{DT.now():%Y-%m-%d_%H-%M}.csv' In [289]: print(file_name) exact_2019-04-02_12-06.csv

Ответ 3



Можно использовать pandas.Timestamp - эквивалент datetime в Pandas. current_time = pd.Timestamp('now').strftime("%Y-%m-%d_%H-%M") fname = 'exact_{}.csv'.format(current_time) exact.to_csv(fname, sep=';')

Анимация появления текстового символа

#css #css3 #html5 #svg #css_animation


У меня есть svg изображение буквы А которая составлена из трех элементов:
двух параллелограммов и прямоугольника - перекладины.  

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




  
    
 
     
    




    


Ответы

Ответ 1



Вот вариант, где opacity считается по дельта времени между кадрами. let left = document.querySelector('#left') let right = document.querySelector('#right') let rect1 = document.querySelector('#rect1') let time = 3000; // время анимации let delay = 1000; // задержка перед анимацией // dt - кол-во миллисекунд с начала анимации function animate(dt) { let v = dt - delay; opacity(left, v/time*3); opacity(right, v/time*3 - 1); opacity(rect1, v/time*3 - 2); dt < time + delay + 50 && requestAnimationFrame(animate) } function opacity(el, v) { v = Math.min(1, Math.max(v, 0)); // приводим к диапазону 0-1 el.setAttribute('opacity', v) } requestAnimationFrame(animate);

Ответ 2



Вот такой вот эффект c background-image и keyframes. Для этого группа фигур из оригинала была переделана в маску для прямоугольника. В ходе выполнения было замечено что у оригинала svg viewbox и width, height перепутаны...

Ответ 3



.letter { width:200px;height:auto; stroke-width:2.5; stroke:#000; fill:none; stroke-dasharray: 0 24; } .animateFirst { animation: 0.5s animateFirst ease-in forwards; } .animateSecond { animation: 0.2s 0.45s animateSecond ease-out forwards; } @keyframes animateFirst { to { stroke-dasharray: 24 24; } } @keyframes animateSecond { to { stroke-dasharray: 6 24; } } Источник ответа:@web-tiki

Ответ 4



SVG решение Все элементы анимации в начале невидимы fill-opacity="0" Анимация появления одного элемента: Последовательность выполнения анимаций достигается цепочкой условиё в атрибуте begin="an_left.end" Такая запись означает что анимация правого прямоугольника начнется только после окончания анимации левого многоугольника Ниже полный код: .container { width:35%; height:35%; }
CSS решение .container { width:35%; height:35%; } #left,#right, #rect1 { fill-opacity:0; fill:#008080; } #left { animation:anLeft 0.3s ease forwards; animation-delay: 0.1s; } @keyframes anLeft { 100% { fill-opacity:1; } } #right { animation:anRight 0.3s ease forwards; animation-delay: 0.4s; } @keyframes anRight { 100% { fill-opacity:1; } } #rect1 { animation:anRect 0.3s ease forwards; animation-delay:0.7s; } @keyframes anRect { 100% { fill-opacity:1; } }
Второй вариант .container { width:35%; height:35%; }
Click me
Источник ответа:@Alexandr_TT

как продублировать все элементы динамического массива (вектора) в C++?

#cpp


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


  исходный вектор: 12 56 -7 89 4 0 11 -6;
  
  результат: 12 12 56 56 -7 -7 89 89 4 4 0 0 11 11 -6 -6.


Я решил воспользоваться методом insert(), предварительно объявив итератор. Но программа
выдает ошибку. Насколько я знаю, метод insert(p, x) вставляет значение x ПЕРЕД элементом,
на который указывает итератор p и возвращает итератор на вставленный элемент, поэтому
я сделал шаг p + 2 чтобы добраться до следующего элемента, а иначе, при использовании
обычного инкремента, итератор вставал бы на элемент, который уже был продублирован.
Возможно, я неправильно понимаю, как работает метод insert() и как функционируют итераторы. 

Вот цикл, который должен дублировать элементы вектора:

for (auto p = ivec.begin(); p != ivec.end();)
{


    ivec.insert(p, *p);
    p + 2;


} 


ivec - вектор,
p - итератор

Вывод программы:


  free(): invalid pointer
  
  Aborted (core dumped)

    


Ответы

Ответ 1



Влезу и я со своими 5 копейками. При таком варианте у вас будет O(N^2) перемещений элементов, что не слишком хорошо. Я бы создал новый вектор удвоенного размера и простым циклом переписал все элементы, т.е. выполнив операцию за O(N). Потом можно просто выполнить перемещение данных. Примерно так void dbl(vector&v) { vector n; n.reserve(v.size()*2); for(auto i: v) { n.push_back(i); n.push_back(i); } v.swap(n); } int main(int argc, const char * argv[]) { vector v { 1,2,3,4,5,6,7,8,9,10 }; for(auto i: v) cout << i << " "; cout << endl; dbl(v); for(auto i: v) cout << i << " "; cout << endl; } Update Как обычно, проведем эксперимент :) Итак, три версии - моя, AR Hovsepyan, со вставкой. Для int и тормознутого класса (тормознутость имитируется небольшой задержкой). Так как задержка тормозит конкретно, для int - 100000 элементов, для тормозов - 1000. Полный код эксперимента приведен ниже. Результаты для 100000 int: Мой код 533 mks Код ARH 419 mks Вставка 640601 mks Для тормозов в 1 нс :) Мой код 6826 mks Код ARH 40797 mks Вставка 1418118 mks В общем, что и требовалось доказать... Полный код: #include #include #include #include #include #include using namespace std; template void dblHW(vector&v) { vector n; n.reserve(v.size()*2); for(auto i: v) { n.push_back(i); n.push_back(i); } v.swap(n); } template void dblAR(vector& v) { vector t(v.size() * 2); int j = 0; for(T i : v) { t[j] = t[j + 1] = i; j += 2; } v.swap(t); } template void dblIns(vector& v) { for(size_t i = 0; i < v.size(); i+=2) v.insert(v.begin()+i,v[i]); } class Tormoz { #define delay this_thread::sleep_for(1ns) public: Tormoz(int i = 0):i(i) { delay; } ~Tormoz() { delay; } Tormoz& operator = (const Tormoz& t) { i = t.i; delay; return *this; } Tormoz(const Tormoz& t) : i(t.i) { delay; } Tormoz(Tormoz&& t) : i(t.i) { delay; } int i; }; bool operator == (const Tormoz& a, const Tormoz& b) { return a.i == b.i; } class muTimer { using Clock = std::chrono::high_resolution_clock; bool active = false; Clock::duration duration_; Clock::time_point start_ = Clock::now(), stop_ = Clock::now(); muTimer(const muTimer&) = delete; muTimer& operator=(const muTimer&) = delete; public: using ns = std::chrono::nanoseconds; using mks = std::chrono::microseconds; using ms = std::chrono::milliseconds; muTimer() { reset(); start(); } ~muTimer() = default; muTimer& reset() { duration_ = std::chrono::nanoseconds(0); active = false; return *this; } muTimer& start() { if (!active) { start_ = Clock::now(); active = true; } return *this; } muTimer& stop() { if (active) { stop_ = Clock::now(); duration_ += stop_ - start_; active = false; } return *this; } template unsigned long long duration() { return static_cast (std::chrono::duration_cast(stop_-start_).count()); } }; int main(int argc, const char * argv[]) { { vector a; for(int i = 0; i < 100000; ++i) a.push_back(rand()); vector b = a, c = a; //for(int i : a) cout << i << " "; cout << endl; { muTimer m; dblHW(a); m.stop(); cout << "HW: " << m.duration() << " mks\n"; } { muTimer m; dblAR(b); m.stop(); cout << "ARH: " << m.duration() << " mks\n"; } { muTimer m; dblIns(c); m.stop(); cout << "Ins: " << m.duration() << " mks\n"; } assert(a == b && b == c); } { vector a; for(int i = 0; i < 1000; ++i) a.push_back(rand()); vector b = a, c = a; //for(int i : a) cout << i << " "; cout << endl; { muTimer m; dblHW(a); m.stop(); cout << "HW: " << m.duration() << " mks\n"; } { muTimer m; dblAR(b); m.stop(); cout << "ARH: " << m.duration() << " mks\n"; } { muTimer m; dblIns(c); m.stop(); cout << "Ins: " << m.duration() << " mks\n"; } assert(a == b && b == c); } }

Ответ 2



http://www.cplusplus.com/reference/vector/vector/insert/ - "Iterator validity" p = ivec.insert(p, *p);

Ответ 3



Предложу другой вариант(без вызовов функций) ответа Harry void dbl(std::vector& v) { std::vector t(v.size() * 2); int j = 0; for (int i : v) { t[j] = t[j + 1] = i; j += 2; } v.swap(t); } P.S. А если вы часто пользуетесь вставками и удалением, то std::list кандидат получше вектора

Ответ 4



https://ideone.com/RCUR7N #include #include using namespace std; template void duplicate(vector &v) { size_t n = v.size(); v.resize(n << 1); for (size_t q=n-1; ~q; --q) { v[(q<<1)|1] = v[q]; v[q<<1] = move(v[q]); // should work for 0 } } int main(int argc, const char * argv[]) { vector v { 1,2,3,4,5,6,7,8,9,10 }; for(auto i: v) cout << i << " "; cout << endl; duplicate(v); for(auto i: v) cout << i << " "; cout << endl; }

Как определить, есть ли в сообщение “-”

#javascript


Я создаю бота в дискорде, и хочу что бы он в сообщение проверял есть ли там "-",
сколько бы я не пытался у меня не получается это сделать

Мой не рабочий код

let one = args[0];
if(!one) return;

if(one == message.content(/-/)) return message.reply("Минус не допустим)

    


Ответы

Ответ 1



Регулярки в данном конкретном случае не обязательны. ES6: var str = 'Быть или не быть-вот в чём вопрос.'; var str2 = 'нет дефисов.'; console.log(str.includes('-')); console.log(str2.includes('-')); includes - проверяет, содержит ли строка заданную подстроку, и возвращает, соответственно true или false. C помощью indexOf: var str = 'Быть или не быть-вот в чём вопрос.'; var str2 = 'нет дефисов.'; console.log(str.indexOf('-') !== -1); console.log(str2.indexOf('-') !== -1);

Ответ 2



Используйте регулярный выражения Например в вашем случае поможет if((message.content).match(/-/g).length) return message.reply("Минус не допустим)

Ответ 3



if (message.content.indexOf("-") !== -1) return message.reply("Минус недопустим")

На чистом js можно найти предка n-уровня?

#javascript #html


Сейчас, чтобы найти нужного мне предка, я пишу elem.parentElement.parentElement.parentElement.parentElement. 

1) А можно как-то поизящнее?

2) И другой вопрос: есть такая структура:

Как узнать id table (в данном случае это "some"), если известен input#myInput? Спасибо!


Ответы

Ответ 1



let elem = document.getElementById("myInput"); let elemId = elem.closest('table').id; // table id = some... По сути, через тот же closest() можно искать и родителя, тут в зависимости от ситуации варианты рассматривать надо

Ответ 2



Есть метод closest, который помогает искать родителя по какому-то селектору. В случае с вашей таблицей: const input = document.getElementById('myInput'); const table = input.closest('#some'); if (table) { console.log('Parent of input is: ', table); }
Полезные ссылки closest

Ответ 3



Closest не поддерживается IE, так что в дополнение к другим ответам - полифил: if (!Element.prototype.closest) { Element.prototype.closest = function(css) { var node = this; while (node) { if (node.matches(css)) return node; else node = node.parentElement; } return null; }; }

Ответ 4



Если нужен именно n родительский элемент, то можно написать свою функцию: const nParent = (node, n) => { while (node) { if (n-- <= 0) return node; else node = node.parentElement; } return null; } const x6 = document.getElementById('x6'); console.log(nParent(x6,0)); console.log(nParent(x6,1)); console.log(nParent(x6,2)); console.log(nParent(x6,3)); console.log(nParent(x6,4)); console.log(nParent(x6,5)); console.log(nParent(x6,6)); console.log(nParent(x6,7)); console.log(nParent(x6,8));


В Chrome не работает анимация атрибута offset для линейного градиента

#javascript #css #svg #css_animation #svg_animation


Отвечая на вопрос: Как анимировать градиентную непрозрачность в SVG? 

столкнулся со странным поведением анимации атрибута offset 

Ниже код, который прекрасно работает в Firefox, но любые попытки анимировать атрибут
offset линейного градиента окончились ничем. 

Подойдут любые решения данной проблемы с помощью: SVG, CSS, CSS3, JS 



  

 
 
  
	
	
	   
	    
      
    
        
		 
     



	




Пробовал также использовать проценты и gradientUnits ="objectBoundingBox"



  

 
 
  
	
	
	   
	    
      
    
        
		 
     




	


 

Но это не принесло положительного результата в Chrome   

В Firefox и этот вариант работает отлично.
    


Ответы

Ответ 1



Вот решение на JS, тут нужна зависимость от времени, по которой мы будем менять атрибут: requestAnimationFrame(animateOffsets); // если функция вызвана как колбек requestAnimationFrame, // то первым аргументом у нее идет время от старта сцены function animateOffsets(t) { requestAnimationFrame(animateOffsets); t = t%5000/5000; // будет меняться от 0 до 1 в течение 5 секунд t = Math.sin(t*Math.PI*2); // будет менятся от -1 до 1 stop1.setAttribute('offset', `${50 + t*50}%`); }

Ответ 2



Решение CSS Вот идея только с CSS, где вы можете полагаться на два градиента и translation/opacity animation, чтобы добиться нужного эффекта: .box { border-radius:20px; width:200px; height:200px; position:relative; z-index:0; overflow:hidden; } .box:before, .box:after{ content:""; position:absolute; bottom:0; right:0; width:220%; height:220%; animation:translate 2s infinite linear alternate; } .box:after { background: linear-gradient(to bottom right,dodgerblue 0%,white 40%,gold 60%); animation-name:translate,show; opacity:0; } .box:before { background: linear-gradient(to bottom right,dodgerblue,white 50%,gold 50%); } @keyframes translate{ from { transform:translate(48%,48%); } } @keyframes show{ 30%,85% { opacity:1; } }
Источник ответа: @Temani Afif

Ответ 3



Опубликовал аналогичный вопрос на англ. SO Предложили интересное решение, - заменить проценты в параметре values="100%;0%;100%" на values="1;0;1" И это решение стало работать в Chrome: Источник ответа: @enxaneta

Алгоритм перехода в другую систему счисления

#алгоритм #любой_язык #системы_счисления


имеется следующий алфавит


  A=1; B=2; C=4;


Число 10, например, переводится как CCB, число 7 как CBA.
Как может выглядеть алгоритм, который преобразует число новую систему с наименьшим
числом символов (должно быть не AAAAA, а CA) На любом языке ответ приемлем, заранее
спасибо)
    


Ответы

Ответ 1



В данном случае вполне применим жадный алгоритм - сначала набираете делением с остатком наибольшие единицы (C), затем меньшие (B) и потом совсем малые(A). Типа 11 - сколько можно набрать C? только 2, итак - CC, остается 3. Его можно представить одним B с остатком 1 - итак, CCB и остаток 1 - т.е. A, так что окончательно - CCBA. Надо сказать, что такой жадный алгоритм годится не для всех наборов, но в вашем случае проходит. Думаю, закодировать проблемы быть не должно... P.S. Так, как вы сформулировали - это задача о размене, но не о переходе в другую систему счисления...

Ответ 2



Например на Питоне с использованием словаря алфавита: alph = {4: 'C', 2: 'B', 1: 'A'} x = int(input()) answ = '' Keys = list(alph.keys()) for k in Keys: a = x // k answ += a * alph[k] x -= a * k

Ответ 3



Просто опишу: дано число X Делим на цело Х на 4: d = X div 4 В результирующую строку вставляем d cимволов С Остаток от деления Х на 4: m = X mod 4 Берем остаток от деления m на 2: m1 = m mod 2 и частное d1 = m div 2 Если d1 равно 1, добавляем в результирующую строку В, если равно нулю, то ничего Если m1 равно 1, добавляем в результирующую строку A, если равно нулю, то ничего

Ответ 4



Решение на python-3.7: ALPH = {4: 'C', 2: 'B', 1: 'A'} def convert(num: int) -> str: assert num >= 1 new_num = '' for key in ALPH: while num >= key: num -= key new_num += ALPH[key] return new_num print(convert(int(input()))) Тесты: print(convert(11)) # CCBA print(convert(10)) # CCB print(convert(7)) # CBA

Тест производительности “операторы Python” против SymPy и numexpr

#python #python_3x #оптимизация #sympy


Насколько расчеты встроенными операторами Python быстрее, чем расчет по формуле SymPy
и numexpr?
    


Ответы

Ответ 1



Как на счет использования анаболиков numexpr? from itertools import combinations import numpy as np import numexpr as ne lst = list(combinations(range(1, 23), 6)) X = np.array(lst) formula = """(a+b)*c-(d/e)**f""" def std_op(lst): result = [] for i in lst: result.append((i[0]+i[1])*i[2]-(i[3]/i[4])**i[5]) return result def anabolics(X, formula): d = { "a": X[:, 0], "b": X[:, 1], "c": X[:, 2], "d": X[:, 3], "e": X[:, 4], "f": X[:, 5], } return ne.evaluate(formula, d) тесты: In [17]: sum(std_op(lst)) Out[17]: 8083104.010504639 In [18]: anabolics(X, formula).sum() Out[18]: 8083104.01050503 скорость: In [19]: %timeit std_op(lst) 44.1 ms ± 1.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) In [20]: %timeit anabolics(X, formula) 590 µs ± 14.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) вывод: numexpr + numpy в ~75 раз быстрее Vanilla Python: In [21]: 44.1*1000 / 590 Out[21]: 74.7457627118644

Ответ 2



Код теста: from itertools import combinations from sympy import symbols lst = list(combinations(range(1, 23), 6)) a, b, c, d, e, f = symbols('a b c d e f') formula = (a+b)*c-(d/e)**f print(formula) def std_op(lst): result = [] for i in lst: result.append((i[0]+i[1])*i[2]-(i[3]/i[4])**i[5]) return result def sympy(lst): result = [] for i in lst: result.append(formula.subs(zip([a, b, c, d, e, f], i)).n()) return result %timeit std_op(lst) result = std_op(lst) print(len(result), result[0], result[-1]) %timeit sympy(lst) result = sympy(lst) print(len(result), result[0], result[-1]) Результат теста: c*(a + b) - (d/e)**f 19.3 ms ± 205 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 74613 8.737856 664.6581501289133 18.4 s ± 81 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 74613 8.73785600000000 664.658150128913 Итог: Операторы Python победили с результатом: 19.3 ms против 18.4 s 18 секунд! Таким образом, можно сделать вывод, что SymPy лучше не использовать в виде "калькулятора".

Анимация логотипа

#html #css #css3 #html5 #вёрстка




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

Рассматривает 2 варианта:

1) Запустить крутиться планету — тогда нужно искать для нее полную модель глобуса
и чтобы она начинала крутиться с такого ракурса материков, как сейчас изображено на
лого. Таким образом планета будет крутиться, а буквы "Мир принадлежит тебе" будут стоять
на месте. Крутиться в левую сторону — тогда создается эффект, что дирижабль летит вокруг
земного шара.

2) Если планету запустить не получится, тогда нужно запустить надпись "Мир принадлежит
тебе", тоже с прокруткой в левую сторону вокруг планеты.

Скажите, насколько реально сделать эти два варианта с помощью CSS, или для этого
нужно использовать другие какие-то технологии/программы?
    


Ответы

Ответ 1



Вот Вам планетка на svg+d3.js, при желании сюда не трудно добавить интерактивность const s = 600; const svg = d3.select('svg'); const projection = d3.geoOrthographic().translate([s / 2, s / 2]); const path = d3.geoPath().projection(projection); const url = 'https://gist.githubusercontent.com/mbostock/4090846/raw/d534aba169207548a8a3d670c9c2cc719ff05c47/world-110m.json'; fetch(url).then(r => r.json()).then(d => { svg.selectAll("path.country") .data(topojson.feature(d, d.objects.countries).features) .enter() .append("path") .classed("country", true) .style("stroke", "#888") .style("fill", (d, i) => '#e3edb8'); }) requestAnimationFrame(draw) function draw(t) { projection.rotate([0.01 * t]); svg.selectAll("path.country").attr("d", path); requestAnimationFrame(draw) }; body, svg { overflow: hidden; margin: 0; width: 100vw; height: 100vh; }

Ответ 2



Заставить крутиться планету можно без всяких JS и гифок. Ищете изображения, собираете в одно, делаете анимацию путем сдвига частей изображения внутри блока (например, меняете background-position). Заставить крутиться текст можно с помощью CSS-трансформаций. transform3d и анимация вам в помощь.

Самый частый символ

#python #python_3x


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


Ответы

Ответ 1



from collections import Counter word = 'приоритет' c = Counter(word) print(c.most_common(1)[0][0]) Т.к. метод most_common возвращает список самых частых значений (даже если мы запросили одно самое частое значение), то нужно взять первый элемент (для этого нужен первый [0]). Каждый элемент в этом списке - пара (элемент, количество), поэтому нужно взять первый элемент еще раз. Вообще, в слове "приоритет" есть 3 буквы, которые встречаются по два раза (р, и, т), выведет только одну из них (у меня вывело "р"). Вариант решения без использования Counter: word = 'приоритет' # Подсчитываем количество вхождений каждой буквы в слове c = dict() for letter in word: c[letter] = c.get(letter, 0) + 1 # .get(letter, 0) вернет значение по ключу letter или 0, если такого ключа нет print(c) # {'п': 1, 'р': 2, 'и': 2, 'о': 1, 'т': 2, 'е': 1} # Выводим ключ, которому соответствует наибольшее из значений # (точнее, один из таких ключей) print(max(c.items(), key=lambda item: item[1])[0]) # р

Ответ 2



Решение без использования модуля Counter: text = "приритет" #выбираем буквы letters = set(text) #считаем буквы count = [] for letter in letters: count.append((text.count(letter), letter)) count.sort(reverse=True) print (count) print(count[0][1]) вывести все буквы с одинаковым количеством вхождений, думаю, сам сможешь. а этот код выведет: [(2, 'т'), (2, 'р'), (2, 'и'), (1, 'п'), (1, 'е')] т Благодаря наставлению старших товарищей (см. примечание @gil9red), напишу более понятный для наметаного глаза вариант кода без Count: text = "приритет" #считаем буквы count = sorted([(text.count(letter), letter) for letter in set(text)], reverse=True) print (count) print(count[0][1]) Правда, изящно и почти по английски? просто читаешь.. "счетчик равен отсортированному по убыванию списку составленному для каждой буквы из набора букв исходного текста. Причем каждый элемент этого списка состоит из пары: (количество буквы в тексте, буква) Такой себе однострочный функциональный вариант...

Объектно-ориентированный код в C

#ооп #c


Поскольку OO - это шаблон программирования, а не неотъемлемое свойство языка, он
должен быть применим и к C. Как пишут ОО-код в C, когда это нужно и когда нельзя задействовать
C++?     


Ответы

Ответ 1



Ну, суть сказали - использовать структуры для хранения контекста конкретных объектов. И передавать соответствующую структуру аргументом в функции. Которые уже будут работать с этой структурой как с классом =3 Пример: typedef struct { // контекст объекта с чем угодно внутри int x; int y; } nya; typedef nya * pnya; void nya_construct (pnya this) // конструктор { this->x = 0; this->y = 0; } void nya_incx (pnya this) // метод 1 { this->x++; } void nya_decy (pnya this) // метод 2 { this->y--; } int main (void) // использование { pnya first = (pnya)malloc(sizeof(nya)); // объект 1 pnya second = (pnya)malloc(sizeof(nya)); // объект 2 nya_construct(first); // конструируем nya_construct(second); nya_incx(first); // исполняем метод в контексте объекта 1 free(first); // удаляем. Деструктора нет, его не вызываем free(second); } Ну, в таком духе.

Ответ 2



Ну и вопросик. Как пишут - не знаю, объяснить тем более не смогу. Но могу назвать классический пример - библиотека графических виджетов Tk (из известной связки Tcl/Tk). На классику ООП весьма похоже, написано на C, исходники открыты и статей куча. Но энтузиазм с этим знакомиться должен быть свой.

Ответ 3



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

Ответ 4



У меня был случай, когда писался ОО-код на C. Делался WDM драйвер. Для драйвера возможен только C-код. Драйвер был для звука на основе AC-Link. Поскольку есть много разных кодеков, а набор используемых методов очень близок, то была реализован упрощенный COM-подобный интерфейс. Вся реализация строилась на структурах подобного типа struct SomeType { void *pContext; void (*pFunc)(void *pContext); }; где pContext - это укатель на экземпляр структуры.

Ответ 5



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

Ответ 6



В таком случае нужно обязательно посмотреть библиотеку Gtk. Написана на Си, но при этом объектно-ориентированная. Следующие три страницы помогут разобраться: 1, 2, 3.

Ответ 7



Есть классы и структуры. Классы по дефолту - private, а структуры - public. Используя структуры можно писать те же классы, только кода будет на пару строчек больше... Ну и с освобождением памяти нужно будет чуть больше повозиться. Кажется нигде не наврал :)

Ответ 8



Назад к истокам?! :) Читайте про "C с классами" и "Objective C".

Будет ли утечка памяти, если конструктор бросит исключение?

#память #cpp


Есть некая фабрика:

TBar * foo()
{
    return new TBar();  // здесь конструктор TBar бросает исключение
}


Если конструктор TBar бросит исключение, мы получим утечку памяти, выделенной для
нового объекта TBar. Верно?
    


Ответы

Ответ 1



Нет, неверно. Если не рассматривать выделения памяти внутри конструктора TBar, то утечек не будет. В языке C++ объект считается созданным только в тот момент, когда его конструктор завершит выполнение без ошибок. Здесь этого не происходит, поэтому объект никогда не был создан, а, значит, и память под него "как бы" не выделялась. Т.е. компилятор обязан корректно освободить память, в которой будет находится объект, в случае исключения в его конструкторе.

Ответ 2



Вот что написано в стандарте С++ 2011 15.2.2 An object of any storage duration whose initialization or destruction is terminated by an exception will have destructors executed for all of its fully constructed subobjects (excluding the variant members of a union-like class), that is, for subobjects for which the principal constructor (12.6.2) has completed execution and the destructor has not yet begun execution. Similarly, if the non-delegating constructor for an object has completed execution and a delegating constructor for that object exits with an exception, the object’s destructor will be invoked. If the object was allocated in a new-expression, the matching deallocation function (3.7.4.2, 5.3.4, 12.5), if any, is called to free the storage occupied by the object. В общем, если конструктор был прерван исключением, то вызываются деструкторы всех уже созданных объектов, а динамическая память, выделенная под основной класс, будет освобождена соответствующим delete. Итого, утечки не будет, в том числе и при наличии базового класса, если, конечно, нет внутренних утечек памяти.

Ответ 3



Утечка будет, если у класса TBar есть хотя бы один базовый класс. В этом случае, если будет брошено исключение в конструкторе TBar, то деструкторы для всех базововых классов вызваны не будут. Поскольку объект еще полностью не был создан. Если есть опасение, что в конструкторе будет сгенерировано исключение и это приведет к фатальным последствиям для программы, то рекомендуется весь код всех конструкторов помещать в блог try. И придумать способ извещения о корректности создания объекта (типа IsValid()). TBar::TBar() { try { ... } catch (...) { } }

Ответ 4



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

Эффективная замена std::vector?

#cpp


Есть набор элементов, примерно 27 миллионов типа float. Необходимо, что бы все элементы
хранились в памяти. Используется std::vector. С элементами из vector производятся различные
операции. Доступ по индексу. 
Есть ли способ по-другому организовать хранение информации, поскольку вычислений
с данными много, а обращение через vector.at медленное?
    


Ответы

Ответ 1



Используйте прямую индексацию через перегруженный оператор []. В методе vector::at есть проверки на корректность индекса - это может уменьшать производительность. Сам по себе std::vector достаточно быстр - не хуже по производительности обычного динамического массива.

Ответ 2



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

Ответ 3



Нашёлся метод, позволяющий ускорить вычисления. Он не связан с изменением алгоритма программы. Проведена компиляция с помощью Intel C++ Compiler с включением оптимизаций под конкретный процессор. Скорость обработки увеличилась примерно в 12 раз по сравнению с билдом без оптимизаций. Выходные данные идентичны.

Ответ 4



Если Вы используете std::vector<> исключительно для доступа к элементам по индексу (через at()), то стоит подумать об использовании обычных ("сишных") массивов. Тогда, поскольку операции на массивами в С/С++ де-факто (да и де-юре) являются арифметикой над указателями, Вы получите именно скорость доступа O(1) и заметно меньшую, чем в случае с std::vector<>.at(). Недостатки: придется вспомнить malloc() :-) а если возможно изменение размеров - то и realloc() никто за Вас не будет контролировать выход за пределы массива. Безусловно, перегруженный [] в std::vector практически решает проблему, но вот вопрос более философский - стоит ли использовать более "сложную" структуру данных? Успехов!

Как работают argc и argv

#cpp #c


Расскажите, пожалуйста, о принципе работы аргументов argc и argv в C/C++.
    


Ответы

Ответ 1



Первая типа int хранит количество передаваемых параметров, один из параметров - это обязательно имя программы (абсолютный путь), далее уже могут быть ваши параметры, если это ваша программа. argv - это обычно массив char, но сейчас уже _TCHAR, причем указателей, но _TCHAR обычно в IDE стоит как char, там уже имена переданных параметров, один - это программа, а остальные - это уже их порядок. Пример: hello.exe -param1 -param2 argc = 3 argv[0] = hello.exe argv[1] = -param1 argv[2] = -param2 Вот я только с путем подзабыл. Если что, книга есть "Пахомов Visual C\C++ 2010", я там такое вычитывал.

Ответ 2



argv - это массив указателей на нуль-терминированные строки, содержащие параметры командной строки, с которыми вызывалась ваша программа. Если argc больше нуля, то argv[0] содержит указатель на имя вашей программы. В каком виде это имя представлено - зависит от реализации. Если имя программы не предоставляется, argv[0] будет указывать на пустую строку (т.е. не может быть нулевым указателем). Если argc больше единицы, то элементы argv[1]...argv[argc - 1] содержат указатели на параметры командной строки. Размер этого массива - argc + 1 (а не argc, как часто ошибочно полагают). При этом гарантируется, что argv[argc] содержит нулевой указатель. Таким образом для того, чтобы найти конец массива argv, вы можете как пользоваться значением argc, так и просто просматривать массив argv до встречи с первым нулевым указателем. В языке С разрешается модифицировать как элементы массива argv, так и сами строки, указуемые элементами массива argv (разумеется, в пределах исходной длины строки). В языке С++ такого разрешения явным образом не дается.

Ответ 3



argc - 1 равно количеству аргументов, переданных программе в командной строке. argv[1] ... argv[argc - 1] - сами аргументы. argv[0] - имя программы, как ввели его в командной строке.

Список файлов в директории и ее поддиректориях

#cpp


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


Ответы

Ответ 1



FindNextFile. Не уверен, что подойдет, но что вот если воспользоваться этой функцией? Имя найденного файла можно выдернуть из структуры WIN32_FIND_DATA, примерно будет так: вызываем FindFirstFile, находим файл, а потом вызываем FindNextFile. void Copy(LPCTSTR szInDirName, LPCTSTR szOutDirName, bool flag = false) { WIN32_FIND_DATA ffd; HANDLE hFind; TCHAR szFind[MAX_PATH + 1]; TCHAR szInFileName[MAX_PATH + 1]; TCHAR szOutFileName[MAX_PATH + 1]; lstrcpy(szFind, szInDirName); // Ищем файлы с любым именем и расширением lstrcat(szFind, L"\\*.*"); hFind = FindFirstFile(szFind, &ffd); do { // Формируем полный путь (источник) lstrcpy(szInFileName, szInDirName); lstrcat(szInFileName, L"\\"); lstrcat(szInFileName, ffd.cFileName); // Формируем полный путь (результат) lstrcpy(szOutFileName, szOutDirName); lstrcat(szOutFileName, L"\\"); lstrcat(szOutFileName, ffd.cFileName); // Если flag == true, то копируем и папки if(flag) { if(ffd.dwFileAttributes & 0x00000010) { if(lstrcmp(ffd.cFileName, L".") == 0 || lstrcmp(ffd.cFileName, L"..") == 0) continue; CreateDirectory(szOutFileName, NULL); Copy(szInFileName, szOutFileName); } } // Иначе пропускаем папки else if(ffd.dwFileAttributes & 0x00000010) continue; CopyFile(szInFileName, szOutFileName, TRUE); } while(FindNextFile(hFind, &ffd)); FindClose(hFind); } Это пример, просто, ищет файлы в одной директории, подкаталоги, копирует во вторую. Конечно, это не так хорошо, как выше совет, но все таки работает.

Ответ 2



Есть библиотека boost::filesystem. В качестве примера программа выводит все файлы с расширением cpp в текущей директории: #include #include namespace fs = boost::filesystem; int main() { for (fs::recursive_directory_iterator it("./"), end; it != end; ++it) { if (it->path().extension() == ".cpp") { std::cout << *it << std::endl; } } return 0; }

Zend vs .NET

#net #zend_framework #php


Какой фреймворк лучше учить для создания небольших и не очень больших проектов? Опишите
все плюсы и минусы, которые Вы видите в asp.net,ado.net и php, а именно zend. Представьте
пожалуйста результат сравнения их трудности в обучении и востребованности на рынке. 
Заранее спасибо!    


Ответы

Ответ 1



.NET (дотнет) платформа, вкупе с технологией доступа к данным ADO.NET - одно из лучших решений для разработки с точки зрения программиста. Очень удобна в разработке и отладке. Продуманная в смысле обновления отдельных элементов проекта. Огромная библиотека классов. Работа на ней более высокооплачиваемая (обычно раза в два). Лучшая из испробованных мной IDE - MS Visual Studio звточена как раз под .NET. Достаточно востребован. Но. Это дорогая в смысле развертывания платформа. Учитывая стоимость Windows-сервера и родного для ADO.NET MSSQL - очень дорогая. MONO (линуксовая альтернатива .NET) вряд ли когда догонит оригинал в плане производительности, укомплектованности и стабильности работы. PHP. Что язык, что платформа, что инструменты разработки оставляют желать сильно лучшего. Если C# я мог бы назвать одним из лучших языков, то PHP - один из худших, начиная недоделанным ООП и заканчивая странными конструкциями. Тем не менее. PHP + Linux + Apache + PostgerSQL - это вполне работоспособная и совершенно бесплатная платформа с неслабым комьюнити (что немаловажно). Не привожу в качестве альтернативного решения MySQL, так как не вижу в данной СУБД ни одного плюса, а минусов в ней просто море. Самый существенный плюс PHP - очень низкий порог вхождения в технологию. В разы ниже чем для .NET или Java. Соответственно, вы намного быстрее можете приступить к работе, если начинать с нуля. Весьма востребован на рынке. PHP фреймворки. Zend, Codeigniter, Kohana, Yii и прочие производные MVC-паттерна. Разница между ними довольно относительная. Про Zend хорошего можно сказать только то, что в нем уйма всяких библиотек, значительно больше чем в остальных (но он очень громоздкий). Во всем прочем Zend ничем не лучше альтернатив. Лично я много работал с Kohana и немного меньше с прототипом коханы - CodeIgniter. Довольно неплохие решения, быстрое ядро, имеются все необходимые для решения большинства задач библиотеки, CI отличается большим упором в быстродействие, Kohana - большим удобством API. Все упомянутые фреймворки пользуются спросом. Zend и CI чаще других. Java. Где-то между двумя выше рассмотренными категориями. По быстродействию сравним с .NET, по хроническому хаосу в библиотеках и решениях - с PHP (ибо бесплатен и вообще опенсорс). Что неудивительно, так как дотнет делался как конкурент джаве с учетом всех ошибок второй. Но если вам нужна бесплатная платформа и хорошее быстродействие, то других альтернатив просто нет. Главный минус Java - найти толковый хостинг, или настроить свой сервер, что несколько сложнее, чем в случае с PHP и даже .NET. Востребован наравне с .NET. RoR (Ruby on Rails) - тоже как Джава похож на гибрид .NET и PHP, но наоборот. Здесь почти исключительная ситуация, когда в бесплатном решении мы имеем хорошо продуманный язык и богатую библиотеку классов. Active Records из RoR - это несбывшаяся мечта пхп-ешника. Недостатки: плохо с хостингом, медленный. По разным тестамм один из самых медленных интерпретаторов (местами даже медленнее PHP). Менее востребован. Python. Подобно Руби и ПХП - скриптовый (а значит медленный в выполнении) язык. Есть несколько популярных фреймворков : Django, TurboGears, Pylons, Zope. Каждый имеет свой спектр задач, которые решает достаточно хорошо. Универсального пожалуй нет. Тут все так же хаотично как в PHP и Java. Востребован на равне с RoR. Это то, как вопрос видится мне лично. Надеюсь, кому-то мое оформленное в текст мнение окажется полезным. Понимая принципиальную холиварность темы на положительную реакцию "гуру" не рассчитываю :)

Информация по MVC

#mvc


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


Ответы

Ответ 1



Фаулер: GUI Architectures Переводы: Часть 1 Часть 2

Ответ 2



Developing a Spring Framework MVC application step-by-step.

Ответ 3



А я б посоветовал взять фреймворк, например, kohana, codeigneter, zend и т.д., короче, любой посовременнее и изучить на его примере и MVC и HMVC :)

Ответ 4



Можете глянуть тут, неплохо написано: http://irbis-team.com/15/3/1

Ответ 5



PureMVC дает возможность попробовать MVC на практике. Библиотека написана на многих языках программирования и широко используется. Имеется подробная документация (в т.ч. и на русском)

Ответ 6



Вот на примере symfony.

Сортировка List по нескольким полям

#c_sharp


В List<> хранятся объекты, которые необходимо отсортировать по нескольким полям одновременно.
Подскажите, пожалуйста, как это сделать.    


Ответы

Ответ 1



Через LINQ запись будет выглядеть даже проще: IEnumerable result = nonSorted.OrderBy(x => x.value1).ThenBy(x => x.value2); Если хотите избежать ленивых вычислений, то можно сразу спроектировать результат в IList<>: IList result = nonSorted.OrderBy(x => x.value1).ThenBy(x => x.value2).ToList();

Ответ 2



Ordering Operators должно помочь string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };//c List тоже будет работать var sortedDigits = from d in digits orderby d.Length, d select d; one six two five four nine zero eight seven three

Ответ 3



Лист уже сам по себе все умеет: static int comparison< T >(T a, T b){/сравнение по нужному алгоритму/} .... list.Sort(comparison); либо если можно изменять класс, экземпляры которого лежат в листе, то: private class MyClass:IComparable< MyClass > { public int CompareTo(MyClass other){ // сравнение по нужному алгоритму } } и будет достаточно вызвать метод Sort без параметров.

Ответ 4



Если Вам нужно отсортировать исходный список, используйте Comparison, который предлагает Дмитрий Ложкин. Если Вам нужно получить новый отсортированный список на основе старого, то используйте Linq.

Различие в работе эмуляторов iPad и Android

#эмулятор #ipad #android #objective_c #производительность


Почему приложение (Objective-C) при запуске на эмуляторе для iPad работает быстрее,
чем на самом устройстве, а на эмуляторе для Android (Java приложение) работает медленнее,
чем на устройстве?    


Ответы

Ответ 1



Потому что в случае с iPad это не эмулятор, а симулятор. Эмулятор Android эмулирует ARM на x86, iPad же работает сразу на x86 (поэтому, например, нельзя в симуляторе iPad запустить приложение собранное для устройства). Соответственно, у любого современного компьютера ресурсов больше, чем у iPhone/iPad, поэтому приложение в симуляторе работает быстрее, чем на устройстве. Эмулятору же Android'а недостаточно ресурсов компьютера (я ещё не видел компьютера, на котором эмулятор не тормозил бы), он и без всяких приложений заметно медленнее телефонов/планшетов.

Ответ 2



Рекомендую прочитать статью на хабре о порте android x86: Как ускорить эмулятор Android на 400%

Ответ 3



У андроида именно эмулятор т.е. имитация работы процессора мобильного устройства на х86 компа, все действия при работе выполняются с дополнительным переводом инструкций одного проца под другой, а у iPhone это всего лишь симмуляция - библиотеки и какая-то урезанная версия оси откомпилированы под х86_64 и работают в нативном коде

Как отправить форму, если кнопка submit скрыта?

#jquery #javascript #html #css


Задача такая: я скрыл кнопку для кастомизации, теперь не пойму, как отправить форму.
Вроде функция с jquery submit() должна помочь, но ничего не выходит, помогите.    


Ответы

Ответ 1



Даже если кнопка сабмит скрыта, то jquery.submit() должен работать: //тем временем в jQuery $("#real_smb").click(function() { $("#myform").submit(); });


Ответ 2



Чтоб отправить форму вам всё равно надо будет выполнить нажатие кнопки. Например можно воспользоваться html-тегом
, которому можно задать некий стиль. Например:
текст кнопки
Учтите, эту div-кнопку обязательно надо писать в форме, которую собираетесь отправить! По идее можно воспользоваться и таким методом: А в JavaScript-е при определённых, заданных, условиях сделать такую запись: document.getElementById('my_id').click(); В таком случае кнопку видно не будет, и форма будет отправляться при выполнении условий. По идее должно работать. Если не выходит - пишите, разберём. Третий вариант, это создавать событие onKeyPress в строке ввода данных формы. При нажатии клавиши Enter выполнять функцию submit();. P.S.: первый метод точно должен работать, проверено не раз.

Ответ 3



Можно имитировать нажатие на кнопку $("#myform").trigger('click');

Вывод случайных чисел

#php


Как вывести случайные числа в заданном диапазоне от 1 до 90, то есть числа должны
выводится без повторений, и все 90, но в случайном порядке.     


Ответы

Ответ 1



Вариант 1: $used = array(); while (count($used)<90){ $rand = mt_rand(1,90); if (!in_array($rand,$used)) { $used[] = $rand; echo $rand."
"; } } Вариант 2 (лучше): for ($i=1;$i<=90;$i++) $arr[]=$i; while (count($arr)>0){ shuffle($arr); echo array_pop($arr)."
"; } 2-й лучше первого, т.к. в первом количество итераций цикла зависит от того, как часто mt_rand будет попадать в неиспользованное число. Поэтому если мы уже вывели 10, а случайное число еще 50 раз выдало 10, то в результате 50 лишних итераций. А во втором варианте кол-во итераций равно количеству выводимых чисел. Вариант 3 (от @ikoolik + от меня) убран цикл в заполнении: $arr = range(1,90); shuffle($arr); foreach ($arr as $val) echo $val."
";

openFileDialog, saveFileDialog

#c_sharp #net


Если не трудно то можно пошагово объяснить работу с тем и другим объектом? Или хорошую
ссылку.    


Ответы

Ответ 1



Пример коректного использования... using (var openFileDialog = new OpenFileDialog()) { openFileDialog.Filter = "Comma Separated Value(*.csv) | *.csv"; //openFileDialog.InitialDirectory = "<путь к папке>";//если нужно if (openFileDialog.ShowDialog() == DialogResult.OK) { OpenCsvFile(openFileDialog.FileName); } } saveFileDialog используется по аналогии с даным кодом. Сам компонент на форму добавлять не нужно. Убивать тоже, он сам диспоузнется по окончанию using конструкции.

Ответ 2



Все просто. Если диалог не добавлен как компонент формы, то создаем его. OpenFileDialog openFileDialog = new OpenFileDialog(); Задаем параметры: 1) Типы файлов openFileDialog.Filter = "Файлы Excel (*.xls; *.xlsx) | *.xls; *.xlsx"; 2) Можно задать начальную директорию: openFileDialog.InitialDirectory = "<путь к папке>"; Остальные параметры можно посмотреть на MSDN, там они все описаны. И наконец вызываем его: openFileDialog.ShowDialog(); Функция ShowDialog() вернет значение из перечисления System.Windows.Forms.DialogResult, по которому можно определить что нажал пользователь. Имя файла с полным путем до него: openFileDialog.FileName; Для диалога SaveFileDialog все анологично.

Ответ 3



Вы сами поленились "погуглить" или вам не подходит информация с мсдн? Если не искали, то вот: OpenFileDialog SaveFileDialog