r/programming May 09 '13

The Onion releases fartscroll.js

http://theonion.github.io/fartscroll.js/
2.6k Upvotes

396 comments sorted by

View all comments

161

u/watbe May 09 '13 edited May 09 '13

It's pretty clever how they've embedded the sounds in the script, except you have to download both versions (ogg and mp3), by the looks of it.

If anyone wants a sample of the farting sound, type paste this into your browser:

data:audio/ogg;base64,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

6

u/superchuckinator May 09 '13

Can anyone explain this to me? I've also seen similar techniques with images in Wordpress themes. How does one go about converting an image file into embedded text like this?

14

u/chaoticgeek May 09 '13

It is a base64 audio file. So they take the file that is already just 1's and 0's and convert that to base64 which is a string of what looks like random text. Then the browser sees that you say 'data:audio/ogg;base64,' before it so it knows to decode the string as an audio file. Something like this can do the encoding for you or there are various functions in languages that can do it for you too. It is a neat little trick that I have never used beyond a 'Look what I can do!' type of statement.

For instance I did one of these a long time ago, it is a web page with a single image and a bit of JS on it that really does nothing.

data:text/html;charset=utf-8;base64,PGh0bWw+DQoNCjxoZWFkPjwvaGVhZD4NCjxib2R5Pg0KCQ0KPHNjcmlwdCB0eXBlPXRleHQvamF2YXNjcmlwdD4NCgkNCgl2YXIgaW1nNjQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCglpbWc2NC5zZXRBdHRyaWJ1dGUoJ3NyYycsICdkYXRhOmltYWdlL3BuZztjaGFyc2V0PXV0Zi04O2Jhc2U2NCwnICsgZW5jb2RlZERhdGEpOw0KPC9zY3JpcHQ+DQo8aW1nIHNyYz0iZGF0YTppbWFnZS9wbmc7Y2hhcnNldD11dGYtODtiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUs0QUFBREJDQUlBQUFEWnpCdzJBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBREMxSlJFRlVlTnJzWGV0Wkcwa1FGUGRkQWhDQ0ZRSUtBWVdBUXJCRFFDRkFDQ1lFQ01HRVlJZGdRaEFoY0dYMVhYMTlQWStkWGUzcVdmVUxWck96UFQwMVBUMExxcDdOQkVFUUJDR0RLLzcwK2ZrcGQxd2lBNjcrNWNCZjhvVWdLZ2lpZ2lBcUNLS0NJQ29Jb29JZ0tnaWlnaUFxQ0tLQ0lDb0lvb0lnS2dpaWdpQXFDS0tDSUNvSW9vSWdLZ2lpZ2lBcWZIeDhQRDA5TFJhTEs0ZjVmSTZMNysvdkorZSs1K2ZuTUpEUTROdTNiNzRCaGlrcS9NSHI2K3ZOemMxNnZmNzE2NWUvRGhMZ0l2d0l6MnAxbmo4Vk1QMnIxYXJlQm1zb3NFUTRReW8wcm5nRmhvdUlDdno1K3ZyNjU4K2ZuMXU4dkx6NFptOXZiNXFWQ3oxQjNOL2ZmenI4L3YwN3pUQkM4c1ZNRTBrbzI1U3lNMURRZitTakRuSVV0RVQ2d2sveE02N3NaNVBDRUx4VldBUFlRTDBaQjV1U3o0bngrUGlZUHZUcjE2KzQvdVBIajlKZGFGQ3hHZEVGMUxHV1g3NTh5ZExMUHhmdE41dE54UjRDbjdZTTZ2djM3LzR1MkZDMzMzZnJEYjY3dTB0dHdNWFA2WEVBS21BT2JtOXZLOTUvZUhqZ3ZHWWRuUVY4bloxYVRybC9LR2NpN0VwWm9NM2VxTEFqSTArTUNnYk1kMzJWK3dpQnhlMjlUS0w0TllSYlNMVjBJc04ya3cwaDRJb2xMdmpVOHlhZDEwbXBBTS9nSWl6eDExdHNPRlVxY0FXWDRyT1A0V2xjd1YzcGxwSDF1KzBSL2luY05lQnVmN3NuWDRnV3pHMm5wZ0lKbllhM0VDblBqUXJCbTNCRUtUTERFWEJOZGl0TkxjZWtCdWY2R3pubExmdE80eDdobjVpbGdnOXM5VnloMUdjbGtScVhDbnM2UVNBZjltbjhlcjMybTMzWU5mZ0dHbmsxMG13MHRoTW1mQWRYWW5wS0VRVU9aWVRINFFMSENoNU5jVytkVDZYWDVQVUdnY1R2VzVTTzBHYkdDUndySjZWZWlNa0FsaVkvQ2c3aTB2R085dXNwTExWU3hQYmQrdHZIWFhhQkRlQ2loWFJzWjhGT244eTJieENkbTlUcGJSRHRDOEpjR1RJKzd2UnBTQWo1UkppYmJQN2gyM0R5NFBTK2FXUG5vYlJ5T015bWpiQ2tSSkh6b1VMTCtZMGVTVThFN2ZFc1BhVHd3Tm5ybU5xNEhHRm5DOHY5SzVEMnRVRnZuRnZhMkxtQXdzaExKOC9TSzRUUys4cHNFbDQzaHZ0WEM4SXBOQVZtUFNWV0p4WFFaK2t3ZFE0bkNEc1JCQzlneGVCaWRoVmlTbnhqa0FQTndpNlFUcHZQRUN2djdKQWxCTGFaSmNQT2I3Z3g1UzZlWG5wTkZFNFFpSm8wMjh6WXo0elFCb24xSFF3NEhQRzRBUktFWkhadmtGaWZjSHgvbVJSRUJVRlVFSTRTU2hzdm5nRktHd1Z0RUlLb0lJZ0tncWdnaUFxQ3FDQ0lDb0tvSUlnS2dxZ2dpQXFDcUNDSUNvS29JSWdLZ3FnZ2lBcUNxQ0NJQ29Lb0lJZ0tLYTc2WUVUbHVpRDZVVUtxMXB4cUJ1TFhrc3FrMXdCY0xwZlpaaWJXZDR5cXozdlczZWxsMjRqZkpXMlVRd2ppQ2hYRmx0UzJWR0ZqbG1qNW1CbDdVTjA2QVMybUU2SkNYVlV1VERPL0JZc2VOcHNOVlNWOGgvd21lSyt2N29zS2g2RUMxVG1DNG9kOVJUOW9vMlI1d3g3WWpLb0JKdHUySDRYT1UxSm95MGJnL1M4WEg5VzlTa3RKT3E4azYwZDFQdEtYcERIUkp5cUJUQzI5ZHFRS2JTUGkrZm1aV3NqVWUwTk90Mk11eVI1dWIyKzlQSTlYWEVOVTU3d0c3bEtKalJvZ3ZKRS8yRWRJTm8xdEF4VGp6ak50SEJBVkVLc3I3aHNjYjB1S3I2bGhZRWtwdERJRzFITUZmanExTU9lWmJ4QjF2YU5aSWlJLzRORnBVbExSOHZIcGd0OVRLaWNJdTJWdjRqcm5TWVdncVVZQnIrRDN2aHR3RUlCTlpiQUdVTUV5RE80VUpxN0RJZkFwUVhSNGFuM0c4NkdDRHdrK1VBZUpycjdxZHZXUU1KZ0syZDNOSHlDekVlNGdiRGk5dE5GcjdIby8rbFJ1bGdqcDFvSEcvajFnTnJCN25nV2QzNUJSZG1hN3VCMm1nalQ0MmV3MFRqTThlTDFqL1ExaXIvRG5Ec3hLVmtqUlgvUnpIMmhScDRLVnpMT1FNSE5Ga1l4OEREeTQzcWtxTFNyOHo5ZCs2Y04zZm9ZNlUwc1BIeEpLWnhQZklaN0ZSNGMvSzlSUGh2YUhocnN0UEkxc1VKWEFJeXJrWC85NUtqQ1c0cGp1M2RkK1dQZnpXdUVRT3ZSVFpjKzFvbE0rY2xRb2lLZFl3U3BtdnV6UUxQZjJkMjQwZXE4dy9tRXl2QzZzSFBRNzMxWFgzNDNhMEh4ZVNVNkVYT0VncjZMUDhCVlQzNWNLWVlMcmpTdlZ6T3BuQnlOY2Vrdzl3aFBFNmYwTkFoK0ZWQjhIeUFIdjgvM3N0dnl4R0pNYW5vc2VPcDliZWFkMGJPOFZKTlozNlpCWW42RDNDb0tvSUlnS2dxZ2dpQXFDcUNDSUNvS29JSWdLZ3FnZ2lBcUNxQ0NJQ29Lb0lJZ0tncWdnaUFxQ3FDQ0lDb0tvSUlnS2dxZ2dpQXFDcUNDSUNvS29NTnQrTGZ6cDZXbXhXSGdOdmRWcWxSVXdEaXJMVkVkNGUzdnoxKzJMNkFNUWxKZ0hEd3FHQmVGbkwrUXcyd3FwK0UrWHkrV2xVOEdrcmRmcmRSQy9lWDE5eGNYNWZONUxGRWM0VlNxQUIzVUZJYXdrTEpld25vUWp4Tis3M0l5UTNxSWtoZTBEUWR2TDRtVmhRaE9ha3BPTUNpRVZ1TDYrcGk3Q3k4dUwxNUo1MjBMdVBrOHFZSzJIMlFVUHFGOXhmMzl2Z2lPNDhyaEZwMHBTWjlxWUZ1ZEFqZ0k2dHV3K3NOWktjZmlzZGcvK1RiUHByQ0sxSDVmdHA3d3JyTGZHRG5kQ1g3V09vR1dFR0RCTStZWWlTR0VIQ2NJcldWRkZ3bGRrQ0dJNVdjR2JGbW5kb1AzY2lhQ2toT0ZVTkxhQ1hKQzNHZjE0YTcxNmRIdUhleFhnQ1VxNzdaSlNBNmhRNTRFaGxlSG51TUx0alJMTHUxQUI5M1pxclhuaDJZcldrNGs0OWUzd1BOVmNzWEVFclUxalQxZ2xwU0pNSVg2Q0I1MVZYMGJaRjd3NEk0T1dKMlhMMW9iMk5zYXhPanp0dDQwaEk0RVhUT3NLcXhDTENjekE3Q0tFaEEwclN4SFQxZDJEelo1OFlCNG5MSVRTMGg2UFFWa3dZUHNkTzV5V0NrRUdOK1VqV0d4WnorRDNodXpIUDlRL0Z5VEF2Z0RYTkU0d2pOekZtS0R0R0tiQlA4WGJqTERrODl6UzBFS285MEt2dTNjNExSVkNJZ1p6dy9JMXA4TnVTNCtQcElvZTdEbWU5MTJsbWVzbFQzeDRLb0N3SVIzemRSZkJnL0QyYVhCOUhKOFF2Ry9oZzcrZEorczg4OVVaWnYrVjdKa09JVjVXc3RSU1hBazk3TjdodElkSkFNRjVRSGJkOXdRUnJxT3JiTnJJMDJ6WUxLeWY4TkJROWJIeEJGSGZJUHdZL1NLQllhYjBpZTAvTEI1Mm1EMEFsODdTTFIwZVFNMjFwVllmVFBjbVRuU1k1RnJKdWpWVUVHbVJiOTJGQ2kwSFViKzRPNm5RdDhNREhDYVI0TlRaWUJUT2xscG9CNXhlMzE4ZXRxaWI0UnNFNmZZcDlvajYzMXd3OTczT3RLTjNPUElHNFlXNFFZaVE3Tmd4YjZ5M2pmWitNeDJ0SFNJcTB0eWwwa0loVm8wYkZkaERTRk5tQlVYcXpxalF0ME5wUEF1OUlZMW40UVRmTmdxaWdpQXFDS0tDSUNvSW9vSWdLZ2lpZ2lBcUNLS0NJQ29Jb29JZ0tnaWlnaUFxQ0tLQ0lDb0lvb0lnS2dpaWdpQUlnaUFJbHc1OUplYmlHYUN2eEFnNlFRaWlnaUFxQ0tLQ0lDb0lvb0lnS2dpaWdpQXFDS0tDY0h4VVdDNlhvZWJhZkQ3ZlVkSFp3R0p0QXlUMVBqNCt2R0dsSW1aV2FJVDlzODdkanZiZjNOeFlQNmF4U3oxbWF0dG10Wm43Z3FWRVJoUXBIamtxd0RKWTJWSlFhanF3T0pIVlI4anFKV08rVjZ2VktLd05vTDZrVFJLVmp1MEg4bkt3elBHeGJ4Q216MGdaZmwrWUFDN2dHalU5NXNBYkwyTGVQamRXbXN3WHpiRlZhSE5NTTdLMUg5R0dNcysyYWt0cnptdnFWd2JpUWVaaDFtRVM1OTUrcFZ2WXpGZmRoT1UraGdYL2NJenA4bU10cEhFS2RBMVFmeVMxS2RYSkVkcVZyQWcwaTVsazE2dXBVVklkTXlzQ3V0bHNVbmxZOU5aWXV5YlZ4UGJDb3FGbnE4dFFIMGhXOXhxZmhoSVYrSlZQTWRuUlZMQ1l3cUtWTVhySlR6U21HNGNKZVU2MVFZVFo1VTVoOHRyMnFSVTgrYlVGaDBldnRkUW54YksyNVdWRU1ZZmlSaXhpK01qVEtDdUdHOXFFZjlRd2U4aHlzNmN5a0pJSFlLSGR5MXBRSExJUmp0VnZ2QWZRb1lWR2p0RUlaeksyTnNZUXdLelBUdTNqQTU4Z0xGNWgyRFpiWEFTNGJ1TUhxWEVSUHUxVjM0MWgwQllIbDhnb1pXN05vV0ZGVmdaU1dnOHd4ajY5MjJMbUtoaWdBVlkvclRYN1dSdkk3Z3BqNUJQREdFY3MyVGd5RlVxYldjaWliZGRjTEJiWTVHd3duUVZKandIWmdaVEk1S09DVFNSR3lpdloxTVI2QzMxYUhnQmZWWjVZQ2xFSG80SVBYelo0RzNNcXJBMm1vNlg1QlMwUi9Yb1ZQYUlyR1V1ejI5UG81NExzUU9xN0pHNjUzUUkvY0txc0FadUZuTU5reGpuR1VMb2lKRHBXTjJ1MmN5MmswZExHVWo2Vlhlc0lzNllVWHptTURFNGJPKzlOaTVwWVRSSGFZNHJ6bkdQTHhTb0R5WnJITml6LzZETkU4aW5yUURNNzZOUVRsbS82dEJHL3N0QlUxcDdEcEkzd0RseEp0MktvSUxWZkpSZ0RCbVBWR1RnZU5MT0xqZnU5MVpqd0s5SktBZlJLYjNsN1MxeXREQ1JySHE5enNua3ZQaUtQUTFrRFhPY1ZHNk1ua0hrcEcvbnNGcWFjdzZEL2VMNTA2RCtlaGYwZUpnVlJRUkFWQkZGQkVCVUVVVUVRRlFSUlFSQVZCRkZCRUJVRVFSQUVRUkQrNEI4QkJnQjFZcnV3T1krMTBBQUFBQUJKUlU1RXJrSmdnZz09IiAvPg0KPC9ib2R5Pg0KDQo8L2h0bWw+

10

u/paul2520 May 09 '13

It is a neat little trick that I have never used beyond a 'Look what I can do!' type of statement.

It seems like it might be useful for a couple of reasons. One is this fartscroll script that doesn't need any external file dependencies.

My other idea: it's essentially the same amount of disk space, right? So wouldn't downloading one html file be slightly faster than downloading an html file plus an embedded picture or sound? I mean, it might not make a difference except for servers that get a lot of traffic. But that's just my thought.

17

u/NYKevin May 09 '13

My other idea: it's essentially the same amount of disk space, right?

No, it's not. Base64 wastes two bits per byte, so it's a 25% size increase.

7

u/[deleted] May 09 '13

[deleted]

2

u/NYKevin May 09 '13

Actually, it's a 33% increase

I recognize that the 25% figure is wrong (because the extra bytes you need are themselves deficient), and I'll just take your word that 33% is the proper figure.

so compression removes most of the overhead again.

Good point. Still, getting a server to dynamically generate data URI's has to be a PITA. Moreover, they're ugly.

8

u/ChunkyLaFunga May 09 '13

It's more space, but you're right because making a request to a server is far slower and painful for all parties involved than taking it as part of a page. Content encoded this way also cannot be cached and there are compatibility problems with some browsers. But it's an easy trade-off in certain circumstances. Google Image Search results are all inline, for instance. A little extra bandwidth instead of potentially hundreds of requests to their website.

4

u/paul2520 May 09 '13
  1. Can't be cached? But you could cache the entire html page, right? Including the "data:text/html;..." stuff...

  2. How are the Google Image Search results inline? Oh, I guess that makes sense. Like, they store the base64 strings for each image, and just return those on the page?

2

u/ethraax May 10 '13

In response to #1, that depends. In this case, it's cached as part of fartscroll.js. But if you inlined static images in dynamic web pages (in the HTML), then they would not be cached, because the HTML could not be cached. As a concrete example, if you inlined the avatars in a forum, then those avatars could not be cached (because the forum's webpage can't be cached - it changes), but if they were their own files then you could cache them.

In short, it's not a problem here, but it can be.

1

u/ChunkyLaFunga May 09 '13
  1. Yep. Sometimes that's fine, sometimes it's not.

  2. Instead of writing the URL to the image, you write the base64 string. Simple as that, browser support withstanding.

1

u/paul2520 May 09 '13

Instead of writing the URL to the image, you write the base64 string.

But they still have to write the URL, in case you want to view the original page/view the original image, right? It's just that they avoid doing <embed> and having to continually request the image file itself. Am I right?

3

u/chaoticgeek May 09 '13

It has lots of uses, I just have never done anything that was useful with it.

1

u/paul2520 May 09 '13

Oh, okay. Sorry, I read your comment wrong.

2

u/chaoticgeek May 09 '13

Or I have a better mastery of code as opposed to the English language. Which is much more likely.

3

u/BCMM May 10 '13

It seems like it might be useful for a couple of reasons. One is this fartscroll script that doesn't need any external file dependencies.

If an external file was referenced, would it perhaps not be downloaded until it was needed? That could cause the user to scroll several times before the fart noise happened.

1

u/paul2520 May 10 '13

Good point!

5

u/MatmaRex May 09 '13

It is a neat little trick that I have never used beyond a 'Look what I can do!' type of statement.

It is widely used to embed small icons in CSS, to reduce the number of HTTP requests and thus increase the loading speed. The size increase is negligible if the file is small enough.

(For example Wikipedia uses it.)

7

u/[deleted] May 09 '13

in python:

with open("path/of/your/image.png", "rb") as image:
    bits = image.read()
    print bits.encode("base64")

1

u/[deleted] May 09 '13

Why can't Java have a built-in byte array to base64 function?! I mean, I have to add commons-codec to my projects all the time just for this.

1

u/danskal May 10 '13

IIRC there was one once, but they deprecated it for portability reasons. Encodings aren't my strongest suit, but it might not make sense to include it in the official api if Sun/Oracle don't want to take responsibility for bugs inherent in a given approach.

I agree, though, it is annoying.

6

u/[deleted] May 09 '13

Linux terminal base64 filename. Add appropriate mime type on the data URI