How can I copy from files from one Linux (or generally, any Unix based OS) device to another? Assuming both have some kind of network connection, I usually go and install my SSH key on the target device and then simply run scp or rsync, the latter being especially useful if I need to update the remote file tree. If for some reason there was no SSH, I might resort to FTP, SFTP even, SMB, NFS.

The only option Android leaves - at least if you don't want to void the warranty by rooting the device - is this: Connect the device with a cable (remember this being on the same network) and use the worst protocol you can think of to copy files to the device. Even in the latest Ubuntu the version of the library needed for that is to old, so you will have to painfully upgrade it. Rage ensued!!

I'm not even sure whether Google or Samsung, which manufactured the device in question, are to blame for this. One of them however broke the whole concept of networked devices just to force everyone to either rebreak the jailed concept alltogether or ressort to a crippled, restricted Microsoft developed protocol like MTP. What where they thinking a user would need to copy files?

Dear Google, please fix that. Give the users some way to copy files to their device from native Linux environments. Create an app to run an SFTP server, be it jailed to parts of the file system and let me copy files over there as I usually do. I will now have to head to the Market and look for some third party app to copy files. The heck!

Here is a list of very cool, useful projects enhancing the already great Twitter Bootstrap:

  • Lavish creates a Bootstrap colorscheme (CSS and LESS) out of any image you supply. This link will launch a colorscheme for the website of the JDAV Baden-Württemberg.

  • StyleBootstrap will give you a finer grained control over the color choices. It allows you to format fonts and colors of elements of the Bootstrap layout like the Navbar, the text body, buttons and forms.

  • Boilerstrap combines Bootstrap with lots of useful tools you almost certainly want to have like the HTML5 Boilerplate tweaks, Modernizr loading, javascript compression and other useful things.

  • WrapBootstrap has a list of commercial Bootstrap template with an option to buy one if you like it.

Today I tried to copy files to a Samsung Galaxy Tab 10.1. After figuring out, that it will only talk MTP via the USB port, I installed the mtp-tools package and happily ran mtp-detect in a shell.

pimp@eekkater:~$ mtp-detect 
libmtp version: 1.1.0

Listing raw device(s)
Device 0 (VID=04e8 and PID=6860) is a Samsung GT-P7510/Galaxy Tab 10.1.
   Found 1 device(s):
   Samsung: GT-P7510/Galaxy Tab 10.1 (04e8:6860) @ bus 1, dev 17
Attempting to connect device(s)
PTP_ERROR_IO: failed to open session, trying again after resetting USB interface
LIBMTP libusb: Attempt to reset device
inep: usb_get_endpoint_status(): No such device
outep: usb_get_endpoint_status(): No such device
usb_clear_halt() on IN endpoint: No such device
usb_clear_halt() on OUT endpoint: No such device
usb_clear_halt() on INTERRUPT endpoint: No such device
ignoring usb_claim_interface = -9ignoring usb_claim_interface = -22LIBMTP PANIC: failed to open session on second attempt
Unable to open raw device 0
OK.

Truly, the best part is the last line. However, nothing was OKok and some ducking later I figured I had to upgrade libmtp to the latest version by hand. As I'd like future Ubuntu package upgrades not to break my upgraded version and hoping that the maintainers will sooner or later catch up, I decided to build the packages with the new source. Thanks to the package using some modern design paradigms, there was little effort needed to get the whole thing going. Most of the basic steps are similar for other packages and are – among others – documented in the Debian New Maintainer Guide in the chapter on new upstream releases.

The Upgrade Process

First you have to install the build requirements by running:

sudo aptitude build-depends libmtp

Then you can download the old version's source package from the Ubuntu repositories:

apt-get source libmtp

This will automatically download and extract everything for you, so you theoretically could rebuild the old version without any further steps.

Now to the actual upgrade. The libmtp package comes with a watch file, which contains the URL to look at for new versions. Thus you only need to run uscan from inside the package directory:

cd libmtp-1.1.0/; uscan

which – if successful – will output:

libmtp: Newer version (1.1.2) available on remote site:
  http://qa.debian.org/watch/sf.php/libmtp/libmtp-1.1.2.tar.gz
  (local version is 1.1.0)
libmtp: Successfully downloaded updated package libmtp-1.1.2.tar.gz
    and symlinked libmtp_1.1.2.orig.tar.gz to it

Hooray! That's the version we want. Next you need to unpack the new source and copy all Debian build specific stuff over there. This action being quite common among the build processes, there's a helper for that as well. Run

uupdate -v 1.1.2 ../libmtp_1.1.2.orig.tar.gz

which – if successful – will output:

New Release will be 1.1.2-0ubuntu1.
-- Untarring the new sourcecode archive ../libmtp_1.1.2.orig.tar.gz
Unpacking the debian/ directory from version 1.1.0-3ubuntu1 worked fine.
Remember: Your current directory is the OLD sourcearchive!
Do a "cd ../libmtp-1.1.2" to see the new package

Do as it says to change to the new package.

cd ../libtmp-1.1.2

There we will apply patches to the source tree, which are included in Ubuntus version of the package and adapt it's behaviour to the specifics of Ubuntu. As most of the patches failed, I figured I'd only keep the one which worked and looked like it did more than add support for some devices. The file debian/patches/series contains all patches that will be applied. Edit it and remove all patches except for 1002-udev_rules.patch.

echo 1002-udev_rules.patch > debian/patches/series

Now we will apply all (that single) patches to the sources by running:

while dquilt push; do dquilt refresh; done

Next you have to update the changelog file to reflect the new version of the package. There is a helper for that as well which will fill out almost everything you need. Run:

dch

and add any comment as you wish, for example "Fix libmtp support for the Galaxy Tab". There are some rules, which you would have to follow if you were to distribute the package through the official Debian/Ubuntu channels, but let's just assume you won't.

One more thing to do before you can start the build. One filename in the upstream release is different, so you will have to run

sed -i -e 's/39/69/' debian/libmtp-common.install

and point the build system to the right path. After that you're ready. Fire up

debuild

and watch the whole thing build – it will output quite some lines during the process. After it has finished, you should have (among others) the following files

$ ls ../*deb
../libmtp9_1.1.2-0ubuntu1_amd64.deb
../libmtp-common_1.1.2-0ubuntu1_all.deb
../libmtp-dbg_1.1.2-0ubuntu1_amd64.deb
../libmtp-dev_1.1.2-0ubuntu1_all.deb
../libmtp-doc_1.1.2-0ubuntu1_all.deb
../libmtp-runtime_1.1.2-0ubuntu1_amd64.deb
../mtp-tools_1.1.2-0ubuntu1_amd64.deb

in the parent directory. Go ahead and upgrade your installed packages by running [*]

sudo dpkg -i ../libmtp9_1.1.2-0ubuntu1_amd64.deb ../libmtp-common_1.1.2-0ubuntu1_all.deb ../libmtp-runtime_1.1.2-0ubuntu1_amd64.deb ../mtp-tools_1.1.2-0ubuntu1_amd64.deb

Run mtp-detect again and it will output a long list of specs for your device. Hooray!

[*] Warning: Your file names may differ if you're not on a 64bit machine.

Beim Abwischen der Küchenplatte hab ich das da gesehen und fotografiert:



Im Treppenhaus ist der Steinmetz zugange und schleift gerade zum zweiten Mal die Treppen ab - diesmal wohl recht gründlich. Das sieht dann so aus: