For quite some time I was pretty confident that Weblate will need some UI rewrite at some point. This is always problematic thing for me as I'm no way an UI designer and thus I always hope that somebody else will do that. I've anyway spent few hours on train home from LinuxTag to check what I could do with that.
The first choice for me was to try Twitter Bootstrap as I've quite good experience with using that for UI at work, so I hoped it will work quite well for Weblate as well. The first steps went quite nicely, so I could share first screenshots on Twitter and continue to work on that.
After few days, I'm quite happy with basic parts of the interface, though the most important things (eg. the page for translating) are still missing. But I think it's good time to ask for initial feedback on that.
Main motivation was to unite two tab layout used on main pages, which turned out to be quite confusing as most users did not really get into bottom page of the page and thus did not find important functions available there. So all functions are accessible from top page navigation, either directly or being in menu.
I've also decide to use colors a bit more to indicate the important things. So the progress bars are more visible now (and the same progress bar now indicates status of translation per words). The quality checks also got their severity, which in turn is used to highlight the most critical ones. The theme will probably change a bit (so far it's using default theme as I did not care much to change that).
So let's take a look at following screenshot and let me know your thoughts:
You can also try that yourself, everything is developed in the bootstrap branch in our Git repository.
Filed under: English phpMyAdmin SUSE Weblate 4 comments Flattr this!
I've been using Linode since 2010, and many of
my friends have heard me talk about how big a fan I am of linode. I've
used Debian unstable on all my Linodes, since I often use them as a remote
shell for general purpose Debian development. I've found my linodes to be
indispensable, and I really love Linode.
The Problem
Recently, because of my work on Docker, I was forced
to stop using the Linode kernel in favor of the stock Debian kernel, since
the stock Linode kernel has no aufs support, and the default LVM-based
devicemapper backend can be quite a pain.
I tried loading in btrfs support, and
using that to host the Docker instance backed with btrfs, but it was throwing
errors as well. Stuck with unstable backends, I wanted to use the
aufs backend, which, dispite problems in
aufs internally, is quite stable with Docker (and in general).
I started to run through the Linode Library's guide on PV-Grub,
but that resulted in a cryptic error with xen not understanding the compression
of the kernel. I checked for recent changes to the compresson, and lo, the
Debian kernel has been switched to use xz compression in sid. Awesome news,
really. XZ compression is awesome, and I've been super impressed with how
universally we've adopted it in Debian. Keep it up! However, it appears only
a newer pv-grub than the Linode hosts have installed will fix this.
After contacting the (ever friendly) Linode support, they were unable to give
me a timeline on adding xz support, which would entail upgrading pv-grub. It
was quite disapointing news, to be honest. Workarounds were suggested,
but I'm not quite happy with them as proper solutions.
After asking in #debian-kernel, waldi was
able to give me a few pointers, and the following is very inspired by him,
the only thing that changed much was config tweaking, which was easy enough.
Thanks, Bastian!
The Constraints
I wanted to maintain a 100% stock configuration from the kernel up.
When I upgraded my kernel, I wanted to just work. I didn't want to
unpack and repack the kernel, and I didn't want to install software
outside main on my system. It had to be 100% Debian and unmodified.
The Solution
Left unable to run my own kernel directly in the Linode interface, the tact
here was to use Linode's old pv-grub to chain-load grub-xen, which loaded
a modern kernel. Turns out this works great.
Let's start by creating a config for Linode's pv-grub to read
and use.
sudo mkdir -p /boot/grub/
grub-xen (which is just Grub 2.0, as far as I can
tell) to /boot/grub/menu.lst. And to think, I almost forgot all about
menu.lst. Almost.
default 1
timeout 3
title grub-xen shim
root (hd0)
kernel /boot/xen-shim
boot
sudo apt-get install grub-xen
sudo update-grub
/boot/load.cf file:
configfile (xen/xvda)/boot/grub/grub.cfg
/boot/xen-shim file that we need
to boot to:
grub-mkimage --prefix '(xen/xvda)/boot/grub' -c /boot/load.cf -O x86_64-xen /usr/lib/grub/x86_64-xen/*.mod > /boot/xen-shim
pv-grub, and give the machine
a kick. Should work great! If you run into issues, use the lish shell to
debug it, and let me know what else I should include in this post!
Hack on!
This is the second post in a series of posts describing a secure alternative to applications like WhatsApp. I started with the following statement:
I believe it is possible to build a system with the simplicity and functionality of WhatsApp or Viber, which provides end-to-end encryption, is built on free software and open protocols, that supports federation and is almost decentralised, and that would allow interested companies to turn a profit without compromising any of these principles.In this post, I will outline the concepts behind the most critical component of the architecture: the directory service.
So I ve configured voice service a number of times, but never using Cisco equipment. There s a business starting up here on Orcas Island and they need a number of lines voice and fax service. I had a spare 2801 router laying around and heard that it s possible to provision voice service using these machines. So I looked on eBay for a module that will provide more than two FXS ports and decided on the VIC-4FXS. When it was delivered, I installed it and booted the router. It told me that it needed a PVDM DSP Module, so I got one of those as well. It has arrived. I have installed it. Now when I boot the router, I don t get a warning or an error.
configure the router to send outbound calls to the SIP server
configure the router to send inbound calls to FXS ports 2,3,4 in round robin
trunk group FXSlines ! voice-port 0/2/1 trunk-group FXSlines ! voice-port 0/2/2 trunk-group FXSlines ! voice-port 0/2/3 trunk-group FXSlinesconfigure the router to send inbound calls to the correct ports on the VIC-4FXS
dial-peer voice 1 pots preference 7 destination-pattern 3602987792 translate-outgoing called 10 port 0/2/0 forward-digits all ! dial-peer voice 2 pots preference 2 destination-pattern 3602987793 translate-outgoing called 10 port 0/2/1 forward-digits all ! dial-peer voice 3 pots preference 3 destination-pattern 3602987794 translate-outgoing called 10 port 0/2/2 forward-digits all ! dial-peer voice 4 pots preference 4 destination-pattern 3602987795 translate-outgoing called 10 port 0/2/3 forward-digits allconfigure the router to accept inbound calls from the asterisk call server
voice service voip allow-connections sip to sip no supplementary-service sip moved-temporarily no supplementary-service sip refer fax protocol t38 ls-redundancy 0 hs-redundancy 0 fallback cisco sip registrar server expires max 3600 min 3600 localhost dns:8.8.8.8configure the asterisk call server to send inbound calls to the router On asterisk call server, edit sip.conf to register with SIP server on cisco router at 172.16.78.209:
[fhvoice] type=peer insecure=port,invite context=fhvoice disallow=all allow=ulaw language=en canreinvite=no host=172.16.78.209 qualify=20000 dtmfmode=rfc2833On asterisk call server, edit extensions.conf and add extensions to the incoming context:
exten => 3602987792,1,Dial(SIP/fhvoice/$ EXTEN ,30) same => n,Hangup() exten => 3602987793,1,Dial(SIP/fhvoice/$ EXTEN ,30) same => n,Hangup() exten => 3602987794,1,Dial(SIP/fhvoice/$ EXTEN ,30) same => n,Hangup() exten => 3602987795,1,Dial(SIP/fhvoice/$ EXTEN ,30) same => n,Hangup()configure the asterisk call server to accept outbound calls from the router
I ve been searching for interesting ways to manipulate RDF graphs in Python, to create an application that would handle Linked Data Resources in an OO-way, i.e. using Python classes and not tables/sets/lists of triples. The data will be persisted in graphs in a triple store, accessed through a SPARQL enpoint.
In this post, I ll illustrate how I managed to tie RDFLib s SPARQLStore plugin and RDFAlchemy to reach a rather nice looking result.
(predicate, object) tuples.
Here comes the second tool, RDFAlchemy, which allows to create descriptor classes mapping RDF Resources to Python classes. Here again, there isn t much docs available, but I found the excellent tutorial by Ted Lawless Reading and writing RDF for VIVO with RDFAlchemy.
Now we can put the 2 pieces together, modulo a few precautions : the SPARQLStore plugin of RDFLib will generate SPARQL queries everytime a graph is navigated, whereas RDFAlchemy expects the graph to be in memory (at least AFAIU). So we ll have to manually pre-load the contents of the graphs that we need for all the attributes of the descriptor classes.
I ve written an example code that illustrates this by trying to query french films in Wikipedia. Here s a copy of the gist. Attention, it will query DBPedia a lot, so pay attention to the bandwidth and memory if you change parameters.
It isn t perfect, and I still need to investigate benefits and limitations of the approach. On clear limitation is the number of SPARQL queries made on the endpoint, instead of a smarter pre-loading.
Also, on a side note, during tests I could spot a few issues with SPARQLStore, which seems lagging behind probably not used by so many people. The RDFAlchemy project doesn t seem to be in great health, mostly unmaintained from what I can see (and notice that I linked to the GitHub clone/fork that seemed to be the latest maintained while the original author s seems dead), but nevertheless, the code works with a more recent RDFLib, so that s not so bad.
Stay tuned for more adventures in Linked Data land in Python.
I wrote my own init. I didn't mean to, and in the end, it took 2 lines of
code. Here's how.
Propellor has the nice feature of
supporting provisioning of Docker containers. Since Docker normally runs
just one command inside the container, I made the command that docker
runs be propellor, which runs inside the container and takes care of
provisioning it according to its configuration.
For example, here's a real live configuration of a container:
-- Exhibit: kite's 90's website.
, standardContainer "ancient-kitenet" Stable "amd64"
& Docker.publish "1994:80"
& Apt.serviceInstalledRunning "apache2"
& Git.cloned "root" "git://kitenet-net.branchable.com/" "/var/www"
(Just "remotes/origin/old-kitenet.net")
void $ async $ job reapzombies
where
reapzombies = void $ getAnyProcessStatus True False
systemctl status.
If that does happen, perhaps I'll eventually be able to remove 2 lines of code
from propellor.
Today I released version 0.25 of my console mail client, which is a release focussed upon portability (DragonFly BSD, and MacOSX specifically).
Over the past couple of weeks I've written a fair bit of code, wondering if I want to make the jump to a graphical email client, but the conclusion for the moment has to be no.
With the scripting support built into my client, and even before then using the hooks/hacks that mutt supported, I just process mail so much more quickly than via a GUI system.
I also benefit from reading the mail on the host to which it is delivered - mail gets filtered by something like procmail, and I read it in-situa. IMAP is available if I travel, but I rarely do so.
Having a GUI client might be fun, but it would mean I'd read mail on my desktop - pretty much the only system I don't backup (except for images, videos, and local media). It would also involve running imapsync, or similar, to pull the mail in, and relaying through the remote server to avoid my ISPs poor IP-reputation.
In short I believe if I use a GUI client I'll get slower, and I'll still need the remote host regardless.
It was this time last year when I thought it was functional, but now it is functional, battle-tested, and reliable.
So I guess I'm done with email for the next few years. Maybe in that time somebody will write something better - console based for preference, GUI as a last resort, and certainly not another webmail client.
In other news ..
I had a fun interview on Monday, it went well until they admitted they couldn't afford me - so their goal is to pay a junior member a small salary and hope to get somebody senior to work part-time for a similarly minimal salary. Might work for somebody else, but it wouldn't for me right now, so on that basis I declined.
The most annoying thing about interviewing is the waiting, between the early flirting about duties and expectations, to scheduling meetings, and then awaiting decisions.
On that note I'm half-way through building a new desk which is a nice physical job I can really concentrate upon. I'm currently waiting for the stain to dry on the legs, and then I'll get the damn thing finished. It probably looks more "rustic" than "modern", but it smells nice, so that's the main thing ;)
Expect pictures when it is finished.
Did I get your attention with the title? Good. In this post I will outline something that I have been thinking about for some months:
I believe it is possible to build a system with the simplicity and functionality of WhatsApp or Viber, which provides end-to-end encryption, is built on free software and open protocols, that supports federation and is almost decentralised, and that would allow interested companies to turn a profit without compromising any of these principles.
I have just tagged Obnam (my backup program) 1.8 in git, and built and
uploaded Debian packages to code.liw.fi and Debian unstable. NEWS
snippet below.
Version 1.8, released 2014-05-13
obnam force-lock now works even when the client running it is not
in the client list.obnam restore: restored files would
be created with quite liberal default permissions, which would be
set to the backed-up permissions later. This could allow a snooper
to read files they shouldn't be. This has been fixed now by using
restrictive default permissions. A workaround for older versions is
to create a directory, set its permissions to 0700, and restore to a
subdirectory of that directory.--help output no longer shows the default value of any options. It
was shown only for a few options anyway. The proper way to see the
current settings is with the --dump-config option. The bug that
was fixed that the generated manual page no longer contains values
that are specific to the machine doing the generation, such as the
hostname as the default value for --client-name. Reported by
SanskritFritz.--exclude,
Obnam wouldn't remove it from the new backups. Now it does. Bug
fixed by Anssi Hannula, though his patch got changed because it no
longer applied.user.foo) Obnam now ignores them, instead of trying to
set them and crashing.syslog or none, if the
setting --log=none or --log=syslog is used.
Endlich tut mal jemand was gegen die
rechte Hetzpartei! Ein Arbeitskollege fragt, ob man die nicht
einfach mit einem langen Heckenschneider abmachen kann aber sie so
l cherlich zu machen hat auch was
Finally, someone is doing something against this Nazi party! A coworker wondered whether it s legal to cut them off with a long tool, but making them ridiculous like this is also funny
(Explanation: the Pro NRW people put their campaign thingies (sorry, I don t speak English well) up on lamp posts very high, because they are taken down by other citizens immediately otherwise, so there s now people making fun of them for using long ladders (to put them up there, so the offended citizens need equally long ladders or tools with long arms) in leaning on the saying that lies have long legs here: ladders.)
Recently I've been seeing lot of posts about DNSSEC on Internet and I
thought I should configure my domain to be secured by DNSSEC.
copyninja.info domain is now secured with DNSSEC you can verify
this by DNSSEC analyzer by Verisign and DNSViz online tool or by
installing DNSSEC validator addon for
your browser.
There are good amount of tutorials and guides available to enable
DNSSEC for your domain, still I want to note down steps I followed to
here for the record (of course it will be helpful for me if I forget
it ;-))
First step will be installing bind9 and dnssec-tools package, if
you use aptitude installing dnssec-tools will pull down the bind9
unless you have configured aptitude to not install the Recommends.
Next setting up the zone file for your domain, for this first make a
copy of /etc/bind/db.local as /etc/bind/db.example.com, replace
example.com with your domain name. Now you need to add your zone
records to the zone file.
Next edit the /etc/bind/named.conf.local file and add following lines
zone "example.com"
type master;
file "/etc/bind/db.copyninja.info";
allow-transfer secondary; ;
;
Here replace secondary with your secondary DNS servers, if you don't
have one you can ommit this but its always recommended to have
secondary DNS servers for a zone, in cases when primary fails. After
this we need to enable DNSSEC on bind, this is done by editing the
file /etc/bind/named.conf.options. Add following lines into
options section.
dnssec-validation yes; dnssec-enable yes; dnssec-lookaside auto;A more explanation on this can be found on Linux Journal article. Now its time to create DNSSEC keys and sign your zone, more about different DNSSEC keys and records can be found in the Linux Journal Article on implementation. I used zonesigner utility from dnssec-tools which does job of signing and including KSK and ZSK keys into bind configuration which otherwise should be done manually. Here is the command line I used for generating keys, thanks to Jonas for this.
mkdir -p /etc/bind/keys zonesigner -algorithm RSASHA256 -keydirectory /etc/bind/keys\ -dsdir /etc/bind/keys -archivedir /etc/bind/keys/archive \ /etc/bind/db.example.comHere we store our keys into /etc/bind/keys directory, and use RSASHA256 algorithm for key generation which is more stronger than the default used RSASHA1 (atleast thats what Jonas told me). This will create ZSK and KSK for the signing zone and creates a signed zone file db.example.com.signed in same directory as original zone file. Now all you need to do is replace the zone file from db.example.com to db.example.com.signed in file directive with your named.conf.local file.
Note that this keys expire after 30 days so you need to resign your zone before 30 days. For resigning just run zonesigner from /etc/bind/keys. You can setup cron job to do this periodically.
zonesigner -zone example.com /path/to/db.example.comOur signed zone is ready but we are not done yet! For DNSSEC to work others should trust your signed record for this you need to register your public keys with registrar for your domain and this can be done via your domain provider (in my case this is Gandi). You need to check your domain name providers documentation on how to do this. For Gandi users there is a nice documentation.
Using % ?_smp_flags can speed up your build a lot.Above RPM macro enables SMP, use all CPU cores to build package and it looks good. We can easily buy multi core processor machine nowadays even if it is cheapest laptop.
So I was needing a resulting JSON array with possible solutions for a given address or city name and then angular-geocomplete was made.
The great thing is that you can use it together with typeahead and now you have address/location autocomplete, just like the one on Google Maps.
And yes, it does uses Google Maps's API.
What's the advantage of this thing? You get coordinates together with all the names.
Installable via bower as well with bower install angular-geocomplete.
Any issue: to the GitHub tracker.
This is an updated version of an
earlier post in March.
A number of talks about Rcpp are scheduled
over the next couple of months:
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
Oracle has demonstrated that implementing an API is effectively the same as copying code from a program. To me, as a non-lawyer programmer, this surprising court decision seems to mutate copyrights into a kind of Software-Patent-Lite(tm) without the benefit of examiners or a 15 year term limit. This seems like a chilling new tool for deep pockets companies like Oracle to go about tormenting people. Thinking more deeply, however, you begin to wonder if Oracle hasn t inadvertently created some kind of Free Software Doomsday weapon.
After all, if simply implementing an API makes you code a derivative work then doesn t that mean the terms of the GPL will apply on any code that implements the API of a GPL d system? Even if you didn t copy code you have implemented that API and according to Oracle that s a derived work. If you ask me, its the most excitingly vauge and contagious information phenomena since the Open Data Base License.
The aaddition of lambdas in C++11 has greatly improved the flexibility
of the language as a whole. C++14 will add a few more abilities.
C++ Truths has a very nice and brief overview of what C++14 will
allow. Part 1 goes from the very basics via closures to a small
demonstration of partial function application. And Part 2 continues
by showing recursive lambdas, overloaded lambdas, pattern matching,
in-place parameter pack expansion (neat) and finally even memoisation.
These code examples have been the most inspiring ones I have
seen lately. If you have any interest in C++, go read them.
I had a really productive day today actually working on Debian, as planned
for my Mondays.
I'm still working through my list of packages, trying to get them all
vaguely up to date for jessie. It's mostly just addressing Lintian issues
that mostly revolve around old standards versions, with the occasional new
upstream release. I've also been doing bug triage where the bugs aren't
overwhelming.
Today I made uploads for pssh (a new upstream release),
pymetrics (mostly
just a rebuild), rcs-blame (mostly just a rebuild) and
simpleproxy (mostly
just a rebuild).
I need to revisit simpleproxy, because I'm having problems convincing the
resulting binary to be linked correctly for relro. It's weird, because I'm
doing everything I'm supposed to be doing and I can see all the other
hardening flags being passed in except for this one.
I really like simplifying down debian/rules using dh,
that really makes things readable. You can see the useful stuff without
losing it in all the boilerplate. For some reason I was never a fan of CDBS,
but I'm quite liking dh. I think it's because it's less opaque than
CDBS.
Next.