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.
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.
Here 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.
Our 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.
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.
Oracle won their appeal regarding whether APIs are copyrightable. There'll be ongoing argument about whether Google's use of those APIs is fair use or not, and perhaps an appeal to the Supreme Court, but that's the new status quo. This will doubtless result in arguments over whether Oracle's implementation of Linux APIs in Solaris 10 was a violation of copyright or not (and presumably Google are currently checking whether they own any code that Oracle reimplemented), but that's not what I'm going to talk about today.
Oracle own some code called DTrace (Wikipedia has a good overview here - what it actually does isn't especially relevant) that was originally written as part of Solaris. When Solaris was released under the CDDL, so was DTrace. The CDDL is a file-level copyleft license with some restrictions not present in the GPL - as a result, combining GPLed code with CDDLed code will (in the absence of additional permission grants) result in a work that is under an inconsistent license and cannot legally be distributed.
Oracle wanted to make DTrace available for Linux as part of their Unbreakable Linux product. Integrating it directly into the kernel would obviously cause legal issues, so instead they implemented it as a kernel module. The copyright status of kernel modules is somewhat unclear. The GPL covers derivative works, but the definition of derivative works is a function of copyright law and judges. Making use of explicitly exported API may not be sufficient to constitute a derivative work - on the other hand, it might. This is largely untested in court. Oracle appear to believe that they're legitimate, and so have added just enough in-kernel code (and GPLed) to support DTrace, while keeping the CDDLed core of DTrace separate.
The kernel actually has two levels of exposed (non-userspace) API - those exported via EXPORT_SYMBOL() and those exported via EXPORT_SYMBOL_GPL(). Symbols exported via EXPORT_SYMBOL_GPL() may only be used by modules that claim to be GPLed, with the kernel refusing to load them otherwise. There is no technical limitation on the use of symbols exported via EXPORT_SYMBOL().
(Aside: this should not be interpreted as meaning that modules that only use symbols exported via EXPORT_SYMBOL() will not be considered derivative works. Anything exported via EXPORT_SYMBOL_GPL() is considered by the author to be so fundamental to the kernel that using it would be impossible without creating a derivative work. Using something exported via EXPORT_SYMBOL() may result in the creation of a derivative work. Consult lawyers before attempting to release a non-GPLed Linux kernel module)
DTrace integrates very tightly with the host kernel, and one of the things it needs access to is a high-resolution timer that is guaranteed to monotonically increase. Linux provides one in the form of ktime_get(). Unfortunately for Oracle, ktime_get() is only exported via EXPORT_SYMBOL_GPL(). Attempting to call it directly from the DTrace module would fail.
Oracle work around this in their (GPLed) kernel abstraction code. A function called dtrace_gethrtimer() simply returns the value of ktime_get(). dtrace_gethrtimer() is exported via EXPORT_SYMBOL() and therefore can be called from the DTrace module.
So, in the face of a technical mechanism designed to enforce the author's beliefs about the copyright status of callers of this function, Oracle deliberately circumvent that technical mechanism by simply re-exporting the same function under a new name. It should be emphasised that calling an EXPORT_SYMBOL_GPL() function does not inherently cause the caller to become a derivative work of the kernel - it only represents the original author's opinion of whether it would. You'd still need a court case to find out for sure. But if it turns out that the use of ktime_get() does cause a work to become derivative, Oracle would find it fairly difficult to argue that their infringement was accidental.
Of course, as copyright holders of DTrace, Oracle could solve the problem by dual-licensing DTrace under the GPL as well as the CDDL. The fact that they haven't implies that they think there's enough value in keeping it under an incompatible license to risk losing a copyright infringement suit. This might be just the kind of recklessness that Oracle accused Google of back in their last case.
Crowdsourcing ventures with disruptive business models are a regular point of contention these days.
In London, taxi drivers are threatening to create gridlock as part of an anti-Uber protest. In Melbourne, Uber drivers have been issued with $1,700 fines for operating without a taxi license. San Francisco city officials, despite being the birthplace of many of these ventures, are debating whether AirBNB should be regulated.
An orderly society or an old-school protection racket?
Just what exactly is it that established players in these industries are trying to achieve through their protests and lobbying efforts?
In the case of apartment rentals, many people have sympathy for respecting the wishes of neighbourhoods over those of individual landlords. In the case of car pooling schemes, the arguments tend to come not from motorists at large but from those who are afraid of competition.
Without competition, could things be any worse?
Melbourne actually provides the perfect backdrop for this debate. Only a couple of years before Uber came on the scene, the government had made a detailed study into the taxi industry. One of Australia's most prominent economic experts, a former chairman of the Australian Competition and Consumer Commission spent 18 months studying the industry.
One of the highlights of the incumbent system (and the reason I suggest Melbourne is the perfect backdrop for this debate) is the way licenses are issued to taxi drivers. There are a fixed number of licenses issued by the government. The licenses are traded on the open market so prices can go up and down just like real-estate. Under the rules of Australia's pension scheme, people have even been able to use money from their pension fund to purchase a taxi license as an investment. It goes without saying that this has helped rampant speculation and the price of a license is now comparable to the price of a house.
The end result is that no real taxi driver can afford a license: most of them have to rent their license from one of the speculators who bought the license. These fixed rental fees have to be paid every month whether the driver uses their car or not. Consequently, taxi drivers have cut back on other expenses, they are often criticised for failing to keep their cars clean and the industry as a whole is criticised due to the poor quality of drivers who don't even know their way around the city. The reason, of course, is simple: by the time some newly arrived immigrant has learnt his way around Melbourne he has also figured out that the economics of driving a taxi are not in his favor. Realizing there is no way to break even, they take other jobs instead.
It was originally speculated that the government review would dramatically reduce or abolish these speculative practices but ultimately lower license charges have only been used for the issue of 60 new licenses, barely 1% of the taxi fleet in the city today. Furthermore, the new licenses were only available to existing players in the industry.
Uber to the rescue?
Uber drove into the perfect storm as they launched their service in Melbourne in 2013.
Uber drivers get a significant benefit over their competitors in traditional taxis. In particular, as they don't have the fixed monthly payment to rent a taxi license, they don't have to work every day and can even take holidays or take time to clean the cars. These things may simultaneously benefit road safety and passenger comfort.
Meanwhile, those people who speculated on the old taxi licenses have tried hunger strikes and all kinds of other desperate tactics to defer the inevitable loss of their "investment".
The reality is that crowdsourcing is here to stay. Even if Uber is stopped by bullying and intimidation, the inefficiency of Melbourne's taxi system is plain for all to see and both customers and drivers will continue looking for alternatives. Other car-pooling apps based on barter or cost sharing will continue to find ways to operate even if the Uber model is prohibited.
It is interesting to note that the last great reform of Melbourne taxis, under Premier Jeff Kennett in the 1990s, simply resulted in a change of paint with the aim of making them look like those in New York City. Disruptive services like Uber (with their numerous technology-powered innovations to save time and money) appear to be doing far more to improve the lives of passengers and drivers.
The hidden cost
That said, large scale schemes like Uber do also have a down side for customer privacy. Hailing cabs in the street leaves no records of your movements. This new model, however, is leaving a very detailed trail of breadcrumbs that can be used for both marketing purposes or extracted (lawfully or otherwise) by some third party who wishes to monitor a particular customer's past or future movements. This is the trade-off that arises when we benefit from the efficiencies of any cloud-based service.
Near the end of my internship with Simon Peyton Jones at MSR Cambridge I tackled the problem that foldl is not a good consumer in the sense of list fusion, as the resulting code compiles quite badly. I found an analysis that would allow GHC to safely do the required transformation to fix this in the common case; I dubbed this analysis Call Arity. The code is in GHC master (but not in 7.8), and I get to present at the Trends in Functional Programming conference in Soesterburg in 2 weeks. If you are curious you can either look at the code in CallArity.hs or the submitted paper, which yet has to go through the formal post-conference peer review in order to be officially accepted.
If you are going to TFP as well and want to get your GPG key signed, just talk to me there!
The Linux Security Summit is happening in Chicago August 18th and 19th, just before LinuxCon. Send us some presentation and topic proposals, and join the conversation with other like-minded people. :)
I d love to see what people have been working on, and what they d like to work on. Our general topics will hopefully include:
System hardening
Access control
Cryptography
Integrity control
Hardware security
Networking
Storage
Virtualization
Desktop
Tools
Management
Case studies
Emerging technologies, threats & techniques
The Call For Participation closes June 6th, so you ve got about a month, but earlier is better.
As promised, today I would like to write a bit about the making of
The Hacker's Guide to Python. It has
been a very interesting experimentation, and I think it is worth sharing it
with you.
The inspiration
All started out at the beginning of August 2013. I was spending my summer,
as the rest of the year, hacking on OpenStack.
As years passed, I got more and more deeply involved in the various tools
that we either built or contributed to within the OpenStack community. And I
somehow got the feeling that my experience with Python, the way we used it
inside OpenStack and other applications during these last years was worth
sharing. Worth writing something bigger than a few blog posts.
The OpenStack project is doing code reviews, and therefore so did I for
almost two years. That inspired a lot of topics, like
the definitive guide to method decorators
that I wrote at the time I started the hacker's guide. Stumbling upon the
same mistakes or misunderstanding over and over is, somehow, inspiring.
I also stumbled upon Nathan Barry's blog and book
Authority which were very helpful to
get started and some sort of guideline.
All of that brought me enough ideas to start writing a book about Python
software development for people already familiar with the language.
The writing
The first thing I started to do is to list all the topics I wanted to write
about. The list turned out to have subjects that had no direct interest for
a practical guide. For example, on one hand, very few developers know in
details how metaclasses work, but on the other hand, I never had to write a
metaclass during these last years. That's the kind of subject I decided not
to write about, dropped all subjects that I felt were not going to help my
reader to be more productive. Even if they could be technically interesting.
Then, I gathered all problems I saw during the code reviews I did during
these last two years. Some of them I only recalled in the days following the
beginning of that project. But I kept adding them to the table of contents,
reorganizing stuff as needed.
After a couple of weeks, I had a pretty good overview of the contents that
there I will write about. All I had to do was to fill in the blank (that
sounds so simple now).
The entire writing of the took hundred hours spread from August to November,
during my spare time. I had to stop all my other side projects for that.
The interviews
While writing the book, I tried to parallelize every thing I could. That
included asking people for interviews to be included in the book. I already
had a pretty good list of the people I wanted to feature in the book, so I
took some time as soon as possible to ask them, and send them detailed
questions.
I discovered two categories of interviewees. Some of them were very fast to
answer ( 1 week), and others were much, much slower. A couple of them even
set up Git repositories to answer the questions, because that probably
looked like an entire project to them. :-) So I had to not lose sight and
kindly ask from time to time if everything was alright, and at some point
started to kindly set some deadline.
In the end, the quality of the answers was awesome, and I like to think that
was because I picked the right people!
The proof-reading
Once the book was finished, I somehow needed to have people proof-reading
it. This was probably the hardest part of this experiment. I needed two
different types of reviews: technical reviews, to check that the content was
correct and interesting, and language review. That one is even more
important since English is not my native language.
Finding technical reviewers seemed easy at first, as I had ton of contacts
that I identified as being able to review the book. I started by asking a
few people if they would be comfortable reading a simple chapter and giving
me feedbacks. I started to do that in September: having the writing and the
reviews done in parallel was important to me in order to minimize latency
and the book's release delay.
All people I contacted answered positively that they would be interested in
doing a technical review of a chapter. So I started to send chapters to
them. But in the end, only 20% replied back. And even after that, a large
portion stopped reviewing after a couple of chapters.
Don't get me wrong: you can't be mad at people not wanting to spend their
spare time in book edition like you do.
However, from the few people that gave their time to review a few chapters,
I got tremendous feedback, at all level. That's something that was very
important and that helped a lot getting confident. Writing a book alone for
months without having anyone taking a look upon your shoulder can make you
doubt that you are creating something worth it.
As far as English proof-reading, I went ahead and used
ODesk to recruit a professional proof-reader. I looked
for people with the right skills: a good English level (being a native
English speaker at least), be able to understand what the book was about,
and being able to work with correct delays. I had mixed results from the
people I hired, but I guess that's normal. The only error I made was not to
parallelize those reviews enough, so I probably lost a couple of months on
that.
The toolchain
While writing the book, I did a few breaks to build a toolchain. What I call
a toolchain is set of tools used to render the final PDF, EPUB and MOBI
files of the guide.
After some research, I decided to settle on
AsciiDoc, using the
DocBook output, which is then being transformed to
LaTeX, and then to PDF, or either to EPUB directly. I realy on
Calibre to convert the EPUB file to MOBI. It
took me a few hours to do what I wanted, using some magic LaTeX tricks to
have a proper render, but it was worth it and I'm particularly happy with
the result.
For the cover design, I asked my talented friend
Nicolas to do something for me, and he
designed the wonderful cover and its little snake!
The publishing
Publishing in an interesting topic people kept asking me about. This is what
I had to answer a few dozens of time:
"Who is your editor?"
"Me."
I never had any plan for asking an editor to publish this book. Nowadays,
asking an editor to publish a book feels to me like asking a major company
to publish a CD. It feels awkward.
However, don't get me wrong: there can be a few upsides of having an editor.
They will find reviewers and review your book for you. Having the book
review handled for you is probably a very good thing, considering how it was
hard to me to get that in place. It can be especially important for a
technical book.
Also, your book may end up in brick and mortar stores and be part of a
collection, both improving visibility. That may improve your book's selling,
though the editor and all the intermediaries are going to keep the largest
amount of the money anyway.
"Oh, you will publish it yourself, great. So you will print it and sell it
to people?"
"Not really."
I've heard good stories about people using Gumroad to
sell electronic contents, so after looking for competitors in that market, I
picked them. I also had the idea to sell the book with Bitcoins, so I
settled on Coinbase, because they have a nice API to
do that.
Setting up everything was quite straight-forward, especially with Gumroad.
It only took me a few hours to do so. Writing the Coinbase application took
a few hours too.
"Oh, you will sell it only as an ebook? That's too bad. You need a paper
version. Many people will want a paper version."
My initial plan was to only sell online an electronic version. On the other
hand, since I kept hearing that a printed version should exist, I decided to
give it a try. I chose to work with Lulu because I knew
people using it, and it was pretty simple to set up.
The launch
Once I had everything ready, I built the selling page and connected
everything between Mailchimp, Gumroad, Coinbase, Google Analytics, etc.
Writing the launch email was really exciting. I used Mailchimp feature to
send the launch mail in several batches, just to have some margin in case of
a sudden last minute problem. But everything went fine. Hurrah!
I distributed around 200 copies of the ebook in the first 48 hours, for
about $5000. That covered all the cost I had from the writing the book, and
even more, so I was already pretty happy with the launch.
Retrospective
In retrospect, something that I didn't do the best way possible is probably
to build a solid mailing list of people interested, and to build an
important anticipation and incentive to buy the book at launch date. My
mailing list counted around 1500 people subscribed because they were
interested in the launch of the book subscribed; in the end, probably only
10-15% of them bought the book during the launch, which is probably a bit
lower than what I could expect.
But more than a month later, I distributed in total almost 500 copies of the
book (including physical units) for more than $10000, so I tend to think
that this was a success. I still sell a few copies of the book each weeks,
but the number are small compared to the launch.
I sold less than 10 copies of the ebook using Bitcoins, and I admit I'm a
bit disappointed and surprised about that.
Physical copies represent 10% of the book distribution. It's probably a lot
lower than most people that pushed me to do it thought it would be. But it
is still higher of what I thought it would be. So I still would advise to
have a paperback version of your book. At least because it's nice to have it
in your library.
I only got positive feedbacks, a few typo notices, and absolutely no refund
demand, which I really find amazing.
The good news is also that I've been contacted with a couple of Korean and
Chinese editors to get the book translated and published in those countries.
If everything goes well, the book should be translated in the upcoming
months and be available on these markets in 2015!
If you didn't get a copy,
it's still time to do so!
pub 2048R/9C6C32C7 2014-02-16 Laura ARJONA REINA <larjona99@gmail.com>
Laura ARJONA REINA <larjona@fsfe.org>
Laura ARJONA REINA <laura.arjona@upm.es>
Old key 0xE20474C3 no longer valid: lost secret key. (Clave antigua 0xE20474C4 ya no es v lida: clave secreta perdida.)
Fingerprint=F29B A6D8 D1DC A30F 3E34 53DF 5CD1 FDE5 9C6C 32C7
Please act as if it does not exist. The reason is that I cannot remember the passphrase of my master GPG key. This is why I didn t signed any of the keys of people that I met in Barcelona MiniDebconf. My geek self steem is a bit undermined, but feeling sorry for myself accomplishes nothing, so I think I will not hide problems and move on.
I ll post about my new key soon.
Long version
The bad news
The bad news are many.
I generated my key in February 2014 (I generated my very first GPG Key in 2010, as an exercise, but never used it again, and in 2014 I couldn t remember the passphrase, and the paper where it was written, had got lost before). Anyway, February 2014, new GPG key. I followed the Howto in FSFE wiki in order to use my brand new FSFE SmartCard. I have to admit that I didn t understand very well how all this works, and it seems that my main mistake was to miss-understand that since I was using a smartcard, with a PIN and an Admin PIN, remembering passphrases was no longer required (only remembering the PINs). I was WRONG! PINs are for daily use with the subkeys of your card (for encryption, decryption, and signing stuff different than GPG keys), you still have the master key that is not in the card (but in a separate medium in a safe place), and for the master key we still use passphrase, and the master key is the one that allows signing keys from other people, and changing, revoking, adding subkeys, etc.
So, it seems I used a random passphrase that I didn t write down and I could not remember, due to this terrible missunderstanding.
Another bad news is that I didn t generate a revocation certificate (well in fact, I was going to generate just before signing the first key of another person, and then I realize that it was asking the passphrase, hence the problem). First I thought that it should ask the PIN and my smartcard setup was wrong or anything, but after reading and interchanging emails with other people more experienced than me, I realized that I should remember that passphrase. And I couldn t. So there are no revocation certificates :(
Another bad news is that some (awesome) people already signed my key, and it will be difficult to meet again so they sign my new key. I was thinking about applying to the Debian new member process this summer, and I have not many opportunities to meet Debian people in person, so I gathered quite a lot signs last March in MiniDebConf Barcelona. Now I m again at the starting point (well, this is perfect excuse to try to join a Debian event soon :) I don t know how I would manage to do it, but I ll try!).
The good news (Always look at the bright side of life )
The main good news is that I didn t used the GPG key for signing/encrypting important stuff: I just interchanged some encrypted mail as test with friends, and signed some mails sent to public mailing lists (for signing mails I was using the smartcard PIN so I didn t notiece the problem).
The other main good news is that my key is not compromised (well, you can never be sure, but I think so). I cannot revoke it but I m quite sure nothing important depends on that key.
Other good news is that I have read a lot about how GPG works and how the smartcard works, keys and subkeys and all this stuff, and I think now I understand everything quite better. I have learned (and also tried) tools as nasty, John The Ripper and rephrase to try to recover the passphrase. I didn t recover it, but at least I know that all those (free software) tools exist and how to use them :)
And I have learned the lesson: to be extremely careful, test that everything works (not just try one or two things, test everything) and to not leave work for later (and for example, generate the revocation certificates just right after the keys).
Next steps
I ll send a message to all the friends that signed or downloaded my old GPG key apologysing and pointing to this blog post so they learn the details about why I create a new key.
I ll take this opportunity to download and use the Tails (The Agnostic Incognito System, a Debian derivative which is a live system and is focused in protecting privacy and anonymity of the user). Tails will be my safe, network disconnected environment to generate the new keys and do the sensible tasks with them. I think this time I will create my main key 4096-bit long (since now I understand that the main key is not stored in the card) and the subkeys can be 2048-bit or 3072 to fit in the smarcard.
Well, hands on! I ll write another blog post when my new GPG keys are ready. I hope third time s the charm!
Note: Thank you to all the people that gave me advice and support (knowledge, links, moral support) about this issue. You know who you are! Filed under: My experiences and opinion, Tools Tagged: Debian, encryption, English, Free Software, gpg, libre software, Moving into free software, mswl-cases
I have been looking for an App like this since I got my first iOS device in
december 2011. Finally, it is here! A single-player (bot-driven) poker
app for iOS, THETA Poker Pro, fully accessible and usable with VoiceOver.
AppleVis has a review.
It doesn't happen very often, but App programmers in the iOS Universe
do indeed sometimes think about Accessibility support, and the APIs
provided by Apple are useful enough to allow programmers to write
very accessible apps. You can say about Apple whatever you want,
currently, it is the company providing the best accessibility support on the market.
Why? Because they made accessibility a first-class citizen of their platform(s).
This is where policy helps. If you can dictate top-down that
you support people with disabilities, things actually
start to happen. If you have to ask, hope, and wait, like it is with
free software, things do not really progress as fast as the users need it.
Back to THETA Poker Pro: The default configuration is already very useable with VoiceOver.
However, if you want the cards placed on the board announced to you, so that
you do not have to discover them manually by touch, you can enable the
"Card Announcement" item in the Options menu. You can also set message delay
a bit slower, such that all messages are actually fully spoken and not cut off sometimes.
With these two settings adjusted, and maybe "Animation" set to "Very fast",
the game feels extremely nice. There is actually nothing I would
want to change, which does not happen very often when I test
a program for its accessibility.
With these settings changed, game play is very smooth with VoiceOver, you basically
just have to tap your cards to check, tap the deck to fold, or tap
your chips to raise. Very simple, and these three "buttons" are on
the bottom of the screen, so rather easy and quick to find.
All other activity is automatically announced by VoiceOver.
I have played a few hundred hands already with this App. It is a wonderful
way to pass time. For instance, I don't like to go to my
doctor, because I usually wait up to two or three hours. I had to pay
her a visit on monday. While waiting, I played "a few" hands, and
suddenly, I was already called in. When I came out again, I checked the
time and was rather surprised that yes, I have waited two hours again,
but this time, I didn't notice! :-)
Special thanks go to the author(s) of this app.
It is a good example of an App that was not specially made for the blind,
but which feels like it was. Thanks, you've made my week!
A small rant
OTOH, it makes me sad when I think about my beloved Linux platform and GUI accessibility.
We are stuck since 2004 with a bit of desktop support + a half-working
Firefox. During the D-Bus rewrite, quality of GUI accessibility
has dropped so much that I had to take time off from linux
gui accessibility to stay sane. It is back to where it was in 2006, yay,
but we haven't made a lot of real progress in the last 8 years.
Granted, firefox has improved, but to my taste, not enough.
I still do all my email, shell work, programming and some other things on Linux of course,
but I notice that I do more and more casual stuff
on iOS, it is just sooo much more useable. I do almost all my
surfing with mobile safari, because it just works. Firefox works sometimes, and
some other times working with it feels so slow that I am actually getting
angry.
The scratch-your-own-itch philosophy combined with a very small margin group is
poison for success. We'd need much more funding, and people working
actively on this stuff as their day job, if we ever want to
be competitive with existing solutions.
The recent flurry of activity with neovim have made me wonder if there could be something similar for the other editor, emacs.
If you poke around recent GNU Emacs releases you'll come across random signs that the code carries a lot of baggage:
/usr/share/emacs/23.4/etc/MACHINES
There are special considerations for a variety of this system which
is known as the Yellow Dog [GNU/]Linux'
Yellow Dog [GNU/]Linux has been dead for many years now.
/etc/emacs/site-start.d/50dictionaries-common.el
Contains references to skipping stuff that runs under Emacs 19, 20, 21, & 22.
None of these are huge things, and the core code of Emacs is a pleasure to read in many places, but it does make you think, or not, whichever the case may be it is all good :)
(I do all "real work" in emacs. I write all outgoing emails in vim, and use it for git/mercurial commit messsages, otherwise the only time I use it is for random one-line edits over slow links.)
A new release 4.300 of Armadillo, the templated C++
library for linear algebra, was released by Conrad a few days ago.
As usual, this was rolled up in a new
RcppArmadillo
release 0.4.300.0 which is now on CRAN and in
Debian.
This release brings nice new upstream changes such as faster
find() as well as corresponding functions to find elements which
are either finite or non-finite, based on a suggestion we made. This may
need an RcppArmadillo specific
extension as R extends the IEEE logic to supported NA,
NaN and Inf on floating point variables whereas
standard C++ (and hence Armadillo)
only supports the latter two. We hope to work on this shortly.
Kevin also put in some code to make sure unsigned int vectors
and matrices are converted correctly, and I updated the short configure
script checking for complete LAPACK support to account for the R 3.0.3 or
later case.
Changes in RcppArmadillo version 0.4.300.0 (2014-05-04)
Upgraded to Armadillo release Version 4.300 (Medieval Cornea Scraper)
faster find()
added find_finite() and find_nonfinite() for finding indices of finite and non-finite elements
expressions X=inv(A)*B*C and X=A.i()*B*C are automatically converted to X=solve(A,B*C)
Corrected conversion to unsigned int vectors and matrices
Configure script now checks for R version 3.0.3 or newer to enable complex divide-and-conquer SVD in case of R-supplied LAPACK
Dashkiosk is a solution to manage dashboards on multiple
displays. It comes in four parts:
A server will manage the screens by sending URL to be
displayed. A web interface enables an administrator to configure
groups of dashboards and attach them to a set of displays.
A receiver runs in a browser attached to each screen. On
start, it contacts the server and waits for the URL to display.
An Android application provides a simple fullscreen webview to
display the receiver.
A Chromecast custom receiver which will run the regular
receiver to display dashboards using Google Chromecast
devices. The server is able to drive Chromecast devices through
nodecastor, a reimplementation of the sender API.
For a demo, have a look at the following video (it is also available
as an Ogg Theora video).
I was invited to give a talk at a local conference, OS-UPIITA. I have been invited to this conference before, and will gladly be there again. But I was recently pointed at the invitation poster they are distributing (which I reproduce here for your convenience) And I must make a couple of corrections here:
First and foremost: I don't want to trick anybody. I am not the Director of Debian Mexico. In fact, Debian Mexico does not exist. I am just a humble Debian Developer.
I accept the conference title, because that's what they requested from me. I'm trying to come up with a coherent exposition, but whoever knows me must be perfectly aware that I don't know (nor really care about) how to make money with Free Software. I have lived all of my professional life thanks to Free Software, but I'm against the entrepenurial culture. I will talk about my vision, of course, so if you want to hear me rant, you are invited to join us ;-)
I specifically asked the organizing committee by mid-April, when they gave me the talk title, to replace "Open Source" with "Free Software" in my talk. Even though the conference is called "OS UPIITA" (as it is the Open Source conference in the UPIITA unit of Instituto Polit cnico Nacional), I cannot identify with the Open Source monkier. And if we are talking about a deeply ideological issue, which is the case here, I request to use the name I can relate with. For my talk only, of course.
</rant>
But anyway, I will be very happy to be there, and believe me, am working to come up with a good talk.
OS-UPIITA friends: Please correct your online banners carrying this wrong data.
[update] OS-UPIITA changed the poster! I'm just keeping this one for the memory ;-)
[update 2] I was there, and gave the talk. And it was even a success, yay! \o/ Care to see it? Here is the presented material.
Just saw http://sny.no/2014/04/dbts and I feel compelled to note that distributed bug trackers are not new the earliest I personally encountered was Aaron Bentley s Bugs everywhere coming up on it s 10th birthday. BE meets many of the criteria in the dbts post I read earlier today, but it hasn t taken over the world and I think this is in large part due to the propogation nature of bugs being very different to code different solutions are needed.
XXXX: With distributed code versioning we often see people going to some effort to avoid conflicts semantic conflicts are common, and representation conflicts extremely common.The idions
Take for example https://bugs.launchpad.net/ubuntu/+source/ntp/+bug/805661. Here we can look at the nature of the content:
Concurrent cannot-conflict content e.g. the discussion about the bug. In general everyone should have this in their local bug database as soon as possible, and anyone can write to it.
Observations of fact e.g. the code change that should fix the bug has landed in Ubuntu or Commit C should fix the bug .
Reports of symptoms e.g. Foo does not work for me in Ubuntu with package versions X, Y and Z .
Collaboratively edited metadata tags, title, description, and arguably even the fields like package, open/closed, importance.
Note that only one of these things the commit to fix the bug happens in the same code tree as the code; and that the commit fixing it may be delayed by many things before the fix is available to users. Also note that conceptually conflicts can happen in any of those fields except 1).
Anyhow my humble suggestion for tackling the conflicts angle is to treat all changes to a bug as events in a timeline e.g. adding a tag foo is an event to add foo , rather than an event setting the tags list to bar,foo then multiple editors adding foo do not conflict (or need special handling). Collaboratively edited fields would be likely be unsatisfying with this approach though last-writer-wins isn t a great story. OTOH the number of people that edit the collaborative fields on any given bug tend to be quite low so one could defer that to manual fixups.
Further, as a developer wanting local access to my bug database, syncing all of these things is appealing but if I m dealing with a million-bug bug database, I may actually need the ability to filter what I sync or do not sync with some care. Even if I want everything, query performance on such a database is crucial for usability (something git demonstrated convincingly in the VCS space).
Lastly, I don t think distributed bug tracking is needed it doesn t solve a deeply burning use case offline access would be a 90% solution for most people. What does need rethinking is the hugely manual process most bug systems use today. Making tools like whoopsie-daisy widely available is much more interesting (and that may require distributed underpinnings to work well and securely). Automatic collation of distinct reports and surfacing the most commonly experienced faults to developers offers a path to evidence based assessment of quality something I think we badly need.
It doesn t look like the Debian PowerPC bootloader, yaboot can deal with the root filesystem on an lvm on a raid. *sigh* There goes six hours of my life.
If you're looking to get started at packaging free software for
Debian, you should start with the excellent
New Maintainers' Guide or
the
Introduction to Debian Packaging
on the Debian wiki.
Once you know the basics, or if you prefer to learn by example, you may be
interested in the full walkthrough which follows. We will look at the
contents of three simple packages.
node-libravatar
This package is a
node.js library for the
Libravatar service.
Version 2.0.0-3
of that package contains the following files in its debian/ directory:
changelog
compat
control
copyright
docs
node-libravatar.install
rules
source/format
watch
debian/control
Source: node-libravatar
Priority: extra
Maintainer: Francois Marier <francois@debian.org>
Build-Depends: debhelper (>= 9)
Standards-Version: 3.9.4
Section: web
Homepage: https://github.com/fmarier/node-libravatar
Vcs-Git: git://git.debian.org/collab-maint/node-libravatar.git
Vcs-Browser: http://git.debian.org/?p=collab-maint/node-libravatar.git;a=summary
Package: node-libravatar
Architecture: all
Depends: $ shlibs:Depends , $ misc:Depends , nodejs
Description: libravatar library for NodeJS
This library allows web application authors to make use of the free Libravatar
service (https://www.libravatar.org). This service hosts avatar images for
users and allows other sites to look them up using email addresses.
.
node-libravatar includes full support for federated avatar servers.
This is probably the most important file since it contains the bulk of the
metadata about this package.
Maintainer is a required field listing the maintainer of that package,
which can be a person or a team. It only contains a single value though, any
co-maintainers will be listed under the optional Uploaders field.
Build-Depends lists the packages which are needed to build the
package (e.g. a compiler), as opposed to those which are needed to
install the binary package (e.g. a library it uses).
Standards-Version refers to the version of the
Debian Policy that this package
complies with.
The Homepage field refers to the upstream homepage, whereas the
Vcs-* fields point to the repository where the packaging is stored. If
you take a look at the
node-libravatar packaging repository
you will see that it contains three branches:
upstream is the source as it was in the tarball downloaded from
upstream.
master is the upstream branch along with all of the Debian
customizations.
pristine-tar is unrelated to the other two branches and is used by the
pristine-tar tool
to reconstitute the original upstream tarball as needed.
After these fields comes a new section which starts with a Package
field. This is the definition of a binary package, not to be confused
with the Source field at the top of this file, which refers to the name of
the source package. In this particular example, they are both the same
and there is only one of each, however this is not always the case, as we'll
see later.
Inside that binary package definition, lives the Architecture field which
is normally one of these two:
all for a binary package that will work on all architectures but only
needs to be built once
any for a binary package that will work everywhere but that will need to
be built separately for each architecture
Finally, the last field worth pointing out is the Depends field which
lists all of the runtime dependencies that the binary package has. This is
what will be pulled in by apt-get when you apt-get install
node-libravatar. The two variables will be substituted later by debhelper.
debian/changelog
node-libravatar (2.0.0-3) unstable; urgency=low
* debian/watch: poll github directly
* Bump Standards-Version up to 3.9.4
-- Francois Marier <francois@debian.org> Mon, 20 May 2013 12:07:49 +1200
node-libravatar (2.0.0-2) unstable; urgency=low
* More precise license tag and upstream contact in debian/copyright
-- Francois Marier <francois@debian.org> Tue, 29 May 2012 22:51:03 +1200
node-libravatar (2.0.0-1) unstable; urgency=low
* New upstream release
- new non-backward-compatible API
-- Francois Marier <francois@debian.org> Mon, 07 May 2012 14:54:19 +1200
node-libravatar (1.1.1-1) unstable; urgency=low
* Initial release (Closes: #661771)
-- Francois Marier <francois@debian.org> Fri, 02 Mar 2012 15:29:57 +1300
This may seem at first like a mundane file, but it is very important since
it is the canonical source of the package version (2.0.0-3 in this
case). This is the only place where you need to bump the package version
when uploading a new package to the Debian archive.
The first line also includes the
distribution
where the package will be uploaded. It is usually one of these values:
stable-security for security fixes to the stable version of Debian that
cannot wait until the next stable point release and have been
approved by the security team
Packages uploaded to unstable will migrate automatically to testing
provided that a few conditions are met (e.g. no release-critical bugs were
introduced). The length of time before that migration is influenced by the
urgency field (low, medium or high) in the changelog entry.
Another thing worth noting is that the first upload normally needs to close
an ITP (Intent to Package) bug.
As can be gathered from the first two lines of this file, this is a
Makefile. This
is what controls how the package is built.
There's not much to see and that's because most of its content is
automatically added by debhelper. So
let's look at it in action by building the package:
$ git buildpackage -us -uc
and then looking at parts of the build log (../node-libravatar_2.0.0-3_amd64.build):
One of the first things we see is the debian/rules file being run with the
clean target. To find out what that does, have a look at the
dh_auto_clean
which states that it will attempt to delete build residues and run something
like make clean using the upstream Makefile.
Next we see the build target being invoked and looking at
dh_auto_configure
we see that this will essentially run ./configure and its
equivalents.
The
dh_auto_build
helper script then takes care of running make (or equivalent) on the
upstream code.
This should be familiar to anybody who has ever built a piece of free
software from scratch and has encountered the usual method for building
from source:
./configure
make
make install
Finally, we get to actually build the .deb:
fakeroot debian/rules binary
dh binary
dh_testroot
dh_prep
dh_installdirs
dh_auto_install
dh_install
...
dh_md5sums
dh_builddeb
dpkg-deb: building package node-libravatar' in ../node-libravatar_2.0.0-3_all.deb'.
Here we see a number of helpers, including
dh_auto_install
which takes care of running make install.
Going back to the debian/rules, we notice that there is manually defined
target at the bottom of the file:
override_dh_auto_test:
which essentially disables
dh_auto_test
by replacing it with an empty set of commands.
The reason for this becomes clear when we take a look at the test target
of the upstream Makefile and the
dependencies
it has: tap, a node.js library that is
not yet available in Debian.
In other words, we can't run the test suite on the build machines so we need
to disable it here.
debian/compat
9
This file simply specifies the version of debhelper that is required by the
various helpers used in debian/rules. Version 9 is the latest at the moment.
debian/copyright
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: node-libravatar
Upstream-Contact: Francois Marier <francois@libravatar.org>
Source: https://github.com/fmarier/node-libravatar
Files: *
Copyright: 2011 Francois Marier <francois@libravatar.org>
License: Expat
Files: debian/*
Copyright: 2012 Francois Marier <francois@debian.org>
License: Expat
License: Expat
Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to the following
conditions:
.
The above copyright notice and this permission notice shall be included in all copies
or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
This machine-readable file lists all of the different licenses encountered in this
package.
It requires that the maintainer audits the upstream code for any copyright
statements that might be present in addition to the license of the package
as a whole.
debian/docs
README.md
This file contains a list of upstream files that will be copied into the
/usr/share/doc/node-libravatar/ directory by dh_installdocs.
debian/node-libravatar.install
lib/* usr/lib/nodejs/
The install file is used by
dh_install
to supplement the work done by dh_auto_install which, as we have seen
earlier, essentially just runs make install on the upstream Makefile.
Looking at that
upstream Makefile,
it becomes clear that the files will need to be installed manually by the
Debian package since that Makefile doesn't have an install target.
This is the file that allows Debian tools like the
Package Tracking System
to automatically detect that a new upstream version is available.
What it does is simply visit the
upstream page which contains all of the
release tarballs and look
for links which have an
href
matching the above regular expression.
Running uscan --report --verbose will show us all of the tarballs that can
be automatically discovered using this watch file:
-- Scanning for watchfiles in .
-- Found watchfile in ./debian
-- In debian/watch, processing watchfile line:
https://github.com/fmarier/node-libravatar/tags /fmarier/node-libravatar/archive/node-libravatar-([0-9.]+)\.tar\.gz
-- Found the following matching hrefs:
/fmarier/node-libravatar/archive/node-libravatar-2.0.0.tar.gz
/fmarier/node-libravatar/archive/node-libravatar-1.1.1.tar.gz
/fmarier/node-libravatar/archive/node-libravatar-1.1.0.tar.gz
/fmarier/node-libravatar/archive/node-libravatar-1.0.1.tar.gz
/fmarier/node-libravatar/archive/node-libravatar-1.0.0.tar.gz
Newest version on remote site is 2.0.0, local version is 2.0.0
=> Package is up to date
-- Scan finished
pylibravatar
This second package is the
equivalent Python library for the Libravatar service.
Version 1.6-2
of that package contains similar files in its debian/ directory, but let's
look at two in particular:
control
upstream/signing-key.asc
debian/control
Source: pylibravatar
Section: python
Priority: optional
Maintainer: Francois Marier <francois@debian.org>
Build-Depends: debhelper (>= 9), python-all, python3-all
Standards-Version: 3.9.5
Homepage: https://launchpad.net/pyLibravatar
...
Package: python-libravatar
Architecture: all
Depends: $ misc:Depends , $ python:Depends , python-dns, python
Description: Libravatar module for Python 2
Module to make use of the federated Libravatar.org avatar hosting service
from within Python applications.
...
Package: python3-libravatar
Architecture: all
Depends: $ misc:Depends , $ python3:Depends , python3-dns, python3
Description: Libravatar module for Python 3
Module to make use of the federated Libravatar.org avatar hosting service
from within Python applications.
...
Here is an example of a source package (pylibravatar) which builds two
separate binary packages: python-libravatar and python3-libravatar.
This highlights the fact that a given upstream source can be split into
several binary packages in the archive when it makes sense. In this case,
there is no point in Python 2 applications pulling in the Python 3 files, so
the two separate packages make sense.
Another common example is the use of a -doc package to separate the
documentation from the rest of a package so that it doesn't need to be
installed on production servers for example.
debian/upstream/signing-key.asc
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
mQINBEpQYz4BEAC7REQD1za69RUnkt6nRCFhSJmmoeJc+yEiWTKc9GOIMAwJDme1
+CMYgVn4Xzf1VQYwD/lE+mfWgyeMomLQjDM1mxx/LOM2a1WWPOk9+PvQwKfRJy92
...
UxDtZm/4yUmU6KvHvOGiDCMuIiB+MqhqJJ5wf80wXhzu8nmC+fyGt6nvu0ggMle8
sAMgXt/aQUTZE5zNCQ==
=RkTO
-----END PGP PUBLIC KEY BLOCK-----
This is simply the
OpenPGP key
that the upstream developer uses to sign release tarballs.
Since PGP signatures are available on the upstream
download page, it's possible
to instruct
uscan
to check signatures before downloading tarballs.
The way to do that is to use the pgpsigurlmange option in debian/watch:
which is simply a regular expression replacement string which takes the
tarball URL and converts it to the URL of the matching PGP signature.
fcheck
The last package we will look at
is a file integrity checker. It essentially goes through all of the files in
/usr/bin/ and /usr/lib/ and stores a hash of them in its database. When
one of these files changes, you get an email.
In particular, we will look at the following files in the debian/ directory of
version 2.7.59-18:
dirs
fcheck.cron.d
fcheck.postrm
fcheck.postinst
patches/
README.Debian
rules
source/format
debian/patches
This directory contains ten patches as well as a file called series which
lists the patches that should be applied to the upstream source and in which
order. Should you need to temporarily disable a patch, simply remove it from
this file and it will no longer be applied at build time.
Let's have a look at patches/04_cfg_sha256.patch:
This is a very simple patch which changes the default configuration of
fcheck to promote the use of a stronger hash function. At the top of the
file is a bunch of metadata in the
DEP-3 format.
Why does this package contain so many customizations to the upstream code
when Debian's policy is to push fixes upstream and work towards reduce the
delta between upstream and Debian's code? The answer can be found in
debian/control:
This package no longer has an upstream maintainer and its original source is
gone. In other words, the Debian package is where all of the new bug fixes
get done.
debian/source/format
3.0 (quilt)
This file contains what is called the source package format. What it
basically says is that the patches found in debian/patches/ will be
applied to the upstream source using the
quilt tool at build time.
debian/fcheck.postrm
#!/bin/sh
# postrm script for fcheck
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postrm> remove'
# * <postrm> purge'
# * <old-postrm> upgrade' <new-version>
# * <new-postrm> failed-upgrade' <old-version>
# * <new-postrm> abort-install'
# * <new-postrm> abort-install' <old-version>
# * <new-postrm> abort-upgrade' <old-version>
# * <disappearer's-postrm> disappear' <overwriter>
# <overwriter-version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
remove upgrade failed-upgrade abort-install abort-upgrade disappear)
;;
purge)
if [ -e /var/lib/fcheck/fcheck.dbf ]; then
echo "Purging old database file ..."
rm -f /var/lib/fcheck/fcheck.dbf
fi
rm -rf /var/lib/fcheck
rm -rf /var/log/fcheck
rm -rf /etc/fcheck
;;
*)
echo "postrm called with unknown argument \ $1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0
This script is one of the many possible
maintainer scripts that a
package can provide if needed.
This particular one, as the name suggests, will be run after the package is
removed (apt-get remove fcheck) or purged (apt-get remove --purge
fcheck). Looking at the case statement above, it doesn't do anything extra in the
remove case, but it deletes a few files and directories when called with
the purge argument.
debian/README.Debian
This optional README file contains Debian-specific instructions that might
be useful to users. It supplements the upstream README which is
often more generic and cannot assume a particular system configuration.
debian/rules
#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
build-arch:
build-indep:
build: build-stamp
build-stamp:
dh_testdir
pod2man --section=8 $(CURDIR)/debian/fcheck.pod > $(CURDIR)/fcheck.8
touch build-stamp
clean:
dh_testdir
dh_testroot
rm -f build-stamp
rm -f $(CURDIR)/fcheck.8
dh_clean
install: build
dh_testdir
dh_testroot
dh_prep
dh_installdirs
cp $(CURDIR)/fcheck $(CURDIR)/debian/fcheck/usr/sbin/fcheck
cp $(CURDIR)/fcheck.cfg $(CURDIR)/debian/fcheck/etc/fcheck/fcheck.cfg
# Build architecture-independent files here.
binary-arch: build install
# Build architecture-independent files here.
binary-indep: build install
dh_testdir
dh_testroot
dh_installdocs
dh_installcron
dh_installman fcheck.8
dh_installchangelogs
dh_installexamples
dh_installlogcheck
dh_link
dh_strip
dh_compress
dh_fixperms
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install
This is an example of a old-style debian/rules file which you still
encounter in packages which haven't yet upgraded to the latest version of
debhelper 9, as can be shown by the contents of debian/compat:
8
It does essentially the same thing that what we've seen in the build log,
but in a more verbose way.
debian/dirs
usr/sbin
etc/fcheck
This file contains a list of directories that
dh_installdirs
will create in the build directory.
The reason why these directories need to be created is that files are copied
into these directories
in the install target of the debian/rules file.
Note that this is different from directories which are created at the time
of installation of the package. In that case, the directory
(e.g. /var/log/fcheck/) must be
created in the postinst script
and removed in the postrm script.
debian/fcheck.cron.d
#
# Regular cron job for the fcheck package
#
30 */2 * * * root test -x /usr/sbin/fcheck && if ! nice ionice -c3 /usr/sbin/fcheck -asxrf /etc/fcheck/fcheck.cfg >/var/run/fcheck.out 2>&1; then mailx -s "ALERT: [fcheck] hostname --fqdn " root </var/run/fcheck.out ; /usr/sbin/fcheck -cadsxlf /etc/fcheck/fcheck.cfg ; fi ; rm -f /var/run/fcheck.out
This file is the cronjob which drives the checks performed by this
package. It will be copied to /etc/cron.d/fcheck by dh_installcron.
It took some time, but now it s finally done: KDE has translations for AppStream upstream metadata!
AppStream is a Freedesktop project to extend metadata about the software projects which is available in distributions, especially regarding applications. Distributions compile a metadata file from data collected from packages, .desktop files and possibly other information sources, and create an AppStream XML file from it, which is then directly or via a Xapian cache read by software-center-like applications such as GNOME-Software or KDEs Apper.
Since the metadata available from current sources is not standardized and rather poor, upstream projects can ship small XML files, AppStream upstream metadata or AppData in short. These files contain additional information about a project, such as a long description and links to screenshots. They also provide hints about public interfaces a software provides, for example binaries and libraries, making it possible for distributors to give users exactly the right package name in case they are missing a software component.
So, in order to represent graphical KDE applications like they deserve it in the new software centers making use of AppStream, we need to ship AppData files, with long descriptions, screenshots and a few URLs.
But how can you create these metadata files? In case you want your graphical KDE app to ship an AppData file, there is now a help page on the Techbase Wiki which provides all information needed to get started!
For non-visual stuff or software which just wants to publish it s provided interfaces with AppStream metadata, there is a dedicated page for that as well. Shipping metadata for non-GUI apps will help programmers to satisfy depedencies in order to compile new software, enhance bash-completion for missing binaries and provides some other neat stuff (take a look at this blogpost to get a taste of it).
And if you want to read a FAQ about the metadata stuff and get the bigger picture, just go to the Techbase Wiki page about AppStream metadata as well.
The pages are not 100% final, so if you have questions, please write me a mail and I ll update the pages, or simply correct/refine it by yourself (it s a wiki afterall).
And now to the best thing: As soon as you ship an AppStream upstream metadata file (*.appdata.xml* for apps or *.metainfo.xml* for other stuff), the KDE l10n-script (Scripty!) will automatically start translating it, just like we already do with .desktop files. No further actions are necessary.
I already have a large amount of metadata files here, partially auto-generated, which show that we have about 160+ applications in KDE which could get an AppData file, not counting any frameworks or other non-GUI stuff yet. Since that is a bit much to submit via Reviewboard (which I originally planned to do), I hope I can commit the changes directly to the respective repositories, where the maintainers can take a look at it and adjust it to their liking. If that idea does not receive approval, I will just publish a set of data at some place for the KDE app maintainers to take as a reference (the auto-generated stuff needs some fixup to be commit-ready (which I d do in case I can just commit changes)). Either way, it is safe now to write and ship AppData files in KDE projects!
In order to get your stuff translated, it is necessary that you follow the AppStream 0.6 metadata specification, and not one of ther older revisions. You can easily detect 0.6 metadata by the <component> root node, instead of <application>, or by it having a metadata_license tag. We don t support the older versions simply because it s not necessary, as there were only two KDE projects shipping AppData before, which are now using 0.6 data as well. Since 0.6, the metadata XML format is guaranteed to be stable, and the only reason which could make me change it in an incompatible way is to prevent something as bad as the end of the world from happening (== won t happen ). You can find the full specification (upstream and distro data) here.
All parsers are able to handle 0.6 data now, and the existing tools are almost all migrated already (might take a few months to hit the distributions though).
So, happy metadata-writing!
Thanks to all people who helped with making this happen, and especially Burkhard L ck and Albert Astals Cid for their patch-review and help with integrating the necessary changes into the KDE l10n-script.
The GNOME and many other infrastructures have been recently attacked by an huge amount of subscription-based spam against their Mailman istances. What the attackers were doing was simply launching a GET call against a specific REST API URL passing all the parameters it needed for a subscription request (and confirmation) to be sent out. Understanding it becomes very easy when you look at the following example taken from our apache.log:
May 3 04:14:38 restaurant apache: 81.17.17.90, 127.0.0.1 - - [03/May/2014:04:14:38 +0000] "GET /mailman/subscribe/banshee-list?email=example@me.com&fullname=&pw=123456789&pw-conf=123456789&language=en&digest=0&email-button=Subscribe HTTP/1.1" 403 313 "http://spam/index2.html" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36"
As you can the see attackers were sending all the relevant details needed for the subscription to go forward (and specifically the full name, the email, the digest option and the password for the target list). At first we tried to either stop the spam by banning the subnets where the requests were coming from, then when it was obvious that more subnets were being used and manual intervention was needed we tried banning their User-Agents. Again no luck, the spammers were smart enough to change it every now and then making it to match an existing browser User-Agent. (with a good percentage to have a lot of false-positives)
Now you might be wondering why such an attack caused a lot of issues and pain, well, the attackers made use of addresses found around the web for their malicius subscription requests. That means we received a lot of emails from people that have never heard about the GNOME mailing lists but received around 10k subscription requests that were seemingly being sent by themselves.
It was obvious we needed to look at a backup solution and luckily someone on our support channel suggested the freedesktop.org sysadmins recently added CAPTCHAs support to Mailman. I m now sharing the patch and providing a few more details on how to properly set it up on either DEB or RPM based distributions. Credits for the patch should be given to Debian Developer Tollef Fog Heen, who has been so kind to share it with us.
Before patching your installation make sure to install the python-recaptcha package (tested on Debian with Mailman 2.1.15) on DEB based distributions and python-recaptcha-client on RPM based distributions. (I personally tested it against Mailman release 2.1.15, RHEL 6)
The Patch
diff --git a/Mailman/Cgi/listinfo.py b/Mailman/Cgi/listinfo.py
index 4a54517..d6417ca 100644
--- a/Mailman/Cgi/listinfo.py
+++ b/Mailman/Cgi/listinfo.py
@@ -22,6 +22,7 @@
import os
import cgi
+import sys
from Mailman import mm_cfg
from Mailman import Utils
@@ -30,6 +31,8 @@ from Mailman import Errors
from Mailman import i18n
from Mailman.htmlformat import *
from Mailman.Logging.Syslog import syslog
+sys.path.append("/usr/share/pyshared")
+from recaptcha.client import captcha
# Set up i18n
_ = i18n._
@@ -200,6 +203,9 @@ def list_listinfo(mlist, lang):
replacements[''] = mlist.FormatFormStart('listinfo')
replacements[''] = mlist.FormatBox('fullname', size=30)
+ # Captcha
+ replacements[''] = captcha.displayhtml(mm_cfg.RECAPTCHA_PUBLIC_KEY, use_ssl=False)
+
# Do the expansion.
doc.AddItem(mlist.ParseTags('listinfo.html', replacements, lang))
print doc.Format()
diff --git a/Mailman/Cgi/subscribe.py b/Mailman/Cgi/subscribe.py
index 7b0b0e4..c1c7b8c 100644
--- a/Mailman/Cgi/subscribe.py
+++ b/Mailman/Cgi/subscribe.py
@@ -21,6 +21,8 @@ import sys
import os
import cgi
import signal
+sys.path.append("/usr/share/pyshared")
+from recaptcha.client import captcha
from Mailman import mm_cfg
from Mailman import Utils
@@ -132,6 +130,17 @@ def process_form(mlist, doc, cgidata, lang):
remote = os.environ.get('REMOTE_HOST',
os.environ.get('REMOTE_ADDR',
'unidentified origin'))
+
+ # recaptcha
+ captcha_response = captcha.submit(
+ cgidata.getvalue('recaptcha_challenge_field', ""),
+ cgidata.getvalue('recaptcha_response_field', ""),
+ mm_cfg.RECPTCHA_PRIVATE_KEY,
+ remote,
+ )
+ if not captcha_response.is_valid:
+ results.append(_('Invalid captcha'))
+
# Was an attempt made to subscribe the list to itself?
if email == mlist.GetListEmail():
syslog('mischief', 'Attempt to self subscribe %s: %s', email, remote)
Additional setup
Then on the /var/lib/mailman/templates/en/listinfo.html template (right below <mm-digest-question-end>) add:
<tr>
<td>Please fill out the following captcha</td>
<td><mm-recaptcha-javascript></TD>
</tr>
Make also sure to generate a public and private key at https://www.google.com/recaptcha and add the following paramaters on your mm_cfg.py file:
RECAPTCHA_PRIVATE_KEY
RECAPTCHA_PUBLIC_KEY
Loading reCAPTCHAs images from a trusted HTTPS source can be done by changing the following line:
EPEL 6 related details
A few additional details should be provided in case you are setting this up against a RHEL 6 host: (or any other machine using the EPEL 6 package python-recaptcha-client-1.0.5-3.1.el6)
Importing the recaptcha.client module will fail for some strange reason, importing it correctly can be done this way:
and then fix the imports also making sure sys.path.append( /usr/share/pyshared ) is not there:
from recaptcha import captcha
That s not all, the package still won t work as expected given the API_SSL_SERVER, API_SERVER and VERIFY_SERVER variables on captcha.py are outdated (filed as bug #1093855), substitute them with the following ones:
British taxpayers are paying for extra support for Windows XP due to a lack of planning by the UK government [1]. While the cost of this is trivial compared to other government stupidity (such as starting wars of aggression) this sort of thing should be stopped.
The best way to solve such problems is for governments to only use free software. If the UK government used Red Hat Enterprise Linux then when Red Hat dropped support for old versions they would have the option of providing their own support for old versions, hiring any other company to support old versions, or paying Red Hat for supporting it. In that case the Red Hat offer would probably be quite reasonable as competition drives the prices down.
It doesn t seem likely that the UK government will start using only free software in the near future. It s not impossible to do so, there are organisations dedicated to this task such as Free-gov.org which aims to develop e-government software that is under GPL licenses [2]. The Wikipedia page List of Linux Adopters [3] has a large section on government use, while not all entries are positive (some have reverted) it shows that it s possible to use Linux for all areas of government. But governments often move slowly and in the case of wealthy countries such as the UK it can be easier to just tax the citizens a little more than to go to the effort of saving money.
But when governments use proprietary software they shouldn t be restricted in support. It seems that the only way to ensure that the government can do what it needs is to have a source escrow system. Then if the company that owned the software ceased supporting it anyone who wanted to offer support would be able to do so. This would probably require that software which is out of support be released to the public domain so that anyone who wanted to tender for such support work could first inspect the code to determine if they were capable of doing the work.
People who believe the myths about secret source software claim that allowing the source code to be released would damage the company that owns it. This has been proved incorrect by the occasions when source code for software such as MS-Windows has been released on the Internet with no apparent harm. Also Microsoft have a long history of licensing their source code to universities, governments, and other companies for various purposes (including porting Windows to other CPUs). It s most likely that some part of the UK government already has the full source code to Windows XP, and it s also quite likely that computer criminals have obtained copies of the source by now for the purpose of exploiting security flaws. Also they stop supporting software when they can t make money from providing the usual support, so by definition the value to a company of the copyright is approaching zero by the time they decide to cease support.
Given the lack of success experienced by companies that specialise in security (for example the attack on RSA to steal the SecurID data [4]) it doesn t seem plausible that Microsoft has had much success in keeping the source to Windows XP (or any other widely used product) secret over the course of 12 years.
In summary source code to major proprietary software products is probably available to criminals long before support expires and is of little value to the copyright owners. But access to it can provide value to governments and other users of the software.
The only possible down-side to the software vendor is if the new version doesn t provide any benefits to the user. This could be a problem for Microsoft who seem to have the users hate every second version of Windows enough to pay extra for the old version. The solution is to just develop quality software that satisfies the needs of the users. Providing a legal incentive for this would be a good idea.
url_for is normally used to avoid hard coding of URL in Flask based
webapps. I've been using it in SILPA port written using Flask
by. But this was written long back and written as POC to show for
Santhosh author of SILPA app which even managed to go into production
:-). Recently I started organizing the code and started using
flask.Blueprint which was previously written using
flask.views.MethodView class and here I started facing problem with
old templates. I'm just gonna explain what is the difference when
using url_for with MethodView and Blueprint.
Lets have some sample code for MethodView first, this code is from
Flask documentation.
Here we have a view which is derived from MethodView which has logic
on how to handle the requests. We use add_url_rule to register rule
to handle /users/ url end point and we pass the class as view
function which is done by as_view class method and we can refer this
method in our Jinja2 templates using name users. So a statement like
url_for('users')
in our templates will be converted to /users/ URL when page is
rendered to client by Flask.
Now when I replaced the MethodView in favor of Blueprint I started
getting up werkzeug.routing.BuildError thrown on my face and I had
no clue why!. Yeah I know I'm bad at reading documentation but even
after reading documentation I was still thinking that
url_for('/')
should return me a proper URL and I was wondering why its
failing. Finally after re-reading documentation for url_for it was
becoming clear to me, url_for definition looks like below
flask.url_for(endpoint,**values)
Here endpoint is actually a function which is supposed to be serving
the URL and **values is the arguments for this function. The URL in
question should be defined in python code using decorator. In my case
following is the new function serving the web pages for SILPA.
bp=Blueprint('frontend',__name__)@bp.route(_BASE_URL,defaults='page':'index.html' )@bp.route(_BASE_URL+'<page>')defserve_pages(page):ifpage=="index.html":returnrender_template('index.html',title='SILPA',main_page=_BASE_URL,modules=_modulename_to_display)elifpage=="License":returnrender_template('license.html',title='SILPA License',main_page=_BASE_URL,modules=_modulename_to_display)elifpage=="Credits":returnrender_template('credits.html',title='Credits',main_page=_BASE_URL,modules=_modulename_to_display)elifpage=="Contact":returnrender_template('contact.html',title='Contact SILPA Team',main_page=_BASE_URL,modules=_modulename_to_display)else:# modules requested!.ifpagein_display_module_map:returnrender_template(_display_module_map[page]+'.html',title=page,main_page=_BASE_URL,modules=_modulename_to_display)else:# Did we encounter something which is not registered by us?returnabort(404)
You can ignore function code but just note the decorators, here I'm
registering the function serve_pages with page as argument for URL
patterns / and /<page>, _BASE_URL here is mount point of
application it can be just / or /mountpoint depending on that URL
registered changes. Now I need to modify code for all url_for in my
template to look like below
url_for('.serve_pages',page='/License')# for /Licenseurl_for('.serve_pages')# which will turn in to /index.html
The . in front of function is for referring current Blueprint, in my
case the Flask will consider it as frontend.serve_pages as function
name and generates appropriate URL at run time.
So my fault was misunderstanding endpoint argument as URL endpoint
but where as its actually function name supposed to serve the
page. But when using MethodViews I can simply convert class to a
function with my preferred name just like UserAPI.as_view('/') so
url_for('/') just works.