Na novoroční inauguraci starosty New Yorku Zohrana Mamdaniho bylo zakázáno si s sebou přinést Raspberry Pi anebo Flipper Zero. Raspberry Pi i Flipper Zero jsou explicitně uvedeny v seznamu zakázaných věcí jak na na veřejné pozvánce, tak i na oficiálních stránkách města.
OpenTTD (Wikipedie), tj. open source klon počítačové hry Transport Tycoon Deluxe, byl vydán v nové stabilní verzi 15.0. Přehled novinek v seznamu změn a také na YouTube. OpenTTD lze instalovat také ze Steamu.
Správce oken IceWM byl vydán ve verzi 4.0.0, která např. vylepšuje navigaci v přepínání velkého množství otevřených oken.
Od 1. ledna 2026 jsou všechny publikace ACM (Association for Computing Machinery) a související materiály přístupné v její digitální knihovně. V rámci této změny je nyní digitální knihovna ACM nabízena ve dvou verzích: v základní verzi zdarma, která poskytuje otevřený přístup ke všem publikovaným výzkumům ACM, a v prémiové zpoplatněné verzi, která nabízí další služby a nástroje 'určené pro hlubší analýzu, objevování a organizační využití'.
K 1. lednu 2026 končí 70leté omezení majetkových autorských práv děl autorů zesnulých v roce 1955, viz 2026 in public domain. V americkém prostředí vstupují do public domain díla z roku 1930, viz Public Domain Day.
Všem vše nejlepší do nového roku 2026.
Crown je multiplatformní open source herní engine. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT a GPLv3+. Byla vydána nová verze 0.60. Vyzkoušet lze online demo.
Daniel Stenberg na svém blogu informuje, že po strncpy() byla ze zdrojových kódů curlu odstraněna také všechna volání funkce strcpy(). Funkci strcpy() nahradili vlastní funkcí curlx_strcopy().
Byla vydána nová verze 25.12.30 svobodného multiplatformního video editoru Shotcut (Wikipedie) postaveného nad multimediálním frameworkem MLT. Shotcut je vedle zdrojových kódů k dispozici také ve formátech AppImage, Flatpak a Snap.
#!/usr/bin/env python
import sys, os, threading, tty, fcntl, struct, time
class CD_thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.fd = fd
def run(self):
while True:
fcntl.ioctl(fd, tty.TIOCMIWAIT, tty.TIOCM_CD)
lock.acquire()
print "DCD changed"
lock.release()
fd = os.open('/dev/ttyS0', os.O_RDWR | os.O_SYNC)
lock = threading.Lock()
cd_thread = CD_thread()
cd_thread.start()
try:
while True:
lock.acquire()
print "heartbeat"
os.write(fd, "\xff"*100)
lock.release()
time.sleep(3)
except:
cd_thread._Thread__stop()
Hlavní vlákno každé tři sekundy něco pošle na sériový port, přičemž jiné vlákno hlídá změnu stavové linky DCD. Zámek hlídá, aby si vlákna moc nelezla do zelí (ale to se stejně trochu děje). Zdá se, že to funguje, ze sériového portu skutečně něco leze a na DCD to reaguje, ale fakt nevím, jestli nemůže nastat nějaká problémová situace.
man 2 signal man 2 alarmJe to jednoduché a mělo by to fungovat bez problémů. Spočívá to v tom, že si nastavíš, za jak dlouho ti má jádro poslat signál SIGALRM. A jakýkoliv příchozí signál by měl přerušit ten syscall, který se během něho prováděl. Takže do obsluhy signálu bych dal jen nastavení nějakého flagu a pořešil to v hlavní smyčce (nebudeš mít problémy se synchronizací).
void sig_alrm(int signo)
{
printf ("posilam heartbeat\n") ;
alarm(3); //znovu za 3 sec
}
int main()
{
int fd,er, rts = TIOCM_RTS, dtr = TIOCM_DTR, talk;
if ((fd=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)
{
perror("open_port: Unable to open /dev/ttyS0 - ");
return 1;
}
//nastav bity potrebuju volty na diodu
ioctl(fd, TIOCMBIS, &rts);
ioctl(fd, TIOCMBIC, &dtr);
if (signal(SIGALRM, sig_alrm) == SIG_ERR)
perror("signal(SIGALRM) error");
while(1){
alarm(3);
er = ioctl(fd, TIOCMIWAIT, TIOCM_CAR);
if (er < 0)
{
if (er != EINTR /*ERESTARTSYS*/)
perror("wait_DCD");
}
else {
alarm(0);
if (ioctl(fd, TIOCMGET, &talk) < 0)
perror("get_DCD");
if (talk & TIOCM_CAR)
printf ("1\n");
else
printf ("0\n");
}
}
close (fd);
}
static int s, alarm_flag = 0 ;
static struct sockaddr_in server_address;
void send_data (int data)
{
if (sendto(s, &data, 1, 0, (struct sockaddr*)&server_address, sizeof(server_address))==-1)
{perror("Error sending datagram: "); close(s); exit(-1); }
}
void sig_alrm(int signo)
{
alarm_flag++;
}
int main()
{
int fd, rts = TIOCM_RTS, dtr = TIOCM_DTR, talk, mask = TIOCM_CAR, result, DCD,er;
s = socket(PF_INET, SOCK_DGRAM, 0);
if (s == -1) {
perror("Server: Error Opening socket \n");
exit (-1);
}
// pripravime adresu serveru
server_address.sin_family=AF_INET;
server_address.sin_port=htons(32000);
server_address.sin_addr.s_addr=inet_addr("127.0.0.1");
printf("Sending datagram to server\n");
// posleme datagram na pripravenou adresu serveru
//open the device
if ((fd=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)
{
perror("open_port: Unable to open /dev/ttyS0 - ");
return 1;
}
//nastav bity potrebuju volty na diodu
ioctl(fd, TIOCMBIS, &rts);
ioctl(fd, TIOCMBIC, &dtr);
siginterrupt (SIGALRM,1);
if (signal(SIGALRM, sig_alrm) == SIG_ERR)
perror("signal(SIGALRM) error");
while(1){
alarm(3);
if ( ioctl(fd, TIOCMIWAIT, TIOCM_CAR)< 0) if (errno != EINTR /*ERESTARTSYS*/) perror("wait_DCD");
if (alarm_flag) {
printf ("posilam heartbeat\n") ;
send_data (1);
alarm_flag = 0;
}
else {
alarm(0);
if (ioctl(fd, TIOCMGET, &talk) < 0)
perror("get_DCD");
if (talk & TIOCM_CAR)
{printf ("1\n");send_data (10);}
else
{printf ("0\n");send_data (0);}
}
}
close(fd);
close(s);
}
SA_RESTART, viz sigaction(2).
Tiskni
Sdílej: