I decided to go to DebConf11
by car. Not willing to do this alone, I asked for volunteers to join me
in my car trip. One such volunteer showed up, and the car trip happened.
Now, since I remembered to push the correct buttons on my dashboard
after I completely fueled up the car and checked the tire tension and
other things, I am now proud to be able to present you with the
following statistics on this trip:
Some weeks ago I noticed that one of my backup servers was not removing
the old backup generations it was making. It had over 18 months worth of
daily backups, done with rsync and "cp -al". This is not the world's
greatest backup system, but that's entirely irrelevant for this rant.
The cron job that would do that did not exist: I had forgotten to enable it.
So I ran it by hand. Then fixed it, when I noticed it was buggy, and didn't
remove any old generations prior to 2010. After that
I removed years-old backups of machines that haven't existed for years.
Disk usage:
Size Used Avail Use%
before 5.4T 2.6T 2.6T 51%
after 5.4T 892G 4.3T 18%
Inodes:
Inodes IUsed IFree IUse%
before 732577792 77645915 654931877 11%
after 732577792 16871789 715706003 3%
That's about 61 million files removed, over the course of three weeks,
of which the machine was down due to crashes for about one week.
It should not take two weeks to copy a couple of terabytes (it's less than
two megabytes per second). It should definitely not take two weeks to
delete it. Almost all the time it was up, it was removing files. There
were a couple of times when it finished one run and was idle until I woke
up and started the next run. Say a day in total.
Why is "sudo rm -rf" on a large directory tree, or set of large directory
trees, so slow? I suspect part of the problem is that the system call
API is beautiful, but simplistic: you need to call unlink or rmdir on
every file separately, and that means doing an inode lookup separately
for each file. Having a system call to delete everything in a directory
would have a chance of removing things more efficiently, I suspect.
However, since I've not done any profiling, nor even analyzed the
relevant source code in the kernel, I might be entirely wrong.
I wonder if anyone else needs to remove large directory trees frequently?
I do that a lot, because of my backup software development hobby. But
I may be in a unique position, and nobody else would benefit from fast
removal.
(I'll note that my backup server is using ext3, and that ext4 is much
faster at removing files, particularly large
files, but it's still not fast enough.)
mksh R40b (nowadays with filled
in user s caveats (for R40, too!)
and packager s upgrade hints) has
just been released. This is a should-have upgrade, fixing a number of
admittedly some obscure bugs, changing things begun in R40, improving
upon others. Thanks to the PLD Linux guys for spotting all these errors;
thanks to them and phpnet.org both for adopting mksh so well.
I have also fixed a bug in nroff(1) which will lead to an even
nicer looking HTML manpage mksh(1) (after the next rebuild and upload of
a MirBSD snapshot scheduled RSN).
jupp 3.1.16 took on the task
of merging Debian joe changes (aiming at an upload). I also split the
jupprc file into three versions (2.8 generic/DOS, 3.1+jupp and 3.7/Unix)
because of the differences in the baseline executables making rc files
partially mutually incompatible (think Insert key), annoyingly warning
(think syntax, hmsg), or less usable (joe s new menu system).
jupp 2.8.2 is a companion to
jupp 3.1.16 mostly because of the new help window character map
Binaries for jupp should be updated RSN too.
Considering Banja Luka is arriving quickly, the r in RSN should be
taken with a few grains of salt. I ve also scheduled working on the pcc
Debian package for the next future; updating lynx and maybe others like
OpenSSH in MirBSD is also due; cvs(1) will receive more of my time, but
before the next Upload I d like to fix LP#12230 once verified.
Builds for Debian/m68k are also still running. I note I did in fact
not manage to make a new base image, yet (but 2.6.39 kernels
miss a patch, anyway, so waiting for 3.0 is ok). It s still using gcc-4.4
because nobody tests gcc-4.6 and gcj-4.6 FTBFS due to SIGSEGV, but that s
ok in my books. rsyslog is broken but sysklogd works.
The #ksh Freenode page finally
got a well-deserved link to Planet Commandline. Throw more my way!
Acronyms and translations,
too. (Got Norwegian and Rumanian covered in the meantime. No idea whether any
RTL languages will work in that beast. But I m young and need the money)
Since I m writing a wlog entry anyway let me thank Gunnar for a nice
summary on the current Free Culture discussion; my comments on Nina s site
seem to be eaten, but let me support it fully, although, of course, I normally
use a copycenter style licence, which
is specifically written for general works of authorship under copyright law,
not limited to software. I did in fact have that in mind. Maybe some people
will like it (it s less than one Kibibyte long) either generally or just for
their everyday random musings (they can then keep CC-BY-SA for the big works
if they so desire).
Wouter, grass background makes green headlines illegible. I ve never liked,
and never installed manually, cups either. (Benny tells me that Apple s new
version refuses to talk with a non-Apple cups, kinda defeating the whole idea
I think.) Port 9100 is JetDirect (probably with an HP in front and some subset
of trailing) and just nice. (Being able to talk ESC/P with your printer
like print '\033K\x07\0\x3E\x81\x99\xA5\xA5\x81\x3E' >/dev/lpa too
rocks though, IMHO. Yes, mine can, and I still can. /dev/lpa is BSD.)
Kai, thanks for your vimrc lines:
:highlight TrailWhitespace ctermbg=red guibg=red :match TrailWhitespace /\s\+$\ \+\ze\t/
Automatic removal is harmful, though I just fell into the trap since jupprc contains needed whitespace at EOL but manual removal (bound to ^K] in jupp) rocks. And I like that your solution uses such strong a colour vim users are the single most represented offender group for actually leaving the redundant whitespace at EOL there, and it should hurt their eyes. (Sadly there is some vehement disagreement preventing them from inclusion in grml-etc-core but that s why I re-post them here.) Ah, and jupp can of course display whitespace visibly (although it uses / , replacing the arrow with if no UTF-8, not ), accessible with ^Ov. Steve, want to put up a checklist for sites? We can crowdsource the testing to maybe get some interesting results Some other people would get more comments if they were idling in IRC (Freenode) or allow comments on their blog, specifically without too high an entrance barrier OpenID is ok, but many other things, and ECMAscript, are not; but I can t really say that loud because our wlog is static HTML compiled from a flat plaintext data source so it doesn t allow such either. I often forget what I wanted to add if I can t get it out quickly enough (especially at work). Sowwy Me like the cat picture postings (Amayita, Tiago, Gracias!).
Recently I was at a pub and there was an advert for pub tokens displayed on the window.
Seemed like a cute idea:
SELECT * FROM cms_module_pubtokens_users where email = '"'' AND password =''"' LIMIT 1 Fatal error: Call to a member function FetchRow() on a non-object in /home/pubtokens/U79P18WQ/htdocs/includes/functions.php on line 291Suffice it to say I sent them an email, then poked them on twitter, but to no avail. In conclusion they don't get my money, and I couldn't recommend them to anybody else at this point either. As I'm not a customer at least I can rest easy knowing my details haven't been compromised at any point over the past few months. ObQuote: "It can't rain all the time" - The Crow
The question was recently asked, How do I perform crash recovery on a MySQL
master/slave database cluster? Because replication is async, a transaction
that has been committed to the master may not be able to leave the master
before the crash happens.
The short answer is, you don t. Asynchronous replication, by it s very
nature, is prone to these sorts of issues, and MySQL doesn t make life
easier in general by using query replay.
Some of the issues aren t massive: for instance, if a slave crashes, the
master will keep replication logs for the slave until it comes back up (as
long as the slave comes back before the master decides some of the replogs
are too old and starts deleting them, of course), so as long as you can live
without a master for a while, you can recover and continue along your merry
way.
Promoting a slave to be a master, on the other hand, is a situation frought
with peril. Here, you ve just got to hope hope that your chosen slave is
consistent with the master s state at death (because it s async, you have no
guarantees about that), and that all the other slaves have the same ideas
about what counts as the current state of the data. If your newly-promoted
slave managed to apply an update that another slave didn t, that slave will
be out of sync with reality (until such time as the now-dead master comes
back and replays all those queries hahahaha). To even guarantee that
any slaves have a consistent view of the data as compared to the new master,
you ve got to rereplicate everything from the new master, because MySQL s
where are you up to? counter is master-specific.
I ve heard people who have to deal with this sort of thing these days say
that the Maatkit tools are handy for dealing with
various issues of this type (monitoring, repairing the database when it gets
inconsistent).
However, I prefer to keep right the hell away from MySQL replication
altogether, after a year of having to gently coax an insane MySQL tree
replication setup to do the right thing for any extended period, and
watching a group of DBAs at Engine Yard go slowly insane.
My preferred alternatives are:
^Wmachine ) hardware is so ridiculously cheap,
relative to the clueful sysadmin time needed to make (and keep) MySQL
replication running, that you really need to be at the huge end of town
(where other scaling issues are going to bite you in the arse first) before
spending too much time on your database is worth the investment. Even then,
you ll get more bang for your buck from:
In an earlier post, I asked a number of questions, most of
which are now answered. Here's a recap:
I wrote
I stumbled across some CF Engine-style definitions for puppet in a Debian Administration article (taken originally from puppet's own wiki, which have since been moved/deleted)Perhaps it was removed with good reason This is a fairly horrid solution to the problem. Phil was the first to suggest investigating Augeas, a neat tool that abstracts away the nasty specifics of parsing the myriad configuration file formats and provides a unified, tree-like interface for adjusting configurations. The interface reminds me of manipulating XML via the DOM. More on Augeas in a later blog post I also wrote
package [foo,bar]: syntax worked fine, but is a little verbose and the package list is awkward to maintain buried inside the puppet syntax. I spent some time trying to see whether I could populate a puppet list based on the contents of a file: then I could list the packages one-per-line in a separate file. I haven't found a way of doing that yet.I haven't found a more concise way of solving this problem, but as I have grown more familiar with puppet's syntax I have become less bothered by it. I igo suggested pre-processing the puppet configuration, but I'd rather not complicate my provisioning approach (VCS hooks) by attempting that. Finally I wrote
Using my laptop as a second node also exposed some interesting puppet client behaviour. Once I went off-site, the laptop tried to look upI'm pleased to report that the client is at least this clever: it refused to talk to a local puppetmaster that I setup at home.puppeton foreign networks (such as my home network). I would have assumed that, once the strong SSL association had been made, the client would try to connect to the FQDN of the server. This probably isn't a serious problem in practice, as we probably won't need to rely on nodes off-site talking to the configuration server, but I hope that the client doesn't trust any host that happens to answer topuppet...
apt-get build-dep gnucash
apt-get install python-dev
As a non privileged user:
apt-get source gnucash
cd gnucash-N.N.N # varies depending on your version)
Then, edit debian/rules and add --enable-python-bindings to the dhautoconfigure command. I replaced the line:
--enable-locale-specific-tax
With the lines:
--enable-locale-specific-tax \
--enable-python-bindings
Then, update the change log with:
dch
Built the new package:
dpkg-buildpackage -rfakeroot -uc -b
I then wrote a python module. It logs into the server running our members database, runs a script to export tab delimited lists, and then imports them into our gnucash xml file.
It's far from perfect (I'm fairly new to python). Also - I have sheepishly inserted code that searches for certain values by accessing the gnucash file directly (via python's xml handling modules). I couldn't figure out how to do the search I needed with they available python methods, although it may very well be there and I just couldn't figure it out.
If anyone is interested in using it for a template:
#!/usr/bin/python
import sys
import os
import time
import csv
import warnings
from xml.dom.minidom import parse
from gnucash import Session, GncNumeric
from gnucash.gnucash_business import Customer, Invoice, Entry, BillTerm
from decimal import Decimal
import datetime
import tempfile
import subprocess
def main(argv = None):
if argv is None:
argv = sys.argv
path = os.environ['MFPL_GNUCASH_PATH']
if not os.path.exists(path):
print """Path (%s) does not exist. Please set
MFPL_GNUCASH_PATH environment variable\n""" % path
return 1
if os.path.exists(path + '.LCK'):
print """Lock file exists. Is GNUCash running?\n"""
return 1
command = argv[1]
import_file = None
if 2 in argv:
if argv[2] == '--from-file':
if argv[3]:
if os.path.exists(argv[3]):
file_path = argv[3]
import_file = open(file_path,'r')
else:
print "Can't find file to import: %s" % argv[3]
return 1
else:
print "Please pass path to file if using --from-file"
return 1
else:
print "I didn't understand the argument: %s" %s
# download import file if not provided
if import_file == None:
import_file = get_data(command)
# The file might be gzipped, so
# open and save it
s = get_gnucash_session(path)
s.save()
s.end()
# Wait a second, so we can create a backup
# without a name collision
time.sleep(1)
# Open for real now...
s = get_gnucash_session(path)
xml_dom = parse(path)
if command == "members":
ret = import_members_from_file(s, xml_dom, import_file)
if command == "invoices":
ret = import_invoices_from_file(s, xml_dom, import_file)
s.save()
s.end()
return ret
def get_data(command):
import_file = tempfile.NamedTemporaryFile()
if command == 'members':
remote_cmd = 'acc-member-list'
else:
remote_cmd = 'acc-invoice-list'
args = [ '/usr/bin/ssh', 'mayfirst@hay.mayfirst.org', '/home/mayfirst/bin/' + remote_cmd ]
subprocess.call(args,stdout = import_file)
return import_file
def import_invoices_from_file(s, xml_dom, csvfile):
dialect = 'excel-tab'
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
nodes = xml_dom.getElementsByTagName('gnc:GncCustomer')
already_entered = 0
entered = 0
for row in reader:
member_id = row[0]
invoice_id = row[1]
invoice_date = row[2]
invoice_amount = row[3]
invoice_desc = row[4]
if not member_id.isdigit():
# header line or not coded to a member?
continue
member_id = int(member_id)
invoice_id = int(invoice_id)
if invoice_exists(xml_dom, invoice_id):
# print "Already entered %s (%s)" % (invoice_date,invoice_id)
already_entered += 1
else:
if not member_exists(xml_dom, "No Name McGoo - fix me" , member_id):
print "Skipping member id %s, invoice id %s - member doesn't exist" % (member_id, invoice_id)
else:
invoice_enter(s, member_id, invoice_id, invoice_date, invoice_amount, invoice_desc )
entered += 1
print "Invoices entered from last two months: %s (%s already existed)" % (entered, already_entered)
return True
def get_guid_from_member_id(nodes,member_id):
member_id = pad_number(member_id)
for node in nodes:
for child in node.childNodes:
if child.nodeName == 'cust:guid':
guid = child.childNodes[0].data
if child.nodeName == 'cust:id':
if member_id == child.childNodes[0].data:
return guid
def import_members_from_file(s, dom, csvfile):
dialect = 'excel-tab'
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
already_entered = 0
entered = 0
for row in reader:
member = row[0]
member_id = row[1]
if not member_id.isdigit():
# header line?
continue
member_id = int(member_id)
if member_exists(dom, member, member_id):
#print "Already entered %s (%s)" % (member, member_id)
already_entered += 1
else:
member_enter(s, member, member_id )
entered += 1
print "Members entered from last two months: %s (%s already existed)" % (entered, already_entered)
return True
def get_gnucash_session(path):
with warnings.catch_warnings():
warnings.simplefilter("ignore")
return Session(path, is_new = False)
def member_enter(s, member, member_id):
print "Entering %s with id %s" % (member, member_id)
book = s.book
root = book.get_root_account()
commod_table = book.get_table()
USD = commod_table.lookup('CURRENCY', 'USD')
member_id = pad_number(member_id)
new_customer = Customer(book, member_id, USD, member)
def invoice_enter(s, member_id, invoice_id, invoice_date, invoice_amount, invoice_desc):
book = s.book
root = book.get_root_account()
commod_table = book.get_table()
USD = commod_table.lookup('CURRENCY', 'USD')
invoice_id = pad_number(invoice_id)
member_id = pad_number(member_id)
invoice_date_object = datetime.datetime.strptime(invoice_date, "%Y-%m-%d %H:%M:%S")
member = book.CustomerLookupByID(member_id)
assert( member != None )
assert( isinstance(member, Customer) )
assets = root.lookup_by_name("Assets")
recievables = assets.lookup_by_name("Recievables")
income = root.lookup_by_name("Membership Dues")
invoice = Invoice(book, invoice_id, USD, member, invoice_date_object )
invoice_value = gnc_numeric_from_decimal(Decimal(invoice_amount))
invoice_entry = Entry(book, invoice)
invoice_entry.SetDescription(invoice_desc)
invoice_entry.SetQuantity( GncNumeric(1) )
invoice_entry.SetInvAccount(income)
invoice_entry.SetInvPrice(invoice_value)
invoice_entry.SetDate(invoice_date_object)
invoice_entry.SetDateEntered(invoice_date_object)
print "Entering invoice %s %s %s" % (invoice_id, invoice_date, invoice_amount)
invoice.PostToAccount(recievables, invoice_date_object, invoice_date_object, "", True)
def pad_number(num):
return "%(number)06d" % 'number': num
def member_exists(dom, member, member_id):
member_id = pad_number(member_id)
for node in dom.getElementsByTagName('gnc:GncCustomer'):
for child in node.childNodes:
if child.nodeName == 'cust:name':
for grandchild in child.childNodes:
if member == grandchild.data:
return True
if child.nodeName == 'cust:id':
for grandchild in child.childNodes:
if member_id == grandchild.data:
return True
return False
def invoice_exists(dom, invoice_id):
invoice_id = pad_number(invoice_id)
for node in dom.getElementsByTagName('gnc:GncInvoice'):
for child in node.childNodes:
if child.nodeName == 'invoice:id':
for grandchild in child.childNodes:
if invoice_id == grandchild.data:
return True
return False
def gnc_numeric_from_decimal(decimal_value):
sign, digits, exponent = decimal_value.as_tuple()
# convert decimal digits to a fractional numerator
# equivlent to
# numerator = int(''.join(digits))
# but without the wated conversion to string and back,
# this is probably the same algorithm int() uses
numerator = 0
TEN = int(Decimal(0).radix()) # this is always 10
numerator_place_value = 1
# add each digit to the final value multiplied by the place value
# from least significant to most sigificant
for i in xrange(len(digits)-1,-1,-1):
numerator += digits[i] * numerator_place_value
numerator_place_value *= TEN
if decimal_value.is_signed():
numerator = -numerator
# if the exponent is negative, we use it to set the denominator
if exponent < 0 :
denominator = TEN ** (-exponent)
# if the exponent isn't negative, we bump up the numerator
# and set the denominator to 1
else:
numerator *= TEN ** exponent
denominator = 1
return GncNumeric(numerator, denominator)
if __name__ == "__main__":
sys.exit(main())
:highlight TrailWhitespace ctermbg=red guibg=red
:match TrailWhitespace /\s\+$\ \+\ze\t/
If you just want this functionality if syntax highlighting is also active,
then you should use
:autocmd Syntax * syn match TrailWhitespace /\s\+$\ \+\ze\t/
instead of the :match line. The regular expression used in both
cases matches trailing whitespaces and whitespaces in front of tabs.
Of course there are several other options on how to do this or what you might
want to highlight, but that would be beyond the scope of this little post.
Somehow, even though I'd know about it for the longest time, I had never get around to reading George R.R. Martins A Song of Ice and Fire series until I heard about the Game of Thrones HBO series. Then I thought I had better hurry up and read the books as TV adaptations tend to be inferior. (I must say HBO did a pretty good job though.) I was instantly hooked and finished all four books in a week. Today the long-awaited fifth installment called A Dance with Dragons
Let's make it clear: Your data is yours and in Google+ official announcement there's the following "You and over a billion others trust Google, and we don t take this lightly. In fact we ve focused on the user for over a decade: liberating data, ...". John Goerzen is wrong.
i386 systems are dying off and therefore building 32bit Debian packages in 64bit environments is important if you still need packages for i386. For some recent projects I had to set up 64bit-only environments with the need to provide 32bit packages for i386 as well as according i386 Linux kernel packages.
1) Common Debian packages
Just prepend the linux32 command to the build commands and use the -a386 option of dpkg-buildpackage(1). So use linux32 dpkg-buildpackage -ai386 , linux32 git-buildpackage -ai386 , linux32 debuild -ai386 , or whatever build tool you prefer to work with. I personally like using git-buildpackage -S together with cowbuilder. When using cowbuilder it s easy to get i386 Debian packages:
# create initial cow base directory, needs to be executed just once: cowbuilder --create --basepath /var/cache/pbuilder/wheezy32.cow \ --architecture i386 --distribution wheezy --mirror http://ftp.de.debian.org/debian # the "debbuildopts -b" says I want a binary-only build, see dpkg-buildpackage(1): linux32 cowbuilder --build --basepath /var/cache/pbuilder/wheezy32.cow \ ~/foobar_0.42.dsc --debbuildopts "-b"2) Debian Kernel packages If you re building your own kernel images you might be aware of setting ARCH for the common make targets, like:
ARCH=i386 make oldconfigTo build a linux-image Debian package you can use upstream s deb-pkg target, like:
ARCH=i386 make deb-pkgThis should provide you according linux-headers, linux-firmware-image, linux-libc-dev and linux-image i386 Debian packages. But if you need the according source and doc packages as well you might prefer make-kpkg of kernel-package instead, using options like:
DEB_HOST_ARCH=i386 setarch i386 make-kpkg --revision "$KERNELVERSION" \ --cross-compile - --arch=i386 --us --uc --initrd \ --rootcmd fakeroot kernel-image kernel-headers kernel-doc kernel-source3) Debian linux-2.6 kernel packages If you re interested in building Debian kernel images the same way as the Debian kernel team does (AKA linux-2.6) make sure to check out the kernel-handbook. After installing essential software packages I had to set up some symlinks for building:
apt-get install build-essential fakeroot devscripts fakeroot apt-get build-dep linux-2.6 ln -s /usr/bin/gcc-4.4 /usr/bin/i486-linux-gnu-gcc-4.4 ln -s /usr/bin/ld /usr/bin/i486-linux-gnu-ld ln -s /usr/bin/ar /usr/bin/i486-linux-gnu-ar ln -s /usr/bin/objcopy /usr/bin/i486-linux-gnu-objcopy ln -s /usr/bin/nm /usr/bin/i486-linux-gnu-nm ln -s /usr/bin/objdump /usr/bin/i486-linux-gnu-objdump ln -s /usr/bin/strip /usr/bin/i486-linux-gnu-stripThen executing:
apt-get source linux-2.6 cd linux-2.6* debuild -ai386 -us -ucprovided the according Debian packages (linux-doc, linux-headers, linux-image, linux-libc-dev, linux-manual, linux-patch-debian, linux-source, linux-support and linux-tools). 4) Out-of-tree kernel module packages If you want to build external modules which are available as $MODULENAME-source in Debian (e.g. tp-smapi-source) using module-assistant then use the DEB_HOST_ARCH environment variable, like:
DEB_HOST_ARCH=i386 m-a -v --text-mode -k /home/mika/linux-$KERNELVERSION -l $KERNELVERSION build tp-smapiIf the external module is not available for use with module-assistant then compile the module running:
make -C /lib/modules/$KERNELVERSION/build M=$(pwd)whereas /lib/modules/$KERNELVERSION/build is pointing to the build directory of your 32bit kernel.
Two promising new developments need to be mentioned. First, we were approached
by companies that develop hardware for brain-imaging and psychophysics
research. They were curious to learn about Debian as an integrated platform
that offers free software solutions that an increasing amount of their
customers demands (e.g. PsychoPy). Apparently, the movement towards open
research software has finally made it into the business plans of companies, as
they seem to start perceiving compatibility with free software systems as a
competitive advantage. We explained how software gets into Debian, and how its
release cycle is managed. To foster their motivation we also pointed them to
the existing open-source software that is already available or even present in
Debian. Let s see whether we see more Debian-certified research products in
the future.
Lastly, we started talking with folks from the INCF to explore possibilities of
collaborating on INCF projects using Debian as the integration and development
platform. The INCF is an OECD-funded organization that develops collaborative
neuroinformatics infrastructure and promotes the sharing of data and computing
resources to the international research community. At least one INCF project is
already relying on the efforts of the NeuroDebian project. We are going to continue
this discussion during a workshop in September. A report will follow...
Debian people at the booth (f.l.t.r): Michael Hanke, Yaroslav Halchenko, Stephan Gerhard, Dominique Belhachemi. Not shown: Swaroop Guntupalli.
Okay, so the story continues: Joe Brockmeier has posted a rebuttal
to Nina Paley's post that I commented on
earlier today.
Basically, Joe says that Culture is not the same things as
Software, and gives a lot of arguments as to why this would be true. But
I can't agree with him. Let's see why.
His first argument is "One of these things is not like the other". As
in,
But it's far more reasonable and sensible to discuss Perl scripts and software written in assembler embedded on a chip together, and the rights that they come with, than to try to talk about rights to modify sculpture and essays.I don't see how one could combine a perl script with an embedded assembler program, except perhaps over a network, or by using exec() two cases in which the FSF would consider that they are not even derivatives anymore, they are "at arm's length", and it would be legal to do something like this if one bit was released under the GPL while the other was not. At the same time, it's possible to engrave (part of) an essay into a statue, for example. Or make a technical apparatus which looks like a statue but which will play music if you come near it. Both would be valid cases of some artist combining two separate and (at first sight) distinct things into one work.
Sure, you could crowdsource sculpture, but I doubt it will have much practical application. (And certainly difficult over the Internet, but I digress...)It's called RepRap, and it's very much possible over the Internet. Joe moves on, with 'Unintended consequences of forkable prose'.
Take the GNU Manifesto, for example. If you could "fork" the manifesto, I could easily see variant versions modified to justify open source instead of free software.This argument had been brought forward during the discussions which Debian had on the GFDL vote, and has been seriously debunked there. In short: the ability and right to fork someone's prose does not, in any way, give you the right to misrepresent them. While I believe it should be okay for someone to base a theoretical Open Source Manifesto on the GNU Manifesto, I do not believe it should be okay for them to still keep calling it the GNU Manifesto. It's not the same thing anymore, so that should be clear. This is true within Free Software as well: if you fork, you give it a new name, so it becomes clear that you're not the original anymore. Moreover, I doubt the kind of prose found in the GNU Manifesto is the same kind of prose that Nina would like to see in a free culture movement. Not because the GNU Manifesto is a bad piece of writing it isn't but because Free Culture likely focuses on other things than manifestos. Next, we get "Solving a problem that doesn't exist"
The spark that fired off the GNU revolution was a legitimate problem because of non-free code, a user was unable to make use of hardware they (or their university) legitimately owned.(...)
While Paley and others may want the same freedoms to go with cultural works, it is not a real problem in the same sense.Pardon ye me? I am a musician. Not a very brilliant one, mind you, but I play the flute with much enthusiasm, and have done so in a number of places. If you've been to any debconf since 2007, surely you must've heard me play. Also, I've been singing in choirs since I was sixteen which, I just realized, means I've now been singing for more than half my lifetime. Time flies, it must be said. One of the orchestra that I've been playing in was an extended flute choir with a rather unusual instrumentarium: apart from 30-something flautists, the orchestra also had a piano and drummer, a number of guitar players, and a bass guitar. Such an unusual set of music means you have three options: you play original music, written specifically for your group; you play something written for a different set of instruments, without changing anything, and hope nobody notices that it doesn't actually sound very well; or you make modifications. You make a derivative work of the music, so you can actually play it. There, I've said the word. This isn't just true for music; I've yet to see the first theatre performance that is true, word-for-word, to the original script. Also, movies use music all the time. When they do, there are usually two options: either they have original pieces of music written specifically for their movie (as is the case for most Hollywood blockbusters), or they take a piece of existing music, and adapt it so it fits the events in the movie better. By, say, shortening it, so it doesn't run into the next scene. Or by repeating the refrain an extra time, so the words line up nicely with the action. Or by having a group of musicians record a version of that piece specifically for your movie, which is the same thing in everything except the speed so that the feet of the actor walking on the big screen hit the ground in sync with the music. Or... well. You get the idea. By claiming that artists have no need to modify and derive from others, the only thing Joe accomplishes is to show that he really, really, really doesn't know what the fuck he's talking about. Artists have a need to modify other artists' works all the time. The only difference with free software is that they either need to invoke the fair use clause, or need to pay big bucks to the original rightsholder. Sound familiar? Joe finishes up with stating that despite all of that, Free Culture is still possible. And:
That doesn't mean that free culture is impossible. It simply means that different standards apply.Exactly: different standards apply. And why? There is no good reason for that. Because people make money from cultural works? Well, money is made from software, too, that has never been a good enough reason. Because Culture is not functional? How many in the Free Software movement would even be willing to only be doing software all the time, and not ever do anything remotely related to Culture? None, I would say. Culture is just as functional as Software, it just serves different functions. In the comments, Joe clarifies that he isn't against people preferring not to use the ND clause in the CC licenses they select, he's just against demanding that others do the same. That argument would make sense if not for the fact that the FSF demands, mostly, that Software Should Be Free!!1!. By not complaining about the GNU Manifesto, but complaining about Paley's "Rantifesto", which basically complains about the lack of such an environment in the free culture movement, Joe just makes a fool of himself. Anyway, 'nuff said.
It s not often that you get clarity and transparency from a Certificate
Authority, so it s good to see that Honest Achmed has requested his CA root
certificate be included in
Firefox. Really, how
can you not trust a guy whose name is Honest Achmed , and who has such a
strong and clear-cut verification statement:
Honest Achmed promises to studiously verify that payment from anyone requesting a certificate clears before issuing it (except for his uncles, who are good for credit). Achmed guarantees that no certificate will be issued without payment having been received, as per the old latin proverb nil certificati sine lucre .His response to Mozilla s CA Recommended Practices is forthright and trustworthy, too:
Honest Achmed promises to abide by these practices. If he s found not to abide by them, he ll claim it was a one-off slip-up in procedures and that policies have been changed to ensure that it doesn t happen again. If it does happen again, he ll blame it on one of his uncles or maybe his cousin, who still owes him some money for getting the car fixed.I m getting all my SSL certificates from Honest Achmed. He can t be any worse than Comodo
Hello this is the third report regarding my project. As usual, quick
We watched the special features on the Blu-Ray disc, and one of them was an interview with director Florian Henckel von Donnersmarck. He described how he spent a lot of time interviewing both victims of the Stasi, as well as ex-Stasi officers. One of the most disturbing things to me was his almost offhand comment that most of the former Stasi officers still had some pride in performing their jobs well. Even now, freed of the state s ideology, they were proud of the work they did which could be put most charitably as ruining people s lives.
What leads a person to view life that way? How can we try to make sure it doesn t happen again elsewhere?
I am happy to say that most of us have never experienced anything like the Stasi. And yet, small reflections of that mindset can be seen almost everywhere. Societies at wartime or feeling under threat, even Western democracies, can drum up those feelings. In the USA, for instance, the McCarthyism era saw people s careers ruined for alleged anti-state behavior. Contemporary examples include the indefinite detention (I hate that word; shouldn t we say imprisonment ?) of terrorism suspects at Guantanamo Bay, and the terrible treatment of Bradley Manning, who revealed some true but embarrassing things about the US military which really needed to be revealed. Even tobacco farmers and companies are selling a product they know ruins lives, but somehow keep doing it.
And there are still members of the public that try to make life difficult for people that don t think like they do. From organizing campaigns of telephone harassment of colleges that don t perform the American national anthem before sporting events, to tossing about the term un-American (a loaded McCarthyist one, which many may not even be aware) at an inflated rate, we are not immune from attempts at forcing conformity or silence in others, and blind loyalty to state.
I am never in a particularly celebratory mood on July 4, the biggest day for American boasting, faux patriotism, militarism, and general flag-waving. We do have a lot to be proud of and thankful for, but it seems that we celebrate all the wrong things on July 4, and see it as an occasion to proclaim American exceptionalism rather than as one to see how far we ve come and bolster hope for how far we can, and should, yet go.
No, I don t think that the land of the free ought to have operated secret prisons in Europe (nor the Europeans to have been complicit in it), or that the American military was defending our freedom 100% of the time they were deployed, or that it is right for governments to mandate daily recitation of an untrue document (the pledge of allegiance) in schools.
And yet, I am mindful that I have a lot to be thankful for stability, lack of much internal violent conflict, etc. And this particular day I am happy that a post like this is not something that gets the attention of some government agency and mostly that I will have a handful of angry emails to delete.
Next.