Byla vydána nová verze 5.18 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl povýšen na verzi 12.5.6. Tor na verzi 0.4.8.6.
Šifrovací nástroj VeraCrypt v menším vydání 1.26.7 nejen opravuje chyby a aktualizuje podporované algoritmy (podrobnosti v poznámkách vydání), ale také přestává podporovat původní svazky TrueCrypt.
V sobotu 7. října proběhne Maker Faire Liberec, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.
Mastodon vydal výroční zprávu za rok 2022 (pdf).
Ubuntu Summit 2023 proběhne od 3. do 5. listopadu v Rize.
Programovací jazyk Python byl vydán v nové major verzi 3.12.0. Podrobný přehled novinek v Changelogu.
Linux ve Scratchi. Ne Linux v linuxové distribuci Linux From Scratch, ale Linux bežící v emulátoru procesoru RISC-V ve vizuálním programovacím jazyce Scratch.
Dnes ve 12 hodin začal další ročník CTF (Capture the Flag) soutěže The Catch: "Tentokrát nás kolegové z Forenzní laboratoře zavedou na loď plnou sofistikovaných síťových technologiích, kde soutěžící budou muset zvládnout náročné úkoly. Loď nese jméno našeho skvělého kolegy Josefa Vericha – síťového guru. Tradičně se soutěž koná v říjnu – měsíci kybernetické bezpečnosti."
Konference LinuxDays 2023 proběhne již tento víkend 7. a 8. října v prostorách Fakulty informačních technologií Českého vysokého učení v Praze (FIT ČVUT). Na programu je spousta zajímavých přednášek a workshopů.
Netflix v pátek 29. září odeslal poslední film na DVD (YouTube). Společnost dnes známá jako streamovací služba začala před 25 lety jako půjčovna filmů na DVD. Zákazník si DVD objednal na webových stránkách, odesláno mu ale bylo klasickou poštou. Po zhlédnutí jej vložil do obálky a poslal zpět.
/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...
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
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
/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; }
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: