Wayback byl vydán ve verzi 0.3. Wayback je "tak akorát Waylandu, aby fungoval Xwayland". Jedná se o kompatibilní vrstvu umožňující běh plnohodnotných X11 desktopových prostředí s využitím komponent z Waylandu. Cílem je nakonec nahradit klasický server X.Org, a tím snížit zátěž údržby aplikací X11.
Byla vydána verze 4.0.0 programovacího jazyka Ruby (Wikipedie). S Ruby Box a ZJIT. Ruby lze vyzkoušet na webové stránce TryRuby. U příležitosti 30. narozenin, první veřejná verze Ruby 0.95 byla oznámena 21. prosince 1995, proběhl redesign webových stránek.
Všem čtenářkám a čtenářům AbcLinuxu krásné Vánoce.
Byla vydána nová verze 7.0 linuxové distribuce Parrot OS (Wikipedie). S kódovým názvem Echo. Jedná se o linuxovou distribuci založenou na Debianu a zaměřenou na penetrační testování, digitální forenzní analýzu, reverzní inženýrství, hacking, anonymitu nebo kryptografii. Přehled novinek v příspěvku na blogu.
Vývojáři postmarketOS vydali verzi 25.12 tohoto před osmi lety představeného operačního systému pro chytré telefony vycházejícího z optimalizovaného a nakonfigurovaného Alpine Linuxu s vlastními balíčky. Přehled novinek v příspěvku na blogu. Na výběr jsou 4 uživatelská rozhraní: GNOME Shell on Mobile, KDE Plasma Mobile, Phosh a Sxmo.
Byla vydána nová verze 0.41.0 multimediálního přehrávače mpv (Wikipedie) vycházejícího z přehrávačů MPlayer a mplayer2. Přehled novinek, změn a oprav na GitHubu. Požadován je FFmpeg 6.1 nebo novější a také libplacebo 6.338.2 nebo novější.
Byla vydána nová verze 5.5 (novinky) skriptovacího jazyka Lua (Wikipedie). Po pěti a půl letech od vydání verze 5.4.
Byla vydána nová verze 5.4.0 programu na úpravu digitálních fotografií darktable (Wikipedie). Z novinek lze vypíchnout vylepšenou podporu Waylandu. Nejnovější darktable by měl na Waylandu fungovat stejně dobře jako na X11.
Byla vydána beta verze Linux Mintu 22.3 s kódovým jménem Zena. Podrobnosti v přehledu novinek a poznámkách k vydání. Vypíchnout lze, že nástroj Systémová hlášení (System Reports) získal mnoho nových funkcí a byl přejmenován na Informace o systému (System Information). Linux Mint 22.3 bude podporován do roku 2029.
GNU Project Debugger aneb GDB byl vydán ve verzi 17.1. Podrobný přehled novinek v souboru NEWS.
Jak zařídit, aby příkaz cp ukazoval "progress bar" (ukazatel postupu) podobně jako wget? Stačí trocha poměrně nechutného čarování s strace a skript je na světě.
Tiskni
Sdílej:
Ale jako hack je to opravdu luxusní (jen kdyby strace nebylo tak zatraceně pomalé
).
/*
* cwp.c: catenate with progress
*
* Copyright (c) 2001 Chris Lightfoot. All rights reserved.
*
*/
static char rcsid[] = "$Id: cwp.c,v 1.2 2001/01/19 00:26:17 chris Exp $";
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/time.h>
#define BLOCKSIZE 65536
#define TIMESTEP 10. /* number of seconds over which rate will be calculated */
int columns = 80; /* width of screen */
/* timeoffset:
* Returns the number of seconds since some time.
*/
float timeoffset(const time_t t0) {
struct timeval tv;
gettimeofday(&tv, NULL);
tv.tv_sec -= t0;
return (float)tv.tv_sec + 1e-6 * (float)tv.tv_usec;
}
/* size:
* Return a string describing the size of something.
*/
char *strsize(const int width, const int len) {
static char str[64];
if (len > 10000000)
sprintf(str, "% *.1f Mb", width - 3, (float)len / 1048576.);
else if (len > 10000)
sprintf(str, "% *.1f Kb", width - 3, (float)len / 1024.);
else
sprintf(str, "% *d b", width - 2, len);
return str;
}
/* file_copy_progress:
* Copy data from a file to some file descriptor, with a progress indicator
* which indicates what fraction of the file has been copied.
*/
void file_copy_progress(char *f, int o, size_t size) {
int i;
ssize_t j, total = 0;
char *buf;
time_t tst;
float t0 = 0., t1, t2;
ssize_t n0, n1, n2;
i = open(f, O_RDONLY);
if (i == -1) {
perror(f);
return;
}
buf = (char*)malloc(BLOCKSIZE);
tst = time(NULL);
t0 = timeoffset(tst);
n0 = 0;
while ((j = read(i, buf, BLOCKSIZE))) {
ssize_t k;
float rate;
if (j == -1 && errno != EINTR) {
fprintf(stderr, "\n");
perror(f);
close(i);
free(buf);
return;
}
for (k = 0; k < j; ) {
ssize_t l;
l = write(o, buf + k, j - k);
if (l == -1 && errno != EINTR) {
fprintf(stderr, "\n");
perror(f);
close(i);
free(buf);
return;
}
k += l;
total += l;
}
t1 = timeoffset(tst);
if ((t1 - t0) > TIMESTEP / 2.) {
t2 = timeoffset(tst);
n2 = total;
}
if ((t1 - t0) > TIMESTEP) {
t0 = t2;
n0 = n2;
}
/* Print a progress indicator. */
fprintf(stderr, "%.*s: written %s/",
columns - 55,
f, strsize(9, total));
fprintf(stderr, "%s % 5.1f%% ",
strsize(9, size),
100. * ((float)total/(float)size));
rate = ((float)(total - n0) / (t1 - t0));
if (rate < 0.) rate = 0.;
if (rate > 1e7)
fprintf(stderr, "% 5.1f Mb/s", rate / 1048576.0);
else if (rate > 1e4)
fprintf(stderr, "% 5.1f Kb/s", rate / 1024.0);
else
fprintf(stderr, "% 5.1f b/s", rate);
fprintf(stderr, " \r");
}
free(buf);
}
/* pipe_copy_progress:
* Copy data from a nonseekable thing to a file descriptor, with a progress
* indicator which indicates how many bytes have been copied.
*/
void pipe_copy_progress(char *f, int i, int o) {
ssize_t j, total = 0;
char *buf;
time_t tst;
float t0 = 0., t1, t2;
ssize_t n0, n1, n2;
buf = (char*)malloc(BLOCKSIZE);
tst = time(NULL);
t0 = timeoffset(tst);
n0 = 0;
while ((j = read(i, buf, BLOCKSIZE))) {
ssize_t k;
float rate;
if (j == -1 && errno != EINTR) {
fprintf(stderr, "\n");
perror(f);
close(i);
free(buf);
return;
}
for (k = 0; k < j; ) {
ssize_t l;
l = write(o, buf + k, j - k);
if (l == -1 && errno != EINTR) {
fprintf(stderr, "\n");
perror(f);
close(i);
free(buf);
return;
}
k += l;
total += l;
}
t1 = timeoffset(tst);
if ((t1 - t0) > TIMESTEP / 2.) {
t2 = timeoffset(tst);
n2 = total;
}
if ((t1 - t0) > TIMESTEP) {
t0 = t2;
n0 = n2;
}
/* Print a progress indicator. */
fprintf(stderr, "%.*s: written %s ",
columns - 20,
f, strsize(9, total));
rate = ((float)(total - n0) / (t1 - t0));
if (rate < 0.) rate = 0.;
if (rate > 1e7)
fprintf(stderr, "% 5.1f Mb/s", rate / 1048576.0);
else if (rate > 1e4)
fprintf(stderr, "% 5.1f Kb/s", rate / 1024.0);
else
fprintf(stderr, "% 5.1f b/s", rate);
fprintf(stderr, " \r");
}
free(buf);
}
int main(int argc, char **argv) {
char *s = getenv("COLUMNS");
int i;
if (s && (i = atoi(s)) && i > 0) columns = i;
signal(SIGPIPE, SIG_IGN); /* We would rather get an EPIPE return. */
/* FIXME should we reopen stderr as /dev/tty if !isatty(2)? */
/* Copy stdin to stdout. */
if (argc == 1)
pipe_copy_progress("standard input", 0, 1);
else if (argc == 2 &&
(!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h"))) {
fprintf(stderr,
"cwp: catenate with progress\n"
"%s\n"
"\n"
" cwp file ...\n"
" catenate the given files on standard output, giving a\n"
" progress indication for each file on standard error\n"
"\n"
" cwp\n"
" copy standard input to standard output, giving a\n"
" progress indication on standard error\n"
"\n"
"Copyright (c) 2001 Chris Lightfoot <chris@ex-parrot.com>. Redistribute freely.\n",
rcsid);
} else {
char **a;
for (a = argv + 1; *a; ++a) {
struct stat st;
stat(*a, &st);
if (S_ISREG(st.st_mode)) {
file_copy_progress(*a, 1, st.st_size);
fprintf(stderr, "\n");
} else {
int fd;
fd = open(*a, O_RDONLY);
if (fd == -1) perror(*a);
else pipe_copy_progress(*a, fd, 1);
}
}
}
}