Страницы

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

воскресенье, 12 января 2020 г.

Шифрование строки

#php #rsa


Есть модуль, есть экспонента, есть строка, которую нужно зашифровать:

$modulus = 'CD0....C9246E1';
$exponent = '0...1';
$rsa = new Crypt_RSA();
$modulus = new Math_BigInteger(base64_decode($modulus), 256);
$exponent = new Math_BigInteger(base64_decode($exponent), 256);
$rsa->loadKey(array('n' => $modulus, 'e' => $exponent));
echo $rsa->encrypt('THISISMYSTR');


THISISMYST - строка, которую пытаюсь зашифровать. Но получаю какую-то гадость на выходе.
    


Ответы

Ответ 1



Эта гадость на выходе результат работы функции и она в бинарном виде. Для перевода в читаемый вид можно использовать base64_encode(); Что касается того, что echo выводит разные строки, если не ошибаюсь, результат работы RSA всегда разный. Для проверки выполните расшифровку через $rsa->decrypt(), если результат будет соответствовать тому, что вы зашифровали, то ваш алгоритм работает правильно.

Использование итераторов для проверки элементов массива

#ruby #итераторы


def isfin?
  @matrix[0..@col_count-1][0]==0
end


Как пользоваться итераторами в Ruby? Например, нужно вернуть true, если все элементы
массива [n][0] (где n от 0 до "длина массива - 1") равны нулю. Или в данном случае
лучше использовать простой цикл?

Например, если у нас будет 0..200, и на второй позиции уже не 0, то можно выйти с
false и не просматривать остальные элементы. Или при использовании итераторов это условие
будет автоматически учтено, и медленнее работать не будет?
    


Ответы

Ответ 1



Во-первых, судя по собаке, речь идет о методе собственного класса. Я бы рекомендовал не воротить никакого ООП, пока не знаешь сам язык и stdlib. def isfin? @matrix.all? do |row| row[0] == 0 end end Итератор all? здесь обрывается и возвращает false как только блок do end вернет false. Можно переписать это таким образом, что матрицу сначала транспонируем, и проверяем лишь одномерный массив: def isfin? @matrix.transpose.first.all? do |cell| cell == 0 end end И тогда использование стандартного метода .zero? позволяет записать это короче: def isfin? @matrix.transpose.first.all? &:zero? end А можно .map вместо .tranpose использовать -- это может работать быстрей: def isfin? @matrix.map(&:first).all? &:zero? end

Как сделать юникодную строку читабельной?

#python #кодировка #python_2x


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

Например:

for i in range(0, len(fullTEXT)):
    print fullTEXT[i].text
    textList.append(fullTEXT[i].text)


Известно, что нервные клетки

fullTEXT = str(textList)
print fullTEXT


