[SQL] Простенький бекап для SQLite
Для бекапа средствами SQL, а не самого SQLite'а можно сделать вот так:
//Подсоединяем файл БД, куда будем делать копию: ATTACH DATABASE 'C:\file.db' AS fileDB; //Создаём там таблицу путем копирования содержимого: CREATE TABLE fileDB.qdn AS select * FROM table_name; //Отсоединяемся: DETACH fileDB;
[UX] Артуро Толедо — 24 недели Metro-дизайна для Windows Phone
Оригиналы (англ.) - http://ux.artu.tv/
Перевод первых трёх статей
Принципы
Процесс проектирования приложений
Формирование идей и концепции
Статьи вообще направлены на Metro, как не трудно догадаться, но могут быть использованы и для разработки интерфейсов вообще.
Первые три статьи как раз описывают общие принципы практически без перехода к конкретике.
[SQL] Задачка соискателю
Тема: SQL дерево.
Задача: дана одна сущность с замыканием ключа сам на себя - найти все листья
Таблица:
CREATE TABLE t1 (id integer NOT NULL PRIMARY KEY UNIQUE, id_p integer)
Решение:
SELECT * FROM t1 AS e1 WHERE NOT EXISTS (SELECT * FROM t1 AS e2 WHERE e1.id = e2.id_p)
Т.е. ищем все элементы которые не являются родителем кому-либо
[Android NDK] Unable to find native library
Пытаясь собрать пример из NDK получаю вот такую ошибку:
Caused by: java.lang.IllegalArgumentException: Unable to find native library: native-activity
Весь интернет пишет какую-то ересь типа:
"Поправьте в AndroidManifest.xml строчку android:hasCode="false" на android:hasCode="true" и будет вам счастье"
А вот хер! Никакого эффекта.
Так бы и закончилось моё желание писать на С++ под Дроида, но тут я натыкаюсь на отличную ссылочку:
http://mobilepearls.com/labs/ndk-builder-in-eclipse/
Получается, что проблема в самом Эклипсе, блин.
Коротко:
1. Заходим в Properties проекта в раздел Builders. Жмём New...
2. Выбираем тип Program и жмём Ok
3. Location указываем путь до ndk-builer'а (я указал абсолютный путь. Под Вин это звучит так: <путь в системе>\android-ndk-r8\ndk-build.cmd)
4. Working directory - путь до папки с проектом (Моё: <путь в системе>\android-ndk-r8\samples\native-activity
5. На том же окошке переходим во вкладку Refresh, ставим галочку и выбираем Specific resources. Разворачиваем проект и ставим галочку на lib. Finish
6. Вкладка Build Options. Проверяем наличие галочки на During auto builds и ставим галку на Specify working set of relevant resources. Разворачиваем проект и ставим галочку на jni
7. Жмем Apply, Ok, Ok
Не забываем нажать Project/Clean
Всё, теперь проект запускается без ошибок.
Пара инструментов
1. Пиксель-арт тайлсет редактор - http://pyxeledit.com/
2. Проектирование интерфейса мобильного приложения - http://www.fluidui.com/
Работает только под Сафари и Хромом. Так что может быть, когда нибудь.
[Алгоритмы] MAXimal
Нашел отличный сайт: http://e-maxx.ru/algo/
"Здесь представлено 145 алгоритмов. Ко всем алгоритмам даны краткие описания и программы на C++."
Также на сайте представлено большое количество книг по программированию
[LJ API] getfriends
Спрашиваем список френдов. Возвращает тех, кого вы добавили в друзья.
Метод LJ.XMLRPC.getfriends
Ему необходимо передать логин, пароль и версию протокола.
Пример:
<?xml version="1.0"?> <methodCall> <methodName>LJ.XMLRPC.getfriends</methodName> <params><param><value><struct> <member><name>username</name><value><string>test</string></value></member> <member><name>password</name><value><string>test</string></value></member> <member><name>ver</name><value><int>1</int></value></member> </struct></value></param></params> </methodCall>
Отправляем естественно в одну строку без всяких табуляций и переносов.
В ответ получим defaultpicurl, bgcolor, fgcolor, fullname, username
[Qt] Запись файла в SQLite
Собственно, всё просто
Создали в БД таблицу с атрибутом типа BLOB:
CREATE TABLE fileTable (id_file integer NOT NULL PRIMARY KEY AUTOINCREMENT, file BLOB NOT NULL);
Потом:
QFile file(QApplication::applicationDirPath().append("/file")); file.open(QIODevice::ReadOnly); //открыли файл QByteArray ba = file.readAll(); //прочитали из него всё QSqlQuery query(QSqlDatabase::database("sql")); // query.prepare("INSERT INTO fileTable (file) VALUES(:val);"); //создали запрос query.bindValue ( ":val", ba); query.exec(); //запустили file.close(); //файл закрыли
И всё. Ну, естественно, дописали обработку ошибок.
Обратный процесс - чтение файла из SQLite:
QFile file(QApplication::applicationDirPath().append("/newfile")); file.open(QIODevice::WriteOnly); QSqlQuery query(QSqlDatabase::database("sql")); query.prepare("SELECT file FROM fileTable;"); query.exec(); query.next(); QByteArray ba = query.value(0).toByteArray(); file.write(ba); file.close();
qDebug() и структуры
В дополнении к этому
Есть в классе произвольная структура.
Надо научить её выводиться в qDebug()
Структура:
class MyClass { struct MyStruct { quint8 a1; quint8 a2; quint8 a3; quint8 a4; }; };
Дописываем в *.h :
#ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug, const MyClass::MyStruct); #endif
А в *.cpp :
QDebug operator<<(QDebug aDbg, const MyClass::MyStruct strc) { aDbg.nospace() << "( " << "MyStruct" << " (" << strc.a1 << ", " << strc.a2 << ", " << strc.a3 << ", " << strc.a4 << ") )"; return aDbg.space(); }
[QtScript] Получить доступ из пользовательской функции к интерфейсу.
Продолжаем извращаться.
Захотелось мне написать свою функцию print для QtScript чтобы вывод шел в QTextEdit.
Класс, который содержит в себе TextEdit у меня зовётся Widget
Функция (Вне классов):
QScriptValue funcPrint(QScriptContext *context, QScriptEngine *engine) { QString result; for (int i = 0; i < context->argumentCount(); ++i) { if (i > 0) result.append(" "); result.append(context->argument(i).toString()); } Widget *bgg = (Widget*)engine->parent(); bgg->print(result); return engine->undefinedValue(); }
Регистрируем:
engine->globalObject().setProperty("print", engine->newFunction(funcPrint, 1));
Метод банален:
void Widget::print(QString aStr) { ui->TextEdit->append(aStr); }
Тонкости:
engine является членом класса Widget (приватным) и инициализируется:
engine = new QScriptEngine(this);
Обязательно указать родителя! Иначе его потом не получить и будет segfault
Соответственно можно объявить engine и не указателем.
Тогда обязательно(!) инициализировать в конструкторе:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget), engine(this) //!!!!! { ui->setupUi(this); ... }