В соответствии со старой доктриной ("Если ты не нашёл устраивающей тебя программы под linux, - нипиши её сам") решил попробовать себя на новом поприще и написал простенькую программку - напоминалку, болтающуюся в трее.
Мне нужна была простая маленькая программа, которая бы напоминала мне о днях рождений друзей и знакомых (даты которых помнить просто не реально), но ничего подходящего я не нашел.
Итак, я написал программу со следующими нехитрыми возможностями:
Если кого-то сможет заинтересовать данная разработка, то милости прошу http://software.nisel.net/index.php/reminder.html.
Может, кто, меня мимоходом научит собирать deb пакеты? а то какой-то mustdie-way получается...
Я только встаю на путь истинный и только начинаю программировать под linux, так что прошу тапками в меня не кидаться...
Так же хотел бы выразить благодарность Fatalist'у с нашего форума, который консультировал меня и помогал мне с конструкциями Qt.
Комментарии (123)
Потестим!
нет, конечно это вещь полезная, только я для этого приспособил гугул календарь.. :-)
это оказалось быстрее.
А учитывая мои 4 машины - так еще и намного удобнее. :-)
Это не в обиду - это как вариант решения проблемы. :-)
Была у меня такая мысля, сделать сетевую версию, может и сделаю, когда придумаю как...
ага, из серии где взять сетевое хранилище, чтоб работало где попало, что делать, если под руками есть только кпк/телефон/смартофон на винмобиле/симбиан/S40/андроид/еще черт знает что....
и так далее... :-)
Это из серии - а что будем делать дальше? :-))
Уговорил :0))
Сетевой версии не будет :0))
Очень хочется такую программулину, потому что часто забываю всякие даты.
И deb-ки я училась однажды собирать по руководству, даже для uTorrent сделала. :D
Только тут чтоб дебку сделать нужно чтоб файлик data.dat был всё таки где-то в домашнем каталоге, а то программа будет запускаться из /bin или /usr/bin, не из под рута же её тогда запускать чтоб записывать в эти каталоги файл data.dat. Можно конечно симлинками его и распределением прав сделать, но это как-то не симпатишно получится.
Я тоже подумывал в домашнюю директорию файл журнала кидать, чтобы можно было нормальный установщик сделать, но если положить его в корень домашней директории, то при запуске вручную, всё в порядке, а если кидать в автозагрузку, то программа почему-то не видит файл журнала и начинает ругаться, вот фиг знает почему...
Попробую ещё покапать в сторону разделения мух и котлет...
За ссылку спасибо, посмотрю...
Положите, пожалуйста, не в ~/ а в ~/.config/
ИМХО так будет симпатичней.
Но, если туда положить, тогда будет неудобно править события, для этого придётся делать скрытые файлы видимыми, что не есть очень красиво, да и для новичков будет тяжеловато...
Хозяин - барин!
Распаковал, базу наваял, закинул в автозагрузку - доволен. Спасибо автору!
Работает под amd64, наверно, потому что установлен пакет ia32-libs.
Спасибо за информацию.
Как оказалось, ещё можно на флешке носить, и прямо с неё запускать.
Portable =)
Сделал новую версию.
Теперь файл журнала лежит в ~/.config/data.dat чтобы не мешался нигде (DarkneSS однако оказался прав с идеей куда бы его запихнуть), и для удобства редактирования журнала добавлен пункт редактирования в меню программы, который сам открывает файл журнала в текстовом редакторе, установленным, по-умолчанию.
Таким макаром, удалена необходимость знания пользователем, гдё находится его журнал и открытия его для редактирования вручную.
Сделал наконец-то deb пакет, но возникла новая проблема, при добавлении пункта меню, добавления не происходит.
Пакет собирал по этому руководству http://habrahabr.ru/blogs/linux/78094/.
В меню прописал
?package(deb):needs="text" section="Applications/Accesories" title="hzs reminder" command="/usr/bin/reminder"
Ничего не меняется и не добавляется.
Кто-нибудь подскажет, как формировать меню для программы?
Выложил новую версию на сайте.
Пока можно потестить, кому интересно.
Ещё пару предложений. Базу назвать как-нибудь очевидней, например, reminder.dat. И такая фишка: прога ищет reminder.dat сначала в своей папке (portable), если не находит, то ищет в ~/.config/
Я тоже уже так подумал, в следующей версии сделаю такой вариант.
Сейчас бъюсь с созданием пакета, меню не хочет создаваться...
Гы, у меня самая быстро развивающаяся программа в мире, новые версии выходят по несколько раз на дню :0))
Предлагаю в программе сделать выбор загружаемых смайликов 8)
Типа - чтобы можно было менять "скин" программы в трее 8)
А смысл...
По идее вообще можно не пользоваться этой менюшкой, всё управление на левой и средней кнопках мыши...
В плане - в трее висят страшные смайлики. Мне вот нравятся анимешные. Вот если в трей можно было бы свои смайлики ставить - было бы интереснее. Вот так вот, я не про менюшки...
Выпустил новую версию программы, с учётом пожеланий DarkneSS'a.
База переименована в reminder.dat.
И такая фишка: прога ищет reminder.dat сначала в своей папке (portable), если не находит, то ищет в ~/.config/ тоже реализована.
В пункте о программе сообщается режим запущенной программы portable/standalone.
Буду продолжать мучать сборку пакета.
Круть. Я просто счастлив =)
Не, ты будешь счастлив, когда я тебе, как самому активному тестировщику, выпишу именную версию :0))
Плохой я тестировщик: ни одного багрепорта... С другой стороны - ты хороший программист =)
В чём фишка именной версии?
В том, что в пункте About будет надпись "special edition for DarkneSS".
"Самому привередливому пользователю" =)
Ага.
Если у тебя иссякнут идеи о усовершенствовании программы, значит уже нечего будет добавить :0))
Тут поглядываю уже в сторону создания своего репозитария...
Уже иссякли!
А что если портэбл версия базы старее чем та что в ~/.config/ ? Или если эти 2 файла различаются? Было бы здорово иметь возможность автоматически, (но с запросом) обьединять \ синхронизировать их. =)
Допилил deb пакет.
Программа теперь добавляется в пункт меню Office.
Последнюю на данный момент версию и описание можно найти на http://software.nisel.net/index.php/reminder.html.
Буду рад услышать отзывы и предложения.
А можешь сделать чтоб из Kaddress брал?
Kaddress это что?
И если в нём хранятся даты, разве у него нет функции напоминания?
Я под гномом сижу :0))
Я под гномом сижу
Вот это и заметно. Под KDE есть KAlarm.
Куча, просто тонна настроек.
Зачем? Мне надо простую и лёгкую программу, чтобы висела в трее.
Есть ли возможность запихать KAlarm в трей я не знаю.
Несколько опешил от тезиса о настройках. Вошёл посмотреть. Странно... Под маздаем даже у штатного шедулера настроек больше. Не говоря уже о том же nncron. И в трее KAlarm прекрасно себя чувствует.
Впрочем, на вкус и цвет. Чем больше будет альтернатив, тем лучше.
Разве плохо, что человек написал свою прогу?
да нет, хорошо.
Только как показывает моя практика, мне проще найти уже существующий аналог :-)
на всякий случай: ключевые слова - "моя практика" "мне проще" :-)
Ну, кому проще найти, а кому проще написать.
А если бы разработчики не писали чего-то своего, то из чего бы тогда пользователи выбирали?
А тут есть выбор, моя программа и те программы, которые реализуют примерно этот же функционал.
на всякий случай: ключевые слова - "моя практика" "мне проще" :-)
Я же написал. знал что именно это я и услышу.
Прочти еще раз клчевые слова, которые я повторил специально.
Замечательно, что человек написал свою прогу! Я же не об этом говорил, а о том, что она для гнома.
Она на Qt написана, если чего, так что она "и для гнома" :0))
Да и вообще там форма-то скрыта, то есть интерфейса как такового нету, а в трее всплывающие сообщения примерно одинаково выглядят.
Выпустил новую версию.
Теперь программа локализована и имеет русскоязычный интерфейс.
А где исходники? - Или это проприетарное ПО?
Хотелось бы посмотреть, - я надеюсь ты не против?
Выложи плиз.
Это основной код. Остальное и так понятно.
#include <QtGui>
#include <QDate>
#include <QString>
#include <QProcess>
#include <QByteArray>
#include <QTextStream>
#include <QMessageBox>
#include <QDesktopServices>
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
setupUi(this);
//****************** Create TrayIcon Menu ***************************************
sortAction = new QAction(tr("&Sort events list"), this);
sortAction->setIcon(QIcon(":ico/sort.png"));
connect(sortAction, SIGNAL(triggered()), this, SLOT(SortDataFile()));
launchAction = new QAction(tr("&Launch editor"), this);
launchAction->setIcon(QIcon(":ico/edit.png"));
connect(launchAction, SIGNAL(triggered()), this, SLOT(LaunchEditor()));
siteAction = new QAction(tr("&Go to site"), this);
siteAction->setIcon(QIcon(":ico/gosite.png"));
connect(siteAction, SIGNAL(triggered()), this, SLOT(GoSite()));
aboutAction = new QAction(tr("&About"), this);
aboutAction->setIcon(QIcon(":ico/about.png"));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(ShowAbout()));
quitAction = new QAction(tr("&Quit"), this);
quitAction->setIcon(QIcon(":ico/quit.png"));
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
trayIconMenu = new QMenu(this);
trayIconMenu->addAction(sortAction);
trayIconMenu->addAction(launchAction);
trayIconMenu->addAction(siteAction);
trayIconMenu->addAction(aboutAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
trayIcon = new QSystemTrayIcon(this);
trayIcon->setContextMenu(trayIconMenu);
//********************************************************************************
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
trayIcon->setIcon(QIcon(":ico/normal.png"));
trayIcon->show();
//datafile = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
datafile = qApp->applicationDirPath();
datafile.append("/reminder.dat");
QFile cf(datafile);
if (!cf.exists())
{
datafile = QDesktopServices::storageLocation(QDesktopServices::HomeLocation);
datafile.append("/.config/reminder.dat");
QFile cf(datafile);
if (!cf.exists())
{
QStringList list;
list.append("03.03;День рождения разработчика hzs reminder;1983\n");
list.append("04.10;Дата создания hzs reminder;2010\n");
cf.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
QTextStream out(&cf);
for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
out << *it;
cf.close();
}
portableapp = false;
}
else
portableapp = true;
EventsSelectione();
if (eventscount > 1)
trayIcon->showMessage(tr("hzs reminder:"), tr("Events found"));
if (eventscount == 1)
trayIcon->showMessage(tr("hzs reminder:"), tr("Event found"));
if (eventscount == 0)
trayIcon->showMessage(tr("hzs reminder:"), tr("No events found"));
prevdate = QDate::currentDate();
startTimer(60000 * 60);
}
void MainWindow::closeEvent(QCloseEvent *event)
{
if (trayIcon->isVisible()) {
hide();
event->ignore();
}
}
void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch (reason)
{
case QSystemTrayIcon::Trigger:
{
EventsSelectione();
break;
}
case QSystemTrayIcon::MiddleClick:
{
qApp->quit();
break;
}
}
}
void MainWindow::SortDataFile()
{
QFile cf(datafile);
if (!cf.exists())
{
trayIcon->showMessage(tr("Error sorting events"), tr("Data file 'reminder.dat' not found!\nCreate valid file 'reminder.dat' and restart programm"));
}
else
{
QString line;
QStringList list;
cf.open(QIODevice::ReadOnly);
while (!cf.atEnd())
{
line = cf.readLine();
list.append(line);
}
cf.close();
list.sort();
cf.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
QTextStream out(&cf);
for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
out << *it;
cf.close();
trayIcon->showMessage("hzs reminder:", tr("Events sorted by dates"));
}
}
void MainWindow::EventsSelectione()
{
int currentmonth, currentday, currentyear;
eventscount = 0;
QDate date = QDate::currentDate();
QDate basedate;
currentmonth = date.month();
currentday = date.day();
currentyear = date.year();
QFile cf(datafile);
if (!cf.exists())
{
trayIcon->showMessage(tr("Error loading programm"), tr("Data file 'reminder.dat' not found!\nCreate valid file 'reminder.dat' and restart programm"));
}
else
{
QString lines = "";
QString line, templine;
QString baseevent;
QStringList list;
int baseyear, basemonth, baseday, dot, semi, lastsemi, daysto, yearsto;
bool icotoday = false;
;
cf.open(QIODevice::ReadOnly);
while (!cf.atEnd())
{
line = cf.readLine();
dot = line.indexOf(".");
semi = line.indexOf(";");
lastsemi = line.lastIndexOf(";");
basemonth = line.mid(0, dot).toInt();
baseday = line.mid(dot + 1, semi - dot - 1).toInt();
baseevent = line.mid(semi + 1, lastsemi - semi - 1);
baseyear = line.mid(lastsemi + 1, line.length() - lastsemi - 2).toInt();
if (basedate.setDate(currentyear, basemonth, baseday))
{
daysto = date.daysTo(basedate);
yearsto = currentyear - baseyear;
if(daysto <= 4 && daysto >= 0)
{
if (daysto == 0)
{
lines.append(tr("Today: "));
icotoday = true;
}
if (daysto == 1)
{
templine.setNum(daysto);
lines.append(templine);
lines.append(tr(" day to: "));
trayIcon->setIcon(QIcon(":ico/soon.png"));
}
if (daysto > 1)
{
templine.setNum(daysto);
lines.append(templine);
lines.append(tr(" days to: "));
trayIcon->setIcon(QIcon(":ico/soon.png"));
}
lines.append(baseevent);
lines.append(" ");
if (yearsto > 0 && yearsto < 100)
{
templine.setNum(yearsto);
lines.append("(");
lines.append(templine);
lines.append(")");
}
lines.append("\n");
eventscount ++;
}
}
}
cf.close();
if (icotoday == true)
trayIcon->setIcon(QIcon(":ico/today.png"));
if (eventscount > 1)
trayIcon->showMessage(tr("hzs reminder: events found"), lines);
if (eventscount == 1)
trayIcon->showMessage(tr("hzs reminder: event found"), lines);
if (eventscount == 0)
{
trayIcon->showMessage(tr("hzs reminder:"), tr("No events found"));
trayIcon->setIcon(QIcon(":ico/normal.png"));
}
}
}
void MainWindow::ShowAbout()
{
QString aline = tr("hzs reminder v. 2010.04.24\n© 2010 Nisel Alexander\n");//special edition for DarkneSS\n");
if (portableapp)
aline.append(tr("portable mode\n"));
else
aline.append(tr("standalone mode\n"));
aline.append(tr("\nAdvertising:\n* Creation the internet sites;\n* Introduction Linux at the enterprises;\n"));
aline.append(tr("* Installation Linux on servers.\nhttp://nisel.net"));
trayIcon->showMessage(tr("About hzs reminder:"), aline);
}
void MainWindow::LaunchEditor()
{
QString fileedit = "file:///";
fileedit.append(datafile);
QDesktopServices::openUrl(QUrl(fileedit, QUrl::TolerantMode));
}
void MainWindow::GoSite()
{
QDesktopServices::openUrl(QUrl("http://software.nisel.net/index.php/reminder.html", QUrl::TolerantMode));
}
void MainWindow::timerEvent(QTimerEvent*)
{
if (QDate::currentDate() > prevdate)
{
EventsSelectione();
prevdate = QDate::currentDate();
}
}
Не - ну так не делается.
Хочу забрать весь проект, посмотреть.
Это же не сложно - запаковать все тарбол и положить на том сайте, где бинарник и дебка.
ЗЫ. Или ты переживаешь за свою интеллектуальную собственность ;-)
Гы, вот фиг его знает.
Пока что до конца не проникся идеей "совсем" свободно распространяемого :0))
труЪ.
Положи её в ланчпад под систему контроля версий, это полезно. плюс там автоматическая сборка деб-ов.
Как бы слить в нее все ДР из календаря гугла.
В каком формате можно из гугла выгрузку сделать?
Может, если не сильно гиморно напишу конвертер, а может можно просто в табличном процессоре обработать.
Формат журнала в принципе по формату csv сделан и его многие табличные редакторы поддерживают.
[email protected] - то есть формат ICS
только вот я не до конца понял как выгрузить спец календарь "Дни рождения", но из основного календаря всё выгружается.
Если скрестить (синхронизация) Вашу программу с google.calendar то получится мощный инструмент для напоминания о событиях оттуда. Хотя останется всё той же маленькой програмулинкой :) Но тут думаю нужно рыть в сторону API функций.
и в итоге возвращаемся к моему комментарию... :-)
Хм...
На досуге завести что-ли себе календарь гугла и глянуть что там можно сделать.
Если никаких зависимостей не всплывёт, можно попробовать что-то будет сделать.
В KDE-шной программулине Kontact есть Календарь (он же KOrganizer), который все эти оповещения умеет делать. :) Там даже можно выбрать дополнительные источники для оповещения, например, "Дни рождения из адресной книги KDE", а также установить, за сколько дней перед днём рождения оповестить.
Единственное, что мне в нём не нравится, так это устрашающий вид интерфейса при создании событий и задач. Такое большое количество флажочков, кнопочек и полей для ввода, хотя бОльшая часть из них обычно не нужна, просто угнетает)
Мне было бы не очень интересно с KOrganizer половину кед поставить в свою систему.
Я сижу в гноме.
А моей программе по барабану, какую оболочку использует пользователь, так же как и не надо ставить дополнительные пакеты.
А насчёт большого количества кнопочек, под гномом есть что-то подобное, но именно из-за тяжести такого рода софта, я решил написать маленькую легкую программку.
а birthday из репов ?
Вы догадались как создать базу друзей с днями рождений?
Да и видеть оповещение при логине в систему, не особо удобно...
А, вот, когда, висит в трее ржущий колобок, который с удовольствием "пообщается" с тобой по клике мышкой...
Condor отличная программа. Спасибо! А почему не реализовано "дд.мм.гг описание" ? Как-то не привычно то, как сейчас сделано. И кнопка "отсортировать список событий" имхо лишняя, т.к. список и так формируется вручную.
Ни разу не лишняя! Я тискал :-)
Фиг с ней с кнопкой :) А вот даты реально напрягают. Сейчас пытаюсь всю базу в днюхами и праздниками подогнать под программу, так это ппц. У меня уже голова кругом.
Было такое... Уже привык =)
Действительно настолько напряжно перегнать данные?
Надо бы подумать, может, действительно переделать немного.
Будет со временем получше, покапаюсь в программе.
Год у даты события не реализован так как можно отмечать какое-то событие каждый год, не заморачиваясь о годе, например, праздник какой-то, а дату я ввёл позже, чтобы программа могла считать сколько лет человеку, чтобы открытку правильную использовать, а считать самому лень.
А список хоть и вручную формируется, но опять таки надо выискивать позицию, куда вписать событие надо, а это опять же лень.
Хотя при запуске файл журнала вроде сортируется у меня, программку давно писал, не помню точно.
Как что-то новое придумаю, сделаю новую версию, а так основная напоминательная функция работает, пока что не лезу.
Пипл негодуэ!!! Исходники ф студию!!! =)
Почему ещё нет года в блоке с датой, дело в сортировке дат, то есть она происходит по месяцу, а потом по числу.
Если добавлять год, то по идее, будет по году сортировка вестись, а это неправильно, так как нам важен именно день и месяц события.
То есть, если добавить год, и сделать запись такого вида 1983.03.03;Моя денька, то сортировку надо будет переписывать и если стоит перед месяцем год из 4 цифр, то сортировку надо организовывать без учёта года.
С другой стороны эта запись получится не проще, так как в программах обычно дата хранится в формате дд.мм.гггг.
Возможно, имеет смысл переписать программу с учётом возможности хранения даты в формате дд.мм.гггг и чтобы автоматом проверялось стоит ли год.
Ну и процедуру сортировки переписать.
Не знаю как со временем будет, может ближе к НГ что-нить придумаю, или в январе уже.
А на сайте организую конвертер, чтобы можно было автоматически отконвертировать старый файл журнала.
А что насчёт исходников пипл негодуэ?
Там один модуль всего, код открыт и выложен выше в топике.
Но по просьбам трудящихся открою всё остальное, чтобы можно было посмотреть ещё картинки :0) )
Спасибо!
Всё-таки даты... я специально открыл базу в виде csv и посмотрел, как в офисе даты выглядят. Даже там месяц идёт после дня. Сортировку-то написать - две минуты. Обрезать текст по первую точку, обрезать по вторую, преобразовать в числа, второе умножить на 31, прибавить первое.
А главное - зачем уведомление об отсутствии уведомлений? Я, допустим, загружаю компьютер и меньше всего думаю о том, что ни у кого из знакомых дней рождения нет. А программа об этом напоминает. Зачем? Может опцию можно какую-нибудь? Ключик в командной строке?
Уведомления об отсутствии уведомлений отчекрыжил сам. Ну и ещё кой-чего лишнее отчекрыжил. А ещё вот этого файлика (reminder.qrc) для сборки сильно не хватало:
<RCC>
<qresource prefix="/">
<file>ico/about.png</file>
<file>ico/edit.png</file>
<file>ico/normal.png</file>
<file>ico/quit.png</file>
<file>ico/soon.png</file>
<file>ico/sort.png</file>
<file>ico/today.png</file>
<file>translations/reminder_ru.qm</file>
</qresource>
</RCC>
Мы же, знаете ли, гуманитарии... нас этому не обучали.
Пипл интересуется, какая лицензия исходников. =)
И про команду сборки.
qmake ./reminder.pro
WARNING: Failure to find: reminder.qrc
/usr/bin/rcc: File does not exist 'reminder.qrc'
GPLv3.
Добавил в архив reminder.qrc файл ресурсов смайликов, вот хрен его знает почему его в архиве не было.
Кстати, под 11.10 по ходу дела надо deb пакет перепаковывать, от прошлогодней версии у меня пакет не ставится.
Давно делал, уже не помню как пакет собирать, надо повспоминать будет.
У меня работает пакет в 11.10. Могу попробовать репозиторий замутить. Рпм точно сделаю, они попроще, с дебами у меня не складывается пока))
У меня не работает.
Я себе систему 64 разрядную везде воткнул, надо перекомпиливать :0))
Чтобы компилить под х32, надо либо виртуалку, либо жене на нетбук поставить qtcreator.
У меня х64 тоже.
На первый взгляд программа немного запутанна. Я пока не хочу в ней разбираться, но советую её упростить. Видели систему напоминалок в телефонах?
Видел. Недавно купил, напоминает, что сегодня Др, но не пишет чей :D Так что нет, спасибо.
Не прошло и полгода, как я не без чьей-то там матери осилил сборку deb-ов. Милости прошу тестировать.
Пакеты были пустые, исправил))
По-русски не хочет говорить. Пуркуа?
И почему-то на строку 25.09;Бла бла бла; в dat-файле никак не реагирует. После клика на морде, говорит не найдено событий. А при запуске аж два раза повторяет, что событий нет.
Так'c. Вопрос по дате снимается. Формат мм.дд. А вот дублирование при запуске так и осталось. И по буржуйски разговаривает.
Если х64, попробуйте пакет с сайта. Если с ним всё хорошо, буду завтра думать.
Если не amd64, тоже завтра подумаю.
PS На правах мыслей вслух.
Система 32 бита. Качнул с сайта hzs_reminder_2010.4.24.deb. Теперь по-русски, но другая проблема, вид всплывающих подсказок совершенно не в тему :(
Вот так выглядит, а вот так должно.
Правда сейчас это всё проделывается на другом компе, но система такая же, 12.04, 32 бита.
Старая версия без кдешных уведомлений. Вечером буду чинить репку.
Знаете, что ещё хотелось бы добавить в напоминалку? Чтоб при активации события ещё и звук был.
Я только по пакетикам))
Я знаю. Это я так, мечты вслух.
Condor скастится когда-нибудь ;)
Починил. Пробуйте.
Ждём Condor-а :) Дубль подтверждаю.
Кто спалился?
Я спалился?
В общем, при запуске, он пишет что события найдены, а вот потом, во втором сообщении, пишет чего он нашёл.
Сейчас попробую покосить эту пакость.
Убрал дублирование сообщений при запуске программы, сейчас авродя как корректно работать должно.
64 разрядный бинарник
Исходники
Надо потестить, если всё в порядке, соберу DEB пакеты.
Кстати, есть мысля попробовать проект поинтереснее, подумываю над выводом событий из гуглокалендаря.
Про обновление репки никаких конкретных сроков сказать не могу :( Но будет когда-нибудь обязательно.
Репку ждать не стал, скомпилил из исходников. Правда вот так у меня по-русски не говорит:
myappTranslator.load(":/translations/reminder_" + QLocale::system().name());
А вот так норм:
myappTranslator.load("translations/reminder_" + QLocale::system().name());
И ещё хотелось бы внести предложение. Не показывать сообщение, при запуске программы, если событий не найдено. Судя по коду, сейчас это не очень удобно делать, но если вынести функцию поиска событий в отдельную (вместе с проверкой на наличие и чтением), то такой вариант будет очень легко организовать.
myappTranslator.load(":/translations/reminder_" + QLocale::system().name());
Это дериктива брать перевод из файла ресурсов, он в архиве есть.
Насчёт невывода сообщения о отсутствии событий, я выносил отдельной функцией, на следующий день винт в ноуте погиб, вместе со всей работой, я как-то вчера не стал снова переделывать, хотя, вынести всё отдельной функцией было бы правильно, с точки зрения логики и удобочитаемости кода.
Возможно, сделаю, уже потом и пакеты соберу.
Просто оно стало собираться с локалью во внешнем файле. И с такой строкой она не подгружается. Пару месяцев назад те же сорцы в дебах вшивали локаль в бинарник.
Не компилится, или просто русский язык не подхватывается?
Надо бы мне виртуалку с русским языком завести :0))
Не подхватывается. Когда локаль конвертируется в файл *.qm, что и стало происходить.
LANG=ru_RU.UTF-8 my_cool_prog
Вот именно в таком виде, эта директива, у меня не работает. В смысле перевод не подхватывает. А если убрать
:/
то всё гуд. Т.к. изучаю Qt методом тыка, то не могу научно обосновать сей факт.
А винт жалко. Можно смело сказать, что погиб он смертью храбрых :)
у меня при установке в убурту13 выругалось что:
Установка пакета, который не соответствует стандартам, не разрешена. Это может привести к серьёзным ошибкам на вашем компьютере. Пожалуйста, свяжитесь с теми, кто предоставили данный пакет, указав подробности, изложенные ниже.
- почему так ругается? обычно простое предупреждение что из недостоверных источников ставится пакет, а здесь такие страшные "суеверия" ? :)
А вы как ставите? Из моего репозитория? о.0
я по указанной ссылке: http://software.nisel.net/programs/hzs_reminder_2010.4.24.deb
Так что, правильную ссылку я использую или есть другие сборки? :)
Есть и другие.
возможно я сильно томрожу.. :) Но может проще выложить саму дебку?
запускаю по вашей ссылке: echo 'deb http://download.opensuse.org/repositories/home:DarkSS:deb/xUbuntu_13.10/ /' >> /etc/apt/sources.list.d/hzs-reminder.list через судо - пишет "отказано в доступе"
От рута же надо, написано выше, а ниже есть ссылки и на дебки.
это я понял, что от рута. Вопрос в том - зачем так жестко? обычные программы работают же из-под юзера и ставятся. ну могут запросить пароль при установке. А здесь так все жестко :)
Программа и работает от пользователя. А репозитории, ключи и пакеты только от рута.
Здравствуйте, уважаемые!
Все-таки гложет меня вопрос :)... по поводу рутовских прав при установке проги:
Вот запускаю установку деб-пакета (под юзером).
1) Центр приложений уточняет доверяю ли я источику (стандартная процедура, соглашаюсь)
2) И сразу же вместо запроса пароля, как это делают все обычные программы под убунту, которые я ставил,при установке вашего пакета, выходит сообщение:
"Этот пакет плохого качества. Установка пакета, который не соответствует стандартам, не разрешена. Это может привести к серьезным ошибкам на вашем компьютере. Пожалуйста, свяжитесь с теми, кто предоставили данный пакет, указав подробности, изложенные ниже"
И ниже:
Lintian check results for /tmp/hzs_reminder_2010.4.24.deb:
E: hzs-reminder: arch-independent-package-contains-binary-or-object usr/bin/reminder
E: hzs-reminder: control-file-has-bad-owner md5sums hzs/hzs != root/root
E: hzs-reminder: control-file-has-bad-owner postinst hzs/hzs != root/root
E: hzs-reminder: maintainer-address-missing Nisel Alexander II
E: hzs-reminder: wrong-file-owner-uid-or-gid usr/ 1000/1000
E: hzs-reminder: wrong-file-owner-uid-or-gid usr/bin/ 1000/1000
E: hzs-reminder: wrong-file-owner-uid-or-gid usr/bin/reminder 1000/1000
E: hzs-reminder: wrong-file-owner-uid-or-gid usr/share/ 1000/1000
E: hzs-reminder: wrong-file-owner-uid-or-gid usr/share/applications/ 1000/1000
E: hzs-reminder: wrong-file-owner-uid-or-gid usr/share/applications/reminder.desktop 1000/1000
E: hzs-reminder: wrong-file-owner-uid-or-gid usr/share/pixmaps/ 1000/1000
E: hzs-reminder: wrong-file-owner-uid-or-gid usr/share/pixmaps/reminderico.png 1000/1000
- вот это меня и смущает.Не просто запрос рутовского пароля - а подробное обругивание "пакета плохого качества"
Может можно нормальную дебку собрать? что такого крутого она требует, что убунта так ругается?
Извините за дотошность, но я с винды ушел по причене что там каждая прога делает что хочет и все "от рута". У меня рабочая машина и я ставлю легальное ПО на нее, поэтому такие ругачки напрягают.
:)
Наш пакет с сайта программы или из моего репозитория? Если хотите нормально, выбирайте репозиторий.
Аха, вижу по версии, что с сайта. Поставьте уже мой пакет.
какой ваш то? я пробовал разные ссылки, указанные на этой странице :) Ругачки одинаковые (убунта 13 )
дайте ссылку "на ваш" :)
Повторяю ссылку. И напоминаю что там можно тоже «просто скачать пакет».
люди дорые :)
прога в автозагрузке. даты добавил в текстовый файл. формат там трудно напутать:
03.03;День рождения разработчика hzs reminder;1983
04.10;Дата создания hzs reminder;2010
19.12;поставил напоминальщик;2013
20.12;тест напоминальщика
- а не выводятся уведомления то... я ребутнул комп - должно же было сообщить о сегодняшнем и завтрашнем?
Для сортировки использован американский формат даты ММ.ДД.
То есть должно быть
12.19;поставил напоминальщик;2013
12.20;тест напоминальщика
все, спасибо :) работает!!
По-свежее пакеты есть, я ни разу не видел такого сообщения.
Есть ещё варианты на http://software.nisel.net/reminder.html
Я ленюсь пересобирать пакеты, тем более что использую LTS версию дистрибутива и мне хватает версии пару-летней давности, но DarkneSS авродя как частенько пересобирает.
Неудачно переставил систему, при переносе потерял все свои исходники, в том числе напоминалки.
Но линукс, это добрые люди, нашел исходники своего софта, поставил бинарник вообще с репозитария.
И да, это привет Дмитрию DarkneSS.
К слову о птичках: Qt 4 не войдёт в состав Debian 10.
Это, я так понимаю намёк на то, что если у меня есть исходники, нужно их перепилить под пятые кеды, так как старые исходники не компилятся под 5 кеды и код нужно серьёзно рефакторить...
Таки да!
Короче, я нашел исходники за 2010 год, последняя моя версия была в 2014, у тебя случаем не осталось?
Вернулся на Kubuntu 14.04, всё новомодное гумно не пришлось по вкусу, дык даже без переделки не могу скомпилить, не из чего :0((
Всё, что у меня есть, скачано около 5 лет назад: 1, 2, 3. С Qt4 все 3 собираются. Лучше залить на github =)
Не даёт скачать, закинь в обоако куда-нить плиз.
1 и 2. У двух название и размер совпали, дубль не заливал.
чето как то "Сервер не найден" :(
Есть в репозитариях некоторых.
Сейчас надо полностью всё переписывать, так как в новых версиях QT старый код не компилируется.
Руки дойдут, переделаю напоминалку полностью, заставлю работать в современных версиях.
Ну и сайт надо будет снова запилить.
С Днём рождения, Condor! Будьте счастливы, здоровы, успешны и преуспевающие во всём! И большое спасибо за Ваш hzs reminder!
Жму руку, Григорий
Отправить комментарий