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 23:45 | Zajímavý software

Na blogu Qt bylo představeno Qt 3D Studio. Jedná se o produkt dosud známý pod názvem NVIDIA DRIVE™ Design Studio. NVIDIA jej věnovala Qt. Jedná se o několik set tisíc řádků zdrojového kódu. Qt 3D Studio bude stejně jako Qt k dispozici jak pod open source, tak pod komerční licencí. Ukázka práce s Qt 3D Studiem na YouTube.

Ladislav Hagara | Komentářů: 4
včera 17:50 | Komunita

Nadace The Document Foundation (TDF) zastřešující vývoj svobodného kancelářského balíku LibreOffice slaví 5 let od svého oficiálního vzniku. Nadace byla představena 28. září 2010. Formálně byla založena ale až 17. února 2012.

Ladislav Hagara | Komentářů: 0
včera 12:50 | Komunita

Mozilla.cz informuje, že dosud experimentální funkce Page Shot z programu Firefox Test Pilot (zprávička) se stane součástí Firefoxu. Page Shot je nástroj pro vytváření snímků webových stránek. Umí výběr oblasti, prvku stránky (např. odstavce), nebo uložení snímku celé stránky. Snímky lze ukládat na disk nebo nahrávat na server Mozilly. Nedávno bylo oznámeno, že se součástí Firefoxu stane Activity Stream.

Ladislav Hagara | Komentářů: 24
včera 04:10 | Nová verze

Po 10 týdnech vývoje od vydání Linuxu 4.9 (zprávička) oznámil Linus Torvalds, mj. již 20 let žijící v USA, vydání Linuxu 4.10 (LKML). Přehled nových vlastností a vylepšení například na Kernel Newbies a v Jaderných novinách (1, 2 a 3). Kódové jméno Linuxu 4.10 je Fearless Coyote.

Ladislav Hagara | Komentářů: 10
19.2. 15:55 | Zajímavý projekt

Vyzkoušet si příkazy a vyřešit několik úkolů lze na stránkách Commandline Challenge (CMD Challenge). Úkoly lze řešit různými způsoby, důležitý je výsledek. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

Ladislav Hagara | Komentářů: 18
18.2. 17:35 | Bezpečnostní upozornění

Německá Bundesnetzagentur (obdoba českého ČTU) zakázala na německém území prodej panenky Cayla kvůli „špionáži“ dětí. Tato elektronická hračka obsahuje mikrofon, reproduktor a kameru a bezdrátové komunikační rozhraní, pomocí kterého se hračka připojuje na servery výrobce. Takovýmto způsobem může hračka pomocí umělé inteligence „odpovídat“ na dotazy dítěte. Hlavní problém bude ale asi někde jinde, podle prvotních zpráv může

… více »
Petr Tomášek | Komentářů: 33
17.2. 15:30 | Bezpečnostní upozornění

CSIRT.CZ upozorňuje, že bezpečnostní experti objevili nový typ malwaru, jenž cílí na open source e-commerce platformu Magento. Malware je zajímavý tím, že se jedná o první svého druhu, jehož kód zůstává skrytý v SQL databázi zasaženého e-shopu. Škodlivý kód je volán pomocí tzv. SQL trigerru, který je spouštěn při každém vytvoření objednávky v systému.

Ladislav Hagara | Komentářů: 4
17.2. 09:00 | Nová verze

Bylo vydáno Ubuntu 16.04.2 LTS, tj. druhé opravné vydání Ubuntu 16.04 LTS s kódovým názvem Xenial Xerus. Přehled novinek v poznámkách k vydání a v přehledu změn.

Ladislav Hagara | Komentářů: 60
17.2. 06:00 | Zajímavý článek

Pavel Tišnovský se v dvoudílném článku na MojeFedora.cz věnuje tvorbě pluginů (modulů) pro bitmapový grafický editor GIMP. Pomocí pluginů lze GIMP rozšiřovat o další funkce. Implementovat lze například nové filtry nebo pomocné utility pro tvorbu animací či poloautomatickou retuš snímků.

Ladislav Hagara | Komentářů: 6
16.2. 23:32 | Komunita

Do 30. března se lze přihlásit do dalšího kola programu Outreachy, jehož cílem je přitáhnout do světa svobodného a otevřeného softwaru lidi ze skupin, jež jsou ve světě svobodného a otevřeného softwaru málo zastoupeny. Za 3 měsíce práce, od 30. května do 30. srpna 2017, v participujících organizacích lze vydělat 5 500 USD. Jedná se již o 14. kolo tohoto programu.

Ladislav Hagara | Komentářů: 11
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (13%)
 (2%)
 (72%)
 (3%)
 (10%)
Celkem 674 hlasů
 Komentářů: 61, poslední dnes 13:06
Rozcestník
Reklama

Dotaz: Nahrazeni mezer znakem

30.11.2005 18:54 Andrew
Nahrazeni mezer znakem
Přečteno: 737×
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: 71 | 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: 71 | 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: 71 | 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: 71 | 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: 71 | 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.