[u'\u0418\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u0440\u0432\u043d\u044b\u0435
\u043a\u043b\u0435\u0442\u043a\u0438']
    


Ответы

Ответ 1



Если Ваша цель - получить одну строку из списка строк, хранящихся в списке, можно сделать, что-то вроде: >>>fullTEXT = [u'Известно, что нервные клетки', u'не восстанавливаются'] >>>print ' '.join(fullTEXT) Известно, что нервные клетки не восстанавливаются Если же цель другая, опишите чего хотите добиться, выполняя: fullTEXT = str(textList) print fullTEXT Совет. Ваш цикл: for i in range(0, len(fullTEXT)): print fullTEXT[i].text textList.append(fullTEXT[i].text) можно упростить убрав len и range: for item in fullText: print item.text textList.append(item.text)

Ответ 2



Можно примерно так: >>> mylist = [u"Известно, что нервные клетки", u"Что-то совсем другое"] >>> print u'[%s]' % ', '.join(['"%s"' % item for item in mylist]) ["Известно, что нервные клетки", "Что-то совсем другое"]

Раздельная компиляция и рефакторинг

#cpp #компиляция #cpp11 #рефакторинг


Например, у меня есть несколько файлов (все по правилу odr).

SuperClass.h SuperClass.сpp

SubClass.h SubClass.cpp (наследуется от SuperClass)

main.cpp

Скомпилировал, получил SuperClass.o, SubClass.o, main.o и все объединил компоновщиком
в programm - все хорошо работает.

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

Скомпилировал SuperSuperClass SuperClass и объединил компоновщиком со всеми остальными
- все хорошо работает, хоть я изменил иерархию наследования, внес изменения, но не
трогал имена функций которые вызываются в остальных файлах. Но правило ODR нарушено?
Я не перекомпилировал другие файлы, в которых осталось старое определение SuperClass
и нет никакой информации об обновлении иерархии наследования.

А вдруг я захочу добавить в SuperSuperClass виртуальну функцию? При каких случаях
нужна перекомпиляция остальных файлов? 
    


Ответы

Ответ 1



На самом деле всё просто. Если вы поменяли header — все зависимые от него файлы (то есть, все cpp-файлы, которые включают его прямо или косвенно) должны быть перекомпилированы. Если вы поменяли cpp-файл, то по идее только его и надо перекомпилировать. (Если вы, разумеется, не #include-ите его в другие файлы.) Если вы пользуетесь makefile'ом, зависимости нужно прописать там, тогда повторная компиляция произойдёт автоматически, соберутся лишь нужные таргеты. Если ваш проект слишком большой для ручной расстановки зависимостей, вам поможет утилита makedepend, которая автоматизирует этот процесс.

Ответ 2



Правило ODR тут не причём вообще . То, что у Вас всё работает правильно говорит о том, что Вам Повезло. Вы имеете неопределённое поведение, но так уж случилось, что всё работает правильно. Опять повезло, но уже с компоновщиком. Компоновщик очень умён, и в o файлах, до последней сборки содержатся лишь ссылки, которые потом очень умно заменяются. Общее правило таково: если хоть что-то в заголовке было изменено(в определении класса, даже если это просто порядок функций), все эти изменения, должны быть донесены до всех объектных файлов. В противном случае UB(неопределённое поведение) Не прав я касательно ODR оказался, правило как раз в этом разделе: 3.2/6 <...>There can be more than one definition of a class type <...> Given such an entity named D defined in more than one translation unit, then each definition of D shall consist of the same sequence of tokens; and <...>

QProcess - как получить вывод процесса до его завершения?

#qt #qt5


Есть приложение на Qt, включающее код такого вида :

QProcess proc;
...
proc.setProgramm("Python34\\python");
proc.setArguments(QStringList{"hello.py"});
proc.setProcessChannelMode(QProcess::MergedChannels);
connect(&proc, &QProcess::readyReadStandardOutput, []() {
  QString output = QString(proc.readAllStandardOutput());
  ...
});
proc.start();


Но readyReadStandardOutput отлавливается только после завершения процесса. В моём
случае - требуется проделать определённые действия до завершения (по наличию в выводе
определённого текста).

Как это реализовать?

upd. Более подробный код имеет вид :

class Window: public QMainWindow {
...
  private:
    QVector processes;
    void createProcesses();
    void prepareProcess(QProcess* proc);
}

void MainWindow::createProcesses() {
  for(int i=0;...) {
    processes.append(new QProcess());
    prepareProcess(&processes[processes.size()-1]);
  }
}

void MainWindow::prepareProcess(QProcess* proc) {
  proc->setProgramm("Python34\\python");
  proc->setArguments(QStringList{"hello.py"});
  proc->setProcessChannelMode(QProcess::MergedChannels);
  connect(&proc, &QProcess::readyReadStandardOutput, []() {
    QString output = QString(proc->readAllStandardOutput());
    ...
  });
  proc->start();
}


UPD. А в Qt ли вообще дело? Обнаружил следующее.
При запуске, например ping /t ya.ru результат выводится. Но, с применением например,
следующего питоноскрипта - нет

import time
while True:
  print("Hello")
  time.sleep(1)

    


Ответы

Ответ 1



В справке по обозначенному сигналу говорится, что последний будет отправляться по мере поступления новых данных. То есть не по завершению процесса, а именно во время работы процесса. Метод QProcess::start() является асинхронным. Объект QProcess у Вас создаётся в стеке. В связи с этим, возможно, что проблема заключается в несвоевременном уничтожении объекта, либо в отсутствии вызова цикла событий, что в свою очередь ведёт к помещению отправленного сигнала в очередь. Соответственно, и получается, что сигнал доходит постфактум, а не тогда, когда его вызвали. Создавайте объект QProcess в куче (через new), либо после вызова метода QProcess::start() при помощи QEventLoop активируйте локальный цикл событий. Ну или, как ещё один вариант, воспользуйтесь блокирующим ожиданием: QProcess::waitForReadyRead().

Ответ 2



Дело было не в приложении на Qt, а в буферизации вывода python-ом (https://stackoverflow.com/questions/230751/how-to-flush-output-of-python-print) Лечится запуском с опцией -u

Как сделать выборку по дате из текстового поля

#php #mysql


У меня таблица в формате (поле с типом text):

+------------------+
|       data       |
+------------------+
| 23.06.2015 10:30 |
| 24.06.2015 10:45 |
| 26.06.2015 12:15 |
| 02.07.2015 11:24 |
+------------------+


Если ищу между датами, то находит неправильно. Только если ищу по одному месяцу,
допустим по июню, если ищу с июня по июль, то ничего не выводит.

Такой запрос:

mysql_query("SELECT * FROM `selling_list` WHERE
 `data`>'22.06.2015' AND `data`<'03.07.2015'");


выдаст пустой результат. а такой:

mysql_query("SELECT * FROM `selling_list` WHERE
 `data`>'22.06.2015' AND `data`<'30.06.2015'");


выдаст 3 результата.

Почему так? Как правильно сделать выборку?
    


Ответы

Ответ 1



если дата в строке указана в понятном серверу mysql формате, то диапазон можно указывать, например, так: select ... where data between "2015-06-20" and "2015-07-03"; но у вас ситуация осложняется тем, что в базе данных содержится, во-первых, строка, а не дата, а во-вторых в «непонятном» серверу формате. значит, надо преобразовывать строку при выборке с помощью функции str_to_date, указав вторым параметром подходящий шаблон. пример (в выборку попала дата за 23 июня и не попала за 2 июля потому, что если не указано время, то оно берётся как «полночь» — 0:00:00): SQL Fiddle MySQL 5.6 Schema Setup: create table t (data text); insert into t values ("23.06.2015 10:30"), ("24.06.2015 10:45"), ("26.06.2015 12:15"), ("02.07.2015 11:24"); Query 1: select * from t where str_to_date(data, "%d.%m.%Y %k:%i:%s") between "2015-06-23" and "2015-07-02" Results: | data | |------------------| | 23.06.2015 10:30 | | 24.06.2015 10:45 | | 26.06.2015 12:15 |

Ответ 2



Надеюсь, поможет: SELECT * FROM selling_list WHERE date BETWEEN STR_TO_DATE('22.06.2015', '%d/%m/%Y') AND STR_TO_DATE('30.06.2015', '%d/%m/%Y')

Аналог функции system из C++ для Rust

#cpp #linux #rust


Есть ли в Rust аналог функции system из C++? Или что-то подобное, позволяющее посылать
команды командному процессору Linux.
    


Ответы

Ответ 1



use std::process::Command; let status = Command::new("ls").status().unwrap_or_else(|e| { panic!("failed to execute process: {}", e) }); println!("process exited with: {}", status); Документация std::process::Command Однако в винде это не сработает. Там можно так: use std::process::Command; let status = Command::new("cmd.exe").arg("/c").arg("dir").status().unwrap_or_else(|e| { panic!("failed to execute process: {}", e) });