Michael Meeks, CEO společnosti Collabora, na apríla oznámil, nebyl to ale apríl, že nadace The Document Foundation zastřešující vývoj kancelářského balíku LibreOffice vyloučila ze svých řad všechny zaměstnance a partnery společnosti Collabora, tj. více než třicet lidí, kteří po mnoho let přispívali do LibreOffice. Nadace The Document Foundation po několika dnech publikovala oficiální vyjádření. Přiznává pochybení při zakládání
… více »Protože je už po aprílu, můžou strahováci opět zveřejnit program další Virtuální Bastlírny, aniž by připravená témata působila dojmem, že jde o žert. Vězte tedy, že v úterý 14. dubna (změna!!!) od 20:00 proběhne VB, kde se setkají bastlíři, technici, učitelé i nadšenci do techniky a kde i vy se můžete zapojit do družného hovoru, jako by všichni seděli u pomyslného piva. Co mají bastlíři tento měsíc na srdci? Pravděpodobně by nás musel zasáhnout
… více »Byla vydána verze 26.1 aneb čtvrtletní aktualizace open source počítačového planetária Stellarium (Wikipedie, GitHub). Vyzkoušet lze webovou verzi Stellaria na Stellarium Web.
VOID (Video Object and Interaction Deletion) je nový open-source VLM model pro editaci videa, který dokáže z videí odstraňovat objekty včetně všech jejich fyzikálních interakcí v rámci scény (pády, kolize, stíny...) pomocí quadmaskingu (čtyřhodnotová maska, která člení pixely scény do čtyř kategorií: objekt určený k odstranění, překrývající se oblasti, objektem ovlivněné oblasti a pozadí scény) a dvoufázového inpaintingu. Za projektem stojí výzkumníci ze společnosti Netflix.
Design (GitHub) je 2D CAD pro GNOME. Instalovat lze i z Flathubu. Běží také ve webovém prohlížeči.
Příspěvek na blogu herního enginu Godot představuje aplikaci Xogot přinášející Godot na iPad a iPhone. Instalovat lze z App Storu. Za Xogotem stojí Miguel de Icaza (GitHub) a společnost Xibbon.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za březen (YouTube).
ESP-IDF (Espressif IoT Development Framework), tj. oficiální vývojový framework pro vývoj aplikací na mikrokontrolérech řady ESP32, byl vydán v nové verzi 6.0. Detaily na portálu pro vývojáře.
DeepMind (Alphabet) představila novou verzi svého multimodálního modelu, Gemma 4. Modely jsou volně k dispozici (Ollama, Hugging Face a další) ve velikostech 5-31 miliard parametrů, s kontextovým oknem 128k až 256k a v dense i MoE variantách. Modely zvládají text, obrázky a u menších verzí i audio. Modely jsou optimalizované pro běh na desktopových GPU i mobilních zařízeních, váhy všech těchto modelů jsou uvolněny pod licencí Apache 2.0. Návod na spuštění je už i na Unsloth.
Cursor (Wikipedie) od společnosti Anysphere byl vydán ve verzi 3. Jedná se o multiplatformní proprietární editor kódů s podporou AI (vibe coding).
http://www.abclinuxu.cz/poradna/programovani/show/373050Potreboval bych tutez funkcionalitu implementovat s
mkfifo(). Cili aby mi to po spusteni programu s arametry a delimiterem:
./pipe ls -la @ grep -v .cprovedlo to stejne jakov shellu. Postup bude pravdepodobne stejny, budou tam dva openy asi. Zatim jsem se dostal k hrubemu kodu nize. Nefunguje mi tam ale otevreni fopen():
fopen: No such file or directoryCelkem tapu jak ty prikazy poskladat, aby mi to fungovalo. Budu rad za jakoukoliv radu. Diky. Dosavadni kod (puvodne to byl kod pro nepojmenovanou rouru, stare radky jsou vykomentovane):
int main(int argc,char *argv[]) {
if (argc < 2) {
printf("Programme must be run with with arguments and using pipe shell symbol as a delimiter!\n"
"For example: ./pipe ls -la @ grep -v .c\n");
exit(1);
}
int count, fw, fr;
char command1[50];
char command2[50];
char arguments1[50];
char arguments2[50];
strcpy(command1, argv[1]);
strcpy(arguments1, " ");
strcpy(arguments2, " ");
count = 2;
for (; count < argc; count++) {
if (strcmp(argv[count], "@") == 0) {
break;
}
strcat(arguments1, argv[count]);
strcat(arguments1, " ");
}
arguments1[strlen(arguments1)-1] = '\0'; //removing ending space
strcat(command1, arguments1);
strcpy(command2, argv[count+1]);
count += 2;
for ( ; count < argc; count++) {
strcat(arguments2, argv[count]);
strcat(arguments2, " ");
}
arguments1[strlen(arguments2)-1] = '\0';
strcat(command2, arguments2);
mkfifo(FIFO_FILE, S_IFIFO|0666);
pid_t pid = fork();
if (pid == -1)
return -1;
if (pid == 0) {
//close(fifo); //close write to pipe, in child
//dup2(fifo, STDIN_FILENO); // Replace stdin with the read end of the pipe
//close(fifo); // Don't need another copy of the pipe read end hanging about
if(fr = fopen(FIFO_FILE, "r") == NULL) {
perror("fopen");
exit(1);
}
dup2(fr, STDIN_FILENO);
close(fr);
system(command2);
}
else {
//close(fifo); //close read from pipe, in parent
//dup2(fifo, STDOUT_FILENO); // Replace stdout with the write end of the pipe
//close(fifo); // Don't need another copy of the pipe write end hanging about;
if(fw = fopen(FIFO_FILE, "w") == NULL) {
perror("fopen");
exit(1);
}
dup2(fw, STDOUT_FILENO);
close(fw);
system(command1);
}
return EXIT_SUCCESS;
}
Řešení dotazu:
man errno
, a jeste bych poradil man 3 getopt
návratová hodnota fopen je typu FILE
FILE*
./fifo ls -la @ grep -v .cuz po otevreni roury pro zapis
fw = open(fifo_name, O_WRONLY);hazi chybu:
grep: (standardní vstup): Chybný popisovač souboruCoz je divne, ze mi to hlasi zrovna grep pri otevreni roury teprve por zapis... To same potom pri otevreni roury pro cteni:
ls: chyba při zápisu: Roura přerušena (SIGPIPE)Promenne fr ani fw se mi neinicailzuji, po open() maji hodnotu 0. Pri kompilaci pak dostavam pochopitelne:
fifo.c: In function ‘main’: fifo.c:66:18: warning: ‘fw’ may be used uninitialized in this function [-Wuninitialized] fifo.c:82:18: warning: ‘fr’ may be used uninitialized in this function [-Wuninitialized]DOsavadni kod je takovyto:
int main(int argc,char *argv[]) {
if (argc < 2) {
printf("Programme must be run with with arguments and using pipe shell symbol as a delimiter!\n"
"For example: ./fifo ls -la @ grep -v .c\n");
exit(1);
}
int count, fw, fr, status;
char command1[50];
char command2[50];
char arguments1[50];
char arguments2[50];
char* fifo_name = "/tmp/myfifo";
strcpy(command1, argv[1]);
strcpy(arguments1, " ");
strcpy(arguments2, " ");
count = 2;
for (; count < argc; count++) {
if (strcmp(argv[count], "@") == 0) {
break;
}
strcat(arguments1, argv[count]);
strcat(arguments1, " ");
}
arguments1[strlen(arguments1)-1] = '\0'; //removing ending space
strcat(command1, arguments1);
strcpy(command2, argv[count+1]);
count += 2;
for ( ; count < argc; count++) {
strcat(arguments2, argv[count]);
strcat(arguments2, " ");
}
arguments1[strlen(arguments2)-1] = '\0';
strcat(command2, arguments2);
status = mkfifo(fifo_name, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
if(status == -1) {
perror( "Mkfifo failed" );
exit(1);
}
pid_t pid = fork();
if (pid == -1) {
return -1;
}
if (pid == 0) {
close(fw);
fr = open(fifo_name, O_RDONLY);
unlink(fifo_name);
if(fr == -1) {
printf("Could not open the pipe for reading.\n");
exit(1);
}
dup2(fr, STDIN_FILENO);
close(fr);
system(command2);
unlink(fifo_name);
}
else {
close(fr);
fw = open(fifo_name, O_WRONLY);
if(fw == -1) {
printf("Could not open the pipe for writting.\n");
exit(1);
}
dup2(fw, STDOUT_FILENO);
close(fw);
system(command1);
unlink(fifo_name);
}
return EXIT_SUCCESS;
}
Takze chce to vyresit deskriptory, mozna pouzit jinou fce nez open. Jenze kdyz pouziju fopen(), tak da se nejak jejich vysledek typy FILE* predelat na int a pouzit jako filedeskriptor? To je jediny mozny co me napada...
fileno(), ktera z FILE* promenne vrati file descriptor, ale stejne mi porad vraci nulu a chybove hlasku pro otevreni pomoci fopen() zustavaji stejne... (davam sem jen cast kodu). Proc mi fileno nic nevraci?
int fdr, fdw;
FILE* fr;
FILE* fw;
status = mkfifo(fifo_name, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
if(status == -1) {
perror( "Mkfifo failed" );
exit(1);
}
pid_t pid = fork();
if (pid == -1) {
return -1;
}
if (pid == 0) {
close(fdw);
fr = fopen(fifo_name, "r");
if(fr == NULL) {
perror("Could not open the pipe for reading: \n");
exit(1);
}
fdr = fileno(fr);
dup2(fdr, STDIN_FILENO);
close(fdr);
system(command2);
unlink(fifo_name);
}
else {
close(fdr);
fw = fopen(fifo_name, "w");
if(fw == NULL) {
perror("Could not open the pipe for writting: \n");
exit(1);
}
fdw = fileno(fw);
dup2(fdw, STDOUT_FILENO);
close(fdw);
system(command1);
unlink(fifo_name);
}
if (pid == -1) {
return -1;
}
if (pid == 0) {
fdr = open(fifo_name, O_RDONLY);
if(fdr == -1) {
perror("Could not open the pipe for reading: \n");
exit(1);
}
dup2(fdr, STDIN_FILENO);
close(fdr);
system(command2);
unlink(fifo_name);
}
else {
fdw = open(fifo_name, O_WRONLY);
if(fdw == -1) {
perror("Could not open the pipe for reading: \n");
exit(1);
}
dup2(fdw, STDOUT_FILENO);
close(fdw);
system(command1);
unlink(fifo_name);
}
Akorat bych potreboval jeste poradit, jak misto system() pouzit nejakou exec fci.
Me bohuzel nic jednoducheho nenapada. Ja si dokazu zpracovat vstup na command
retezec a arguments retezec, napriklad ls (command) a -la (arguments), mam to i
v kodu na abicku... jenze exec si neumi poradit se stringy typu "-l -a"
napr:
./fifo ls -l -a @ ....
execlp(command,command,"arguments,NULL) vypada rozepsane jako
execlp("ls","ls","-l -a",NULL);
Nenapada me zadne elegantni reseni. jen nacitat argumenty a testovat, zda
zacinaji"-", pokud ano, tak oddelat minus a spojit s predchozim do jedne velke
sady argumentu... pak jeste ale nejak vyresit parametry bez "-" a jejich
pripadne stridani.. coz nevim moc jak udelat ...a pocet, cim vic takovychto
stridani tim vic by se musela exec fce rozrystat o dalsi a dalsi parametry,
nebo ja fakt nevim, su uz z toho vystavenej...zkratka na zadne nerobustni
reseni nejsem schopnej prijit :(
Tiskni
Sdílej: