Benjamin Mako Hill: Testing Our Theories About Eternal September
Graph of subscribers and moderators over time in /r/NoSleep. The image is taken from our 2016 CHI paper.
Graph of subscribers and moderators over time in /r/NoSleep. The image is taken from our 2016 CHI paper.
A new version of RcppAPT -- our interface from R to the C++ library behind the awesome apt, apt-get, apt-cache, ... commands and their cache powering Debian, Ubuntu and the like -- arrived on CRAN yesterday.
We added a few more functions in order to compute on the package graph. A concrete example is shown in this vignette which determines the (minimal) set of remaining Debian packages requiring a rebuild under R 3.4.* to update their .C() and .Fortran() registration code. It has been used for the binNMU request #868558.
As we also added a NEWS file, its (complete) content covering all releases follows below.
A bit more information about the package is available here as well as as the GitHub repo.Changes in version 0.0.4 (2017-07-16)
- New function
getDepends- New function
reverseDepends- Added package registration code
- Added usage examples in
scriptsdirectory- Added vignette, also in
docsas rendered copyChanges in version 0.0.3 (2016-12-07)
- Added
dumpPackages,showSrcChanges in version 0.0.2 (2016-04-04)
- Added
reverseDepends,dumpPackages,showSrcChanges in version 0.0.1 (2015-02-20)
- Initial version with
getPackagesandhasPackages
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A little while back, in June, I sat my last exam for what I hoped would be the
last module in my degree. For seven years, I've been working on a degree with
the Open University and have been taking advantage of the opportunity to
have a somewhat self-directed course load by taking the 'Open' degree track.
When asked why I bothered to do this, I guess my answer has been a little
varied. In principle it's because I felt like I'd already done a year's worth
of degree and didn't want it wasted, but it's also because I have been, in the
dim and distant past, overlooked for jobs simply because I had no degree and
thus was an easy "bin the CV".
Fed up with this, I decided to commit to the Open University and thus began my
journey toward 'qualification' in 2010. I started by transferring the level 1
credits from my stint at UCL back in 1998/1999 which were in a combination
of basic programming in Java, some mathematics including things like RSA, and
some psychology and AI courses which at the time were aiming at a degree called
'Computer Science with Cognitive Sciences'.
Then I took level 2 courses, M263 (Building blocks of software), TA212
(The technology of music) and MS221 (Exploring mathematics). I really
enjoyed the mathematics course and so...
At level 3 I took MT365 (Graphs, networks and design), M362 (Developing
concurrent distributed systems), TM351 (Data management and analysis -
which I ended up hating), and finally finishing this June with TM355
(Communications technology).
I received an email this evening telling me the module result for TM355 had
been posted, and I logged in to find I had done well enough to be offered
my degree. I could have claimed my degree 18+ months ago, but I persevered
through another two courses in order to qualify for an honours degree which
I have now been awarded. Since I don't particularly fancy any ceremonial
awarding, I just went through the clicky clicky and accepted my qualification
of 'Batchelor of Science (Honours) Open, Upper Second-class Honours (2.1)'
which grants me the letters 'BSc (Hons) Open (Open)' which, knowing me, will
likely never even make it onto my CV because I'm too lazy.
It has been a significant effort, over the course of the past few years, to
complete a degree without giving up too much of my personal commitments. In
addition to earning the degree, I have worked, for six of the seven years it
has taken, for Codethink doing interesting work in and around Linux systems
and Trustable software. I have designed and built Git server software
which is in use in some universities, and many companies, along with a good few
of my F/LOSS colleagues. And I've still managed to find time to attend plays,
watch films, read an average of 2 novel-length stories a week (some of which
were even real books), and be a member of the Manchester Hackspace.
Right now, I'm looking forward to a stress free couple of weeks, followed by
an immense amount of fun at Debconf17 in Montr al!
--column-inserts's pg_dump option.stretch migration.buster suitejenkins.log.
In measured boot, each component of the boot process is "measured" (ie, hashed and that hash recorded) in a register in the Trusted Platform Module (TPM) build into the system. The TPM has several different registers (Platform Configuration Registers, or PCRs) which are typically used for different purposes - for instance, PCR0 contains measurements of various system firmware components, PCR2 contains any option ROMs, PCR4 contains information about the partition table and the bootloader. The allocation of these is defined by the PC Client working group of the Trusted Computing Group. However, once the boot loader takes over, we're outside the spec[1].
Thanks to the cooperation with upstream authors and the maintainer Martin Pitt, the Calibre package in Debian is now up-to-date at version 3.4.0, and has adopted a more standard packaging following upstream. In particular, all the desktop files and man pages have been replaced by what is shipped by Calibre. What remains to be done is work on RAR support.
Rar support is necessary in the case that the eBook uses rar as compression, which happens quite often in comic books (cbr extension). Calibre 3 has split out rar support into a dynamically loaded module, so what needs to be done is packaging it. I have prepared a package for the Python library unrardll which allows Calibre to read rar-compressed ebooks, but it depends on the unrar shared library, which unfortunately is not built in Debian. I have sent a patch to fix this to the maintainer, see bug 720051, but without reaction from the maintainer.
Thus, I am publishing updated packages for unrar shipping also libunrar5, and unrardll Python package in my calibre repository. After installing python-unrardll Calibre will happily import meta-data from rar-compressed eBooks, as well as display them.
deb http://www.preining.info/debian/ calibre main
deb-src http://www.preining.info/debian/ calibre main
The releases are signed with my Debian key 0x6CACA448860CDC13
Enjoy
Solskogen 2017 is over! What a blast that was;
I especially enjoyed that so many old-timers came back to visit, it really
made the party for me.
This was the first year we were using Nageru for not only the stream but also
for the bigscreen mix, and I was very relieved to see the lack of problems;
I've had nightmares about crashes with 150+ people watching (plus 200-ish
more on stream), but there were no crashes and hardly a dropped frame.
The transition to a real mixing solution as well as from HDMI to SDI
everywhere gave us a lot of new opportunities, which allowed a number of
creative setups, some of them cobbled together on-the-spot:
apt-get update
apt-get upgrade
apt-get clean
dpkg --list > original.dpkg
apt-get --download-only install dpkg:amd64 tar:amd64 apt:amd64 bash:amd64 dash:amd64 init:amd64 mawk:amd64
cd /var/cache/apt/archives/
dpkg --install dpkg_*amd64.deb tar_*amd64.deb apt_*amd64.deb bash_*amd64.deb dash_*amd64.deb *.deb
dpkg --configure --pending
dpkg -i --skip-same-version dpkg_*_amd64.deb apt_*_amd64.deb bash_*_amd64.deb dash_*_amd64.deb mawk_*_amd64.deb *.deb
for pack32 in $(grep i386 original.dpkg egrep "^ii " awk ' print $2 ' ) ; do
echo $pack32 ;
if dpkg --status $pack32 grep -q "Multi-Arch: same" ; then
apt-get --download-only install -y --allow-remove-essential $ pack32%:i386 :amd64 ;
fi ;
done
dpkg --install /var/cache/apt/archives/*_amd64.deb
dpkg --install /var/cache/apt/archives/*_amd64.deb
dpkg --print-architecture
dpkg --print-foreign-architectures
But this procedure does not prevent the "apt-get install" to have broken
dependencies.
So trying to install the core packages and the libraries using "dpkg
-i".
apt-get update
apt-get upgrade
apt-get autoremove
apt-get clean
dpkg --list > original.dpkg
apt-get --download-only install dpkg:amd64 tar:amd64 apt:amd64 bash:amd64 dash:amd64 init:amd64 mawk:amd64
for pack32 in $(grep i386 original.dpkg egrep "^ii " awk ' print $2 ' ) ; do
echo $pack32 ;
if dpkg --status $pack32 grep -q "Multi-Arch: same" ; then
apt-get --download-only install -y --allow-remove-essential $ pack32%:i386 :amd64 ;
fi ;
done
cd /var/cache/apt/archives/
dpkg --install dpkg_*amd64.deb tar_*amd64.deb apt_*amd64.deb bash_*amd64.deb dash_*amd64.deb *.deb
dpkg --configure --pending
dpkg --install --skip-same-version dpkg_*_amd64.deb apt_*_amd64.deb bash_*_amd64.deb dash_*_amd64.deb mawk_*_amd64.deb *.deb
dpkg --remove libcurl4-openssl-dev
dpkg -i libcurl4-openssl-dev_*_amd64.deb
Remove packages until all there is no brokens packages
dpkg --print-architecture dpkg --print-foreign-architectures apt-get --fix-broken --allow-remove-essential installStill broken, because apt-get removed dpkg So instead of only installing the libs with dpkg -i, I am going to try to install all the packages with dpkg -i:
apt-get update apt-get upgrade apt-get autoremove apt-get clean dpkg --list > original.dpkg apt-get --download-only install dpkg:amd64 tar:amd64 apt:amd64 bash:amd64 dash:amd64 init:amd64 mawk:amd64 for pack32 in $(grep i386 original.dpkg egrep "^ii " awk ' print $2 ' ) ; do echo $pack32 ; apt-get --download-only install -y --allow-remove-essential $ pack32%:i386 :amd64 ; done cd /var/cache/apt/archives/ dpkg --install dpkg_*amd64.deb tar_*amd64.deb apt_*amd64.deb bash_*amd64.deb dash_*amd64.deb *.deb dpkg --configure --pending dpkg --install --skip-same-version dpkg_*_amd64.deb apt_*_amd64.deb bash_*_amd64.deb dash_*_amd64.deb mawk_*_amd64.deb *.deb dpkg --configure --pendingRemove packages and reinstall selected packages until you fix all off them. Follow the trial for my machine:
dpkg --remove rkhunter dpkg --remove libmarco-private1:i386 marco mate-control-center mate-desktop-environment-core mate-desktop-environment-core mate-desktop-environment mate-desktop-environment-core mate-desktop-environment-extras dpkg --remove libmate-menu2:i386 libmate-window-settings1:i386 mate-panel mate-screensaver python-mate-menu libmate-slab0:i386 mozo mate-menus dpkg --remove libmate-menu2:i386 mate-panel python-mate-menu mate-applets mate-menus dpkg -i libmate-menu2_1.16.0-2_amd64.deb dpkg --remove gir1.2-ibus-1.0:i386 gnome-shell gnome-shell-extensions gdm3 gnome-session dpkg --remove gir1.2-ibus-1.0:i386 dpkg --remove libmateweather1:i386 dpkg -i libmateweather1_1.16.1-2_amd64.deb apt-get --fix-broken --download-only install dpkg --skip-same-version --install dpkg_*amd64.deb tar_*amd64.deb apt_*amd64.deb bash_*amd64.deb dash_*amd64.deb *.deb dpkg --configure --pending dpkg -i python_2.7.13-2_amd64.deb dpkg --configure --pending dpkg -i perl_5.24.1-3+deb9u1_amd64.deb perl-base_5.24.1-3+deb9u1_amd64.deb dpkg -i exim4-daemon-light_4.89-2+deb9u1_amd64.deb exim4-base_4.89-2+deb9u1_amd64.deb dpkg -i libuuid-perl_0.27-1_amd64.deb dpkg --configure --pending dpkg --install gstreamer1.0-plugins-bad_1.10.4-1_amd64.deb libmpeg2encpp-2.1-0_1%3a2.1.0+debian-5_amd64.deb libmplex2-2.1-0_1%3a2.1.0+debian-5_amd64.deb dpkg --configure --pending dpkg --auditNow fixing broken dependencies on apt-get. Found no other way than removing all the broken packages.
dpkg --remove $(apt-get --fix-broken install cut -f 2 -d ' ' ) apt-get install $(grep -v ":i386" ~/original.dpkg egrep "^ii" grep -v "aiccu" grep -v "acroread" grep -v "flash-player-properties" grep -v "flashplayer-mozilla" egrep -v "tp-flash-marillat" awk ' print $2 ')
I recently raised a pull request
on zfec for converting its python packaging from pure setup.py to pbr based.
Today I got review from Brian Warner and one of the issue mentioned was
python setup.py --version is not giving same output as previous version of
setup.py.
Previous version used versioneer which extracts version
information needed from VCS tags. Versioneer also provides flexibility of
specifying type of VCS used, style of version, tag prefix (for VCS) etc. pbr
also does extract version information from git tag but it expects git tag to be
of format tags/refs/x.y.z format but zfec used a zfec- prefix to tag
(example zfec-1.4.24) and pbr does not process this. End result, I get a
version in format 0.0.devNN where NN is number of commits in the repository
from its inception.
Me and Brian spent few hours trying to figure out a way to tell pbr that we
would like to override version information it auto deduces, but there was none
other than putting version string in PBR_VERSION environment variable. That
documentation was contributed by me 3 years back to pbr project.
So finally I used versioneer to create a version string and put it in the
environment variable PBR_VERSION.
import os
import versioneer
os.environ['PBR_VERSION'] = versioneer.get_version()
...
setup(
setup_requires=['pbr'],
pbr=True,
ext_modules=extensions
)
[versioneer]
VCS = git
style = pep440
versionfile_source = zfec/_version.py
versionfile_build = zfec/_version.py
tag_prefix = zfec-
parentdir_prefix = zfec-
I wrote this code, and it made me super happy!
data Variety = Installer Target
deriving (Eq)
seed :: UserInput -> Versioned Variety Host
seed userinput ver = host "foo"
& ver ( (== Installer) --> hostname "installer"
< > (== Target) --> hostname (inputHostname userinput)
)
& osDebian Unstable X86_64
& Apt.stdSourcesList
& Apt.installed ["linux-image-amd64"]
& Grub.installed PC
& XFCE.installed
& ver ( (== Installer) --> desktopUser defaultUser
< > (== Target) --> desktopUser (inputUsername userinput)
)
& ver ( (== Installer) --> autostartInstaller )
This is doing so much in so little space and with so little fuss! It's
completely defining two different versions of a Host. One version is the
Installer, which in turn installs the Target. The code above provides
all the information that propellor needs to convert a copy of
the Installer into the Target, which it can do very efficiently. For
example, it knows that the default user account should be deleted, and a
new user account created based on the user's input of their name.
The germ of this idea comes from a short presentation I made about
propellor in Portland several years ago. I was describing
RevertableProperty, and Joachim Breitner pointed out that to use it, the
user essentially has to keep track of the evolution of their Host in
their head. It would be better for propellor to know what past versions
looked like, so it can know when a RevertableProperty needs to be
reverted.
I didn't see a way to address the objection for years. I was hung up
on the problem that propellor's properties can't be compared for equality,
because functions can't be compared for equality (generally). And on the
problem that it would be hard for propellor to pull old versions of a Host
out of git. But then I ran into the situation where I needed these two
closely related hosts to be defined in a single file, and it all fell
into place.
The basic idea is that propellor first reverts all the revertible
properties for other versions. Then it ensures the property for the current
version.
Another use for it would be if you wanted to be able to roll back changes
to a Host. For example:
foos :: Versioned Int Host
foos ver = host "foo"
& hostname "foo.example.com"
& ver ( (== 1) --> Apache.modEnabled "mpm_worker"
< > (>= 2) --> Apache.modEnabled "mpm_event"
)
& ver ( (>= 3) --> Apt.unattendedUpgrades )
foo :: Host
foo = foos version (4 :: Int)
Versioned properties can also be defined:
foobar :: Versioned Int -> RevertableProperty DebianLike DebianLike
foobar ver =
ver ( (== 1) --> (Apt.installed "foo" <!> Apt.removed "foo")
< > (== 2) --> (Apt.installed "bar" <!> Apt.removed "bar")
)
Notice that I've embedded a small DSL for versioning into the propellor
config file syntax. While implementing versioning took all day,
that part was super easy; Haskell config files win again!
API documentation for this feature
PS: Not really FRP, probably. But time-varying in a FRP-like way.
The twelveth update in the 0.12.* series of Rcpp landed on CRAN this morning, following two days of testing at CRAN preceded by five full reverse-depends checks we did (and which are always logged in this GitHub repo). The Debian package has been built and uploaded; Windows and macOS binaries should follow at CRAN as usual. This 0.12.12 release follows the 0.12.0 release from late July, the 0.12.1 release in September, the 0.12.2 release in November, the 0.12.3 release in January, the 0.12.4 release in March, the 0.12.5 release in May, the 0.12.6 release in July, the 0.12.7 release in September, the 0.12.8 release in November, the 0.12.9 release in January, the 0.12.10.release in March, and the 0.12.11.release in May making it the sixteenth release at the steady and predictable bi-montly release frequency.
Rcpp has become the most popular way of enhancing GNU R with C or C++ code. As of today, 1097 packages (and hence 71 more since the last release in May) on CRAN depend on Rcpp for making analytical code go faster and further, along with another 91 in BioConductor.
This releases contain a fairly large number of fairly small and focused pull requests most of which either correct some corner cases or improve other aspects. JJ tirelessly improved the package registration added in the previous release and following R 3.4.0. Kirill tidied up a number of small issues allowing us to run compilation in even more verbose modes---usually a good thing. Jeroen, Elias Pipping and Yo Gong all contributed as well, and we thank everybody for their contributions.
All changes are listed below in some detail.
Thanks to CRANberries, you can also look at a diff to the previous release. As always, even fuller details are on the Rcpp Changelog page and the Rcpp page which also leads to the downloads page, the browseable doxygen docs and zip files of doxygen output for the standard formats. A local directory has source and documentation too. Questions, comments etc should go to the rcpp-devel mailing list off the R-Forge page.Changes in Rcpp version 0.12.12 (2017-07-13)
- Changes in Rcpp API:
- The
tinyformat.hheader now ends in a newline (#701).- Fixed rare protection error that occurred when fetching stack traces during the construction of an Rcpp exception (Kirill M ller in #706).
- Compilation is now also possibly on Haiku-OS (Yo Gong in #708 addressing #707).
- Dimension attributes are explicitly cast to
int(Kirill M ller in #715).- Unused arguments are no longer declared (Kirill M ller in #716).
- Visibility of exported functions is now supported via the R macro
atttribute_visible(Jeroen Ooms in #720).- The
no_init()constructor acceptsR_xlen_t(Kirill M ller in #730).- Loop unrolling used
R_xlen_t(Kirill M ller in #731).- Two unused-variables warnings are now avoided (Jeff Pollock in #732).
- Changes in Rcpp Attributes:
- Execute tools::package_native_routine_registration_skeleton within package rather than current working directory (JJ in #697).
- The R portion no longer uses
dir.existsto no require R 3.2.0 or newer (Elias Pipping in #698).- Fix native registration for exports with name attribute (JJ in #703 addressing #702).
- Automatically register init functions for Rcpp Modules (JJ in #705 addressing #704).
- Add Shield around parameters in Rcpp::interfaces (JJ in #713 addressing #712).
- Replace dot (".") with underscore ("_") in package names when generating native routine registrations (JJ in #722 addressing #721).
- Generate C++ native routines with underscore ("_") prefix to avoid exporting when standard exportPattern is used in NAMESPACE (JJ in #725 addressing #723).
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
revisiting libjson-spirit.
I tried compiling a program that uses libjson-spirit and noticed that it still is broken. New programs compiled against the header does not link with the provided static library.
Trying to rebuild it fixes it, but it uses compat version 8, and that needs to be fixed (trivially).
hmm... actually code doesn't build anymore and there's multiple new upstream versions.
... and then I noticed that it was a stale copy already removed from Debian repository.
What's a good C++ json implementation these days?
In my previous post I
talked about using subprocess crate to extract beginning and ending year from
git repository for generating debian/copyright file. In this post I'm going to
talk on how I replaced subprocess with native git2 crate and achieved the
same result in much cleaner and safer way.
git2 is a native Rust crate which provides access to Git repository internals.
git2 does not involve any unsafe invocation as it is built against
libgit2-sys which is actually using Rust FFI to directly bind to underlying
libgit library. Below is the new copyright_fromgit function with git2 crate.
fn copyright_fromgit(repo_url: &str) -> Result<String>
let tempdir = TempDir::new_in(".", "debcargo")?;
let repo = Repository::clone(repo_url, tempdir.path())?;
let mut revwalker = repo.revwalk()?;
revwalker.push_head()?;
// Get the latest and first commit id. This is bit ugly
let latest_id = revwalker.next().unwrap()?;
let first_id = revwalker.last().unwrap()?; // revwalker ends here is consumed by last
let first_commit = repo.find_commit(first_id)?;
let latest_commit = repo.find_commit(latest_id)?;
let first_year =
DateTime::<Utc>::from_utc(
NaiveDateTime::from_timestamp(first_commit.time().seconds(), 0),
Utc).year();
let latest_year =
DateTime::<Utc>::from_utc(
NaiveDateTime::from_timestamp(latest_commit.time().seconds(), 0),
Utc).year();
let notice = match first_year.cmp(&latest_year)
Ordering::Equal => format!(" ", first_year),
_ => format!(" - ,", first_year, latest_year),
;
Ok(notice)
Fancy receiving congratulations on the anniversary of when you installed your system?
Installing the installation-birthday package on your Debian machines will celebrate each birthday of your system by automatically sending a message to the local system administrator.
The installation date is based on the system installation time, not the package itself.
installation-birthday is available in Debian 9 ("stretch") via the stretch-backports repository, as well as in the testing and unstable distributions:
$ apt install installation-birthdayEnjoy, and patches welcome. :)
It is my pleasure to announce the renewal/rework/restart of the TeX Live contrib repository service. The repository is collecting packages that cannot enter TeX Live directly (mostly due to license reasons), but are free to distribute. The basic idea is to provide a repository mimicking Debian s nonfree branch.
The packages on this site are not distributed inside TeX Live proper for one or another of the following reasons:
tlmgr repository add http://contrib.texlive.info/current tlcontrib tlmgr pinning add tlcontrib '*'In future there might be releases for certain years. Verification The packages are signed with my GnuPG RSA key: 0x6CACA448860CDC13. tlmgr will automatically verify authenticity if you add my key:
curl -fsSL https://www.preining.info/rsa.asc tlmgr key add -After that tlmgr will tell you about failed authentication of this repository. History Taco Hoekwater started in 2010, but it hasn t seen much activity in recent years. Taco agreed to hand it over to myself, who is currently maintaining the repository. Big thanks to Taco for his long support and cooperation. In contrast to the original tlcontrib page, we don t offer an automatic upload of packages or user registration. If you want to add packages here, see below. Adding packages If you want to see a package included here that cannot enter TeX Live proper, the following ways are possible (from most appreciated to least appreciated):
In a case of blatant self-promotion, I am going to add the Yakking
RSS feed to the Planet Debian aggregation. (But really because I think
some of the readership of Planet Debian may be interested in the
content.)
Yakking is a group blog by a few friends aimed at new free software
contributors. From the front page description:
Welcome to Yakking. This is a blog for topics relevant to someone new to free software development. We assume you are already familiar with computers, and are curious about participating in the production of free software. You don't need to be a programmer: software development requires a wide variety of skills, and you can be a valued core contributor to a project without being a programmer.If anyone objects, please let me know.
apt-get clean apt-get upgrade apt-get --download-only install dpkg:amd64 tar:amd64 apt:amd64 bash:amd64 dash:amd64 init:amd64 dpkg --install /var/cache/apt/archives/*_amd64.deb dpkg --install /var/cache/apt/archives/*_amd64.deb dpkg --print-architecture dpkg --print-foreign-architectures apt-get --fix-broken --allow-remove-essential installThird do a full crossgrade:
apt-get install --allow-remove-essential $(dpkg --list grep :i386 awk ' print $2 ' sed -e s/:i386// )This procedure seams to be a little fragile, but worked most of the time for me.
Next.