Страницы

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

пятница, 11 января 2019 г.

Как составить sql запрос для того чтобы пронумеровать по порядку записи в таблице?

Как составить sql mysql запрос для того чтобы пронумеровать по порядку записи в таблице в заранее подготовленой колонке ?
Желательно 1 запросом если это реально.


Ответ

update table set field=@num:=@num+1 where 0 in(select @num:=0)
Нумерация пойдет с 1. При желании можно подправить стартовое значение и способ вычисления следующего

Удаление бесполезного кода компилятором

Рассмотрим простой код.
void f() { }
// ...
f();
Ясно, что функция f не делает ничего (точнее, не делает никакой полезной работы), поэтому компилятор может её спокойно "выбросить" без изменения поведения программы. (Вариант обращения к памяти за вершиной стека чтобы "сцапать" оттуда адрес возврата не берём, ибо "грязный хак", да ещё может и не сработать.)
Усложним задачу:
void g(int x) { }
int calc_x() { // Долго и упорно что-то вычисляем. }
// ...
g(42); // Ни на что не влияет. g(calc_x()); // А вот тут непонятно...
Ясно, что g(42) можно выкинуть. Но выкинуть g(calc_x()) в общем случае нельзя, поскольку у calc_x могут быть побочные эффекты.
Соответственно, вопрос: при каких условиях компилятор будет иметь право выбрасывать вызовы функции g?
P.S. Я понимаю, что компилятор может оставить даже вызов f(), если отключены все оптимизации. Вопрос следует понимать именно так, как написано - не выбросит, а имеет право выбросить


Ответ

Компилятор может превратить вызов g(calc_x()); в следующий [псевдо]код:
int x = ...; calc_x код x теперь чем-то проинициализирован. Здесь мог бы быть код из g, но его там нет. Увы.
Т.е. компилятор заинлайнил обе функции, после чего он смотрит, что x нигде не используется и на этом этапе он может выкинуть код вообще.
Для примера, вот такой C++ код:
void g(int x) { }
int calc_x() { int x = 0; while(x < 500) { ++x; } return x; }
int main() { g(42); g(calc_x()); }
Превращается в вот такой ассемблер(и в студии, и в gcc):
main: xor eax, eax ret

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

PDO ошибка выборки c LIMIT

Почему выдает ошибку при таком запросе?
$num = 10; $start = 1; $sql = "SELECT * FROM `users_for_events` LIMIT ?, ? "; $data = array($start, $num); $stmt = $this->getCon()->prepare($sql); $stmt->execute($data); $stmt->fetchAll(); var_dump($stmt->fetchAll());
Ошибка вот такого плана:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1327 Undeclared variable: '1'' in


Ответ

В режиме эмуляции все переданные через execute() переменные PDO подставляет в запрос как строки, и в итоге запрос получается
LIMIT '10', '1'
что вызывает ошибку. Самым простым решением будет отключить режим эмуляции сразу после соединения,
$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
и после этого данный код сразу заработает без ошибок.

Ошибка: “Cannot read property 'top' of undefined” при создании прокрутки

По идее вот так
var destination = jQuery("#job").offset().top; if (jQuery.browser.safari) { jQuery('body').animate({ scrollTop: destination }, 1100); //1100 - скорость прокрутки } else { jQuery('html').animate({ scrollTop: destination }, 1100); } return false;
Должно работать, но ничего не скролится. jQuery подключен. Пишет,
Cannot read property 'top' of undefined

Вопрос из ответа @Алексей Дементьев.


Ответ

В данном случае jQuery("#job").offset() - возвращает undefined, а это возможно только в случае когда jQuery("#job") не нашел элементов, удовлетворяющих селектору.
Кроме того в зависимости от версии jQuery при применении этого метода, так же может быть возвращено null, следовательно ошибка может меняться на
Uncaught TypeError: Cannot read property 'top' of null(…)

Как передать переменную в функцию при помощи сигнал-слота?

Начал изучать Qt и в качестве закрепления информации решил создать проект, в котором вектор пушБаттонов будет посылать сигнал в функцию, функция в свою очередь производит вычисления, сохраняет в SQLite базу и выводит на соответствующий ЛайнЕдит (тоже вектор). Однако, на этапе объединения, кнопки и функции, я столкнулся с трудностями так как не знаю, как это можно правильно организовать.
Моя изначальная идея была в том, чтобы создать цикл, который бы объединял баттоны с функцией и передавал значения i, для определения с какой именно кнопки поступил сигнал, что вроде этого:
for(int i = 0; i < max; i++) { QObject::connect(button[i], &QPushButton::clicked, this, MainWindow::function); }
Однако, я не нашел способа передать значение i в функцию. Слышал про QSingalMapper и использования лямбды, но из-за недостатка опыта так и не разобрался как это можно реализовать.
Буду признателен, если продемонстрируете, как в таком случае можно перекинуть i внутрь функции. Или, если моя идея неверна в принципе, предложите другой вариант ее реализации.


Ответ

С использованием лямбда-функций всё намного проще:
connect(button[i], &QPushButton::clicked, this, [=] () { function(i); });
В зависимости от того какие переменные необходимо захватить в контекст лямбда-функции, слот может выглядеть по-другому:
connect(button[i], &QPushButton::clicked, this, [this, i] () { function(i); });
Такой функционал доступен, начиная с C++11

Как сравнить числовые данные, переданные с помощью нескольких интентов в другое активити

Есть активити1, которое передает в активити2 для счетчика количество миллисекунд. Количество миллисекунд может быть разным (в зависимости от того, какая кнопка нажата на активити1).Счетчик в активити2 должен принимать эти значение миллисекунд.
В активити1 код для передачи данных такой:
int SEKOND;
@Override public void onClick(View v) { switch (v.getId()){ case R.id.button_dif SEKOND = 5000; Intent intent = new Intent(this,Activity2.class); intent.putExtra("sekondDif",SEKOND); startActivity(intent); break; case R.id.button_is: SEKOND = 50000; Intent intent1 = new Intent(this,Activity2.class); intent1.putExtra("sekondIs",SEKOND); startActivity(intent1); break;
} }
В ативити2 код получения интентов такой:
Bundle extras = getIntent().getExtras();
int id0 = extras.getInt("sekondDif"); int id1 = extras.getInt("sekondIs");
Т.е. число передано и извлечено.
Далее есть счетчик, вместо id которого нужно поставить либо данные из id0 либо из id1, в зависимости от того, какой интент был получен:
new CountDownTimer(id, 1000) {}
Сама логика такая: на активити1 есть разные button. Если кликнуть по button1, то при переходе на активити2 в счетчике должно быть выставлено одно количество миллисекунд, если кликнуть на активтити1 по button2, то в счетчике должно быть выставлено другое количество миллисекунд.
Помогите, пожалуйста, связать эти условия (секунды счетчика на втором активити и выбор кнопки на первом активити ).


Ответ

Если ваша проблема в том, что вы не знаете во второй активити какое именно значение было передано из первой, то вы можете, при вытаскивании данных из интента указывать значение по умолчанию для отсутствующих данных и проверяя ваши переменные второй активити на предмет равенства значения по умолчанию вызывать метод нужный передавая туда нужную переменную.
Bundle extras = getIntent().getExtras();
//зададим -1 как значение по умолчанию. //им будет инициализированна переменная, если в Bundle нет искомого ключа. //если этот аргумент не указать и значения по ключу нет, то присвоится 0 int id0 = extras.getInt("sekondDif", -1); int id1 = extras.getInt("sekondIs", -1);
if(id0 != -1) { //значит получено "sekondDif" } else if(id1 != -1) { //значит получено "sekondIs" }

Также можно проверять есть ли определённый ключ в Bundle методом contains(String key)

В каких ветках есть локальные изменения

Как узнать, какие ветки содержат закоммиченные, но ещё не запушенные изменения?


Ответ

примерно так:
$ git branch -vv * master c488ea5 [origin/master: ahead 1, behind 1] 20160210184133 test ffc6775 [origin/test: ahead 1] 20160210183855 test2 ffc6775 [origin/test2: behind 1] 20160210183855 test3 7ff0eab 20160210184754
здесь мы видим, что ветки master, test и test2 «привязаны» к удалённым репозиториям (показано и имя репозитория и ветка «привязки»).
также видно, что ветки master и test отстоят на один коммит каждая «впереди» (ahead 1), а master и test2 «позади» (behind 1) от содержимого удалённого репозитория.

дополнительный вопрос, поднятый в комментариях
Как его сократить только до веток, у которых есть ahead/behind? И как убрать commit message из таблицы?
с помощью опций команды branch, по-моему, никак. можно «порезать» вывод чем-то внешним. например, если доступна программа gnu/sed
$ git branch -vv | sed -rn 's/(: (ahead|behind) [0-9]+[^]]*\]).*/\1/p' * master c488ea5 [origin/master: ahead 1, behind 1] test ffc6775 [origin/test: ahead 1] test2 ffc6775 [origin/test2: behind 1]