Posts

  • | Source | Signature

    Lateral with Tom Scott

    My question gets featured on Lateral!

    https://lateralcast.com/episodes/198/

    fig1.png
    (Signature) fig2.png
    (Signature)

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    Freenom and IPTI

    I still haven’t heard anything back from Freenom. Just sharing some notes of what I found.

    u/jweaver0312 shares an email received from Freenom:
    https://www.reddit.com/r/Domains/comments/1uko56l/comment/oz3wy2p/

    I got a similar email too but my domains were reset to 01-01-2033

    Thanks for reaching out, and I understand the concern about your domain(s).

    A little background: the free domains offered under the previous operator, OpenTLD B.V., were extended for a period while the business was being transferred to a new operator. That transfer is now complete, and under the new operator, IPTI B.V., the free-domain tier is being discontinued. As part of this change, legacy free domains have been set to expire on 31 July 2026.

    You can keep your domain(s) by renewing them as paid registrations before that date. Please log in at freenom.com, go to Services → Renew Domains, and complete the purchase there. The cost is €9.95 per year.

    Kind regards, Support team

    Based on some preliminary searches, I believe “IPTI B.V.” is “INTERNET PAYMENT TECHNOLOGY INSTITUTE B.V.”

    Based on company records of the French government, we can see in addition to its Haarlem address (which I sent a letter to in my previous post), there is also a French address “54 RUE SMOLLETT 06300 NICE”. A director named “Jeremie GODRECHE” is also listed.

    Searching for this name, I found a news article from 2015: https://www.digitalnewsasia.com/digital-economy/freenom-launches-ml-domain-in-malaysia-expects-business-to-boom. It describes Jeremie Godreche as “Freenom COO”.

    So I guess, “meet the new boss, same as the old boss.”

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    The (Possible) End of an Era - A Story about Freenom

    TLDR: There is a good chance I will lose my domain name, adrianiainlam.tk, after 2026-07-31. If you want to see my stuff after this date, save my alternate email addresses now, and email me (cantab or gmail) if you can’t find my page next month. If you’re still reading this on adrianiainlam.tk after this date, then whew, everything worked out fine.

    Background

    Freenom maintains the registry for the .tk ccTLD (and a few others). As their company name suggests, they used to give out most of their .tk domain names for free, with the condition that they must be manually renewed every year. They made their money with “premium” names, as well as registrations of generic TLDs.

    Meta, the bully

    Because most domain names were free, inevitably it attracted some abusers. Meta (Facebook), for some odd reason, decided to hold Freenom accountable for said abusers, and sued Freenom for half a billion in damages for alleged typosquatting and trademark infringement. See, e.g., https://domainincite.com/29520-freenom-settles-500-million-meta-lawsuit-and-will-exit-domain-business.

    Let’s be clear: this is absolutely insane. This is like suing Royal Mail for assigning postcodes to allegedly fraudulent businesses. Domain names have always been first come first served. If abusers are actively phishing and infringing trademarks, fine, sue them. There is no sane reason for an entity that registers DNS records to be involved in said lawsuit.

    Alas, Meta is a big strong bully, and Freenom is a small company. They buckled under pressure and “settled” the lawsuit, and announced they will exit the domain registration business.

    But what about the legitimate users?

    I don’t remember the exact date and time, but following Freenom’s surrender, my domain names didn’t resolve for about 2 days.

    I sent an email to Freenom about this at 2024-02-10T16:43:17Z. Two days later, the issue was fixed:

    From: Freenom Support <info@freenom.com>
    Subject: Apologies for the inconvenience. Your domains are working again.
    Date: Mon, 12 Feb 2024 11:16:28 +0000 (UTC)
    To: <redacted>
    Content-Type: text/plain; charset=us-ascii
    Content-Transfer-Encoding: 7bit
    
    Dear registrant,
    
    We have changed the PENDING status of your domains to AUTHORIZED.
    
    To ensure that this doesn't happen again we have registered the
    domains as 'Paid Domains' in our systems. Rest assured, you don't
    need to pay anything, they are 'paid for' for the next 9 years.
    
    Thank you for using Freenom.
    Kind regards,
    
    
    Freenom Support
    

    Subsequently, I could see the domain expiry date set to 2033. There is still the looming question of what would happen when the time comes – similar to the 1997 and 2047 problems of Hong Kong – but for the time being, all was well.

    Sudden renewal notice

    At the start of this month I suddenly received a renewal notice:

    Date: Wed, 01 Jul 2026 07:14:41 +0000 (UTC)
    From: Freenom <info@freenom.com>
    Subject: Upcoming Domain Renewal Notice
    MIME-Version: 1.0
    Reply-To: Freenom <info@freenom.com>
    To: Adrian Iain Lam <redacted>
    Content-Type: multipart/alternative;
     boundary="b1_6cyoFAZfW7VAB3CcI3YhRRpNSo3ZqVvXhZMpwIlnE"
    Content-Transfer-Encoding: 8bit
    
    This is a multi-part message in MIME format.
    
    --b1_6cyoFAZfW7VAB3CcI3YhRRpNSo3ZqVvXhZMpwIlnE
    Content-Type: text/plain; charset=us-ascii
    Content-Transfer-Encoding: 7bit
    
    Dear Adrian Iain Lam,
    
    
    The domain(s) listed below are due to expire within the next 30 days.
    
    adrianiainlam.tk - 31/07/2026 (30 Days)
    
    To ensure the domain does not expire, you should renew it now. You can do this from the domains management section of our client area here: https://my.freenom.com/
    
    
    Should you allow the domain to expire, you will be able to renew it for up to 30 days after the renewal date. During this time, the domain will not be accessible so any web site or email services associated with it will stop working.
    
    
    Freenom - A Name for Everyone
    
    --b1_6cyoFAZfW7VAB3CcI3YhRRpNSo3ZqVvXhZMpwIlnE
    

    This came as a surprise but not a shock. I completely sympathise with the fact that, after the lost legal battle, they may need some sort of financial support. They were asking for 10 USD per domain name per year, and honestly, having used my currently domain name for free for almost 10 years, the price felt reasonable. But, I was also slightly sceptical about the sudden charge. I thought it could have been a repeat of what happened two years ago. So I decided to renew for just one year and see how it goes. I completed the payment within the same hour:

    From: Verotel Billing Solutions <livesupport@verotel.com>
    Reply-To: livesupport@verotel.com
    To: <redacted>
    Subject: Your Receipt
    Date: Wed, 01 Jul 2026 07:56:16 +0000 (UTC)
    
    =0D
    Dear A I LAM=0D
    Thank you for your order Freenom - Invoice #<redacted> at:=0D
    =0D
    http://www.freenom.com=0D
     =0D
    Placed on 01-Jul-2026 07:56:16 UTC timezone.=0D
    Amount    USD 10.35.=0D
    =0D
    This transaction was successful and is now being processed by http://www.fr=
    eenom.com=0D
    =0D
    =0D
    'vtsup.com*Internet P' will appear on your credit card =0D
    or bank statement as the beneficiary of this transaction.=0D
    =0D
    Should you have any questions concerning your order, please refer =0D
    all non-billing questions to support section at http://www.freenom.com.=0D
    =0D
    For billing enquiries, quote your order number and =0D
    contact livesupport@verotel.com. =0D
    =0D
    Kind regards,=0D
    =0D
    Verotel Support =0D
    =0D
    =0D
    ---------------------------------------------------------------------------=
    -----------------------=0D
    

    My bank also shows the amount deducted in my credit card statement:

    fig0-credit-card-statement.png
    (Signature)

    However, TO THIS DAY (2026-07-21), Freenom’s online portal still says my invoice is unpaid and my domain name will expire by the end of the month.

    fig1-freenom-my-invoices.png
    (Signature)

    fig2-freenom-my-domains.png
    (Signature)

    fig3-freenom-client-area.png
    (Signature)

    I tried to contact Freenom about this on multiple occasions.

    I wrote a support ticket on their online portal, 24 hours after my payment, and subsequently followed it up a week later.

    fig4-freenom-ticket.png
    (Signature)

    I sent emails to Freenom, once to support@freenom.com on 2026-07-03 and once to info@freenom.com on 2026-07-07.

    fig5-emails.png
    (Signature)

    I even sent a physical letter to Freenom’s office (ignore the wrong date on the post office stamp).

    fig6-letter.jpg
    (Signature)

    fig7-cert-posting.png
    (Signature)

    Which they have received and signed for.

    fig8-royalmail.png
    (Signature)

    fig9-postnl.png
    (Signature)

    So far, the only “response” I have received from Freenom is (presumably) an automated email, which is basically the same as the first renewal notice except “30 days” is replaced with “15 days”.

    Date: Thu, 16 Jul 2026 07:16:02 +0000 (UTC)
    From: Freenom <info@freenom.com>
    Subject: Upcoming Domain Renewal Notice
    MIME-Version: 1.0
    Reply-To: Freenom <info@freenom.com>
    To: Adrian Iain Lam <redacted>
    Content-Type: multipart/alternative;
     boundary="b1_PC9jtKL6CvQzIdi2fx5EUOFIdXmyDOEZegiJPOepM"
    Content-Transfer-Encoding: 8bit
    
    This is a multi-part message in MIME format.
    
    --b1_PC9jtKL6CvQzIdi2fx5EUOFIdXmyDOEZegiJPOepM
    Content-Type: text/plain; charset=us-ascii
    Content-Transfer-Encoding: 7bit
    
    Dear Adrian Iain Lam,
    
    
    The domain(s) listed below are due to expire within the next 15 days.
    
    adrianiainlam.tk - 31/07/2026 (15 Days)
    
    To ensure the domain does not expire, you should renew it now. You can do this from the domains management section of our client area here: https://my.freenom.com/
    
    
    Should you allow the domain to expire, you will be able to renew it for up to 30 days after the renewal date. During this time, the domain will not be accessible so any web site or email services associated with it will stop working.
    
    
    Freenom - A Name for Everyone
    

    Other than that, I have heard nothing from Freenom. The invoice is still “unpaid”, and my domain still expires by the end of the month.

    Other users

    There is, of course, a Reddit post with multiple users having similar issues. https://www.reddit.com/r/Domains/comments/1uko56l/no_longer_free_freenom_domains/.

    On the same day as my “15 days remaining” email, at least three users (who presumably have not paid to renew) received emails from Freenom saying their domains have been restored to 2033.

    u/DoktorXNetWork

    Just recived email from them

    “Hi,

    During a recent system cleanup, your special domain extension accidentally got reset.

    We have manually fixed this, and your domain is now safely restored to 2033 at no cost. You do not need to make any payments or take any further action.

    Thank you so much for your patience and understanding while we resolved this.

    Kind regards,

    Support team”

    u/jweaver0312

    I got the same email, though I’m starting to migrate to a new domain now anyhow, might as well get ahead of the program

    u/asha009

    I got the same mail! Support freenom not dead! And this good news. I hope this change for 2033 year will be really work!

    On the other hand, users who have paid to renew do not seem to have such luck.

    u/JasperNLxD2

    I paid the invoice but it’s never processed >:( Anyone has any info?

    u/xmtscf

    I’m experiencing the same issue. I was even considering generating a new invoice and paying again, but I’ve realized I would probably just lose more money and still lose my domain.

    u/xmtscf even shared his response from Freenom saying that a renewal fee is required to keep the domain.

    u/xmtscf

    02/07/2026
    Laura Staff

    Hi ****,

    Thank you for contacting Freenom Support.

    Please note that Freenom has permanently discontinued its free domain tier. As part of this final transition, any remaining free domain registrations have had their expiration dates adjusted to July 31, 2026, which marks the official end of the free service tier.

    To keep your domains active beyond this date, they must be transitioned into paid registrations, which is why a renewal fee is now required.

    If you wish to maintain these domains, you will need to complete the paid renewal process through your account dashboard before the July 31, 2026 deadline.

    Kind regards,

    Support team

    Why they’re helping their free users, but ignoring their paying customers, I have no idea.

    Going forward

    I have zero idea whether I can keep my domain name next month. If I can’t, well, it’s been a nice (almost) ten years. I’ll probably register another domain name, but it will be a pain to set everything up again. I can probably get my bank to reverse the credit card payment (so I don’t understand why Freenom is doing this to me – just to scam $10 from me for a month before I reverse it?).

    I’ll try to keep this blog updated if I hear anything back, but at this point I’m not holding my breath.

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    Codegolf - Reverse NATO phonetic alphabet

    A long time ago, I used to visit Codegolf Stack Exchange regularly, and took part in a few contests. Due to certain reasons, I have decided not to contribute to the Stack Exchange network anymore, but I recently came across a codegolf contest that looked interesting, so I thought I’d post my solution in my blog instead.

    The post is linked here, but to summarise, the task is to convert a string spelled out in NATO phonetic alphabet, without any delimiter, back to a string spelled normally, so for example, from “ECHOXRAYALFAMIKEPAPALIMAECHO” to “EXAMPLE”.

    I decided to attempt this in the RISC-V ISA, for no particular reason other than that I have been using it at work. My current score is 52 bytes.

    A few details before getting to the code:

    • Instead of a full program handling I/O, I will only be implementing a function, using the standard RISC-V ABI.
    • I am using the 32-bit ISA with the Zca and Zcb extensions.
    • I will assume C strings (i.e. NUL-terminated array of chars) in ASCII.
    • I will assume the caller has allocated a sufficiently large output buffer.

    My solution relies on the fact that all phonetic alphabets start with the letter it represents, for example, ALFA starts with A, BRAVO starts with B. So all it needs to do is know how long each phonetic alphabet is, and just copy the first letter and skip over the rest.

    Here’s the assembly:

        .globl revnato
    revnato:
        la a3, revnato_data - 65
    revnato_loop:
        lbu a2, 0(a0)
        sb a2, 0(a1)
        beqz a2, revnato_ret
        add a2, a2, a3
        lbu a2, 0(a2)
        add a0, a0, a2
        addi a1, a1, 1
        j revnato_loop
    revnato_ret:
        ret
    revnato_data:
        .byte 4,5,7,5,4,7,4,5,5,7,4,4,4,8,5,4,6,5,6,5,7,6,7,4,6,4
    

    If you’re not familiar with the syntax, all operations are in the form opcode destination operand or opcode destination operand1 operand2.

    Here, a0 is expected to contain the input string, and a1 the output buffer. We first load the address (la) of a lookup table to a3. This table is the string length of each phonetic alphabet. The - 65 will be explained later.

    In the loop, we first load one unsigned byte (lbu) at a0[0] into a2, and store that byte (sb) into a1[0], i.e. copy the first character. We exit from the loop (and return from the function) if the byte is NUL (beqz: branch if equal to zero).

    If non-zero, we compute the index for the lookup table. The unoptimised way would be to subtract 'A' (ASCII 65) from the byte, and then add it to the lookup table address. To optimise this, I have moved the “subtract 65” to the address itself, so that we can just add a3 to a2. We then dereference the address by loading the unsigned byte.*

    We then increment the input pointer by the lookup table entry, and increment the output pointer by 1, and loop.

    *: Note that another way to optimise it would be to leave the a3 address as is, and do lbu a2, -65(a2) instead. This may be more readable, but actually produces bigger code, because -65 is outside the range of the 16-bit lbu immediate opcode range (see RISC-V Zcb), so a 32-bit lbu has to be used instead.

    This can be compiled to an object file with:

    YOUR-TOOLCHAIN-gcc -mabi=ilp32e -march=rv32emzca_zcb -c -o revnato.o revnato.s
    

    We can look at the disassembly to check the binary size:†

    YOUR-TOOLCHAIN-objdump -S revnato.o > revnato.dump
    
    00000000 <revnato>:
       0:	00000697          	auipc	a3,0x0
       4:	00068693          	mv	a3,a3
    
    00000008 <revnato_loop>:
       8:	8110                	lbu	a2,0(a0)
       a:	8990                	sb	a2,0(a1)
       c:	c611                	beqz	a2,18 <revnato_ret>
       e:	9636                	add	a2,a2,a3
      10:	8210                	lbu	a2,0(a2)
      12:	9532                	add	a0,a0,a2
      14:	0585                	addi	a1,a1,1
      16:	bfcd                	j	8 <revnato_loop>
    
    00000018 <revnato_ret>:
      18:	8082                	ret
    
    0000001a <revnato_data>:
      1a:	05070504          	.word	0x05070504
      1e:	05040704          	.word	0x05040704
      22:	04040705          	.word	0x04040705
      26:	04050804          	.word	0x04050804
      2a:	05060506          	.word	0x05060506
      2e:	04070607          	.word	0x04070607
      32:	0406                	.short	0x0406
    
    

    Note that the mv a3,a3, which looks like a NOP, is actually space reserved for a relocation. This is because we are only creating an object file without linking, so the address of revnato_data is not yet known. You can prove this by generating a linked ELF with YOUR-TOOLCHAIN-gcc -mabi=ilp32e -march=rv32emzca_zcb -o revnato.elf revnato.s -nostdlib and observing in that disassembly that the instruction has now changed, for example, to addi a3,a3,-39.

    †: Alternatively, we can just run readelf -S revnato.o and look at the size field of .text.

    Finally, just for completeness, an example C program to call this function:

    #include <stdio.h>
    void revnato(const char *, char *);
    int main(void)
    {
        const char *in = "ECHOXRAYALFAMIKEPAPALIMAECHO";
        char out[100];
        revnato(in, out);
        puts(out);
        return 0;
    }
    

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    New Gachapon shop in London!

    New Gachapon shop in London (Wing Yip Cricklewood)!

    Gave up after spending £16 and still not getting Senjougahara :/

    IMG20250503152112.jpg
    (Signature) IMG20250503152140.jpg
    (Signature)

    There are a lot other series. To name a few I’ve watched: Oshi no Ko, KiseKoi, Frieren, Spy × Family, TenSura, Cardcaptor Sakura.

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    Firefox custom search engine - search.json.mozlz4

    So I have an ancient custom search engine XML that was broken by remote API changes. In trying to fix it, I inadvertently had it deleted from search.json.mozlz4, and have to figure out how to add it back.

    This is basically a rewrite of this post by Frederick Zhang. That post is excellent, but there have been some changes since 2018. The following is tested on the latest stable Firefox (138.0.1).

    First download this Python script. Use it to decompress search.json.mozlz4 (located in the Firefox profile directory): python3 mozlz4a.py -d search.json.mozlz4 search.json

    Optionally, format it with python3 -m json.tool.

    Add a new object to the "engines" array. My example for Startpage with custom params:

            {
                "id": "38c37483-6e61-4f86-bfaf-2b99ed7d8464",
                "_name": "Startpage (Unfiltered)",
                "_loadPath": "[profile]/searchplugins/startpage-unfiltered.xml",
                "_iconMapObj": {
                    "16": "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2jkj+9YtD/vWLQ/71i0P+9otD/vaLRP72i0T+9YtE/vWLRP72i0T+9otD/vaNRP72jUT+9otF/vaLRf73kkv+9Yc///WJP//1iT//9Yk///rAmf/94Mz/+sCa//aRTv/1iUH/9ok///aJP//2i0H/9otB//aJQv/2iUL/9otC//aNRP/2jUT/9o1E//aNRP/6wpv////////////96dr/95dQ//aNRP/2kET/9pBG//aQRv/2kEb/9pBG//aRR//3lEz/95BH//mueP/7xJ3/959g//efYf/4p23//vDm//3p2//3kEr/95FJ//aRSf/niFH/95FK//aRSv/2mE//95hS/vq4iP/////////////////81bj/95xZ//q4iP//////+bF+//eZT//njFT/PSqi/2xGjv/2mVD/951V/vedVv783cX///////vQrf/++PP///////748//+8uj///////m3gf/olFr/PSuj/w8Pt/9sSJD/951V//eeWf73oVv++8ul///////5sXf/+KRi//vRsf////////////3r3v/olF//Piyk/w8Pt/9sSJH/+J5Z//ieWv/3oV/++KZf/vihXP/97N7//vn0//zTs//6wJP/+bBy//q6iP/onW//Piyl/w8Pt/8fGbH/m2iB/+icY//4pGD/96hl/viqZf74pmD/+Kxr//3iy/////////n1//ivbP/onGj/Pi2m/w8Pt/8uJKz/fFeQ/x8Zsf8+Lqb/6J9r//ivbP74rm3++Klm//mpZv/5q2f/+bR9//m0e//poW7/Pi6n/w8Pt/9sTZj/+Ktp//ira/+rd4P/Dw+3/4xijv/5snH++LN1/vmvbf/5r23/+a5t//mvb//4r2//TTuk/w8Pt/8fGrL/6ah1//ivcP/4r3P/q3yI/w8Pt/+MZpP/+bN5/vm4ev75t3X/+bV1//m1df/5t3X/+Ld3/8qUhP98XZn/Hxqz/+mse//5t3f/2p+B/x8as/8PD7f/u4qK//m7fv76u4D++bl7//m3fP/5uXz/+bl8//m5fP/5t3z/+bl//x8as/9NPKf/fWCb/x8as/8PD7f/bVOh//q5f//6v4X++sGI/vm9g//5voX/+b6F//m9hf/6vYX/+r6F//nCh/+bepr/Hxu0/w8Pt/8PD7f/fWOh//q+hf/6wof/+saN/vrGjf75xIv/+ceL//nEi//5xIv/+sSL//rHi//6x43/+ceN/+m7kP+7lpj/6ruQ//rHkP/6x43/+seQ//rLlf76ypT++seR//rJkf/6yZH/+seR//rJkf/6yZH/+8mR//vJlP/7yZT/+smU//rJlP/6yZT/+8yV//rJlf/6zpn+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
                },
                "_metaData": {
                    "loadPathHash": "<SEE BELOW>",
                    "alias": "sp",
                    "hideOneOffButton": false,
                    "order": 8
                },
                "_urls": [
                    {
                        "params": [
                            {
                                "name": "query",
                                "value": "{searchTerms}"
                            },
                            {
                                "name": "cat",
                                "value": "web"
                            },
                            {
                                "name": "lui",
                                "value": "english"
                            },
                            {
                                "name": "prfe",
                                "value": "c774daad5dd23ae2db70252aa321b9354508577d11ee4a79664d62c5d56672dd946c593d0daa5e9f3e7d1ebafaf773669d191e7b802605a743232b31a2254feeccf8ccc0f306bf45f8fa73f3"
                            }
                        ],
                        "rels": [],
                        "template": "https://www.startpage.com/sp/search",
                        "method": "POST"
                    }
                ],
                "_orderHint": null,
                "_telemetryId": null,
                "_filePath": "<ABSOLUTE PATH TO PROFILE DIRECTORY>/searchplugins/startpage-unfiltered.xml",
                "_definedAliases": [],
                "_updateInterval": null,
                "_updateURL": null
            }
    

    I assume the "id" is just some UUID. I ended up reusing an existing one that I no longer needed. I’m not sure whether it would be “validated” in any way.

    The "loadPathHash" is calculated using the following function:

     function getVerificationHash(name, profileDir = PathUtils.profileDir) {
       let disclaimer =
         "By modifying this file, I agree that I am doing so " +
         "only within $appName itself, using official, user-driven search " +
         "engine selection processes, and in a way which does not circumvent " +
         "user consent. I acknowledge that any attempt to change this file " +
         "from outside of $appName is a malicious act, and will be responded " +
         "to accordingly.";
    
      let salt =
        PathUtils.filename(profileDir) +
        name +
        disclaimer.replace(/\$appName/g, Services.appinfo.name);
    
      let data = new TextEncoder().encode(salt);
      let hasher = Cc["@mozilla.org/security/hash;1"].createInstance(
        Ci.nsICryptoHash
      );
      hasher.init(hasher.SHA256);
      hasher.update(data, data.length);
    
      return hasher.finish(true);
    }
    

    This code is taken from the Firefox source code here. It is to be pasted into the Browser Console, then called with getVerificationHash("<VALUE IN _loadPath>", "<ABSOLUTE PATH TO PROFILE DIRECTORY>"). The second argument is required if you are running on a different profile.

    The "order" is just whichever unused number that comes next.

    Save this, then compress it again with: python3 mozlz4a.py search.json search.json.mozlz4.

    Finally, create a backup of the original search.json.mozlz4, and replace it with the new one.

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    Manjaro PinePhone no sound after October 2023 update

    After running a software upgrade yesterday (10 October 2023) with sudo pacman -Syu, my PinePhone ended up with no sound.

    See this post on the Manjaro forum for my fix. To summarize:

    • I downgraded everything by following the “Downgrading all upgraded packages” section in this article (parsing /var/log/pacman.log and restoring from /var/cache/pacman/pkg/), and uninstalled alsa-ucm-pinephone. I then re-upgraded and manually reinstalled alsa-ucm-pinephone, and it just magically worked.
    • I suspect an easier fix will be to just edit /usr/share/alsa/ucm2/conf.d/simple-card/PinePhone.conf and only keep Syntax 2 and the SectionUseCase."HiFi" and SectionUseCase."Voice Call" sections, and remove everything else.

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    LibDem misleading bar chart

    LibDem MP Daisy Cooper’s newsletter for St Albans contains a misleading bar chart where a 0% bar will have a height of 6 mm (i.e. the baseline of the chart is at -3.5%). In other words, if you stack LAB’s 9% and CON’s 39% (total 48%), it will be taller than LIBDEM’s 50%.

    Measurement and regression analysis
    (Signature) Photograph with measurement (LIBDEM)
    (Signature) Photograph with measurement (CON)
    (Signature) Photograph with measurement (LAB)
    (Signature)

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    PinePhone (Manjaro Phosh) automatic suspend bug

    On 2023-06-06 I ran a system upgrade on my PinePhone (running Manjaro Phosh) using pacman -Syu. Afterwards, automatic suspend stopped working.

    The symptoms

    If you are in the lock screen and have the display turned off (this can due to automatic blank screen, or due to manually pressing the power button), then shortly before the automatic suspend timeout, the notification blue LED will light up.

    Previously (before the upgrade), if you ignore the notification, after reaching the timeout, the notification will be cleared, and the PinePhone will be suspended. If you turn on the screen before it suspended, it will very briefly show a notification that the phone will be automatically suspended. However the notification will clear itself almost immediately.

    After the upgrade, the notification LED stays on, and the phone does not suspend. When the screen is turned on again, it will always display the notification (which will clear itself very quickly). Most notably, because it does not actually suspend, the battery drains itself within a few hours. I’d go to work in the morning (unplugging from the charger at 08:30), arrive back home at 18:00 and the phone has already turned itself off.

    The solution

    This has been provided by @alaraajavamma:urheiluaki.org from #pinephone.

    gsettings set sm.puri.phosh.notifications wakeup-screen-triggers []
    

    Note that this needs to be run on a terminal on the PinePhone. It does not work via ssh.

    For future reference, the original value was ['urgency'].

    Other observations

    Things we tried and found out before reaching the solution.

    • Automatic suspend actually works if the display is turned on and not in the the lock screen.
    • sudo systemctl suspend - works.
    • systemctl suspend - works on a terminal on the PP. Does not work via ssh.
    • systemd-inhibit --list gives the following output:

      WHO            UID  USER    PID  COMM           WHAT                                                     WHY                                          MODE
      ModemManager   0    root    3533 ModemManager   sleep                                                    ModemManager needs to reset devices          delay
      NetworkManager 0    root    3513 NetworkManager sleep                                                    NetworkManager needs to turn off networks    delay
      UPower         0    root    3993 upowerd        sleep                                                    Pause device polling                         delay
      eg25manager    0    root    3311 eg25-manager   sleep                                                    eg25manager needs to prepare modem for sleep delay
      manjaro        1000 manjaro 3826 phosh          handle-power-key                                         Phosh handling power key                     block
      manjaro        1000 manjaro 4045 gsd-media-keys handle-power-key:handle-suspend-key:handle-hibernate-key GNOME handling keypresses                    block
      manjaro        1000 manjaro 4045 gsd-media-keys sleep                                                    GNOME handling keypresses                    delay
      manjaro        1000 manjaro 4046 gsd-power      sleep                                                    GNOME needs to lock the screen               delay
      manjaro        1000 manjaro 3826 phosh          sleep                                                    Phosh handling suspend                       delay
      
      9 inhibitors listed.
      

    Preview clipped. Expand | Read full post in new tab

  • | Source | Signature

    Playing 夏ノ終熄 Natsu no Owari on Wine

    When playing this game on Wine 6.17 (64-bit), after the first day, I got this error on a pop-up:

    Failed to call ConnectFilters( pSrc, pMPEG1Splitter ). : [0x80004005] Error: 0x80004005
    

    When running on the command line I get this:

    0024:fixme:quartz:mpeg_splitter_sink_query_accept Unsupported subtype {e436eb84-524f-11ce-9f53-0020af0ba770}.
    

    Searched online for these messages and found a few different solutions, but the only one that worked for me was this one by jkfloris:

    winetricks l3codecx directshow wmp10
    

    Preview clipped. Expand | Read full post in new tab

subscribe via RSS