Singularity je rootkit ve formě jaderného modulu (Linux Kernel Module), s otevřeným zdrojovým kódem dostupným pod licencí MIT. Tento rootkit je určený pro moderní linuxová jádra 6.x a poskytuje své 'komplexní skryté funkce' prostřednictvím hookingu systémových volání pomocí ftrace. Pro nadšence je k dispozici podrobnější popis rootkitu na blogu autora, případně v článku na LWN.net. Projekt je zamýšlen jako pomůcka pro bezpečnostní experty a výzkumníky, takže instalujte pouze na vlastní nebezpečí a raději pouze do vlastních strojů 😉.
Iconify je seznam a galerie kolekcí vektorových open-source ikon, ke stažení je přes 275000 ikon z více jak dvou set sad. Tento rovněž open-source projekt dává vývojářům k dispozici i API pro snadnou integraci svobodných ikon do jejich projektů.
Dle plánu certifikační autorita Let's Encrypt nově vydává také certifikáty s šestidenní platností (160 hodin) s možností vystavit je na IP adresu.
V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 14.0 (Mastodon). Forgejo je fork Gitei.
Just the Browser je projekt, 'který vám pomůže v internetovém prohlížeči deaktivovat funkce umělé inteligence, telemetrii, sponzorovaný obsah, integraci produktů a další nepříjemnosti' (repozitář na GitHubu). Využívá k tomu skrytá nastavení ve webových prohlížečích, určená původně pro firmy a organizace ('enterprise policies'). Pod linuxem je skriptem pro automatickou úpravu nastavení prozatím podporován pouze prohlížeč Firefox.
Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.18. Díky 174 přispěvatelům.
Miliardy korun na digitalizaci služeb státu nestačily. Stát do ní v letech 2020 až 2024 vložil víc než 50 miliard korun, ale původní cíl se nepodařilo splnit. Od loňského února měly být služby státu plně digitalizované a občané měli mít právo komunikovat se státem digitálně. Do tohoto data se povedlo plně digitalizovat 18 procent agendových služeb státu. Dnes to uvedl Nejvyšší kontrolní úřad (NKÚ) v souhrnné zprávě o stavu digitalizace v Česku. Zpráva vychází z výsledků víc než 50 kontrol, které NKÚ v posledních pěti letech v tomto oboru uskutečnil.
Nadace Wikimedia, která je provozovatelem internetové encyklopedie Wikipedia, oznámila u příležitosti 25. výročí vzniku encyklopedie nové licenční dohody s firmami vyvíjejícími umělou inteligenci (AI). Mezi partnery encyklopedie tak nově patří Microsoft, Amazon a Meta Platforms, ale také start-up Perplexity a francouzská společnost Mistral AI. Wikimedia má podobnou dohodu od roku 2022 také se společností Google ze skupiny
… více »D7VK byl vydán ve verzi 1.2. Jedná se o fork DXVK implementující překlad volání Direct3D 5, 6 a 7 na Vulkan. DXVK zvládá Direct3D 8, 9, 10 a 11.
Byla vydána verze 12.0.0 knihovny libvirt (Wikipedie) zastřešující různé virtualizační technologie a vytvářející jednotné rozhraní pro správu virtuálních strojů. Současně byl ve verzi 12.0.0 vydán související modul pro Python libvirt-python. Přehled novinek v poznámkách k vydání.
Práci s protokoly HTTP a FTP implementují třídy QHttp a QFtp, které jsou v Qt dostupné už mnoho let. Ve verzi 4.4 se objevila třída QNetworkAccessManager, která poskytuje jednodušší, ale přesto mocnější API a vývojáři doporučují její použití v nových programech.
Síťování je asynchronní a využívá technologie signálů a slotů. Pošlete požadavek, vytvoří se objekt s odpovědí a tento objekt potom vyšle signál, když je požadavek vyřízený nebo když dojde k chybě.
Při vytváření projektů pracujících s modulem QtNetwork v Qt Creatoru si nezapomeňte modul vyžádat. Pokud projekt vytváříte ručně, tak si do .pro souboru přidejte řádek QT += network.
Ukážeme si, jak poslat HTTP požadavek GET a vypsat získané hlavičky. Program funguje takto:
$ ./httphead http://www.abclinuxu.cz/ Expires: Fri, 22 Dec 2000 05:00:00 GMT Set-Cookie: JSESSIONID=5117noj9m1ik;Path=/ Content-Type: text/html; charset=utf-8 Last-Modified: Thu, 27 Aug 2009 13:38:35 GMT Cache-Control: no-cache, must-revalidate Pragma: no-cache Content-Encoding: gzip Server: Jetty(6.1.11)
http.h: API.
#ifndef HTTP_H
#define HTTP_H
#include <QObject>
#include <QNetworkReply>
#include <QTextStream>
class QNetworkAccessManager;
class HTTP : public QObject
{
Q_OBJECT
public:
HTTP();
int run();
private:
QNetworkAccessManager *manager;
// objekt pro zápis na std. výstup
QTextStream cout;
private slots:
void gotReply(QNetworkReply* reply);
void gotError(QNetworkReply::NetworkError);
};
#endif // HTTP_H
http.cpp
#include "http.h"
/*
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QStringList>
*/
// includne celý modul QtNetwork, který s sebou vtáhne QtCore
#include <QtNetwork>
// tohle potřebujeme pro stdout
#include <cstdio>
HTTP::HTTP() : cout(stdout, QIODevice::WriteOnly)
{
manager = new QNetworkAccessManager(this);
// spojíme signál značící vyřízení požadavku se slotem,
// který zpracuje odpověď
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(gotReply(QNetworkReply*)));
}
int HTTP::run()
{
// zkontrolujeme počet argumentů, případně vypíšeme nápovědu
QStringList args = qApp->arguments();
if(args.size() != 2)
{
cout << "usage: " << args.at(0) << " [http url]\n";
cout.flush();
// odsud nelze ukončit program běžným způsobem,
// vysvětlení najdete u souboru main.cpp
return 1;
}
QString url = args.at(1);
// pošleme HTTP požadavek HEAD na dané URL, uložíme si ukazatel na odpověď
QNetworkReply* reply = manager->head(QNetworkRequest(QUrl(url)));
// spojíme odpověď se slotem, který zpracuje případnou chybu
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(gotError(QNetworkReply::NetworkError)));
return 0;
}
// vypíše všechny hlavičky a ukončí program
void HTTP::gotReply(QNetworkReply* reply)
{
foreach(QByteArray header, reply->rawHeaderList())
{
QByteArray value = reply->rawHeader(header);
cout << header << ": " << value << "\n";
}
cout.flush();
qApp->exit(0);
}
// vypíše chybu a ukončí program
void HTTP::gotError(QNetworkReply::NetworkError e)
{
switch(e)
{
case QNetworkReply::NoError:
break;
case QNetworkReply::ConnectionRefusedError:
cout << tr("connection refused") << "\n";
break;
case QNetworkReply::RemoteHostClosedError:
cout << tr("the remote server closed the connection") << "\n";
break;
case QNetworkReply::HostNotFoundError:
cout << tr("host not found") << "\n";
break;
case QNetworkReply::TimeoutError:
cout << tr("connection timed out") << "\n";
break;)
case QNetworkReply::ProtocolUnknownError:
cout << tr("unknown protocol (did you forget http:// ?)") << "\n";
break;
default:
cout << tr("an error occured") << "\n";
break;
}
cout.flush();
qApp->exit(2);
}
main.cpp: V metodě run() nelze ukončit program klasickým způsobem, protože ještě neběží smyčka událostí. Jelikož zde program ukončit potřebujeme (pokud uživatel nezadá argument – URL), tak jsem zvolil jedno z mnoha řešení, jak to obejít.
#include <QCoreApplication>
#include "http.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
HTTP main;
if(main.run() != 0)
return 1;
return a.exec();
}
Zdrojáky si můžete stáhnout v archívu httphead.tar.bz2.
Jelikož má QNetworkAccessManager takové pěkné rozhraní pro stahování souborů, rozhodl jsem se předvést zde metodu get() právě pro stahování z FTP.
Výstup programu vypadá následovně:
$ ./ftpget ftp://gentoo.mirror.web4u.cz/releases/amd64/autobuilds/20090716/install-amd64-minimal-20090716.iso downloaded 121188352 bytes (out of 121188352), which is 100% download finished, file saved as install-amd64-minimal-20090716.iso $ ./ftpget http://gentoo.mirror.web4u.cz/snapshots/portage-20090818.tar.bz2 downloaded 36430733 bytes (out of 36430733), which is 100% download finished, file saved as portage-20090818.tar.bz2
ftpget.h: API.
#ifndef FTPGET_H
#define FTPGET_H
#include <QObject>
#include <QTextStream>
#include <QNetworkReply>
class QFile;
class QNetworkAccessManager;
class FtpGet : public QObject
{
Q_OBJECT
public:
FtpGet();
int run();
private:
QFile* file;
QString fileName;
QNetworkAccessManager* manager;
QNetworkReply* reply;
QTextStream cout;
private slots:
void downloadFinished(QNetworkReply*);
void showProgress(qint64, qint64);
void writeData();
void handleError(QNetworkReply::NetworkError);
};
#endif // FTPGET_H
ftpget.cpp:
#include "ftpget.h"
#include <QtNetwork>
FtpGet::FtpGet() : cout(stdout, QIODevice::WriteOnly)
{
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(downloadFinished(QNetworkReply*)));
}
int FtpGet::run()
{
// zkontrolujeme počet argumentů, případně vypíšeme nápovědu
QStringList args = qApp->arguments();
if(args.size() != 2)
{
cout << "usage: " << args.at(0) << " [ftp://file]\n";
cout.flush();
return 1;
}
QUrl url(args.at(1));
// získáme z URL název souboru
fileName = url.path().split('/').last();
if(fileName.isEmpty())
fileName = QString("file_from_%1").arg(url.host());
// otevřeme soubor pro zápis
file = new QFile(fileName);
if(!file->open(QIODevice::WriteOnly))
{
cout << "could not open the file (" << fileName << ")\n";
cout.flush();
return 1;
}
// začneme stahovat
reply = manager->get(QNetworkRequest(url));
// propojíme signály s funkcemi pro zápis, výpis průběhu a zpracování chyb
connect(reply, SIGNAL(downloadProgress(qint64,qint64)),
this, SLOT(showProgress(qint64,qint64)));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(handleError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(readyRead()), this, SLOT(writeData()));
return 0;
}
// zapíše průběžně stažená data
void FtpGet::writeData()
{
file->write(reply->readAll());
}
// zavře soubor, informuje o dokončení stahování a ukončí program
void FtpGet::downloadFinished(QNetworkReply* reply)
{
Q_UNUSED( reply )
if(file && file->isOpen())
file->close();
cout << QString("\ndownload finished, file saved as %1\n").arg(fileName);
cout.flush();
qApp->quit();
}
// vypíše průběh stahování
void FtpGet::showProgress(qint64 dl, qint64 all)
{
// procenta
int perc = 0;
// spočítá kolik procent je staženo (pokud to lze)
if(dl > 0 && all > 0)
perc = dl / (all / 100);
// pomocný řetězec s celkovou velikostí
QString sizestr = (all == -1) ? "[unknown total size]" : QString::number(all);
// pomocný řetězec s procenty
QString percstr = "";
if (perc != 0)
percstr = QString(", which is %1%").arg(perc);
// vypíše info o průběhu stahování
cout << QString("\rdownloaded %1 bytes (out of %2)").arg(dl).arg(sizestr) << percstr << "\t\t";
}
// zpracuje chybu (v tomto případě jen vypíše chybový kód, viz první program pro úplné řešení)
void FtpGet::handleError(QNetworkReply::NetworkError e)
{
cout << "\nan error ocurred (code #" << e << "), see http://qt.nokia.com/doc/qnetworkreply.html#NetworkError-enum\n";
qApp->exit(2);
}
main.cpp:
#include <QCoreApplication>
#include "ftpget.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
FtpGet main;
if(main.run() != 0)
return 1;
return a.exec();
}
Zdrojáky si můžete stáhnout v archívu ftpget.tar.bz2.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Zdravim,
mozno mi niekto bude vediet poradit - ked som posledne robil s metodami ktore pracuju s HTTP/HTTPS napriek tomu ze Qt network je deklarovane ako asynchronne na Windows strojoch to sposobovalo "zamrznutie" UI aplikacie pri poziadavkach na server. Ked som to prehnal cez gdb tak Qt vytvoralo cca 5-6 threadov na kazde volanie. Nevie niekto cim to moze byt sposobovane? Vyskytovalo sa to len na Windows, Qt bolo verzie 4.2.2.
Zkus aktuální verzi Qt (dnes 4.5.2) a případně nahlaš chybu vývojářům (viz web qt.nokia.com). Půjde o windows-specific bug.
Pokud to zatím potřebuješ obejít, tak síťování dělej v odděleném vlákně QThread.
finished spojuješ se slotem gotReply/downloadFinished už v konstruktoru, zatímco všechny ostatní až v metodě run (a to dokonce teprve poté, co spustíš samotné stahování)? Intuitivně bych to všechno dělal na jednom místě (asi v run před zahájením stahování)…
Jak korektne implementovat void QTcpServer::incomingConnection ( int socketDescriptor ) pro potomka tridy QTcpServer? Prijde mi, ze to neni mozne. Ta metoda je virtualni, aby mohla byt prepsana. Ale jeji implementace v QTcpServer vyuziva privatni funkce, takze kdyz ji chce nekdo implementovat znovu, nemuze podle me zajistit stejnou funkcnost.
QTcpServer::incomingConnection(socketDescriptor);