Assorted random notes

This post is just a bunch of random notes, but I think that things are going well, this time.

# Btrfs

Just started playing with btrfs after converting a 2TB disk with about 1.3TB of data from ext4 to btrfs. This particular filesystem contains my backup data and I hope that btrfs is able to live up to high standards.

I will probably write a detailed review with my impressions, but suffice to say that it is working fine and I hope that I will be happy for a long time to come. My other filesystems, for the moment, will be ext4.

Thanks to John Lehmann's generosity, now coursera-dl has a new home: a github organization of its own!

Some people may have noticed, others may not, but when downloading videos from Youtube, they apparently are getting more aggressive with the use of Dynamic Adaptive Streaming over HTTP (also called DASH) and, as a result, some (perhaps going to be all in the near future?) of the videos may not be available in the resolution/formats that you used to like (like me, with format number 35).

By the way, one thing that is interesting with youtube videos provided via DASH is that they are available in different streams: one for the video and another for the audio.

What does this mean in practical terms for users of youtube-dl? Well, if you wanted to download videos in resolutions like the 480p (format 35) that I mentioned, then you will probably have to change your way of doing things, until a more automated solution is in place.

You will have to download both the audio and the video and, then, "combine" them (that is, multiplex them) to create one "normal" video file with both the audio and the video. I usually do this via:

 ffmpeg -i audio.m4a -i video.mp4 -vcodec copy -acodec copy combined.mp4 

If you prefer having a Matroska container instead of an mp4 container (which, BTW, results in smaller muxing overhead), then you can use the command line:

 mkvmerge -o combined.mkv audio.m4a video.mp4 

Oh, those m4a and mp4 extensions are a new addition that I just sent upstream (in the past, both would have been named with an extension of mp4).

As, an aside, I like formats 135 for video and 140 for audio, for the reasons that I mentioned in a comments to issue 1612:

Otherwise, to download 480p videos (which I do for lectures and so on with other projects of mine, like edx-dl) I have to call youtube-dl twice: once for format 135 and another for format 140, since the old format 35 files are much smaller than the lower resolution 360p files (due to the former being encoded in High profile vs. the latter being encoded in Constrained Baseline profile).

While this is unfortunate for some, this is a good thing for others: I once had a blind user of youtube-dl asking me if he could avoid downloading the whole video just to extract the audio, so that he save on bandwidth. Well, now this is possible.

Expect a new version of youtube-dl to be uploaded soon to Debian unstable.

# Music

It is so nice to see the music that I like getting better. It was particularly pleasant to see Tarja Turunen being joined on stage by Floor Jansen.

In fact, it is my impression that the once female-fronted bands are getting more and more into collaborations and side-projects and they are, in many ways, getting more refined. Examples of this includes Floor, Tarja, Anneke van Giersbergen, Sharon den Adel, Kari Rueslåtten and many others that I can't remember right now.

Of course, some thanks to people that take the time to film, and upload/share the videos so that other people not at these events can watch them is highly appreciated and they usually are treated as anonymous, but, of course, this should be fixed.

Posted
Quick tip #1

I wrote the following as part of a post to an discussion forum (I can't remember which one), and people told me that they liked this information and said that others would profit from it if I posted it on my blog, which I now decided to post.

The context: for homework of one MOOC, people were trying to download a large virtual machine image that was offered both via an official HTTP source, which was slow.

Other students started saying that the bittorrent download was faster up to a certain point and, then, things slowed down a lot. Of course, they got faster to the point where lots of pieces were already well distributed and, then, only the everybody had already downloaded things and, then, only the seeder had the missing segments of the torrent.

Then I commented with:

Depending on your bittorrent client, you can add the original HTTP download as a "Web seed" and, this way, your client will download both from the peers and also from the web to fill in parts that are not yet available.

One such client is the Free (as in Freedom) qbittorrent, but I guess that others also have this option.

Posted
SNA Acceleration vs. UXA Acceleration

Seeing as recent versions of Xorg have made it into Debian's testing (which I am using right now, instead of my usual sid installations), I decided to see what they would bring me in terms of performance, since they have the SNA acceleration implemented as well as the standard UXA acceleration.

Well, I did not have any other tests to perform, but below are the results on my wife's laptop (a Core i5 2410M), when running gtkperf:

# With UXA

GtkPerf 0.40 - Starting testing: Mon Aug 12 20:33:20 2013

GtkEntry - time:  0.19
GtkComboBox - time:  5.36
GtkComboBoxEntry - time:  3.59
GtkSpinButton - time:  0.60
GtkProgressBar - time:  0.41
GtkToggleButton - time:  0.73
GtkCheckButton - time:  0.48
GtkTextView - Add text - time: 21.72
GtkTextView - Scroll - time:  2.29
GtkDrawingArea - Lines - time:  6.18
GtkDrawingArea - Circles - time:  6.74
GtkDrawingArea - Text - time:  4.32
GtkDrawingArea - Pixbufs - time:  0.67
---
Total time: 54.25


# With SNA

GtkPerf 0.40 - Starting testing: Mon Aug 12 20:36:58 2013

GtkEntry - time:  0.21
GtkComboBox - time:  4.86
GtkComboBoxEntry - time:  2.67
GtkSpinButton - time:  0.59
GtkProgressBar - time:  0.24
GtkToggleButton - time:  0.61
GtkCheckButton - time:  0.51
GtkTextView - Add text - time: 17.19
GtkTextView - Scroll - time:  1.84
GtkDrawingArea - Lines - time:  2.70
GtkDrawingArea - Circles - time:  2.65
GtkDrawingArea - Text - time:  1.72
GtkDrawingArea - Pixbufs - time:  0.11
---
Total time: 36.91


So, with SNA, the timing that I get are almost 2 times lower, which is superb for a very simple /etc/X11/xorg.conf config file:

Section "Device"
Identifier "Intel Graphics"
Driver "intel"
Option "AccelMethod" "sna"
EndSection


I have not noticed any change, but if drawing graphics faster means that I get a bit more of battery life, then I will be super happy. I still have not tested if this works on my notebook with a Core2Duo T7250. Crossing my fingers so that it does.

Posted
Beginning Ruby

These are some very rough/sketchy notes that I took while doing the exercises on the introductory track of the Ruby language at codeacademy. They were written from the point-of-view of an amateur programmer in C and Python (read: "me").

Since this is my first time with Ruby and I only have about 1 week of experience with it, these notes are likely to contain many mistakes, many simplifications, many omissions or simply gross errors. I would love to be informed of such facts so that I can fix them and not write code that is burdensome for others to maintain.

# Operators

• Math operators: +, -, *, /, %, ** (just like Python)
• Relational operators: ==, <, >, <=, >= (just like other languages)
• Boolean operators: &&, ||, ! (just like C/C++/Perl)
• The combined comparison operator ("spaceship operator", like Perl): <=> (follows the spirit of what strcmp in C does)
• Conditional assignment operator (||=) only assigns a value to a variable if that variable is bound to nil.

# Numbers

• You can write number literals embedding an underscore (_) for readability purposes.

# Basic I/O

• Output: print and puts. Both print strings to stdout, but puts also appends a new line to the end.
• Input: gets accepts an input from stdin and returns a string.
• To convert a string foo to an integer, use the Integer(foo) constructor. It throws an exception if it cannot convert the value.

# Strings

• Strings have at least some methods: .length, .reverse, .upcase, .downcase, .capitalize, .chomp (like Perl, removes the trailing endline)
• .upcase seems to have problems with non-ASCII characters, like é.
• Interpolation is performed by putting the name name of the variable inside a string and delimited as #{name} at the place we want the interpolation to occur.
• Methods like .capitalize don't change the string (they return a new string capitalized). To change the string, you call the method .capitalize! (with a ! at the end of the name of the method).
• Other useful methods: .gsub for globally substituting a regular expression (and its variant .gsub! for inplace modification), and .include? to verify if the first string includes another.
• Another method: .split(" "), to split on the string specified as argument.

# Control flow

## If

• The syntax of a if is:

if expression1
block1
elsif expression2
block2
else
block3
end


note that it ends with the word end, there are no need for parentheses, no braces, no colons, and the keyword for "else if" is elsif (different from Python's elif).

• The "if" can also be started with the keyword unless instead, which checks if the expression is false rather than true (as is the case of if).

## While

• The syntax of the while is similar to other languages:

while condition
block
end

• A variation of the while is the until, with the same syntax, except for the until in place of the while, and that it iterates when the condition is false, instead of true.

## For

• The simple case of iterating over a range of numbers is:

for i in 1...10
block
end


Like ranges in Python, the 10 is not included (the variable i iterates from 1 to 9).

For an inclusive range, we use two dots (1..10), instead of three dots (1...10).

## Loop

• To iterate a block, we can use the loop keyword, as in:

loop { block } # with braces


or as in

loop do # note the pair do/end in place of braces
block
end

• It is useful to use break when using loop to break out of the infinite iterations.

• Similarly, we can use next as in other languages (the same as continue in C or C++).

# Arrays

• The equivalent to Python's lists are arrays and they are declared in the same fashion:

my_array = [1, 2, 3, 4, 5]

• Arrays in Ruby are 0-based.

• Every array has an iterator called the .each method. The basic syntax is:

object.each { |item| block } # do something


which can be written as:

object.each do |item| block end


where the name between | | is bound to (a copy of?) each element of object in turn. The equivalent in Python would be:

for item in object:
block

• Arrays can be sorted with the .sort method (or its sibling .sort!). When passing a parameter, it is useful to use the spaceship operator (<=>) (like Perl) to specify a custom order (similar in spirit to what we do with Python's key argument to the sort method of a list). Example:

 my_array.sort! {|a, b| a <=> b} # Ascending order
my_array.sort! {|a, b| b <=> a} # Descending order

• The .push method appends an element to an Array (similar to Python's .append).

• The empty Array is denoted by [], like an empty list in Python.
• An iterator (like (1..10)) can be converted to an array with the .to_a method.

# Hashes

• A literal hash is defined by the syntax:

my_hash = {
"key1" => "abc",
"key2" => 2,
"key3" => false
}


Quite similar to the version in Python:

my_hash = {
"key1": "abc",
"key2": 2,
"key3": False
}


In fact, in Ruby 1.9, you can write, instead:

my_hash = {
key1: "abc",
key2: 2,
key3: false
}


which is very similar to Python or JSON.

• The empty hash, OTOH, is defined by calling the constructor .new of the class Hash:

my_hash = Hash.new


The syntax used by Python can also be used: my_hash = {}

• Iterating over a hash is done the same way as done for an array, but the .each method gives both the key and the value, as in:

my_hash.each do |k, v|
puts "#{k}: #{v}"
end

• To iterate only on keys, we use the method .each_key. To iterate only on values, we use the method .each_value.

• A hash can be sorted with the .sort_by method (to sort by keys, values or any expression involving them) and since it can be ordered, we can reverse (in-place) the order of its elements with the .reverse! method. This makes Ruby's hashes to "taste" like Python's OrderedDict's.
• When one initializes a hash, one can specify a default value to the .new method (e.g., foo = Hash.new(0)), which makes it convenient to do the equivalent of Python's defaultdict or Counter.
• You can select part of a hash by using the .select method and giving it a block. For example:

good_movies = movie_ratings.select{|k, v| v > 3}


# Functions/methods

• Functions in Ruby are defined with the word def (as in Python) and end with the word end, as other composite constructs. Example:

def square(n)
return n*n
end

• Parentheses are optional in Ruby, unless they create ambiguity. So, to call the function above, one can use any of the following:

square(2)
square 2

• A function can take a block as a parameter (and this is what .each does, for instance).

• Functions can take a variable number of elements with the splash operator (denoted by *), which puts the extra parameters in an Array (like Python).
• Functions can have default parameters, which are set in the "prototype", just like in Python or C++.
• If the return keyword is omitted from the method, Ruby uses an implicit return, where the value of the last executed expression is returned to the caller of the method.

# Symbols

• Any instances of a given symbol share the same ID. This is due to the fact that they are immutable.
• Symbols start with a colon (:) and they can contain any character that is valid for a variable name.
• It is possible to convert between a symbol and a string with the methods .to_s and .to_sym.

• Single line comments use the hash symbol (#).
• Ruby also has multiline comments, which are delimited by a line beginning with =begin and a line beginning with =end.

# Lambda functions

• A lambda function in Ruby is defined, as expected, as, for example:

foo = lambda { |x| x.to_sym }

• The basic differences between a lambda and a proc is that:

• A lambda checks the number of elements that it receives, while a proc doesn't and assigns nil to parameters that it didn't receive (a proc seems to ignore extra parameter that it wasn't expecting).
• When a lambda returns, the control goes back to the function that called the lambda, while when a proc returns, the control is returned also from the function that called the proc.

# Classes

• "Everything is an object in Ruby." (At least one exception are blocks).
• To test if an object is of a given class, you use the method .is_a? on the object and the type as argument (e.g., foo.is_a? Integer)
• The "null" value in Ruby is nil. It is equivalent to None in Python.
• The only "falsy" values in Ruby are false and nil. The others are "truthy", differently from C/C++/Perl/Python.
• For a given object, the method .object_id returns what is the "address" of that object.
• Classes in Ruby are created with the syntax

class ClassExample
# body
end


(That is for a class that has is not derived from other regular classes).

• Constructors in Ruby are called initialize. An instance of a class is created by calling the method .new on the class name (and passing parameters as needed for the initialize method).
• Instance variables are named with 1 at sign (@) as a prefix. Class variables are named with 2 at signs (@@) as a prefix. Global variables are named with a dollar sign ($) as a prefix. • Class methods are declared inside a class prefixed with self. and they are called with the class name suffixed with the name of the method. For example, for a class MyClass, with a class method class_method, we call it as MyClass.class_method. • When overriding a method in a subclass, one can call the method from the parent class with the keyword super, as in super(arg1, arg2). • Ruby doesn't support multiple inheritance. In place of multiple inheritance, Ruby offers mixins. • To access one attribute, say @my_attrib, in Ruby classes, one usually creates two methods to manipulate it: a method with the name my_attrib, that returns the value of @my_attrib (a getter) and a method with the name my_attrib= that accepts a parameter to set @my_attrib to (a setter). There is syntatic sugar for creating both getters or setters. For a getter, you declare attr_reader :my_attrib (the member name as a symbol). For a setter, you declare attr_writer :my_attrib. If you need both a getter and a setter, then you can abbreviate them with attr_accessor. • All methods, by default, are public in Ruby. To explicitly mark something as public, you use the keyword public. To mark something as private, you use the keyword private. # Modules • You can import a module with the keyword require (as in Perl) and the name of the module in quotes. • One example of a module is the benchmark module, which provides the Benchmark class, which has the method .realtime, which takes a block and reports how much time it used. • To create a module, use a syntax similar to that of a class, but substituting the keyword class with module. • The scope resolution operator in Ruby is the double colon (::), like in Perl. • To create a method inside a module, you have to prefix it by the name of the module with a dot or with self., if you want to create a method to be called outside the module. The same also holds for creating class methods (as opposed to instance methods): they can be simply named self.foo to get a class method called foo. • While some modules are already "preloaded" by the interpreter (e.g., Math), others need to be explicitly loaded. We do this by using require 'foo' to load the module (in the file foo?). # Mixins • A mixin is the use of a module to "enrich" a class, adding "instance" methods of the module to the class. It is, in a sense, a way to have some of multiple inheritance in Ruby (without its headaches?) • Using the word include Foo imports the items of the module Foo in the current namespace for instances of a class. • Using the word extend Foo imports the items of the module Foo in the current namespace as class methods/attributes. # Conventions • Local variables are named in lower case, with parts separated by underscores, as in my_name. • Methods that return boolean values have a question mark (?) at the end of their name. • Methods that have destructive side-effects (like changing their input) have an exclamation mark (!) at the end of their name. • Code is indented by 2 spaces. • Like other languages, constants are written in all caps, with words separated by underscores. For example, MAX_VALUE. • Global variables are prefixed with a dollar sign (e.g., $Foo).
• Classes are named in camel case (no initial lowercase).
• The "poetic mode" in Ruby recommends one to omit the parentheses on function calls (whenever unambiguous) and, in essence, to write as little "bureaucracy" (like the explicit return keyword in methods).
Posted
Playing with MOOCs

Not so much ago, we had a boom of new enterprises offering Massive Online Open Courses (MOOCs for short).

First were Thrun and Norvig (Artificial Intelligence), with Widom (Introduction to Databases) and Ng (Machine Learning). Then, these initial experiments led to the creation of Udacity (founded by Thrun) and Coursera (founded by Ng and Koller).

I have been keeping an eye on them for some time and, in fact, I have been contributing to a project similar to youtube-dl (which I package for Debian), but focused on downloading videos from Cousera, called coursera-dl.

I started contributing to coursera-dl because I wanted to stratch some itches with downloading with aria2c, but soon the original author of the project granted me write permission to the repository and I have been one of the persons that commits the most, which is strange, since I was not the original creator of the program.

So far, from the courses that grant certificates, I have concluded the following:

• Algorithms: Design and Analysis, Part 1 (Coursera)
• Machine Learning (Coursera)
• Introduction to Databases (Coursera)
• Quantum Mechanics and Quantum Computation (Coursera)
• Introduction to Cryptography I (Coursera)
• M101P: MongoDB for Developers (10gen)
• M102: MongoDB for DBAs (10gen)
• M101J: MongoDB for Java Developers (10gen)

I have to say that this have been a pleasant experience, with some of the courses being challenging, but not up to what an undergraduate course would be (and the fears of some people that such courses would threaten the conventional University-style model are a bit far at this point).

Anyway, talking about challenging courses, in particular, prof. Umesh Vazirani's "Quantum Mechanics and Quantum Computation" had a lot of (computational) work and this was one of the courses that prompted me to use a computer algebra system for manipulating some tedious calculations.

In particular, I used a mix of the online SAGE math server and Wolfram Alpha, whichever I found the syntax to be easier to use for the problem in question. It is with happiness that I see that there are efforts to get SAGE again packaged in Debian.

Another (positively) surprising course has been Dan Boneh's "Introduction to Cryptography I", which was more theoretical and more serious than what I was expecting. It even included some nice proof sketches and discussion of recent results. The last course on cryptography that I took was in 1998 and a lot of things changed since then, including the way to think about cryptography. But more on that on a future post.

There are some other courses that I may be completing soon and that I will post more about, with some reviews of the good and the bad parts of select ones.

Posted
Working with CVS via Git

The easiest way of using git locally to commit to a CVS repository is to have both a git clone of the CVS repository and a CVS checkout of your repository.

# Initial steps that Work for Me (TM)

1. Create your git clone of the CVS repository:

git cvsimport -v -a -A /tmp/lame-authors.txt -k -m -d \
:ext:rbrito@lame.cvs.sourceforge.net:/cvsroot/lame lame


The command above will create your clone of the CVS repository in the current directory which we suppose, for the sake of this discussion, is /tmp/gitified.

If want to specify a directory different than what you're in, then you should add the option -C /path/to/git/repository.

2. Create a checkout of the CVS repository for CVS work stuff (I'm checking out things under /tmp):

cvs -z3 -d:ext:rbrito@lame.cvs.sourceforge.net:/cvsroot/lame checkout lame


This will create your CVS checkout on the directory /tmp/lame, assuming that you are working under /tmp, as I do.

# Doing real work

1. Go to your git clone (/tmp/gitified) and start hacking, committing, etc.

2. When it is time to send your patches to the CVS repo, you have to:

export GIT_DIR=/tmp/gitified/.git
cd /tmp/lame
git cherry origin master | sed -n 's/^+ //p' | xargs -l1 git cvsexportcommit -c -p -v


This will automatically check in all the commits that you have made in the previous step.

1. First, discard your commits in your git repository, so that you don't get further problems with git cvsimport.
2. Update your git repository with the current contents of the CVS repo:

cd /tmp/gitified
git cvsimport -v -a -A /tmp/lame-authors.txt -k -m -d \
:ext:rbrito@lame.cvs.sourceforge.net:/cvsroot/lame lame

3. Update your CVS repository with the current contents of the CVS repo too:

cd /tmp/lame
cvs update


# Conclusion

Of course, I would prefer a simpler, leaner workflow. If you happen to have one, please let me know.

Posted
Lack of cooperation from Ubuntu?

I posted the following on Google+, but it is important enough to be reproduced on Planet. I'm editing it a bit, as it is a followup to my previous post.

While improving the packaging of MongoDB, there was one thing that caught my attention: that Ubuntu had already done some of the embedded/convenience libraries work, but they had not pushed that work to Debian.

Of course, discovered this only after I started working on the improvements of the package.

What gives, Ubuntu people?

Another thing that I saw is that they have patches enabling mongodb working on armhf. Again, they did not push those to Debian.

Why this lack of cooperation?

Another thing that I saw is that they had packages for version 2.2 (more precisely, raring has 1:2.2.4-0ubuntu1), while Debian sid just had 2.0 until very recently.

Why not push this work and avoid duplication of work?

By being a good downstream, I intend to push some of the patches to MongoDB upstream (if they want it), so that we (Debian) have a smaller delta. This will benefit you Ubuntu guys. Why not join forces and help have a world-class set of packages?

Please, be good netizens and share the work that you have. I firmly believe that the armhf people will be happy to have one of the fancy "cloud" software available on ARM, especially since the prospects of having ARM machines on datacenters.

Oh, just for the record, the kFreeBSD people have sent their contribution and I would love to see (if possible) this running on the HURD.

Posted
Some recent Debian activities

I have been occasionally working on some Debian-related tasks.

# Chrony

One of those was to get chrony is a slightly better shape, by using, at least, a patch system (indeed, I "modernized" its packaging with the format "3.0 (quilt)"), put it in a git repository and would like to receive some comments on what I have so far.

The bug Debian bug #694690 contains a very brief description of my intentions and of the problems that I see in the current package. IMVHO, it is a very nice NTP client and server and it could even be used as the default for Debian, once it gets in shape. There is at least another high-profile distribution, namely Fedora, that switched to chrony as its default NTP software. We can certainly take a look at what they are doing and join forces here.

# MongoDB

Another package where I spent some time was with mongodb: MongoDB is a tricky package that is only built for 2 arches: amd64 and i386. The version in unstable for i386 was 2.0.x (roughly the same as for wheezy), which the version in unstable for amd64 was 2.4.1, which has many features that 2.0 lacks.

The packaging of it is a bit tricky, since the source tree has bazillion embedded/convenience libraries (e.g., Google's v8, Mozilla's spidermonkey, BOOST, Google's Snappy, PCRE 3 etc.). Up to version 2.4.1-2, it used all these convenience copies, which is of course, a problem for a distribution like Debian.

I changed part of the build process to use the libraries that we already have in Debian and, as Antonin Kral uploaded this newer version, unsurprisingly the binary packages are smaller (especially if you take into account that a handful of the libraries may already be installed on the system).

A few hours later, Antonin uploaded a new upstream version, which means that we now have better MongoDB packages to play with. I am, in fact, really playing with MongoDB as my first NoSQL database, since 10gen is giving an introductory course on how it works and my motivation was to get what we have in Debian in shape for the course.

You can say that I am a firm believer of the "eat your own dogfood" principle.

Regarding MongoDB only being built for i386 and amd64, the BTS has a patch to enable building for kFreeBSD, but the patch is for the 2.0 series and the code has changed so drastically in relation to the 2.4 series that there is no hope of it applying. It would be super nice to have MongoDB working on kFreeBSD and on HURD also, though.

# nocache

There is a very nice command line program called nocache that was packaged by Dmitry Smirnov (and just approved by the FTP masters!) whose packaging I briefly reviewed per Dmitry's request and this is an amazing utility whose purpose is to bypass/minimize file system caching for a program.

This is especially useful when you are making backups (reading lots of files that would, otherwise, fill the filesystem cache, even if they are not used frequently) or if you are just streaming one file (possibly larger than the system's RAM) to another computer and you have no need to use the file immediately after that.

It performs its job by using the LD_PRELOAD mechanism and using posix_fadvise's flag POSIX_FADV_DONTNEED for the files that will be touched.

# Post note

Oh, just one aside: for the readers of Debian Planet and other aggregation services which are not Debian Developers/Maintainers, I contributed to these packages without being the maintainer of them, just scratching some itches and contributing back what I produced.

Posted
Looking for (Free) a Video Editor

Let's suppose that you went to a show of your favourite some time ago and you were able to sneak in a camera (well, in those times, cell phones weren't able to record much more than 176x144 pixels at 12fps).

But, then, you suddenly found that some people uploaded (short) fragments of that very same show to youtube and, collecting those, you may be able to create a "multi-camera" version of the video that you can record to keep of your memorable concert.

The multi-camera, in the sense above, is not the same as multiple angles (like some DVDs), but something like a TV broadcast, where the stage is filmed by cameras positioned at some places and the image that is broadcast is switched from time to time according to that who is singing, or playing etc.

So, Dear Lazyweb, do we happen to have any Free Software (preferably already packaged in Debian) that is able to help with the task of "aligning" (in time) videos from various (different) sources so as to produce one multi-camera video?

What would my options be? I asked this on youtube for a person that did exactly what I want and their answer was Sony Vegas, which I fear that does not exactly would be allowed in Debian.

Any comments are welcome, thanks, and if I am successful, I will upload the final video.

Posted
Another meme: The Geek test

I was with some spare time a few days ago and I took one of those stupid tests that are so popular in the Internet. Well, here are the results, saying that I am, indeed, a Geek, which does not surprise me that much.

I did expect my Math score to be higher than everything else (I'm only in the 90th percentile with respect to this), while I am high on the Computer side of things (in the 97th percentile).

I guess that I should devote myself to more Mathematics and writing less code.

Posted