The Opus codec provides superior audio quality over codecs such as AAC, MP3 and Vorbis. Android has support for Opus since Android 5.0 (Lollipop). However, when I tried playing Opus files on My LG G4, it wouldn’t recognize the file as a media file at all. It turns out, that the default .opus
extension is not recognized by Android. The workaround is to change the extension to .ogg
. Generally speaking, this is technically correct, as most Opus streams are encapsulated by an Ogg container, however, .opus
is the recommended extension (but apparently not for Android).
Category: Tips
Fixing HTML Rendering in Wine on Debian Jessie
Some application rely on Internet Explorer to provide HTML rendering capabilities. Wine implements the same functionality based on a custom version of Mozilla’s Gecko rendering engine (the same engine used in Firefox). In Debian Jessie you have a package called libwine-gecko-2.24
(the version is part of the name) which provides this rendering engine for Wine. However, different versions of Wine require different versions of wine-gecko. The package provided in Debian Jessie, matches the Wine version provided by wine-development
from the main Jessie repository (1.7.29). Unfortunately wine-development from the jessie-backports if of version 1.9.8 and requires wine-gecko of version 2.44 which is not provided by any Debian repository. This will lead to errors like
Could not load wine-gecko. HTML rendering will be disabled.
and blank spaces where HTML content would be rendered in many applications.
The solution would be to manually install the required version of wine-gecko. We start by downloading the MSI binaries provided by Wine
$ wget https://dl.winehq.org/wine/wine-gecko/2.44/wine_gecko-2.44-x86.msi
$ wget https://dl.winehq.org/wine/wine-gecko/2.44/wine_gecko-2.44-x86_64.msi
Now install the required one, based on whether you are using 32bit or 64bit wine environment:
wine-development msiexec /i wine_gecko-2.44-x86.msi
(be sure the setup the correct $WINEPREFIX
if needed).
en_IL: English locale for Israel
Update: The new locale was committed to glibc
and should be part of glibc-2.24
.
Most Israelis are literate in English, and for a large percentage of them, English is also the preferred language when it comes to computers. They prefer English, as it solves right-to-left issues and general inconsistencies (it might be annoying when some programs are translated ands some not). The downside is, that currently, the existing English locales are not suitable for Israel, as there are cultural differences:
- American English spelling is more common in Israel.
- The metric system is used, along with the relevant paper sizes (“A4” instead of Letter).
- Dates are written in dd/mm/YYYY format, unlike in the USA.
- The first day of week, and also the first workday is Sunday.
- The currency used is ILS (₪).
So, up until now users had to choose locales such as en_US or en_GB and compromise on some stuff. To solve this issue, and create a truly suitable English locale for Israel, I wrote a localedef
file for the en_IL locale.
To install the new locale, copy the en_IL
file from the gist below and place under /usr/share/i18n/locales/en_IL
(no extension). Next
# echo "en_IL.UTF-8 UTF-8" >> /usr/local/share/i18n/SUPPORTED
Now, complete the installation by running dpkg-reconfigure locales
and enable en_IL.UTF-8
from the list, and set it as the default locale.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
comment_char % | |
escape_char / | |
% This file is part of the GNU C Library and contains locale data. | |
% The Free Software Foundation does not claim any copyright interest | |
% in the locale data contained in this file. The foregoing does not | |
% affect the license of the GNU C Library as a whole. It does not | |
% exempt you from the conditions of the license if your use would | |
% otherwise be governed by that license. | |
% Locale for English locale in Israel | |
% Contributed by Guy Rutenberg <guyrutenberg@gmail.com>, 2016 | |
LC_IDENTIFICATION | |
title "English locale for Israel" | |
source "Free Software Foundation, Inc." | |
address "http:////www.gnu.org//software//libc//" | |
contact "" | |
email "bug-glibc-locales@gnu.org" | |
tel "" | |
fax "" | |
language "English" | |
territory "Israel" | |
revision "1.1" | |
date "2016-04-19" | |
% | |
category "i18n:2012";LC_IDENTIFICATION | |
category "i18n:2012";LC_CTYPE | |
category "i18n:2012";LC_COLLATE | |
category "i18n:2012";LC_TIME | |
category "i18n:2012";LC_NUMERIC | |
category "i18n:2012";LC_MONETARY | |
category "i18n:2012";LC_MESSAGES | |
category "i18n:2012";LC_PAPER | |
category "i18n:2012";LC_NAME | |
category "i18n:2012";LC_ADDRESS | |
category "i18n:2012";LC_TELEPHONE | |
category "i18n:2012";LC_MEASUREMENT | |
END LC_IDENTIFICATION | |
LC_CTYPE | |
copy "en_GB" | |
END LC_CTYPE | |
LC_COLLATE | |
copy "en_GB" | |
END LC_COLLATE | |
LC_MONETARY | |
copy "he_IL" | |
END LC_MONETARY | |
LC_NUMERIC | |
copy "he_IL" | |
END LC_NUMERIC | |
LC_TIME | |
abday "<U0053><U0075><U006E>";"<U004D><U006F><U006E>";/ | |
"<U0054><U0075><U0065>";"<U0057><U0065><U0064>";/ | |
"<U0054><U0068><U0075>";"<U0046><U0072><U0069>";/ | |
"<U0053><U0061><U0074>" | |
day "<U0053><U0075><U006E><U0064><U0061><U0079>";/ | |
"<U004D><U006F><U006E><U0064><U0061><U0079>";/ | |
"<U0054><U0075><U0065><U0073><U0064><U0061><U0079>";/ | |
"<U0057><U0065><U0064><U006E><U0065><U0073><U0064><U0061><U0079>";/ | |
"<U0054><U0068><U0075><U0072><U0073><U0064><U0061><U0079>";/ | |
"<U0046><U0072><U0069><U0064><U0061><U0079>";/ | |
"<U0053><U0061><U0074><U0075><U0072><U0064><U0061><U0079>" | |
abmon "<U004A><U0061><U006E>";"<U0046><U0065><U0062>";/ | |
"<U004D><U0061><U0072>";"<U0041><U0070><U0072>";/ | |
"<U004D><U0061><U0079>";"<U004A><U0075><U006E>";/ | |
"<U004A><U0075><U006C>";"<U0041><U0075><U0067>";/ | |
"<U0053><U0065><U0070>";"<U004F><U0063><U0074>";/ | |
"<U004E><U006F><U0076>";"<U0044><U0065><U0063>" | |
mon "<U004A><U0061><U006E><U0075><U0061><U0072><U0079>";/ | |
"<U0046><U0065><U0062><U0072><U0075><U0061><U0072><U0079>";/ | |
"<U004D><U0061><U0072><U0063><U0068>";/ | |
"<U0041><U0070><U0072><U0069><U006C>";/ | |
"<U004D><U0061><U0079>";/ | |
"<U004A><U0075><U006E><U0065>";/ | |
"<U004A><U0075><U006C><U0079>";/ | |
"<U0041><U0075><U0067><U0075><U0073><U0074>";/ | |
"<U0053><U0065><U0070><U0074><U0065><U006D><U0062><U0065><U0072>";/ | |
"<U004F><U0063><U0074><U006F><U0062><U0065><U0072>";/ | |
"<U004E><U006F><U0076><U0065><U006D><U0062><U0065><U0072>";/ | |
"<U0044><U0065><U0063><U0065><U006D><U0062><U0065><U0072>" | |
d_t_fmt "<U0025><U0061><U0020><U0025><U0064><U0020><U0025><U0062><U0020><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U005A>" | |
d_fmt "<U0025><U0064><U002F><U0025><U006D><U002F><U0025><U0079>" | |
t_fmt "<U0025><U0054>" | |
am_pm "";"" % 24-hour clock is used | |
t_fmt_ampm "" | |
date_fmt "<U0025><U0061><U0020><U0025><U0065><U0020><U0025><U0062>/ | |
<U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U0020>/ | |
<U0025><U005A><U0020><U0025><U0059>" | |
week 7;19971130;1 | |
% In Israel Sunday is a workday. | |
first_workday 1 | |
END LC_TIME | |
LC_MESSAGES | |
copy "en_US" | |
END LC_MESSAGES | |
LC_PAPER | |
copy "he_IL" | |
END LC_PAPER | |
LC_NAME | |
copy "en_US" | |
END LC_NAME | |
LC_ADDRESS | |
postal_fmt "<U0025><U0066><U0025><U004E><U0025><U0061><U0025><U004E>/ | |
<U0025><U0064><U0025><U004E><U0025><U0062><U0025><U004E><U0025><U0073>/ | |
<U0020><U0025><U0068><U0020><U0025><U0065><U0020><U0025><U0072><U0025>/ | |
<U004E><U0025><U007A><U0020><U0025><U0054><U0025>/ | |
<U004E><U0025><U0063><U0025><U004E>" | |
country_name "<U0049><U0073><U0072><U0061><U0065><U006C>" | |
country_post "<U0049><U0053><U0052>" | |
country_ab2 "<U0049><U004C>" | |
country_ab3 "<U0049><U0053><U0052>" | |
country_num 376 | |
country_car "<U0049><U004C>" | |
lang_name "<U0045><U006E><U0067><U006C><U0069><U0073><U0068>" | |
lang_ab "<U0065><U006E>" | |
lang_term "<U0065><U006E><U0067>" | |
lang_lib "<U0065><U006E><U0067>" | |
END LC_ADDRESS | |
LC_TELEPHONE | |
copy "he_IL" | |
END LC_TELEPHONE | |
LC_MEASUREMENT | |
copy "he_IL" | |
END LC_MEASUREMENT |
nginx and SNI
Server name indication (SNI) allows you serve multiple sites with different TLS/SSL certificates using a single IP address. Nginx has support for SNI for quite some time and actually setting it up is easy, simply add server
entries for the corresponding sites. There is one caveat, the server_name
entry must come before the server_certificate
in order for SNI to be activated:
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
...
}
server {
listen 443 ssl;
server_name www.example.org;
ssl_certificate www.example.org.crt;
...
}
is good, but
server {
listen 443 ssl;
ssl_certificate www.example.com.crt;
server_name www.example.com;
...
}
server {
listen 443 ssl;
ssl_certificate www.example.org.crt;
server_name www.example.org;
...
}
will serve the wrong certificate for www.example.org
.
WordPress.com Login Loop
Sometimes, when I try to use certain functions on wordpress.com, I get redirected to a login page. After I sign-in, I get redirect again to the same login page. This repeats in an endless loop. It usually doesn’t bother me, as I self-host my blog, but for some things, like the yearly annual report that came in about two weeks ago, it does bother. I looked up into the matter, and the issue turned up to be due to blocking third-party cookies. To resolve the endless login loop, you need to add https://wordpress.com
(note the https
) to the exception list of accepted third-party cookies (In Firefox it’s under Preferences -> Privacy -> Exceptions).
Skip Updates When Using the Let’s Encrypt `letsencrypt-auto` Client
To use Let’s Encrypt CA to issue free certificates, you need to use their client. The recommended method to install it is to use letsencrypt-auto
, a script that automatically fetches and installs all the required dependencies. There is no doubt, that the letsencrypt-auto
is the fastest and simplest way to get a Let’s Encrypted client up and running. I’ve used it myself, when I wrote a guide to get Let’s Encrypt up and running easily.
Automatically updating required dependencies, has its downside. As letsencrypt-auto
does it every time you run it, it quickly gets annoying. Running a simple ./letsencrypt-auto --help
takes a whopping 15 seconds, just figuring out that there are no updates available. Supposing that you know that no update are available, and you wish to save some time, you can run the letsencrypt
executable directly, skipping the updating process of lestencrypt-auto
:
~/.local/share/letsencrypt/bin/letsencrypt
Most of the actions require you to be root, so you might need to run it with sudo
.
You can expect this issue to be resolved in the future. There is already an open issue for it and an active work that will resolve it.
Installing Debian Unstable’s source Packages in Debian Jessie
Sometimes a package that you need is not available for Debian Jessie, but you can find it for Sid (unstable). You may be tempted to try to install it manually, by downloading the binary deb
package, but it will most likely fail due to binary incompatibilities with different libraries’ versions you have. The better method will be to get the source package used to build the binary package, and build it yourself. Most of the time the process is not as hard as it sounds.
First, a short preliminary setup is needed Add the following lines to /etc/apt/sources.list
:
deb http://http.debian.net/debian jessie-backports main
deb-src http://httpredir.debian.org/debian unstable main contrib
You can replace unstable
with testing
if you prefer to use packages from testing
. Update the lists of packages
sudo apt-get update
Next you need, to get the build dependencies for your package. The example below uses the package lyx
:
sudo apt-get build-dep lyx/unstable
Now you are ready to fetch and build the source package:
sudo apt-get source -b lyx/unstable
Finally, you will see in the current directory the resulting DEBs. Simply install them:
sudo gdebi lyx-common_2.1.4-2_all.deb
sudo gdebi lyx_2.1.4-2_amd64.deb
You can later mark the dependecies that you manually installed as automatic:
sudo apt-mark auto lyx-common
Installing the latest version of Iceweasel (Firefox) on Debian Jessie
The jessie-backports
repository does not have the latest Iceweasel builds. However, the Debian Mozilla team releases its own backports. To use their backports follow the steps below:
# apt-get install pkg-mozilla-archive-keyring
# echo "deb http://mozilla.debian.net/ jessie-backports iceweasel-release" >> /etc/apt/sources.list
# apt-get install -t jessie-backports iceweasel
At the time of writing this post, the Mozilla team’s repository provides Iceweasel 42, compared with 38.4 with the regular Jessie repository.
Gnome `Alt+Shift` and `Alt+Shift+Tab`
After installing Debian Jessie with Gnome 3.14, I noticed an annoying bug: When I tried to switch windows using Alt+Tab
it worked as it should, but when I tried to switch in reverse order, using Alt+shit+Tab
it did not work. I quickly figured out that the problem lies in the frequently used shortcut, Alt+Shift
for switching keyboard layouts. Indeed, when I tried cycling through windows, I switched keyboard layouts instead.
The gist of the solution was found after some searching in Stack Exchange albeit it needs some adjustment for newer version of Gnome: Start the Gnome’s Tweak Tool and select Typing from the Tweaks menu. Under “Miscellaneous compatibility options” select “Shift cancels Caps Lock”.
This fixed the issue for me, without any side-effects. I don’t need to use Shift-Alt
instead of Alt-Shift
as suggested in the original solution and neither the Shift key cancels the Caps Lock as may be suggested by this option.
Update 2020-06-08: In Gnome 3.36 the relevant setting appears under Keyboard & Mouse -> Additional Layout Options -> Miscellaneous compatibility options.
Creating Menu Entries for Calibre
I recently installed Calibre using their binary installer for linux, and found out that it doesn’t come with .desktop
files, so Calibre doesn’t appear in the GNOME menu. To remedy this I installed the following desktop files in ~/.local/share/applications/
(modified from the Debian Sid package):
[Desktop Entry]
Type=Application
Name=E-Book Viewer
Comment=E-Book Viewer
TryExec=/home/user/.local/calibre/ebook-viewer
Exec=/home/user/.local/calibre/ebook-viewer %F
Icon=/home/user/.local/calibre/resources/images/viewer.png
MimeType=application/x-mobipocket-ebook;application/epub+zip;
Categories=Office;Graphics;Viewer;
and
[Desktop Entry]
Type=Application
Name=Calibre
GenericName=E-book library management
GenericName[de]=E-Book Bibliotheksverwaltung
Comment=E-book library management
Comment[es]=aplicación para la gestión de libros electrónicos
Comment[de]=E-Book Bibliotheksverwaltung
TryExec=/home/user/.local/calibre/calibre
Exec=/home/user/.local/calibre/calibre %f
Icon=/home/user/.local/calibre/resources/images/lt.png
Categories=Office;Database;FileTools;Viewer;Qt;
MimeType=x-content/ebook-reader;
You may need to adjust the paths for TryExec
, Exec
and Icon
to match where you installed Calibre.