Byla vydána nová verze 9.1.0 správce sbírky fotografií digiKam (Wikipedie). Přehled novinek i s náhledy v oficiálním oznámení (NEWS). Vypíchnout lze vylepšené vyhledávání nebo podporu Pixel Motion Photos. Nejnovější digiKam je ke stažení také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo ke spuštění a spustit.
Přihlaste svou přednášku na další ročník konference LinuxDays, který proběhne 3. a 4. října na FIT ČVUT v pražských Dejvicích. Příjem témat poběží do konce prázdnin, pak proběhne veřejné hlasování a následně sestavení programu.
Byla vydána nová verze 2.4.68 svobodného multiplatformního webového serveru Apache (httpd). Řešeno je mimo jiné 13 zranitelností.
Apple na své vývojářské konferenci WWDC26 (Worldwide Developers Conference, keynote) představil řadu novinek. Vypíchnout lze novou generaci Apple Intelligence a zbrusu novou Siri, která dostala název Siri AI. Kvůli Aktu o digitálních trzích (DMA) však funkce Siri AI nebudou v systémech iOS 27 a iPadOS 27 k dispozici uživatelům v Evropské unii.
Byla vydána nová verze 1.18.0 distribučního frameworku Flatpak (Wikipedie), tj. technologie umožňující distribuovat aplikace v podobě jednoho instalačního souboru na různé linuxové distribuce a jejich různá vydání. Přehled novinek na GitHubu. Vypíchnout lze podporu rozhraní /dev/kfd pro výpočty na kartách AMD (AMDKFD).
aMule (Wikipedie), tj. multiplatformní klient pro peer-to-peer sdílení souborů pro sítě eD2k and Kademlia, byl po více než pěti letech od vydání poslední verze 2.3.3, vydán v nové major verzi 3.0.0 (GitHub). S novou webovou stránkou a dokumentací.
Byly vyhlášeni vítězové a zveřejněny vítězné zdrojové kódy (YouTube, GitHub) již 29. ročníku soutěže International Obfuscated C Code Contest (IOCCC), tj. soutěže o nejnepřehlednější (nejobfuskovanější) zdrojový kód v jazyce C.
Evropská komise předložila evropský balíček pro technologickou suverenitu, tedy soubor opatření, která mají posílit kapacity EU v oblasti polovodičů, umělé inteligence, cloudu a open source. To Evropě pomůže stát se lídrem v oblasti umělé inteligence, posílit její digitální autonomii a vytvářet podmínky pro udržitelnější digitální budoucnost.
OpenCV (Open Source Computer Vision, Wikipedie), tj. open source multiplatformní knihovna pro zpracování obrazu a počítačové vidění, byla vydána v nové major verzi 5.
Byla vydána nová verze 9.7 multiplatformní digitální pracovní stanice pro práci s audiem (DAW) Ardour. Přehled novinek, vylepšení a oprav v poznámkách k vydání.
text1
text2
text3
klic_slovo
text4
text5
...
Potreboval bych vysledek asi takto:text1
text2
text3
klic_slovo text4
text5
...
Zkousel jsem to pomoci sedu, awk i grepu, ale k touzenemu vysledku jsem se bohuzel nedostal..
Honza.
Dle
UZITEČNÉ JEDNOŘÁDKOVÉ SKRIPTY PRO SED
je řešení např. toto:
cat file.txt |sed -e :a -e '/klic_slovo$/N; s/\n/ /; ta'
python << EOF
import gtk
class TwoTexts:
def __init__(self, buff, klic_slovo):
self.klic_slovo = klic_slovo
txtv1 = gtk.TextView()
buff1 = txtv1.get_buffer()
buff1.set_text(buff)
sep = gtk.VSeparator()
txtv2 = gtk.TextView()
txtv2.set_editable(False)
buff2 = txtv2.get_buffer()
self.buffer_changed(buff1, buff2)
buff1.connect('changed', self.buffer_changed, buff2)
hbox = gtk.HBox(False, 0)
hbox.pack_start(txtv1, True, True, 0)
hbox.pack_start(sep, False, True, 0)
hbox.pack_start(txtv2, True, True, 0)
hbox.show_all()
w = gtk.Window(gtk.WINDOW_TOPLEVEL)
w.set_position(gtk.WIN_POS_CENTER)
w.connect('destroy', gtk.main_quit)
w.connect('delete_event', self.delete_event)
w.add(hbox)
w.show_all()
def delete_event(self, widget, data = None):
return False
def buffer_changed(self, buff1, buff2):
start, end = buff1.get_bounds()
text = buff1.get_text(start, end)
newtext = text.replace(self.klic_slovo + '\n',
self.klic_slovo + ' ')
buff2.set_text(newtext)
def runapp(self):
gtk.main()
buff = '''text1
text2
text3
klic_slovo
text4
text5'''
twotexts = TwoTexts(buff, 'klic_slovo')
twotexts.runapp()
EOF
cat file.txt |python -c 'import re; import sys; print re.sub(r"(klic_slovo)\n", "\\1 ", sys.stdin.read())'
Na malý soubor je celkem jedno co použijete, ale jakmile bude soubor stejně velký jako vaše RAM, tak jste na tomto příkladu v pythonu skončili (jasný šlo by to vyřešit, ale to by bylo proti Unixové filozofii, proč znovu vymýšlet kolo). Zkuste se podívat na top, když pracuje python a když sed. Všimněte si, že sed nežere žádnou paměť
a v tom je jeho síla, je to starý dobrý Unixový nástroj. BTW: sort a další sofistikované nástroje jsou na tom stejně, je jim jedno kolik máte paměti a přece dokončí svojí činost
Zkuste se podívat do /tmp při použití sort na velký soubor a uvidíte proč...
#!/usr/bin/env python
import sys
k1 = 'klic_slovo\n'
k2 = 'klic_slovo '
for line in sys.stdin:
if line == k1: line = k2
sys.stdout.write(line)
Sorry, verze na jednom řádku byla jen pro rýpaly a jak jsem se to snažil nahečmat na jeden řádek, tak jsem udělal tu blbost, že jsem nejprve načetl komplet celý vstup do paměti což je moje chyba a ne Pythonu
Nechci tvrdit, že je něco lepší nebo horší, Python mám rád, jen si chci ujasnit na co je lepší se mu vyhnout. Na menší množství dat je bez diskuze pohodlnější po všech stránkách, pokud to není věc, která se jednou napíše přímo do příkazové řádky, již nikdy se nepoužuje a dotyčný zvládá sed, gawk atp.
Myslím, že když chceš srovnávat rychlost, bylo by férové použít i v Pythonu regulární výrazy. Přeci jenom není to vždy takovéto jednoduché porovnávání.
~12x pomalejší:
for line in sys.stdin:
sys.stdout.write(re.sub(r"(klic_slovo)\n", "\\1 ", line))
~6x pomalejší:
pattern1 = re.compile(r"klic_slovo\n")
pattern2 = re.compile(r"(klic_slovo)\n")
for line in sys.stdin:
if (re.search(pattern1, line) == None):
sys.stdout.write(line)
else:
sys.stdout.write(re.sub(pattern2, "\\1 ", line))
Napadá Tě jak to v Pythonu ještě urychlit? Podmínka je samozřejmě zachovat možnost využití regulárních výrazů
Jinak u sedu si můžeme v tomto případě odpustit skákání na značku a, pak je to ještě krapet (opravdu zanedbatelně) rychlejší:
cat file.txt |sed '/klic_slovo$/N; s/\n/ /;'
re.search(pattern1, line) je podle mých pokusů rychlejší pattern1.search (line).
#!/usr/bin/env python
import sys, re
def run():
search = re.compile(r'(klic_slovo)\n').search
write = sys.stdout.write
for line in sys.stdin:
s = search(line)
if s: line = s.groups()[0] + ' '
write(line)
run()
Ale je to pořád o cca 70% pomalejší než sed nebo perl.
Tiskni
Sdílej: