Konference OpenAlt 2026 hledá přednášející. Proběhne o víkendu 7. a 8. listopadu na půdě Fakulty informačních technologií VUT v Brně. Témata konference jsou: Otevřený a svobodný software, IoT a Hnutí tvůrců, Vzdělávání, Bezpečnost a soukromí, Otevřená společnost, komunity a data, OpenMobility a další.
Společnosti OpenAI a Broadcom oznámily čip optimalizovaný pro AI pojmenovaný Jalapeño.
Deno (Wikipedie), běhové prostředí (runtime) pro JavaScript, TypeScript a WebAssembly, bylo vydáno v nové verzi 2.9. Hlavní novinkou je deno desktop pro převod Deno projektu na desktopovou aplikaci. Jedná se o alternativu k frameworkům Electron nebo Tauri.
Od zítra jsou Datové schránky oficiálně na nové adrese datovka.gov.cz. Adresa mojedatovaschranka.cz zůstává funkční do 27. srpna 2026, následně budou uživatelé automaticky přesměrováni na datovka.gov.cz.
Dolphin (Wikipedie), tj. open source multiplatformní emulátor herních konzolí GameCube a Wii od Nintenda, byl vydán ve verzi 2606. S podporou Game Boy Playeru.
Vasudeva Kamath představil utilitu debvulns, alternativu k nativní utilitě debsecan, pro výpis zranitelností v Debianu. Navíc má především možnost výstupu ve strukturovaných formátech JSON a CSV. V plánu je exportér pro Prometheus.
Oficiální český státní eshop s elektronickými dálničními známkami nově najdete na edalnice.gov.cz. Doména gov.cz jasně potvrzuje, že jste na oficiálním státním webu [𝕏].
Byla vydána nová verze 4.8.0 interaktivního shellu fish (friendly interactive shell, Wikipedie). Přehled novinek v poznámkách k vydání.
Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem se nově stal čínský LineShine v Národním superpočítačovém centru v Šen-čenu (NSCS) s výkonem 2,198 exaFLOPS. Z prvního místa sesadil americký superpočítač El Capitan s výkonem 1,809 exaFLOPS. Nejvýkonnější český počítač C24 klesl na 215 místo. Karolina, GPU partition klesla na 249. místo a Karolina, CPU partition na 475. místo.
… více »Zemřel průkopník videoherní hudby Bobby Prince (Wikipedie). Složil hudbu pro hry Wolfenstein 3D, Doom, Doom II, Duke Nukem II a Duke Nukem 3D.
Hledal jsem možnost, jak sledovat logy, kreré vytváří python přes logger logging. Programy tail, more a všechny ostatní metody nesplňovaly moje požadavky ( nebo neumím číst man a google ).
Moje bádání v tomto směru bylo ukončeno rozhodnutím udělat takový program v Pythonu. Cesta (pro mně) síce zdlouhavější, zato však inspirativní.
(doufám, že se tady dozvím, že i zbytečná, protože tohle už přece dávno existuje a všichni to dobře vědí... kromě mně, tedy.)
Program jsem psal Pythonu + pySide2. Je jednoúčelový, hlídá jen jeden log, jednoho typu, ale plně funguje a navíc logy obarvuje. Ještě mě napadá dodělat pořádně otevírání souborů a barvení ANSI sekvencí, tak možná později, až na to bude čas...
Přikládám kód: Pro znovuotevření jiného souboru jsem plánoval odpojit a znovu připojit signál fileChanged (aby se nezdvojoval), ale nepovedlo se mi najít správnou kombinaci pro fuknci receivers .. nějak nevím čím ji nakrmit, no vyřešil jsem to jinak.
#! /usr/bin/python3
# This Python file uses the following encoding: utf-8
import sys
import os
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtCore import QFile, Slot, Signal, SIGNAL, QFileSystemWatcher
from PySide2.QtUiTools import QUiLoader
class Reader(QMainWindow):
def __init__(self):
super(Reader, self).__init__()
self.load_ui()
self.fwatcher = QFileSystemWatcher()
self.fwatcher.fileChanged.connect(self.fileWasChanged)
def load_ui(self):
loader = QUiLoader()
path = os.path.join(os.path.dirname(__file__), "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
self.ui = loader.load(ui_file)
ui_file.close()
self.ui.action_Open_file.triggered.connect(self.readFile)
self.ui.show()
@Slot()
def readFile(self):
# noConnection = self.fwatcher.receivers("filechanged")
watchedFiles = self.fwatcher.files()
if watchedFiles:
self.fwatcher.removePaths(watchedFiles)
self.fname = "/home/blabla/muj.log"
self.fwatcher.addPath(self.fname)
self.fillBrowser()
def fillBrowser(self):
content = ""
with open(self.fname, "r") as fh:
while True:
line = fh.readline()
if not line:
break
line = self.loggerConvert(line)
content += line
self.ui.textBrowser.setHtml(content)
@Slot(str)
def fileWasChanged(self, path):
self.fillBrowser()
def loggerConvert(self, line):
line = line.replace("NOTSET", '<font color="gray>NOTSET</font>')
line = line.replace("DEBUG", '<font color="blue">DEBUG</font>')
line = line.replace("INFO", '\
<font color="green">INFO</font>')
line = line.replace("WARNING", '<font color="orange">WARNING</font>')
line = line.replace("ERROR", '<font color="red">ERROR</font>')
line = line.replace("CRITICAL", '<span style="background-color:red"><font color="white"b>\
CRITICAL</font></span>')
line = line.replace("DEBUG", '<font color="blue">DEBUG</font>')
line = line + "
"
return line
if __name__ == "__main__":
app = QApplication([])
widget = Reader()
# widget.ui.show()
sys.exit(app.exec_())
Log vzniká pomocí modulu logging :
import logging
...
...
logging.basicConfig(
filename=logFilename,
format="%(asctime)s [%(levelname)s] %(module)s: %(lineno)d\
%(funcName)s: %(message)s",
level=logging.DEBUG,
datefmt='%d %H:%M:%S',
filemode="w"
)
Tiskni
Sdílej:
Jako bych slyšel ironii ... ale máš pravdu ... 
less --follow-name
tail -f) program
https://klogg.filimonov.dev anebo
https://glogg.bonnefon.org/index.html
Programy tail, more a všechny ostatní metody nesplňovaly moje požadavky ( nebo neumím číst man a google ).Nebýval kdysi tohle portál pro fanoušky linuxu?
import os
import time
class TailFIterator:
"""
Text file iterator, which yields new lines added to the file, like
tail -F. It can detect when the file descriptor was changed (logrotated) or
the file was truncated (also used by logrotate).
You can overload:
.on_file_not_found()
To change behaviour when the file was followed, but was deleted
in the process (logrotated). Standard behaviour is to wait 5 seconds,
try again forever. See also .file_not_found_counter for details.
.on_no_changes_detected()
To decide what to do when no change was detected. Default is to
wait 1s.
"""
def __init__(self, file_path: str, file_mode: str = "rt"):
self.file_size = 0
self.file_path = file_path
self.file_mode = file_mode
self.inode_number = os.stat(file_path).st_ino
self.logfile = open(file_path, self.file_mode)
self.file_not_found_counter = 0
def __iter__(self):
while True:
try:
size = self._get_current_size()
self.file_not_found_counter = 0
except FileNotFoundError as e:
self.file_not_found_counter += 1
self.on_file_not_found(self.file_not_found_counter, e)
continue
if size > self.file_size:
self.logfile.seek(self.file_size)
for line in self.logfile:
yield line
self.file_size = self.logfile.tell()
# in case the .truncate() was called
elif size < self.file_size:
self._check_and_handle_logrotate()
self.file_size = 0
continue
if self._check_and_handle_logrotate():
continue
self.on_no_changes_detected()
def _get_current_size(self) -> int:
return os.stat(self.file_path).st_size
def _check_and_handle_logrotate(self) -> bool:
current_file_info = os.stat(self.file_path)
current_inode_number = current_file_info.st_ino
if current_inode_number != self.inode_number:
self.inode_number = current_file_info.st_ino
self.logfile = open(self.file_path, self.file_mode)
self.file_size = 0
return True
def on_file_not_found(self, file_not_found_counter: int, exception):
if file_not_found_counter > 5:
raise exception
time.sleep(5)
def on_no_changes_detected(self):
time.sleep(1)
(Psal jsem kdysi pro jeden starší projekt co běžel někde kam jsem nechtěl tahat závislosti).
. Za starých časů jsem psal něco podobného pro PHP a používalo to externí inotify. Dneska už zbytečné, každý jazyk to podoporuje.
Děkuji za fakt šikovné podněty ... I komentátorům vašeho příspěvku... Zvlášť Jenda musel prohrabávat staré (.. co - prastaré) archivy, aby našel prastarý kód ( i když podle syntaxe možná zase tak prastarý není, ale stejně) ... fakt dík :)Je to několik let staré, prohledávat jsem nemusel, mám v notionu složku se snippety kam si házím použitelné věci a různé ukázky.
.. jak jsi onehdá snil ... no počkáme ... a snad se dožijem
\b(ERROR|INFO|WARN)\b
Výhoda je, že to nebude matchovat třeba information nebo terror.
Escape HTML - například <1> by se měla změnit na <1> , jinak to může být hezký námět nat code injection
S těmi newline a načítáním nového souboru - bude tam nějaká komplexita navíc, neboť match či přidání nového řádku by se mělo dít jenom v případech, kdy se dokončilo načtení aspoň jednoho řádku. To jenom detail, když už to tak komplikuju.