Fedora zve na dvoudenní testování (2. a 3. prosince), během kterého si můžete vyzkoušet nové webové uživatelské rozhraní (WebUI) projektu FreeIPA. Pomozte vychytat veškeré chyby a vylepšit uživatelskou zkušenost ještě předtím, než se tato verze dostane k uživatelům Fedory a celého linuxového ekosystému.
Eben Upton oznámil zdražení počítačů Raspberry Pi, kvůli růstu cen pamětí, a představil 1GB verzi Raspberry Pi 5 za 45 dolarů.
Linus Torvalds na YouTube kanálu Linus Tech Tips staví dokonalý linuxový počítač.
Po 9 týdnech vývoje od vydání Linuxu 6.17 oznámil Linus Torvalds vydání Linuxu 6.18. Přehled novinek a vylepšení na LWN.net: první a druhá polovina začleňovacího okna a Linux Kernel Newbies. Vypíchnout lze například podporu protokolu PSP (PSP Security Protocol, PSP encryption of TCP connections).
Byla vydána nová stabilní verze 25.11 linuxové distribuce NixOS (Wikipedie). Její kódové označení je Xantusia. Podrobný přehled novinek v poznámkách k vydání. O balíčky se v NixOS stará správce balíčků Nix.
Richard Hughes na Mastodonu oznámil, že se společnost Framework Computer stala sponzorem služby LVFS (Linux Vendor Firmware Service) umožňující aktualizovat firmware zařízení na počítačích s Linuxem.
Jak na webu co nejšíleněji zadávat datum? Jak to uživatelům co nejvíce znepříjemnit? V Bad UX World Cup 2025 (YouTube) se vybíraly ty nejšílenější UX návrhy. Vítězným návrhem se stal Perfect Date.
Společnost Collabora vydala (YouTube) na LibreOffice založený desktopový kancelářský balík Collabora Office. Pro Windows, macOS a Linux. Se stejným uživatelským rozhraním jako Collabora Online. Svůj desktopový kancelářský balík s rozhraním LibreOffice pojmenovala Collabora Office Classic.
Glen MacArthur vydal AV Linux (AVL) a MX Moksha (MXM) 25. S linuxovým jádrem Liquorix. AV Linux (Wikipedie) je linuxová distribuce optimalizována pro tvůrce audio a video obsahu. Nejnovější AV Linux vychází z MX Linuxu 25 a Debianu 13 Trixie. AV Linux přichází s desktopovým prostředím Enlightenment 0.27.1 a MX Moksha s prostředím Moksha 0.4.1 (fork Enlightenmentu).
Ubuntu pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 1. snapshot Ubuntu 26.04 LTS (Resolute Raccoon).
/proc/net/dev, ale to není podstatný, protože tam mám spíš nějakou chybu, jenže nevím jakou... Ukazuje mi nesmysl:
dl 18014261070691488 kB/s up 0 kB/sNení na tohle třeba nějaká knihovna? Pokud ne, co tam mám špatně? Díky...
Pro začátek zkus program v případě že se nepovede otevřít ten soubor rovnou zabít
cat /proc/net/dev | grep eth0 | awk '{print $1}' (za predpokladu ze si zmenis eth0 :)

awk '/eth0/ {print $1}' /proc/net/dev
$ time for ((i=0; i<999; i++))
do
awk '/eth0/ {print $1}' /proc/net/dev
done > /dev/null
real 0m2.008s
user 0m0.908s
sys 0m1.092s
$ time for ((i=0; i<999; i++))
do
cat /proc/net/dev | grep eth0 | awk '{print $1}'
done > /dev/null
real 0m5.584s
user 0m2.261s
sys 0m3.295s
No, vyřešeno, dík...
S využitím standardní C++ knihovny by se to dalo napsat mnohem elegantněji.Věřím. Zatím nemám peníze na Mistrovství v C++, takže to asi nevymyslím
Zatím zkusím najít nějaký program v C++, ve kterém se se soubory z /proc pracuje, abych viděl jak to z nich dolují
return vyhodil exception, takže by zjistil, co se děje… :-)
ifstream f("/proc/net/dev");
string s;
while(getline(f, s))
if (s.find("eth0") != -1)
cout << s << endl;Tohle vypíše řádek obsahující "eth0", jenže jak z toho dostat ty dvě hodnoty (počet přijatých a odeslaných bajtů) aby to bylo mnohem elegantnější?
Např. takhle:
class Netload {
public:
typedef unsigned long long count_t;
std::string name;
count_t d;
count_t u;
Netload(count_t id = 0, count_t iu = 0) { d = id; u = iu; }
~Netload() {}
const Netload operator - (const Netload& x);
};
inline const Netload Netload::operator - (const Netload& x)
{
return Netload(d - x.d, u - x.u);
}
std::istream& operator >> (std::istream& s, Netload& x)
{
std::string buff;
getline(s, buff, ':');
if (!s) return s;
s >> x.d;
Netload::count_t tmp;
for (int i=0; i<7; i++)
s >> x;
s >> x.u;
s.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
return s;
}
bool GetStat(const std::string& ifname, Netload& stat)
{
std::ifstream s("/proc/net/dev");
if (!s) throw std::runtime_error("cannot open /proc/net/dev");
s.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
s.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
while (s >> stat) {
if (stat.name == ifname) return true;
}
return false;
}
Btw, budu to ještě muset ověřit, ale když použiju tenhle main(), tak se zdá že neměří upload, ukáže vždy nulu...
int main(int argc, char** argv) {
if (argc != 2) {
cout << "Usage: " << argv[0] << " eth0\n";
return 1;
}
Netload before, now, diff;
GetStat(argv[1], before);
sleep(1);
GetStat(argv[1], now);
diff.d = now.d - before.d;
diff.u = now.u - before.u;
cout << "dl " << diff.d / 1024 << " kB/s\nup " << diff.u / 1024 << " kB/s\n";
}
To bude tím, že jsem to nezkoušel. :-) Jinak by tento jednoúčelový prográmek šel samozřejmě napsat jednodušeji, ale předpokládám, že s těmi hodnotami budete chtít pracovat nějak soustavněji, takže spíš než na jednoduchost implementace té třídy jsem se zaměřil na jednoduchost použití. Zrovna tak místo konstanty 'std::numeric_limits<std::streamsize>::max()' jsem mohl napsat třeba 256, ale IMHO je lepší si na podobné bulharské konstanty nezvykat a psát všude to, co tam logicky patří. Takže druhý pokus:
#include <iostream>
#include <fstream>
#include <stdexcept>
#include <unistd.h> // sleep
class Netload {
public:
typedef unsigned long long count_t;
std::string name;
count_t d;
count_t u;
Netload() { d = u = 0; }
Netload(std::string& iname, count_t id = 0, count_t iu = 0)
: name(iname) { d = id; u = iu; }
~Netload() {}
const Netload operator - (const Netload& x);
};
inline const Netload Netload::operator - (const Netload& x)
{
return Netload(name, d - x.d, u - x.u);
}
inline void trimleft(std::string& s)
{
unsigned i = 0;
unsigned L = s.length();
while (i<L && s[i]==' ') i++;
s.erase(0, i);
}
std::istream& operator >> (std::istream& s, Netload& x)
{
getline(s, x.name, ':');
if (!s) return s;
trimleft(x.name);
s >> x.d;
Netload::count_t tmp;
for (int i=0; i<7; i++)
s >> tmp;
s >> x.u;
s.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
return s;
}
std::ostream& operator << (std::ostream& s, const Netload& x)
{
s << x.name << ": dn " << x.d/1024 << " KB, up " << x.u/1024 << " KB\n";
return s;
}
void GetStat(const std::string& ifname, Netload& stat)
{
std::ifstream s("/proc/net/dev");
if (!s) throw std::runtime_error("cannot open /proc/net/dev");
s.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
s.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
while (s >> stat) {
if (stat.name == ifname) return;
}
throw std::runtime_error("cannot read statistics for selected interface");
}
int main(int argc, char** argv)
{
try {
if (argc != 2)
throw std::runtime_error("Usage: transfer <ifname>");
Netload before, now;
GetStat(argv[1], before);
sleep(1);
GetStat(argv[1], now);
std::cout << (now - before);
return 0;
}
catch(std::exception& e) {
std::cerr << "transfer: " << e.what() << std::endl;
return 1;
}
}
Tou elegancí jsem myslel hlavně to, jak se vám zpřehlední právě main() a zejména zpracování chyb. Díky použití nástrojů jazyka C++ můžete totiž oddělit reakci na chybu od její detekce.
$ mrtg-ip-acct eth0 236054352 240845652 4:05pm up 199 days, 12:11, 1 user, load average: 0.00, 0.02, 0.00 localhost
Tiskni
Sdílej: