Since ever the Kobo firmwares also allowed downloading of a bunch of dictionaries, most of which I don t need. As I am fluent in most languages I read and write, the only real dictionary I would like to see is a Japanese-English (I don t dare asking for a Japanese-German). Unfortunately, Kobo never shipped one. OTOH, starting with firmware 3.16.10 they ships two different English-Japanese dictionaries, one excellent Japanese-Japanese dictionary, but not one Japanese-English. So I took the liberty to write a script that allows everyone to enrich the shipped Japanese-Japanese dictionary with English definitions.
Till now I have used Tshering s excellent Japanese dictionary which was enriched with English definitions. It was based on the older Japanese-Japanese dictionary shipped with firmwares before 3.16.10. I didn t want to loose the more complete dictionary from the new firmware, so here is a script that updates the dictionary for you
Prerequisites
The script is neither fool-proof nor does everything by itself. Furthermore, it requires a set of programs. In details:
$ sqlite3 Japanese3.db .output japanese3-data select Entry, Furigana, Summary from entries; |
LC_CTYPE=C 7z x ... |
$ perl enhance-dictionary.pl --dicts edict2 --dicts japanese3 Using the following dictionaries as source for translations: edict2 japanese3 loading edict2 ... done loading Japanese3 data ... done unpacking original dictionary ... done loading dict files ... done searching for words and updating ... done total words 805521, matches: 130563 (edict: 123388, japanese3: 7175) creating output html ... done creating update dictionary in dicthtml-jaxxdjs-201508072201.zip ... done $ |
There is only one caveat: Syncing with Kobo will re-download the original dictionary and overwrite the enhanced one. There is at least one solution here, which I am employing, see this post on MobileRead.
Download and development place
I am using the github repository kobo-ja-dict-enhance to develop the program. Please report bugs, and feature requests there.
The file for the last released version can be downloaded from here: enhance-dictionary.pl
Future plans
I am planning to get rid of the 7z dependency and use Archive::Zip for all the unpacking and packing. This would also allow to do everything in memory and thus make it faster. There is a branch on github with ongoing work on this matter.
I also think about including translations for Hiragana words by providing the translations of all possible Kanji readings.
Conclusions
Even if Kobo does not provide us with a decent Japanese-English dictionary, adding at least a huge amount of translations to the current dictionary is now easily possible. For serious students of Japanese who are reading or starting to read Japanese eBooks, this will be of great help.
Enjoy, and don t forget to give feedback, suggestions, and improvements either here or better via the Github page.
July was the third month I contributed to Debian LTS under the
Freexian umbrella. In total I spent eight hours working on:
logind hangs
If you just updated systemd and ssh to that host seems to hang, that's
just a known Bug (Debian Bug). Don't
panic. Wait for the logind timeout and restart logind.
restart and stop;start
One thing that confused me several times and still confuses people is
systemctl restart doing more than systemctl stop ; systemctl
start. You will notice the difference once you have a failed service. A
restart will try to start the service again. Both stop and start
however will just ignore it. Rumors have it this has changed post
jessie however.
sysvinit-wrapped services and stop
While there are certainly bugs with sysvinit services in general (I
found myself several times without a local resolver as unbound
failed to be started, haven't managed to debug further), the stop
behavior of wrapped services is just broken. systemctl stop will
block until the sysv initscript finished. It will even note the result
of the action in its state. However systemctl will return with
exitcode 0 and not output anything on stdout/stderr. This has been
reported as
Debian Bug.
zsh helper
I found the following zshrc snipped quite helpful in dealing with
non-reported systemctl failures. On root shells it will display a
list of failed services as part of the prompt. This will give proper
feedback whether your systemctl stop failed, it will give feedback
if you still have type=simple services and if the sysv-init script
or wrapper is broken.
precmd ()
if [[ $UID == 0 && $+commands[systemctl] != 0 ]]
then
use_systemd=true
systemd_failed=" systemctl --state=failed grep failed cut -d \ -f 2 tr '\n' ' ' "
fi
if [[ $UID == 0 && $+commands[systemctl] != 0 ]]
then
PROMPT=$'% $fg[red]>> $systemd_failed$reset_color% \n'
else
PROMPT=""
fi
PROMPT+=whateveryourpromptis
zsh completion
Speaking of zsh, there's one problem that bothers me a lot and I don't
have any solution for. Tab-completing the service name for service is
blazing fast. Tab-completing the service name for systemctl restart
takes ages. People traced down to truckloads of dbus communication for
the completion but no further fix is known (to me).
type=simple services
As described in length by
Lucas Nussbaum
type=simple services are actively harmful. Proper type=forking
daemons are strictly superior (they provide feedback of finished
initialization and success thereof) and type=notify services are so
simple there's no excuse for not using them even for private one-off
hacks. Even if you're language doesn't provide libsystemd-daemon
bindings:
(defun sd-notify (event-string)
(let ((socket (make-instance 'sb-bsd-sockets:local-socket :type :datagram))
(name (posix-getenv "NOTIFY_SOCKET"))
(bufferlen (length event-string)))
(when name
(sb-bsd-sockets:socket-connect socket name)
(sb-bsd-sockets:socket-send socket event-string bufferlen))))
This is a
stable API
guaranteed to not break in the future and implemented in less than ten
lines of code with just basic socket functions. And if your language
has support it becomes actually trivial:
try:
import systemd
systemd.daemon.notify("READY=1")
except ImportError:
pass
Note that in both cases there is no drawback at all on systemd-free
setups. It has the overhead of checking the process' environment for
NOTIFY_SOCKET or for the systemd package and behaves like a simple
service otherwise.
Actually the idea of separating the technical aspect (daemonizing)
from the semantic aspect of signalizing "initialization finished,
everything's fine" is a pretty good idea and hopefully has the
potential to reduce the number of services signalizing the
"everything's fine" too early. It could even be ported to non-systemd
init systems easily given the API.
logind hangs
If you just updated systemd and ssh to that host seems to hang, that's
just a known Bug (Debian Bug #770135). Don't
panic. Wait for the logind timeout and restart logind.
restart and stop;start
One thing that confused me several times and still confuses people is
systemctl restart doing more than systemctl stop ; systemctl
start. You will notice the difference once you have a failed service. A
restart will try to start the service again. Both stop and start
however will just ignore it. Rumors have it this has changed post
jessie however.
sysvinit-wrapped services and stop
While there are certainly bugs with sysvinit services in general (I
found myself several times without a local resolver as unbound
failed to be started, haven't managed to debug further), the stop
behavior of wrapped services is just broken. systemctl stop will
block until the sysv initscript finished. It will even note the result
of the action in its state. However systemctl will return with
exitcode 0 and not output anything on stdout/stderr. This has been
reported as
Debian Bug #792045.
zsh helper
I found the following zshrc snipped quite helpful in dealing with
non-reported systemctl failures. On root shells it will display a
list of failed services as part of the prompt. This will give proper
feedback whether your systemctl stop failed, it will give feedback
if you still have type=simple services and if the sysv-init script
or wrapper is broken.
precmd ()
if [[ $UID == 0 && $+commands[systemctl] != 0 ]]
then
use_systemd=true
systemd_failed=" systemctl --state=failed grep failed cut -d \ -f 2 tr '\n' ' ' "
fi
if [[ $UID == 0 && $+commands[systemctl] != 0 ]]
then
PROMPT=$'% $fg[red]>> $systemd_failed$reset_color% \n'
else
PROMPT=""
fi
PROMPT+=whateveryourpromptis
zsh completion
Speaking of zsh, there's one problem that bothers me a lot and I don't
have any solution for. Tab-completing the service name for service is
blazing fast. Tab-completing the service name for systemctl restart
takes ages. People traced down to truckloads of dbus communication for
the completion but no further fix is known (to me).
type=simple services
As described in length by
Lucas Nussbaum
type=simple services are actively harmful. Proper type=forking
daemons are strictly superior (they provide feedback of finished
initialization and success thereof) and type=notify services are so
simple there's no excuse for not using them even for private one-off
hacks. Even if you're language doesn't provide libsystemd-daemon
bindings:
(defun sd-notify (event-string)
(let ((socket (make-instance 'sb-bsd-sockets:local-socket :type :datagram))
(name (posix-getenv "NOTIFY_SOCKET"))
(bufferlen (length event-string)))
(when name
(sb-bsd-sockets:socket-connect socket name)
(sb-bsd-sockets:socket-send socket event-string bufferlen))))
This is a
stable API
guaranteed to not break in the future and implemented in less than ten
lines of code with just basic socket functions. And if your language
has support it becomes actually trivial:
try:
import systemd
systemd.daemon.notify("READY=1")
except ImportError:
pass
Note that in both cases there is no drawback at all on systemd-free
setups. It has the overhead of checking the process' environment for
NOTIFY_SOCKET or for the systemd package and behaves like a simple
service otherwise.
Actually the idea of separating the technical aspect (daemonizing)
from the semantic aspect of signalizing "initialization finished,
everything's fine" is a pretty good idea and hopefully has the
potential to reduce the number of services signalizing the
"everything's fine" too early. It could even be ported to non-systemd
init systems easily given the API.
SOURCE_DATE_EPOCH that contains a known timestamp in Unix epoch format. With this variable exported, tools that would embed the localtime in their generated or processed files, can use this externally supplied date. This would happen only if SOURCE_DATE_EPOCH is exported, so the behaviour of the tool wouldn t change if the variable is not set.
The first package I patched to implement this behaviour was gcc. The reason behind this is that there are about 420 unreproducible packages due to using the __DATE__, __TIME__ and __TIMESTAMP__ C macros. My patch changes the behavior of the macros __DATE__ and __TIME__ if SOURCE_DATE_EPOCH is exported. I submitted this patch to the gcc-patches list. Even though there was some interesting discussions in the list, the patch has not been accepted yet. Seeing how the reproducible builds idea is gaining momentum and becoming widespread, I m positive that at some point the gcc people will be more receptive for such patch.
The second work with SOURCE_DATE_EPOCH was in debhelper; I patched this building tool to export the variable with the latest debian/changelog entry timestamp. With this patch, all the tools that run under dh will be able to use it to embed deterministic timestamps. Unfortunately some parts of the build process of some packages don t happen under debhelper, so the variable needs to be exported in a different way.
Having submitted the debhelper patch allowed many packages to become reproducible after the tools that embedded timestamps were patched to honour SOURCE_DATE_EPOCH. As of today, the toolchain packages I have patched to do that are: gcc, libxslt, gettext, ghostscript and qt4-x11 (qhelpgenerator).
I have also continued working on fixing individual packages affected by timestamps, random orderings (such as the ones from listing hash keys) and locale depending orderings; I have tagged packages in our infrastructure to note what kind of issue makes them unreproducible; I have updated some parts of the Reproducible Builds Wiki.
It's been a while since I talked about Ceilometer and its companions, so I
thought I'd go ahead and write a bit about what's going on this side of
OpenStack. I'm not going to cover new features and fancy stuff today, but
rather a shallow overview of the new project processes we initiated.
Ceilometer growing
Ceilometer has grown a lot since that time
when we started it 3 years ago. It has evolved from a system designed to fetch
and store measurements, to a more complex system, with agents, alarms, events,
databases, APIs, etc.
All those features were needed and asked for by users and operators, but let's
be honest, some of them should never have ended up in the Ceilometer code
repository, especially not all at the same time.
The reality is we picked a pragmatic approach due to the rigidity of the
OpenStack Technical Committee in regards to new projects to become OpenStack
integrated and, therefore, blessed projects. Ceilometer was actually the
first project to be incubated and then integrated. We had to go through the
very first issues of that process.
Fortunately, now that time has passed, and all those constraints have been
relaxed. To me, the
OpenStack Foundation is turning into
something that looks like the
Apache Foundation, and there's, therefore,
no need to tie technical solutions to political issues.
Indeed, the
Big Tent
now allows much more flexibility to all of that. Back a year ago, we were
afraid to bring Gnocchi into Ceilometer. Was the Technical Committee going to
review the project? Was the project going to be in the scope of Ceilometer for
the Technical Committee? Now we don't have to ask ourselves those questions,
now that we have that freedom, it empowers us to actually do what we think is
good in term of technical design without worrying too much about political
issues.
Ceilometer development activity
Aodh is an Irish word meaning
fire. A word picked so it also had some relation to Heat, and because we have
some Irish influence around the project .
It s Seafair weekend in Seattle. As always, the centerpiece is the H1 Unlimited hydroplane races on Lake Washington.
In my social circle, I m nearly the only person I know who grew up in area. None of the newcomers I know had heard of hydroplane racing before moving to Seattle. Even after I explain it to them i.e., boats with 3,000+ horse power airplane engines that fly just above the water at more than 320kph (200mph) leaving 10m+ (30ft) wakes behind them! most people seem more puzzled than interested.
I grew up near the shore of Lake Washington and could see (and hear!) the races from my house. I don t follow hydroplane racing throughout the year but I do enjoy watching the races at Seafair. Here s my attempt to explain and make the case for the races to new Seattleites.
Before Microsoft, Amazon, Starbucks, etc., there were basically three major Seattle industries: (1) logging and lumber based industries like paper manufacturing; (2) maritime industries like fishing, shipbuilding, shipping, and the navy; (3) aerospace (i.e., Boeing). Vintage hydroplane racing represented the Seattle trifecta: Wooden boats with airplane engines!
The wooden U-60 Miss Thriftway circa 1955 (Thriftway is a Washinton-based supermarket that nobody outside has heard of) below is a picture of old-Seattle awesomeness. Modern hydroplanes are now made of fiberglass but two out of three isn t bad.
Although the boats are racing this year in events in Indiana, San Diego, and Detroit in addition to the two races in Washington, hydroplane racing retains deep ties to the region. Most of the drivers are from the Seattle area. Many or most of the teams and boats are based in Washington throughout the year. Many of the sponsors are unknown outside of the state. This parochialness itself cultivates a certain kind of appeal among locals.
In addition to old-Seattle/new-Seattle cultural divide, there s a class divide that I think is also worth challenging. Although the demographics of hydro-racing fans is surprisingly broad, it can seem like Formula One or NASCAR on the water. It seems safe to suggest that many of the demographic groups moving to Seattle for jobs in the tech industry are not big into motorsports. Although I m no follower of motorsports in general, I ve written before cultivated disinterest in professional sports, and it remains something that I believe is worth taking on.
It s not all great. In particular, the close relationship between Seafair and the military makes me very uneasy. That said, even with the military-heavy airshow, I enjoy the way that Seafair weekend provides a little pocket of old-Seattle that remains effectively unchanged from when I was a kid. I d encourage others to enjoy it as well!
It s Seafair weekend in Seattle. As always, the centerpiece is the H1 Unlimited hydroplane races on Lake Washington.
In my social circle, I m nearly the only person I know who grew up in area. None of the newcomers I know had heard of hydroplane racing before moving to Seattle. Even after I explain it to them i.e., boats with 3,000+ horse power airplane engines that fly just above the water at more than 320kph (200mph) leaving 10m+ (30ft) wakes behind them! most people seem more puzzled than interested.
I grew up near the shore of Lake Washington and could see (and hear!) the races from my house. I don t follow hydroplane racing throughout the year but I do enjoy watching the races at Seafair. Here s my attempt to explain and make the case for the races to new Seattleites.
Before Microsoft, Amazon, Starbucks, etc., there were basically three major Seattle industries: (1) logging and lumber based industries like paper manufacturing; (2) maritime industries like fishing, shipbuilding, shipping, and the navy; (3) aerospace (i.e., Boeing). Vintage hydroplane racing represented the Seattle trifecta: Wooden boats with airplane engines!
The wooden U-60 Miss Thriftway circa 1955 (Thriftway is a Washinton-based supermarket that nobody outside has heard of) below is a picture of old-Seattle awesomeness. Modern hydroplanes are now made of fiberglass but two out of three isn t bad.
Although the boats are racing this year in events in Indiana, San Diego, and Detroit in addition to the two races in Washington, hydroplane racing retains deep ties to the region. Most of the drivers are from the Seattle area. Many or most of the teams and boats are based in Washington throughout the year. Many of the sponsors are unknown outside of the state. This parochialness itself cultivates a certain kind of appeal among locals.
In addition to old-Seattle/new-Seattle cultural divide, there s a class divide that I think is also worth challenging. Although the demographics of hydro-racing fans is surprisingly broad, it can seem like Formula One or NASCAR on the water. It seems safe to suggest that many of the demographic groups moving to Seattle for jobs in the tech industry are not big into motorsports. Although I m no follower of motorsports in general, I ve written before cultivated disinterest in professional sports, and it remains something that I believe is worth taking on.
It s not all great. In particular, the close relationship between Seafair and the military makes me very uneasy. That said, even with the military-heavy airshow, I enjoy the way that Seafair weekend provides a little pocket of old-Seattle that remains effectively unchanged from when I was a kid. I d encourage others to enjoy it as well!
We've just started a new team in Debian for maintaining our UEFI
packages together, with git repositories in a shared project on alioth
etc. We're just working out the exact details of how we're going to
manage things, but for now we've moved the following packages under
the team's umbrella:
The list of available wifi channels
is slightly different from country to country. To ensure access to the
right channels and transmit power settings, one needs to set the right
regulatory domain in the wifi stack.
iw reg get
iw reg set CA
where CA is the two-letter country code
when the device is located.
On Debian and Ubuntu, you can make this setting permanent by putting the
country code in /etc/default/crda.
Finally, to see the list of channels that are available in the current
config, use:
iwlist wlan0 frequency
iw commands
above).
In order to persist your changes though, you need to use the
uci command:
uci set wireless.radio0.country=CA
uci set wireless.radio1.country=CA
uci commit wireless
where wireless.radio0 and wireless.radio1 are the wireless devices
specific to your router. You can look them up using:
uci show wireless
To test that it worked, simply reboot the router and then look at the
selected regulatory domain:
iw reg get
| Series: | Katya and Starbride #1 |
| Publisher: | Bold Strokes |
| Copyright: | September 2012 |
| ISBN: | 1-60282-792-3 |
| Format: | Kindle |
| Pages: | 264 |
VLANd is a python program intended to make it easy to manage
port-based VLAN setups across multiple switches in a network. It is
designed to be vendor-agnostic, with a clean pluggable driver API to
allow for a wide range of different switches to be controlled
together.
There's more information in
the README
file. I've just released v0.3, with a lot of changes included since
the last release:
My monthly report covers a large part of what I have been doing in the free software world. I write it for my donators (thanks to them!) but also for the wider Debian community because it can give ideas to newcomers and it s one of the best ways to find volunteers to work with me on projects that matter to me.
Debian LTS
This month I have been paid to work 15 hours on Debian LTS. In that time I did the following:
Kali Linux wants to experiment something close to Debian Constantly Usable Testing: we have a kali-rolling release that is based on Debian Testing and we want to take a new snapshot every 4 months (in order to have 3 releases per year).
More specifically we have a kali-dev repository which is exactly Debian Stretch + our own Kali packages (the kali package take precedence) updated 4 times a day, just like testing is. And we have a britney2 setup that generates kali-rolling out of kali-dev (without any requirement in terms of delay/RC bugs, it just ensures that dependencies are not broken), also 4 times a day.
We have jenkins job that ensures that our metapackages are installable in kali-dev (and kali-rolling) and that we can build our ISO images. When things break, I have to fix them and I try to fix them on the Debian side first. So here are some examples of stuff I did in response to various failures:
how-can-i-help -s testing-autorm --old I just submitted #794238 as a wishlist against how-can-i-help.
At the same time, there are bugs that make it into testing and that I fix / work around on the Kali side. But those fixes / work around might be more useful if they were pushed to testing via testing-proposed-updates. I tried to see whether other derivatives had similar needs to see if derivatives could join their efforts at this level but it does not look like so for now.
Last but not least, bugs reported on the Kali side also resulted in Debian improvements:
2 comments Liked this article? Click here. My blog is Flattr-enabled.
The DUCK challenge is making a quite stable progress: in the last 4 weeks there were approximately 12.25 packages fixed and uploaded per week.
In the current week the following packages were fixed and uploaded into unstable:
| Week 1 | Week 2 | Week 3 | Week 4 | Week 5 | Week 6 | Week 7 | |
|---|---|---|---|---|---|---|---|
| # Packages | 10 | 15 | 10 | 14 | - | - | - |
| Total | 10 | 25 | 35 | 49 | - | - | - |
So we're in Finland, and the differences start out immediately.
We're renting a flat, in building ten, on a street. You'd think "10
Streetname" was a single building, but no. It is a pair of buildings: 10A, and 10B.
Both of the buildings have 12 flats in them, with 10A having 1-12, and 10B having 13-24.
There's a keypad at the main entrance, which I assumed was to let you press a button and talk to the people inside "Hello I'm the postmaster", but no. There is no intercom system, instead you type in a magic number and the door opens.
The magic number? Sounds like you want to keep that secret, since it lets people into the common-area? No. Everybody has it. The postman, the cleaners, the DHL delivery man, and all the ex-tenants. We invited somebody over recently and gave it out in advance so that they could knock on our flat-door.
Talking of cleaners: In the UK I lived in a flat and once a fortnight somebody would come and sweep the stair-well, since we didn't ever agree to do it ourselves. Here somebody turns up every day, be it to cut the grass, polish the hand-rail, clean the glass on the front-door, or mop the floors of the common area. Sounds awesome. But they cut the grass, right outside our window, at 7:30AM. On the dot. (Or use a leaf-blower, or something equally noisy.)
All this communal-care is paid for by the building-association, of which all flat-owners own shares. Sounds like something we see in England, or even like Americas idea of a Home-Owners-Association. (In Scotland you own your own flat, you don't own shares of an entity which owns the complete building. I guess there are pros and cons to both approaches.)
Moving onwards other things are often the same, but the differences when you spot them are odd. I'm struggling to think of them right now, somebody woke me up by cutting our grass for the second time this week (!)
Anyway I'm registered now with the Finnish government, and have a citizen-number, which will be useful, I've got an appointment booked to register with the police - which is something I had to do as a foreigner within the first three months - and today I've got an appointment with a local bank so that I can have a euro-bank-account.
Happily I did find a gym to join, the owner came over one Sunday to
give me a tiny-tour, and then gave me a list of other gyms to try if
his wasn't good enough - which was a nice touch - I joined a couple of
days later, his gym is awesome.
(I'm getting paid in UK-pounds, to a UK-bank, so right now I'm getting local money by transferring to my wifes account here, but I want to do that to my own, and open a shared account for paying for rent, electricity, internet, water, & etc).
My flat back home is still not rented, because the nice property management company lost my keys. Yeah you can't make that up can you? With a bit of luck the second set of keys I mailed them will arrive soon and the damn thing can be occupied, while I'm not relying on that income I do wish to have it.
Hadley is a popular figure, and rightly so as he successfully introduced many newcomers to the wonders offered by R. His approach strikes some of us old greybeards as wrong---I particularly take exception with some of his writing which frequently portrays a particular approach as both the best and only one. Real programming, I think, is often a little more nuanced and aware of tradeoffs which need to be balanced. As a book on another language once popularized: "There is more than one way to do things." But let us leave this discussion for another time.
As the reach of the Hadleyverse keeps spreading, we sometimes find ourselves at the receiving end of a cost/benefit tradeoff. That is what this post is about, and it uses a very concrete case I encountered yesterday.
As blogged earlier, the RcppZiggurat package was updated. I had not touched it in a year, but Brian Ripley had sent a brief and detailed note concerning something flagged by the Solaris compiler (correctly suggesting I replace fabs() with abs() on integer types). (Allow me to stray from the main story line here for a second to stress just how insane a work load he is carrying, essentially for all of us. R and the R community are so just so indebted to him for all his work---which makes the usual social media banter about him so unfortunate. But that too shall be left for another time.) Upon making the simple fix, and submitting to GitHub the usual Travis CI was triggered. And here is what I saw:

- ./travis-tool.sh install_r RcppGSL rbenchmark microbenchmark highlight
which implies source builds of the four listed packages and all their dependencies with the following line implying binary installations of already built packages:
- ./travis-tool.sh install_aptget libgsl0-dev r-cran-rcppgsl r-cran-rbenchmark r-cran-microbenchmark r-cran-highlight
In this particular case I also needed to build a binary package of my RcppGSL package as this one is not (yet) handled by Michael. I happen to have (re-)discovered the beauty of PPAs for Travis earlier this year and revitalized an older and largely dormant launchpad account I had for this PPA of mine. How to build a simple .deb package will also have to left for a future post to keep this more concise.
This can be used with the existing r-travis setup---but one needs to use the older, initial variant in order to have the ability to install .deb packages. So in the .travis.yml of RcppZiggurat I just use
before_install:
## PPA for Rcpp and some other packages
- sudo add-apt-repository -y ppa:edd/misc
## r-travis by Craig Citro et al
- curl -OL http://raw.github.com/craigcitro/r-travis/master/scripts/travis-tool.sh
- chmod 755 ./travis-tool.sh
- ./travis-tool.sh bootstrap
to add my own PPA and all is good. If you do not have a PPA, or do not want to create your own packages you can still benefit from the PPAs by Michael and "mix and match" by installing from binary what is available, and from source what is not.
Here we were able to use an all-binary approach, so let's see the resulting performance:

Follow-up: The post got some pretty immediate feedback shortly after I posted it. Craig Citro pointed out (quite correctly) that I could use r_binary_install which would also install the Ubuntu binaries based on their R packages names. Having built R/CRAN packages for Debian for so long, I am simply more used to the r-cran-* notations, and I think I was also the one contributing install_aptget to r-travis ... Yihui Xie spoke up for the "new" Travis approach deploying containers, caching of packages and explicit whitelists. It was in that very (GH-based) discussion that I started to really lose faith in the new Travis approach as they want use to whitelist each and every package. With 6900 and counting at CRAN I fear this simply does not scale. But different approaches are certainly welcome. I posted my 1:03 to 1:15 minutes result. If the "New School" can do it faster, I'd be all ears.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
Next.