Do prodeje jde tichá bezdrátová herní myš Logitech PRO X2 SUPERSTRIKE s analogovými spínači s haptickou odezvou (HITS, Haptic Inductive Trigger System). Cena je 4 459 Kč.
Microsoft na GitHubu zveřejnil zdrojový kód projektu LiteBox, jedná se o 'knihovní operační systém' (library OS) zaměřený na bezpečnost, využívající systémovou architekturu LVBS k ochraně jádra před útoky z uživatelského prostoru. LiteBox je napsán v Rustu a uvolněný pod licencí MIT. Projekt je teprve v rané fázi vývoje.
BreezyBox je open-source shell a virtuální terminál pro populární jednočip ESP32. Nabízí základní unixové příkazy, sledování aktuálního pracovního adresáře (CWD), jednoduchý instalátor a spouštěč aplikací v podobě ELF binárních souborů, zabudovaný HTTP server nebo třeba ovládání WiFi - ukázka použití coby 'malého osobního počítače'. Ačkoliv je BreezyBox inspirovaný BusyBoxem, oproti němu má tento projekt několik externích závislostí, zejména na ESP-IDF SDK. BreezyBox je dostupný pod licencí MIT.
Byl představen cross-assembler xa.sh, napsaný čistě v Bourne shell skriptu. Tento nástroj umožňuje zpracovávat assemblerový kód pro Intel 8080, přičemž je možné snadno přidat podporu i pro další architektury, například 6502 a 6809. Skript využívá pouze různé běžné unixové příkazy jako jsou awk, sed nebo printf. Skript si lze stáhnout z GitHubového repozitáře projektu.
Byla představena nová verze modelu Claude Opus 4.6 od společnosti Anthropic. Jako demonstraci možností Anthropic využil 16 agentů Claude Opus 4.6 k vytvoření kompilátoru jazyka C, napsaného v programovacím jazyce Rust. Claude pracoval téměř autonomně, projekt trval zhruba dva týdny a náklady činily přibližně 20 000 dolarů. Výsledkem je fungující kompilátor o 100 000 řádcích kódu, jehož zdrojový kód je volně dostupný na GitHubu pod licencí Creative Commons.
Kultovní britský seriál The IT Crowd (Ajťáci) oslavil dvacáté výročí svého prvního vysílání. Sitcom o dvou sociálně nemotorných pracovnících a jejich nadřízené zaujal diváky svým humorem a ikonickými hláškami. Seriál, který debutoval v roce 2006, si i po dvou dekádách udržuje silnou fanouškovskou základnu a pravidelně se objevuje v seznamech nejlepších komedií své doby. Nedávné zatčení autora seriálu Grahama Linehana za hatecrime však vyvolává otázku, jestli by tento sitcom v současné Velké Británii vůbec vznikl.
Společnost JetBrains oznámila, že počínaje verzí 2026.1 budou IDE založená na IntelliJ ve výchozím nastavení používat Wayland.
Společnost SpaceX amerického miliardáře Elona Muska podala žádost o vypuštění jednoho milionu satelitů na oběžnou dráhu kolem Země, odkud by pomohly zajistit provoz umělé inteligence (AI) a zároveň šetřily pozemské zdroje. Zatím se ale neví, kdy by se tak mělo stát. V žádosti Federální komisi pro spoje (FCC) se píše, že orbitální datová centra jsou nejúspornějším a energeticky nejúčinnějším způsobem, jak uspokojit rostoucí poptávku po
… více »Byla vydána nová verze 2.53.0 distribuovaného systému správy verzí Git. Přispělo 70 vývojářů, z toho 21 nových. Přehled novinek v poznámkách k vydání.
Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 216. sraz, který proběhne v pátek 20. února od 18:00 v Red Hat Labu (místnost Q304) na Fakultě informačních technologií VUT v Brně na ulici Božetěchova 1/2. Tématem srazu bude komunitní komunikační síť MeshCore. Jindřich Skácel představí, co je to MeshCore, předvede nejrůznější klientské zařízení a ukáže, jak v praxi vypadá nasazení vlastního repeateru.
Než se pustíte do dalšího čtení, doporučuji prohlédnout si alespoň první díl seriálu o GUI, protože základy jsou podobné a nemá význam opakovat zde celý úvod od začátku.
Cílovou skupinou tohoto seriálu jsou lidé s alespoň základními znalostmi C++. Ačkoliv bude veškerý kód okomentovaný, cílem seriálu není vyučování základů C++.
Je to celkem prosté. Ve funkci main() místo QApplication vytvoříte instanci QCoreApplication a pak už se jen stačí vyhýbat součástem z modulu QtGui.
První ukázkový program, který jsem připravil, slouží k práci s datem. Zadáte nějaké datum a můžete k němu přičítat (nebo od něj odečítat) dny (d), měsíce (m) a roky (y). Ukázka:
$ ./qdatemod today -7d +1m neděle, 10. května 2009 -> středa, 3. června 2009 $ ./qdatemod 1.1.1970 +39y +4m +9d čtvrtek, 1. ledna 1970 -> neděle, 10. května 2009
main.cpp: Nejjednodušší možná varianta. Vytvoříme instanci hlavní třídy a nespouštíme smyčku událostí pomocí app.exec(), protože by nám zde byla k ničemu. Místo toho vracíme hodnotu metody run(), která implementuje veškerou funkčnost.
#include <QCoreApplication>
#include "datemod.h"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
DateMod main;
return main.run();
}
datemod.h: API.
#ifndef DATEMOD_H
#define DATEMOD_H
#include <QObject>
#include <QDate>
#include <QStringList>
#include <QTextStream>
class DateMod : public QObject
{
public:
DateMod();
int run();
private:
int error(QString text, int retcode = 1);
QDate baseDate;
QStringList argList;
QTextStream Output;
};
#endif // DATEMOD_H
datemod.cpp: Zde je novinkou použití třídy QTextStream, která poskytuje rozhraní pro čtení a zápis textu. V programu je použita pro zápis na standardní chybový výstup.
#include "datemod.h"
#include <QCoreApplication>
#include <QDebug>
DateMod::DateMod() : Output(stderr, QIODevice::WriteOnly)
{
// uložíme si seznam argumentů
argList << QCoreApplication::arguments();
// a odstraníme první položku (název spouštěného souboru)
argList.removeFirst();
}
int DateMod::run()
{
// potřebujeme alespoň 1 argument (datum)
if(argList.size() < 1)
return error(tr("Need at least one argument (a 'd.M.yyyy' date)!"));
// načteme zadané datum ("today" nastaví dnešní datum)
if(argList.first() != tr("today"))
{
baseDate = QDate::fromString(argList.first(), "d.M.yyyy");
if(baseDate.isNull())
return error(tr("The date you've entered is not valid.") + " " +
tr("It's not 'd.M.yyyy' or it doesn't exist or it's out of range."));
} else
baseDate = QDate::currentDate();
// odstraníme ze seznamu první argument
argList.removeFirst();
// pokud nemáme žádné další argumenty, vypíšeme samotné datum
if(!argList.size())
return error(baseDate.toString(Qt::DefaultLocaleLongDate), 0);
// regulární výraz, který nám pomůže odfiltrovat zjevné nesmysly a
// dostat z řetězce potřebné části
QRegExp regex("^([+-]?[0-9]+)([dmy])$");
QDate newDate = baseDate;
// dokud seznam argumentů není prázdný
while(!argList.isEmpty())
{
// pokud argument neodpovídá regulárnímu výrazu
if(!argList.first().contains(regex))
return error(tr("Invalid argument: ") + argList.first());
// odstraníme první argument
argList.removeFirst();
bool ok = false;
// převedeme zadané číslo na integer
int add = regex.cap(1).toInt(&ok);
// a zkontrolujeme, zda se to podařilo
if(!ok)
return error(tr("Conversion of ") + regex.cap(1) + tr(" to int failed."));
// uložíme si znak na konci argumentu
char what = regex.cap(2)[0].toAscii();
// podle toho, jaký je na konci argumentu znak, přidáme k aktuálnímu datu
// zadaný počet dní, měsíců nebo roků
switch(what)
{
case 'd':
newDate = newDate.addDays(add);
break;
case 'm':
newDate = newDate.addMonths(add);
break;
case 'y':
newDate = newDate.addYears(add);
break;
default:
break;
}
// pokud nové datum není validní
if(newDate.isNull())
return error(tr("Shifted date is invalid (probably out of range)."));
}
// když vše proběhne v pořádku, vypíšeme původní a nové datum
return error(baseDate.toString(Qt::DefaultLocaleLongDate) + " -> " +
newDate.toString(Qt::DefaultLocaleLongDate), 0);
}
// vypíše text na std. chybový výstup a vrátí hodnotu retcode
int DateMod::error(QString text, int retcode)
{
// vypíšeme text
Output << text << "\n";
Output.flush();
return retcode;
}
Zdrojáky si můžete stáhnout v archívu qdatemod.tar.bz2.
Občas se stane, že z programu potřebujete spustit nějakou utilitu. Pro tyto účely je v Qt k dispozici třída QProcess, která v tomto směru nabízí zajímavé možnosti. Její použití si nyní předvedeme na jednoduchém příkladu.
Na rozdíl od předchozího programu bude mít tento smyčku událostí, i když by se bez ní obešel. Nikdy totiž neuškodí – spíš naopak, je to taková jistota, že po sobě program stihne uklidit v každém případě.
Program spouští příkaz
/sbin/ip address show
a parsuje z jeho výstupu názvy síťových rozhraní v systému. Výstup by měl být stejný, jako když na GNU/Linuxu spustíte
/sbin/ip a | sed -nr '/^[0-9]+:/ s/^[^:]+: ([^:]+).*/\1/p'
Na mém systému toto (i následující program) vypíše:
lo marvell nvidia sit0 vboxnet0
Následuje kód:
main.cpp:
#include <QCoreApplication>
#include <QTimer>
#include "process.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// toto zajistí ukončení programu po jeho vykonání
QTimer::singleShot(0, &a, SLOT(quit()));
// vytvoříme instanci hlavní třídy
Process main;
// a spustíme program
main.run();
// spustíme smyčku událostí, která se v tomto případě
// v podstatě hned ukončí
return a.exec();
}
process.h: API.
#ifndef PROCESS_H
#define PROCESS_H
#include <QObject>
#include <QStringList>
#include <QProcess>
// třídu zakládám na QObject, jelikož používám sloty a lokalizační systém Qt
class Process : public QObject
{
Q_OBJECT
public:
Process();
void run();
private:
QProcess* process;
QString executable;
QStringList arguments;
private slots:
void handleOutput(int, QProcess::ExitStatus);
void handleError(QProcess::ProcessError);
};
#endif // PROCESS_H
process.cpp:
#include "process.h"
#include <QDebug>
Process::Process()
{
// vytvoříme instanci objektu QProcess
process = new QProcess(this);
// cesta k programu, který budeme spouštět
executable = "/sbin/ip";
// argumenty programu
arguments << "address" << "show";
// propojíme signály procesu se sloty této třídy
connect(process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(handleOutput(int,QProcess::ExitStatus)));
connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(handleError(QProcess::ProcessError)));
}
// zpracuje chybový signál (vypíše chybovou hlášku)
void Process::handleError(QProcess::ProcessError error)
{
switch(error)
{
case QProcess::FailedToStart:
qDebug() << tr("The process failed to start. (Either the file doesn't exist, or you have insufficient permissions to invoke it.)");
break;
case QProcess::Crashed:
qDebug() << tr("The process crashed.");
break;
case QProcess::ReadError:
qDebug() << tr("An error occurred when attempting to read from the process.");
break;
default:
qDebug() << tr("An unknown error occurred.");
break;
}
}
// zpracuje výstup programu; vypíše seznam síťových rozhraní
void Process::handleOutput(int /*retcode*/, QProcess::ExitStatus status)
{
if(status == QProcess::CrashExit)
{
qDebug() << tr("process crashed, quitting");
return;
}
// vezme celý výstup programu a rozdělí jej do seznamu,
// kde každý řádek představuje jednu položku
QList<QByteArray> outlines = process->readAllStandardOutput().split('\n');
// vytvoříme si regulární výraz (s referencí)
// tento regexp hledá číslo na začátku, za ním dvojtečku a jako referenci bere
// řetězec, který je za tím (až po další dvojtečku)
// například z "1: abc: def" bude reference "abc"
QRegExp rx("^[0-9]+: ([^:]+)");
// otevřeme si std. výstup pro zápis
QTextStream out(stdout, QIODevice::WriteOnly);
// postupně projdeme každý řádek
for(int i=0; i<outlines.size(); i++)
// pokud výraz odpovídá
if(rx.indexIn(outlines[i]) != -1)
// vypíšeme první referenci
out << rx.cap(1) << '\n';
out.flush();
}
void Process::run()
{
// spustí program s danými argumenty
process->start(executable, arguments);
// čeká, dokud se program neukončí
process->waitForFinished(-1);
}
Zdrojáky si můžete stáhnout v archívu process.tar.bz2.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Pouzivat navic jeste QT4 pro text-mode programy je jeste vice spatne.Jakto?
Spravne by se melo pouzit treba glib a kod by mel byt C99 ci GNU99.Řekl kdo?
Toto by profesionální programátor nikdy neřekl.
I v konzolových aplikacích je potřeba spousta věcí jako networking, XML processing, regexp, threads,a dalsí a další, pro které má QT výbornou podporu (multiplatformově).
Navíc, objektové programování je jasná cesta ve většině jazyků. Proto dnes prosazovat čisté cécko zda se být prochu mimo.
A proč ne raději glib?
Protože je to článek o QT, ne? Taky se v diskuzi pod článkem o gtk+ budete ptát, proč nepoužít raději GLib? POkdu tomu rozumíte, tak sem rovnou napište důvody k upřednostnění GLib a pokud jenom z nudy machrujete, tak jsem na vás ztratil čas (což mě mrzí. ale neomlouvám se).
On tu nějaký článek o Gtk+ je?
.hmm, tak to vela stastia, az budes chciet nakodit konzolovy renderer napr. html+css, alebo nejaku corba aplikaciu
verim, ze ti vtedy nejaka ta "spatnost" da dostatocny dovod, preco napisat 10x viac kodu, a umerne viac dokumentacie a chyb :)
XInitThreads(); app=new QApplication(0,NULL);, vyhodí to sice varování QApplication: invalid Display* argument, ale pak normálně funguje. Má na to qt4 nějaké čisté řešení?Dík, Venca
ide to este jednoduchsie -- ako vravis, cesta je cez klasicke QDialog::show() miesto exec() + treba nastavit, nech sa aplikacia neukonci po zavreti posledneho okna, tusim to je v QApplication triede alebo nejakych global flagoch.
Řešením je použít glib a vůbec se Qt nezabývat... (mimochodem, na tom vidíte, že gtk+/glib je líp navržena, než celá slavná Qt, prostě nikoho nenutí používat X-y...)
Ha. Vieš na čom je najlepšie vidieť, že gtk+/glib je lepšie navrhnutá než celá slávna Qt? Na tom, že ma dlhší názov. 9-2=7, takže gtk+/glib musí byť 7 krát lepšie navrhnutá.
To je argument jak prase...
že gtk+/glib je líp navrženaje argument ještě lepší
Ano, to totiž argument je. Glib můžu použít v konzolové aplikaci na systému bez X11 + gtk+...
A před tím snad nebylo rozumně licencováno? (GPL)
hm, myslel som ze qt gui bezi aj na platformach, ktore Xka vobec nepoznaju... hm, co sa tu dnes nedozviem :)
QApplication: Invalid Display* argument
A je nějaké rozumné odůvodnění předchozí hlášky v případě, že argc = 0, argv = NULL? Nějakou diskuzi jsem našel, ale nic rozumného z ní nevyplynulo. V GTK lze použít gtk_init(NULL, NULL); v Qt se zbavuju otravné hlášky:
int argc = 1; char *argv[1]; QApplication app(argc, argv);
Jak to řešit "čistě"?
Už vím, předpokládal jsem, že volám:
QApplication ( int & argc, char ** argv )
Ale z app(0, NULL); usoudil kompilátor, že chci volat:
QApplication ( Display * dpy, HANDLE visual = 0, HANDLE colormap = 0 )
Viz ./gui/kernel/qapplication.cpp:
if (! dpy)
qWarning("QApplication: Invalid Display* argument");
Huráá, super, díky!! Podařilo se mi to očůrat takhle:
int argc=0; app=new QApplication(argc,(char**)NULL);
Tím se vybere ten správný overload a varování se nezobrazí.
Minule som sa pokúšal urobiť aplikáciu schopnú vyrenderovať HTML stránku a exportovať ju do PDF. Je možné používať QPainter aj bez GUI? Neviem prečo, ale keď som nemal zobrazené žiadne okno aplikácia vždy havarovala. Pritom nepotrebujem QPainter použiť na vykresľovanie okna, ale iba na vykreslenie do súboru ...
A ešte jedna drobnosť, neviem či poznáte knižnice ako Turbo Vision. Bolo by krásne ak by niektoré GUI prvky (základné) fungovali aj v konzole (niečo ako ncurses s tým, že by aplikácia nebežiaca v X zobrazila jednoduché rozhranie skladajúce sa z ASCII znakov). Žiaľ Qt je zamerané len na klasické okná :(
Potreba X11 se da "obejit" pouzitim Xvnc nebo Xvfb. Dalsi zpusob je opatchovat Qt jak to dela napr. http://code.google.com/p/wkhtmltopdf/