The One with the Thoughts of Frans

KOReader 2022.02 “Україна”

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-2022 02

This month there’s been a fairly big change on PocketBook. The rendering is now handled directly with inkview (#8727) This may result in some visual differences, but in principle it should work more dependably.

Terminal emulator

The terminal emulator has been completely rewritten, and it’s now a real vt52 emulator (#8636).

Speaking of the shell on a device, whether directly on the device through a terminal emulator or using SSH, you might want to put run some programs that aren’t easily available. At this point you have three options:

  1. Compile your own. Doesn’t sound very attractive? I agree. But in case you want to, we have specialized toolchains available. The very same which are used to build KOReader.
  2. Our own @NiLuJe has created precombined bundles of tools for Kindle and for Kobo.
  3. Many a Linux distro such as Debian provides precompiled packages for various ARM architectures. You can use these through a chroot. See some basic info here, which depends on sudo apt-get install debootstrap qemu-user-static schroot. The advantage is that once you have this set up, you can just apt install elinks inside the chroot. See the picture of my H2O running Elinks showing the tweakers.net website. If this interests you, here’s my quickly cobbled together start-debian.sh script to serve as inspiration.

#!/bin/sh
mnt=/mnt/onboard/.adds/debian/debian

mount $mnt/../debian.img $mnt

mount -o bind /dev $mnt/dev
mount -t devpts devpts $mnt/dev/pts
mount -t proc proc $mnt/proc
mount -t sysfs sysfs $mnt/sys
mount -t tmpfs tmpfs $mnt/tmp

chroot $mnt /bin/bash

umount $mnt/dev/pts
umount $mnt/dev
umount $mnt/proc
umount $mnt/sys
umount $mnt/tmp

umount $mnt

Noteworthy Changes

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

  • Translator: copy translation to clipboard or save to note (#8669) @hius07
  • fix selection of single CJK char (#8680) @poire-z
  • SDL & Android: Do not set FM banner on resize (#8678) @yparitcher
    This prevents a crash when resizing the window.
  • Battery Stat: Fix remaining & per hour numbers (#8688, #8694) @yparitcher @hius07
  • A few Kobo/sunxi tweaks & fixes (#8672, #8711) @NiLuJe
    • Initial support for the Sage PowerCover (i.e., display its status in the TouchMenu footer).
      I left the footer & co alone, because I don’t really care about seeing that much detail in those other contexts.
    • Fix the update progress bar on sunxi. I had noticed that is was hella broken on the Elipsa & Sage with the latest FW (while I could have sworn it originally worked on the Elipsa…).
    • Above fix led me to a simpler workaround for similar issues with the crash screen.
    • Set the CPU governor on all cores if possible (that’s a NOP in practice, because we don’t change the governor on SMP devices).
    • Accurately refresh the charging LED state on startup & resume, accounting for the PowerCover (i.e., charging == charging the cover).
    • Stash enableCPUCores in CanvasContext, to avoid pulling in Device in Document (re #8579).
  • Autosuspend: fix ‘Disable’ not disabling (#8684) @zwim
  • Support non-touch device to choose file or folder (#8696) and improve non-touch bottom menu usability (#8712) @comphilip
  • FocusManager:focusTopLeftWidget(): only if hasDPad (#8737) @comphilip
  • NewsDownloader: new option to allow EPUB volumization (#8263) @roygbyte
  • crengine: non-linear fragments and list item tweaks (#8700) @poire-z
  • Handle arrow keys and enter in emulator text fields (#8716) @johnbeard @poire-z
  • Various UX fixes (#8720) @hius07
  • UI font fallbacks: allow using more “Noto Sans xyz” (#8722) @poire-z
  • wallabag : fixes synchronization when “send review as tags” is checked (#8733) @agallou
  • PocketBook: handle rendering of interface and books directly with inkview (#8727) @rjd22
  • Terminal emulator: full rewrite, real vt52 emulator (#8636) @zwim
  • PocketBook: add support for PB617 (Basic Lux 3) (#8740) @roshavagarga
  • remove send2ebook plugin (#8747) @pazos
  • Reading statistics: various fixes and tweaks (#8745) @poire-z
  • PageBrowser: allow changing nb of chapter levels shown (#8772) @poire-z
  • Kobo: Use the right input protocol on the Nia (#8794) @NiLuJe
  • ReadHistory: force reload history after files changes (#8813) @hius07
  • File manager: free long-press on Home button; open file with TextViewer (#8821) @hius07
  • BiDi: allow inverting for Document UI elements (TOC) (#8673) @yparitcher

Full changelogclosed milestone issues


Installation instructions: AndroidCervantesChromeOSKindleKoboPocketBookReMarkableDesktop LinuxMacOS

CommentsTags: ,

Inspect Element on Discord desktop app

11:34 · Filed under Software

For alleged security, the Discord client disabled basic functionality. To get it back, add this dark pattern named setting to %APPDATA%/discord/settings.json (Windows) or ~/.config/discord/settings.json (Linux):

"DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING": true

CommentsTags:

KOReader 2022.01 “Union of Utrecht”

10:23 · Filed under Software

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


KO january A-01

The Pragmatic Sanction of 1549, as well as the Unions of Atrecht and Utrecht are important markers in the history of the low countries. We should be wary of attaching too much importance to such historical facts, but it’s certainly defensible that the present-day nations of the Netherlands and Belgium sprang from these pro- and anti-Spanish alliances.

The Union of Utrecht is best characterized as a military alliance to defend freedom of religion against a governor who was not prepared to make even a single concession. By signing the Union of Utrecht, the eternal departure from Spanish king Philip had been made official. Formally this didn’t happen until two years later, when Philip decided to declare William of Orange a wanted man. This directly led to the States-General declaring the Act of Abjuration. Not only did the States-General not leave a shadow of a doubt as to their thoughts on the matter, but it made reconciliation impossible. A total victory over the Spanish was the only solution. So it goes.

Book Map and Page Browser

Perhaps the most interesting additions this month are the Book map and Page browser (#8613). The book map shows a map of the content of a book, including the ToC, bookmarks, read pages and non-linear flows. The page browser shows thumbnails of pages. There are quite a few explanatory screenshots in this comment, or of course you can just play with it yourself.

File Browser

The file browser has been expanded with a basic select mode (#8595), making it easier to apply certain actions like deleting or moving to multiple files at once. Additionally, there’s a new display for the number of files and subfolders in folders (#8598).

All the Rest

Logo credit: @bubapet

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

Full changelogclosed milestone issues


Installation instructions: AndroidCervantesChromeOSKindleKoboPocketBookReMarkableDesktop LinuxMacOS

CommentsTags: ,

KOReader 2021.12 “Belisarius”

16:30 · Filed under Software

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


KO DECEMBER-01

Around this time of year back in 533, Belisarius defeated the Vandals in the Battle of Tricamarum. Incidentally, there are also some amusing legends surrounding Belisarius’ menorah. According to Procopios, after Belisarius took Carthage in 534 a menorah was part of the loot. But once the lamp arrived in Constantinople, a Jew visiting Justinian pointed out that the religious artifact had brought disaster to every city it had ever been in: Jerusalem had been conquered by the Romans, Rome had been sacked by the Vandals, and Carthage in turn had been conquered by the Byzantines. On second thought, The Menorah of Destruction would’ve been a more exciting name for this release, wouldn’t it? Maybe next year.

Hiding under the unassuming commit message speaking of group operations, the file browser now supports applying actions to multiple files (#8536). It works through the Select files action in the Plus (+) menu.

The event dispatcher can now be used to set a specific font face (#8555).

And last but not least, hanging punctuation has been made just a little more beautiful (#8528).

Logo credit: @bubapet

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

Full changelogclosed milestone issues

CommentsTags: ,

KOReader 2021.11 “November Leaves”

9:15 · Filed under Software

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


KO NOVEMBERLEAFS1-01

Did you know that mosquitoes are supposed to crawl up into their winter holes by late September in northern hemispheres? If you didn’t, don’t feel bad, because apparently the mosquitoes don’t know either. The weather’s too mild which is confusing them.

As always there have been many optimizations, most noteworthy this month the improved Japanese support thanks to @cyphar (#8312, #8372, #8446).

Logo credit: @bubapet

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

Full changelogclosed milestone issues

CommentsTags: ,

KOReader 2021.10 “Seagull”

13:39 · Filed under Software

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-2021-10-seagull-fs8

You can see many seagulls out and about this time of year, often even far inland.

The biggest news this month may well be @zwim‘s new Autowarmth plugin (#8129), which improves on and replaces all prior implementations. In advanced mode, it offers a smorgasbord of customization options, but luckily there’s no need to dive into the nitty gritty of all the different kinds of dusk and dawn. Who knew there were so many!

Logo credit: @bubapet

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

Full changelogclosed milestone issues

CommentsTags: ,

Web Apps Opera Bork Edition

18:43 · Filed under Android, Browsers, Opera, Scripting, Software

It’s been 18 years since Opera published their classic bork edition, to protest that MSN would have loaded properly in the browser if only it were served the same code as Internet Explorer.

“Hergee berger snooger bork,” says Mary Lambert, product line manager desktop, Opera Software. “This is a joke. However, we are trying to make an important point. The MSN site is sending Opera users what appear to be intentionally distorted pages. The Bork edition illustrates how browsers could also distort content, as the Bork edition does. The real point here is that the success of the Web depends on software and Web site developers behaving well and rising above corporate rivalry.”

Since I’m a Vivaldi user, today’s the first time I noticed that Chrome on Android artificially restricts installing webpages as apps on the homescreen. Only webpages that specify a manifest.json can receive such a hallowed treatment, instead of every single webpage ever made. For the rest of the internet, there’s only a shortcut. While the situation is not quite comparable, I found the design principle sufficiently distasteful to revive Opera’s classic bork script, in this case specifically targeting the Chrome browser.

You can put it on your website or in your TamperMonkey to remind you when you accidentally open Chrome. The classic result looks like this:

A borked Vivaldi announcement as seen in Chrome.
// http://web.archive.org/web/20050301075735/http://www.opera.com/js/bork/enchefizer.js

/* -*- mode: C++; mode: font-lock; tab-width: 4 -*-
 * 2003-02-10
 *
 * The Enchefizer code is based on a script fetched from 
 *   http://tbrowne.best.vwh.net/chef/
 * written by Andriy Rozeluk , which is
 * based on a Java version written by Josh Vura-Weis
 * , which is based on a UNIX version
 * from 1993 written by John Hagerman  and
 * Jeff Allen 
 *
 * Subsequently hacked by Opera Software to work inside a page by 
 * traversing the DOM tree, and to improve performance. 
 *
 * Typical usage is to add the following text to the bottom of a page:
 *       
 */

const classicOperaBork = () => {
    /* USER CONFIGURATION BEGINS */
    var victim=false;   // false (apply to any page) or regex to match page URL
    //var victim=/^http:\/\/(?:(?:www|msdn).microsoft.com|www.msn.com)/;
    var delay=50;       // ms between replacements, set to 0 to disable waiting
    var units=30;       // number of text nodes to translate each time
    var highlight=true; // highlight the text we're working on
    /* USER CONFIGURATION ENDS */

    var textnodes=[];   // text nodes in the doc
    var nextnode=0;     // next node to process

    function nextWordPos(line)
    {
		var p = line.search(/[ \n\t\\,<.>/?;:\'\"\[{\]}|=+\-_!@#$%^&*()~`]/);
        return p == -1 ? line.length+1 : p;
    }

    function encheferizeLine(line)
    {
		var buff="", word="", t="", out="", wp;

		while(line.length > 0)
		{
			wp = nextWordPos(line);
			word = line.substring(0,wp);
			t = line.charAt(wp);
			line = line.substring(wp+1,line.length);
			out = out + encheferizeWord(word) + t;
		}
		if(t == ".")
		{
	        out = out + "\nBork Bork Bork!";
		}

		return out;
    }

    function encheferizeWord(word)
    {
		if(word.toLowerCase() == "bork") return word;
      
		var letter, count, len, buff, i_seen, isLast;
      
		count=0;
		len=word.length;
		buff=""
		i_seen=false;
      
		while(count0){
               
				} 
			} else if(letter=='t'){
				if(count==len-2 && word.charAt(count+1)=='h'){
					buff = buff + "t";
					count+=2;
					continue;
				} else if(count<=len-3 && word.charAt(count+1)=='h'
						  && word.charAt(count+2)=='e'){
					buff = buff + "zee";
					count+=3;
					continue;
				} 
			} else if(letter=='T' && count<=len-3 && word.charAt(count+1)=='h'
					  && word.charAt(count+2)=='e'){                                                
				buff = buff + "Zee";
				count+=3;
				continue;
			} else if(letter=='v'){
				buff = buff + "f";
				count++;
				continue;
			} else if(letter=='V'){
				buff = buff + "F";
				count++;
				continue;
			} else if(letter=='w'){
				buff = buff + "v";
				count++;
				continue;
			} else if(letter=='W'){
				buff = buff + "V";
				count++;
				continue;
			}
			//End of rules.  Whatever is left stays itself
			buff = buff + letter;
			count++;
		}
		
		return(buff);
    }

    function bork()
    {
		var limit = delay == 0 ? Number.MAX_VALUE : units;
		var start=nextnode;
		var oldc = new Array();
		var n, i, candidate;

		if (highlight)
		{
			for ( n=start, i=0 ; i < limit && n < textnodes.length ; n++, i++ )
			{
				candidate = textnodes[n];
				oldc[i] = candidate.parentNode.style.backgroundColor;
			}

			for ( n=start, i=0 ; i < limit && n < textnodes.length ; n++, i++ )
			{
				candidate = textnodes[n];
				candidate.parentNode.style.backgroundColor = 'red';
			}
		}

		for ( i=0 ; i < limit && nextnode < textnodes.length ; nextnode++, i++ )
		{
			candidate = textnodes[nextnode];
            candidate.replaceData(0,candidate.length,encheferizeLine(candidate.data));
		}

		if (highlight)
		{
			for ( n=start, i=0 ; i < limit && n < textnodes.length ; n++, i++ )
			{
				candidate = textnodes[n];
				candidate.parentNode.style.backgroundColor = oldc[i];
			}
		}

		bork_more();
    }

    function bork_more()
    {
		if (nextnode < textnodes.length)
		{
			setTimeout( bork, delay );
		}
    }

    /* In large docs traversal is a bottleneck at startup; we could
       CPS it or otherwise reify the traversal state to interleave
       traversal with the translation.
	*/
    function find_textnodes(elm, acc)
    {
		if (elm.nodeType == 3)
		{
			if (!elm.data.match(/^[\s\n\r]*$/))
			{
				acc.push(elm);
			}
		}
		else
		{
			var c = elm.childNodes;
			for ( var i=0 ; i < c.length ; i++ )
			{
				find_textnodes(c.item(i),acc);
			}
		}
		return acc;
    }

    /* run page's onload handler, then do our thing */
    var res = false;

    if (typeof old_onload == "function")
	{
		res = old_onload();
	}

    if (/*window == top &&*/ (!victim || window.location.href.match(victim)) )
    {
		textnodes = find_textnodes(document.body, new Array());
		nextnode=0;
		bork_more();
    }
    return res;
}
if (window.navigator.userAgentData.brands.filter(e => e.brand === 'Google Chrome').length > 0) {
    document.addEventListener('DOMContentLoaded', classicOperaBork);
}

CommentsTags:

KOReader 2021.09 “September Cheese”

10:46 · Filed under Software

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


133938026-bd5bea2c-6af1-4513-a76c-e875d6b46c71-fs8

Traditionally, September cheese is made in — you guessed it — September. This is when the grass and milk are at their best. We hope this release won’t take as long to ripen though.

This month the keyboard sports a new coat of paint (#8089), and crengine (the EPUB renderer) has received various improvements (#8165, #8197).

The Evernote plugin has been deprecated due to changes in the Evernote API. It has been replaced by the more generically named Exporter plugin, which supports Joplin, HTML, and plain text export (#7983).

Logo credit: @bubapet

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

Full changelogclosed milestone issues

CommentsTags: ,

PipeWire on Ubuntu 21.10

13:05 · Filed under Linux, Software, Ubuntu

On Debian 11 and Ubuntu 21.04, you can use the Debian wiki to get a basic setup working, but adapting that to newer version is a bit laborious. Instead a kind soul has already taken care of everything over at pipewire-debian. It’s also a more recent version.

So why use it? In my case, I’ve had PulseAudio crap out when having to deal with more over 20 or so things at once. PipeWire deals with load rather significantly better. I understand latency’s much better too, but that’s never bothered me too much for my fairly regular uses. What’s nice though, is that you can use JACK tools like catia to map stuff around. I don’t think PA had any graphical tools like that, and cryptic command-line commands are too much of a bother for quick one-offs. For the moment I mildly miss PulseAudio’s networking ability.

In short, I’ve switched over my laptops. But I might give it a try on my desktop too.

CommentsTags: , ,

KOReader 2021.08 “Fall Weather”

10:25 · Filed under Software

As one of the maintainers of KOReader, a versatile a document and image viewer, I’m proud to announce the latest release.


koreader-logo

We now have a user guide thanks to @offset-torque‘s hard work. This should make it easier for new users to find their way across the program’s features.

Starting with 2021.08, the Kobo Elipsa is supported (#7986, #8004, #8057).

The zsync plugin has been unmaintained for a long time, so it’s now been deprecated (#7957).

We’d like to thank all contributors for their efforts. Some highlights since the previous release include:

Full changelogclosed milestone issues

CommentsTags: ,

« Newer EntriesOlder Entries »