Записки программиста Программирование и не только

15Авг/120

[SQL] Простенький бекап для SQLite

Для бекапа средствами SQL, а не самого SQLite'а можно сделать вот так:

//Подсоединяем файл БД, куда будем делать копию:
ATTACH DATABASE 'C:\file.db' AS fileDB;
//Создаём там таблицу путем копирования содержимого:
CREATE TABLE fileDB.qdn AS select * FROM table_name;
//Отсоединяемся:
DETACH fileDB;
Метки записи: , , Нет комментариев
15Авг/120

[UX] Артуро Толедо — 24 недели Metro-дизайна для Windows Phone

Оригиналы (англ.) - http://ux.artu.tv/

Перевод первых трёх статей
Принципы
Процесс проектирования приложений
Формирование идей и концепции

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

Метки записи: , Нет комментариев
25Июл/122

[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)

Т.е. ищем все элементы которые не являются родителем кому-либо

Метки записи: , 2 Комментарии
25Июл/125

[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
Всё, теперь проект запускается без ошибок.

Метки записи: , , 5 Комментарии
25Июл/120

Пара инструментов

1. Пиксель-арт тайлсет редактор - http://pyxeledit.com/
Pyxeledit

2. Проектирование интерфейса мобильного приложения - http://www.fluidui.com/
FluidUI
Работает только под Сафари и Хромом. Так что может быть, когда нибудь.

19Июл/120

[Алгоритмы] MAXimal

Нашел отличный сайт: http://e-maxx.ru/algo/
"Здесь представлено 145 алгоритмов. Ко всем алгоритмам даны краткие описания и программы на C++."

Также на сайте представлено большое количество книг по программированию

19Июл/120

[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

Метки записи: , , Нет комментариев
5Июн/120

[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();
Метки записи: , , , Нет комментариев
28Апр/120

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();
}
Метки записи: , , Нет комментариев
20Апр/120

[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);
    ...
}
Метки записи: , , Нет комментариев