abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 19:55 | IT novinky

    Americký výrobce čipů Intel propustí 15 procent zaměstnanců (en), do konce roku by jich v podniku mělo pracovat zhruba 75.000. Firma se potýká s výrobními problémy a opouští také miliardový plán na výstavbu továrny v Německu a Polsku.

    Ladislav Hagara | Komentářů: 6
    včera 17:33 | Komunita

    MDN (Wikipedie), dnes MDN Web Docs, původně Mozilla Developer Network, slaví 20 let. V říjnu 2004 byl ukončen provoz serveru Netscape DevEdge, který byl hlavním zdrojem dokumentace k webovým prohlížečům Netscape a k webovým technologiím obecně. Mozille se po jednáních s AOL povedlo dokumenty z Netscape DevEdge zachránit a 23. července 2005 byl spuštěn MDC (Mozilla Developer Center). Ten byl v roce 2010 přejmenován na MDN.

    Ladislav Hagara | Komentářů: 0
    včera 14:55 | Nová verze

    Wayback byl vydán ve verzi 0.1. 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.

    Ladislav Hagara | Komentářů: 0
    včera 13:33 | Nová verze

    Byla vydána nová verze 6.18 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Nově se lze k síti Tor připojit pomocí mostu WebTunnel. Tor Browser byl povýšen na verzi 14.5.5. Thunderbird na verzi 128.12.0. Další změny v příslušném seznamu.

    Ladislav Hagara | Komentářů: 0
    24.7. 14:33 | IT novinky

    Meta představila prototyp náramku, který snímá elektrickou aktivity svalů (povrchová elektromyografie, EMG) a umožňuje jemnými gesty ruky a prstů ovládat počítač nebo různá zařízení. Získané datové sady emg2qwerty a emg2pose jsou open source.

    Ladislav Hagara | Komentářů: 0
    24.7. 14:22 | Nová verze

    Byla vydána (𝕏) nová verze 25.7 open source firewallové a routovací platformy OPNsense (Wikipedie). Jedná se o fork pfSense postavený na FreeBSD. Kódový název OPNsense 25.7 je Visionary Viper. Přehled novinek v příspěvku na fóru.

    Ladislav Hagara | Komentářů: 0
    24.7. 13:33 | IT novinky

    Před 40 lety, 23. července 1985, společnost Commodore představila první počítač Amiga. Jednalo se o počítač "Amiga od Commodore", jenž byl později pojmenován Amiga 1000. Mělo se jednat o přímou konkurenci počítače Apple Macintosh uvedeného na trh v lednu 1984.

    Ladislav Hagara | Komentářů: 2
    24.7. 06:00 | IT novinky

    T‑Mobile USA ve spolupráci se Starlinkem spustil službu T-Satellite. Uživatelé služby mohou v odlehlých oblastech bez mobilního signálu aktuálně využívat satelitní síť s více než 650 satelity pro posílání a příjem zpráv, sdílení polohy, posílání zpráv na 911 a příjem upozornění, posílání obrázků a krátkých hlasových zpráv pomocí aplikace Zprávy Google. V plánu jsou také satelitní data.

    Ladislav Hagara | Komentářů: 9
    23.7. 21:55 | Komunita

    Společnost Proxmox Server Solutions stojící za virtualizační platformou Proxmox Virtual Environment věnovala 10 000 eur nadaci The Perl and Raku Foundation (TPRF).

    Ladislav Hagara | Komentářů: 2
    23.7. 21:22 | Bezpečnostní upozornění

    Byla vydána nová verze 2.4.65 svobodného multiplatformního webového serveru Apache (httpd). Řešena je bezpečnostní chyba CVE-2025-54090.

    Ladislav Hagara | Komentářů: 0
    Kolik tabů máte standardně otevřeno ve web prohlížeči?
     (29%)
     (25%)
     (5%)
     (5%)
     (5%)
     (2%)
     (2%)
     (27%)
    Celkem 131 hlasů
     Komentářů: 16, poslední včera 15:31
    Rozcestník

    Dotaz: Nahrazeni mezer znakem

    30.11.2005 18:54 Andrew
    Nahrazeni mezer znakem
    Přečteno: 779×
    Hello,

    pls nevite nekdo cim resp. jak nahradit mezery v souboru (log file) nejakym znakem? Zadrhel je v tom, ze potrebuji nahradit mezery pouze te casti, ktera je uvozena uvozovkami-" ".

    Dik za tipy....

    Odpovědi

    David Watzke avatar 30.11.2005 19:12 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    $ cat log.file
    " "
    $ sed 's/" "/"_"/g' log.file
    "_"
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    David Watzke avatar 30.11.2005 19:13 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Oops, zřejmě jsem to špatně přečet. To co děláš bych udělal radši v grafickým editoru, vybral tu část a dal nahradit... Ale v shellu.. to ti musí poradit někdo jiný.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    30.11.2005 19:26 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
      #include <stdio.h>
    
      int main()
      {
        int c;
        int inside = 0;
    
        while ((c = getchar()) != EOF) {
          if (c == '"') inside = !inside;
          if (inside && c==' ') c = '_';
          putchar(c);
        }
    
        return 0;
      }
    
    Zpracování chyb a/nebo parametrů si doplňte za cvičení.
    30.11.2005 19:29 Andrew
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Dekuji, osetreni chyb provedu a odevzdam :)

    Ale ja mel na mysli realizace v shellu....
    1.12.2005 11:12 alex
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Reseni zalozene pouze na shellu bude v tomto pripade velice pomale. Jedina jeho vyhoda je v tom, ze nepotrebujete zadny externi program. Tak tady je reseni, pouzivajici jenom vestavene prikazy bash'e:
    #!/bin/bash
    
    ZAMENA="_"
    
    IFS=
    while read line ; do
    	quote=0
    	while read -n 1 char ; do
    		if [ "$char" == " " ] ; then
    			if [ $quote -eq 0 ] ; then
    				outchar=" "
    			else
    				outchar="$ZAMENA"
    			fi
    		elif [ "$char" == '"' ] ; then
    			quote=$((1 - quote))
    			outchar='"'
    		else
    			outchar="$char"
    		fi
    		echo -n "$outchar"		
    	done <<<"$line"
    	echo
    done
    
    Obecne v ulohach takoveho typu vynika Perl. Tady je reseni v Perl'u:
    $ perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' soubor.log
    
    Na zaver uvedu srovnani rychlosti vsech 3 reseni (vcetne programu v C, napsaneho Michalem Kubeckem):
    $ ls -sh /var/log/messages
    716K /var/log/messages
    $ time uvozovky.sh < /var/log/messages > /dev/null
    real	2m12.561s
    user	1m57.610s
    sys	0m6.001s
    $ time perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' /var/log/messages > /dev/null
    real	0m0.038s
    user	0m0.030s
    sys	0m0.008s
    $ time uvozovky_c < /var/log/messages > /dev/null
    real	0m0.071s
    user	0m0.059s
    sys	0m0.005s
    
    Muzete si vsimnout, ze reseni v Perl'u je dokonce rychlejsi nez v C.
    1.12.2005 13:34 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Obávám se, že vaše měření je něčím zkresleno. Zkoušel jsem si to na asi 5 MB vstupu a vychází mi přibližně 435 ms pro Perl a 155 ms pro C, což vypadá podstatně věrohodněji. Nezapomněl jste na optimalizace?
    1.12.2005 14:12 alex
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Mereni muze byt velice jednoduse zkresleno jeste tim, jestli uvazujeme prvni start programu nebo nasledujici (cache).
    [~]$ gcc -o uvozovky_c uvozovky.c -O2
    [~]$ time ./uvozovky_c < /usr/src/linux-2.6.14.2.tar.bz2  > /dev/null
    
    real	0m4.195s
    user	0m3.174s
    sys	0m0.201s
    [~]$ time ./uvozovky_c < /usr/src/linux-2.6.14.2.tar.bz2  > /dev/null
    
    real	0m3.492s
    user	0m3.112s
    sys	0m0.132s
    [~]$ time ./uvozovky_c < /usr/src/linux-2.6.14.2.tar.bz2  > /dev/null
    
    real	0m3.250s
    user	0m3.079s
    sys	0m0.132s
    [~]$ time ./uvozovky_c < /usr/src/linux-2.6.14.2.tar.bz2  > /dev/null
    
    real	0m3.301s
    user	0m3.098s
    sys	0m0.137s
    
    Podobne,
    [~]$ time perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' /usr/src/linux-2.6.14.2.tar.bz2 > /dev/null
    
    real	0m2.278s
    user	0m1.806s
    sys	0m0.154s
    [~]$ time perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' /usr/src/linux-2.6.14.2.tar.bz2 > /dev/null
    
    real	0m2.003s
    user	0m1.807s
    sys	0m0.154s
    [~]$ time perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' /usr/src/linux-2.6.14.2.tar.bz2 > /dev/null
    
    real	0m2.004s
    user	0m1.814s
    sys	0m0.152s
    
    Samozrejme, prvni start Perlu muze byt i pomalejsi nez C, tady mu pomohlo to, ze ja jsem meril rychlost perlu az po c-ku. Neni nic divneho na tom, ze Perl muze byt rychlejsi nez C. Vzlast kdyz si uvedomite, ze pouzivate getchar() misto operaci cteni celeho bloku.
    1.12.2005 14:33 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Samozřejmě jsem používal průměr druhého až čtvrtého běhu programu, nejsem tak hloupý, jak vypadám. Perl v tomto případě není rychlejší než C, protože už z principu, kterým to děláte (vyhledávání regulárního výrazu) dost dobře ani nemůže. Takže tvrdím, že někde děláte chybu, pravděpodobně v těch optimalizacích.

    Vzlast kdyz si uvedomite, ze pouzivate getchar() misto operaci cteni celeho bloku.

    Zapomínáte na to, že streamové operace v libc mají vlastní bufferování, takže vkládat tam ještě druhý buffer by bylo zbytečné a program by to naopak zpomalilo. Není tam ani overhead na volání getchar(), protože to je ve skutečnosti makro. Samozřejmě by šel program trochu zrychlit načítáním celých bloků pomocí read() a jejich zápisem pomocí write(), pak by Perl neměl nejmenší šanci, ale to už by bylo na úkor přehlednosti.

    1.12.2005 15:10 alex
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Samozřejmě jsem používal průměr druhého až čtvrtého běhu programu, nejsem tak hloupý, jak vypadám.
    Nevypadate vubec hloupe, vase prispevky tady a na cz.comp.linux vzdy povazuji za velice duveryhodne. Ale stava se, ze i mistr tesar se utne, takze jsem nevedel, jestli jste nahodou nezapomel na ten cache.
    Takže tvrdím, že někde děláte chybu, pravděpodobně v těch optimalizacích.
    V minulem prispevku jsem uvedl prikaz, pomoci ktereho to prekladam. Optimalizaci mam nastavenou na level 2. Jak to mate vy?
    Zapomínáte na to, že streamové operace v libc mají vlastní bufferování, takže vkládat tam ještě druhý buffer by bylo zbytečné a program by to naopak zpomalilo.
    Plny souhlas.
    Samozřejmě by šel program trochu zrychlit načítáním celých bloků pomocí read() a jejich zápisem pomocí write(), pak by Perl neměl nejmenší šanci, ale to už by bylo na úkor přehlednosti.
    Tak tady nesouhlasim s tim, ze by to zrychlilo program jen trochu.
    [~]$ cat uvozovky_read_write.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define BUFSIZE 512
    
    int main()
    {
        char *buf_in = malloc(BUFSIZE);
        char *buf_out = malloc(BUFSIZE);
        char c;
        int  i, j, n;
        int inside = 0;
    
        j = 0;
        while (n = read(0, buf_in, BUFSIZE)) {
          for (i = 0; i < n; i++) {
    	      c = buf_in[i];
    	      switch (c) {
    		      case '\n': inside = 0; break;
    		      case '"' : inside = !inside; break;
    		      case ' ' : c = inside ? '_' : ' ';
    	      }
    	      buf_out[j++] = c;
    	      if ( j >= BUFSIZE ) {
    		      write(1, buf_out, BUFSIZE);
    		      j = 0;
    	      }
          }
        }
        if ( j ) {
    	    write(1, buf_out, j);
        }
    
        return 0;
    }
    [~]$ gcc -O2 -o uvozovky_read_write uvozovky_read_write.c
    [~]$ time ./uvozovky_read_write < /usr/src/linux-2.6.14.2.tar.bz2 > /dev/null
    
    real	0m0.641s
    user	0m0.326s
    sys	0m0.202s
    
    A skutecne Perl nema sanci.
    1.12.2005 15:28 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Používal jsem '-O3 -fomit-frame-pointer' plus optimalizaci pro procesor. Co se týká přechodu na 'read()' a 'write()', skutečně jsem ho hodně podcenil, rozdíl je v některých případech i řádový. Zdá se, že režie streamových funkcí v glibc je větší, než jsem si pod vlivem dřívějších testů myslel.
    1.12.2005 20:13 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Zdá se, že režie streamových funkcí v glibc je větší, než jsem si pod vlivem dřívějších testů myslel.
    Dost velký čas sežere zbytečné zamykání, při použítí getchar_unlocked() a putchar_unlocked() se to celkem zrychlí.
    1.12.2005 20:36 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Díky za upozornění, hlavně že zrovna včera jsem několik hodin strávil studiem chování glibc vůči multithreadovým aplikacím…
    1.12.2005 16:13 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Hmm, tak koukám, že tady je to samý C expert, aneb jak napsat co nejméně efektivní memcpy. Co třeba takhle?:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define BUFSIZE 65536
    
    int main()
    {
        char *buf = malloc(BUFSIZE);
        char *c, *end;
        int n;
        int inside = 0;
    
        while (n = read(0, buf, BUFSIZE)) {
            end = buf+n;
            for (c = buf; c < end; c++) {
                switch (*c) {
                    case '\n': inside = 0; break;
                    case '"' : inside = !inside; break;
                    case ' ' : if (inside) *c ='_';
                }
            }
            write(1, buf, n);
        }
    
        return 0;
    }
    Proč ty data přesýpat z jednoho místa na druhé fakt nechápu.
    $ time ./uvozovky_read_write </var/cache/apt/archives/openclipart-png_0.17+dfsg-1_all.deb >/dev/null
    
    real    0m1.716s
    user    0m0.580s
    sys     0m0.270s
    $ time ./uvozovky_read_write_orig </var/cache/apt/archives/openclipart-png_0.17+dfsg-1_all.deb >/dev/null
    
    real    0m1.926s
    user    0m0.800s
    sys     0m0.340s
    
    Krom toho ten půlkylovej buffer byl fakt dobrej vtip. Vůbec vám nevadí, že tráví v kernelu skoro stejně dlouhej čas jako v userspace? Ten uvozovky_read_write_orig má samozřejmě zvětšenej buffer taky, jinak by měl něco kolem 600ms v kernelspace. Toho času real si nevšímejte, nejsem na tom App Serveru sám :-)
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    1.12.2005 16:53 alex
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Tady uz neslo o nejefektivnejsi program v C. Slo o to, porovnat rychlost getchar() versus read(). Spravne jste poukazal na spoustu nedokonalosti, ale vsimnete si, ze po tech upravach cas se zkratil na 10%, kdyzto pri prechodu od getchar k read rozdil byl 5-nasobny. To prave vysvetluje, proc Perl s jeho pomalym regexpem muze byt skoro stejne rychly jako ten prvni program v C - vsechno sezere rezie vstupu/vystupu.
    1.12.2005 17:27 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Však doufám, že jsem se někoho nedotknul :-D
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    1.12.2005 17:36 alex
    Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
    Ale ne, jste vseobecne uznavan jako Velky Optimizator :-)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.