Byl vydán LineageOS 23.2 (Mastodon). LineageOS (Wikipedie) je svobodný operační systém pro chytré telefony, tablety a set-top boxy založený na Androidu. Jedná se o nástupce CyanogenModu.
Od března budou mít uživatelé Discordu bez ověření věku pouze minimální práva vhodná pro teenagery.
Evropská komise (EK) předběžně shledala čínskou sociální síť pro sdílení krátkých videí TikTok návykovým designem v rozporu s unijním nařízením o digitálních službách (DSA). Komise, která je exekutivním orgánem Evropské unie a má rozsáhlé pravomoci, o tom informovala v tiskovém sdělení. TikTok v reakci uvedl, že EK o platformě vykreslila podle něj zcela nepravdivý obraz, a proto se bude bránit.… více »
Offpunk byl vydán ve verzi 3.0. Jedná se o webový prohlížeč běžící v terminálu a podporující také protokoly Gemini, Gopher a RSS. Přibyl nástroj xkcdpunk pro zobrazení XKCD v terminálu.
Promethee je projekt, který implementuje UEFI (Unified Extensible Firmware Interface) bindingy pro JavaScript. Z bootovacího média načítá a spouští soubor 'script.js', který může používat UEFI služby. Cílem je vytvořit zavaděč, který lze přizpůsobit pomocí HTML/CSS/JS. Repozitář se zdrojovými kódy je na Codebergu.
Zpráva Justičního výboru Sněmovny reprezentantů upozorňuje na cenzurní kampaň Evropské komise, mířenou proti svobodě projevu na sociálních sítích. V dokumentu se uvádí, že se Evropská komise během posledních šesti let účastnila více než 100 uzavřených jednání, během nichž po platformách požadovala úpravy pravidel moderování obsahu, přičemž toto úsilí Komise zahrnovalo i cenzuru politických názorů a pravdivých informací. Výbor zdůrazňuje, že tento přístup Bruselu ohrožuje ústavou zaručená práva Američanů na svobodu projevu.
Linus Torvalds vydal jádro Linux 6.19. Podrobný výčet změn je ke zhlédnutí na stránce Kernel Newbies, stručné výběry v LWN (část první, druhá).
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.
Řešení dotazu:
C++ má přesně k takovým účelům (udržování kontextu a návrat do původního stavu) své standardní mechanismy. Předchozí barva se dá jednoduše ukládat na zásobník a pak nechat obnovit destruktorem.
Uvedený příklad není (kvůli statické proměnné) thread-safe, nicméně to by nemuselo vadit, protože terminál bývá jeden.
Taky to podporuje jenom 256 barev místo 24-bitových, ale to se dá celkem triviálně doplnit.
#include <cstdint>
#include <ios>
#include <iostream>
#include <string>
#include <string_view>
#include <utility>
using std::uint8_t;
using std::size_t;
class Color {
class Value {
const std::string code_;
public:
Value(std::string_view code); // C++20: constexpr
std::ostream& operator ()(std::ostream &out) const;
};
Color(std::ostream *out, const Value &previous,
const Value &value, bool value_owned);
std::ostream& operator ()(std::ostream &out);
static const Value *_current;
std::ostream *out_;
const Value &previous_;
const Value &value_;
const bool value_owned_;
friend std::ostream& operator <<(std::ostream& out, Color &&color);
public:
Color(Value &&value);
Color(const Value &value);
Color(std::ostream &out, Value &&value);
Color(std::ostream &out, const Value &value);
static Value custom(uint8_t color); // C++20: constexpr
~Color();
static const Value THICK; // C++20: constexpr
static const Value RESET; // C++20: constexpr
static const Value BLACK; // C++20: constexpr
static const Value RED; // C++20: constexpr
static const Value GREEN; // C++20: constexpr
static const Value YELLOW; // C++20: constexpr
static const Value BLUE; // C++20: constexpr
static const Value MAGENTA; // C++20: constexpr
static const Value CYAN; // C++20: constexpr
static const Value WHITE; // C++20: constexpr
};
Color::Value::Value(std::string_view code) : code_{code} {}
std::ostream& Color::Value::operator ()(std::ostream &out) const {
return out << code_;
}
Color::Color(std::ostream *out, const Value &previous,
const Value &value, bool value_owned) :
out_{out}, previous_{previous}, value_{value}, value_owned_(value_owned) {}
std::ostream& Color::operator ()(std::ostream& out) {
out_ = &out;
_current = &value_;
return value_(out);
}
Color::Color(Value &&value) :
Color{nullptr, *_current, *new Value{std::move(value)}, true} {}
Color::Color(const Value &value) :
Color{nullptr, *_current, value, false} {}
Color::Color(std::ostream &out, Value &&value) :
Color{&out, *_current, *new Value{std::move(value)}, true} {
_current = &value_;
value(out);
}
Color::Color(std::ostream& out, const Value& value) :
Color{&out, *_current, value, false} {
_current = &value_;
value(out);
}
Color::Value Color::custom(uint8_t color) {
return Value("\u001B[38;5;" + std::to_string(color) + 'm');
}
Color::~Color() {
if (out_) previous_(*out_);
_current = &previous_;
if (value_owned_) delete &value_;
}
std::ostream& operator <<(std::ostream& out, Color &&color) {
return color(out);
}
const Color::Value Color::RESET{"\u001B[0m"};
const Color::Value Color::THICK{"\u001B[0;1m"};
const Color::Value Color::BLACK{"\u001B[30;1m"};
const Color::Value Color::RED{"\u001B[31;1m"};
const Color::Value Color::GREEN{"\u001B[32;1m"};
const Color::Value Color::YELLOW{"\u001B[33;1m"};
const Color::Value Color::BLUE{"\u001B[34;1m"};
const Color::Value Color::MAGENTA{"\u001B[35;1m"};
const Color::Value Color::CYAN{"\u001B[36;1m"};
const Color::Value Color::WHITE{"\u001B[37;1m"};
const Color::Value *Color::_current = &Color::RESET;
void recursion(size_t base, size_t shift) {
if (shift < 16) {
Color next{std::cout, Color::custom(base + shift)}; // overflow intended
std::cout << shift;
recursion(base, shift + 1);
std::cout << shift;
} else {
std::cout << " █ ";
std::cout << Color{Color::BLACK} << 'K'
<< Color{Color::RED} << 'R'
<< Color{Color::GREEN} << 'G'
<< Color{Color::YELLOW} << 'Y'
<< Color{Color::BLUE} << 'B'
<< Color{Color::MAGENTA} << 'M'
<< Color{Color::CYAN} << 'C'
<< Color{Color::WHITE} << 'W';
std::cout << " █ ";
}
}
int main() {
std::cout << std::hex << '\n';
std::cout << Color{Color::THICK} << '>'
<< Color{Color::BLACK} << "black"
<< Color{Color::THICK} << '<'
<< Color{Color::RED} << " red"
<< Color{Color::GREEN} << " green"
<< Color{Color::YELLOW} << " yellow"
<< Color{Color::BLUE} << " blue"
<< Color{Color::MAGENTA} << " magenta"
<< Color{Color::CYAN} << " cyan"
<< Color{Color::WHITE} << " white";
std::cout << "\n\n";
std::cout << "This is the default.\n";
{
Color red{std::cout, Color::RED};
std::cout << "This is red.\n";
{
Color green{std::cout, Color::GREEN};
std::cout << "This is green.\n";
{
Color blue{std::cout, Color::BLUE};
std::cout << "This is blue.\n";
std::cout << Color{Color::YELLOW} << "This is yellow.\n";
std::cout << "This is blue.\n";
}
std::cout << "This is green.\n";
}
std::cout << "This is red.\n";
}
std::cout << "This is the default.\n\n";
for (size_t color = 0; color < 256; ++color) {
recursion(color, 0);
std::cout << '\n';
}
std::cout << '\n';
{
Color thick{std::cout, Color::THICK};
std::cout << "This is fucking thick!!!\n";
std::cout << Color{Color::custom(77)} << "And this is almost green.\n";
std::cout << "Thick again.\n";
Color orange{std::cout, Color::custom(208)};
std::cout << "This is an arbitrary orange color.\n";
}
std::cout << "And this is the default again!\n\n";
}
Tiskni
Sdílej: