Home
Ben FrantzDale [entries|archive|friends|userinfo]
Ben FrantzDale

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Ascot! [May. 16th, 2009|09:19 pm]
[Tags|, , , ]

After a Quixotic goose chase involving many many mensware stores, I finally found someone who sells ascots in person! (Had it gone on much longer, the quest may have needed an ascot mascot.) After asking but finding none at JoS. A. Bank, I was directed to a place called SYMS which is kind of like a wearhouse-sized T.J. Maxx focusing on dress clothes.

Also in this search I found Porta Classica of 1625 Blue Hill Ave. Matapan (no website). If you live in the greater Boston area and want an awesome zoot suit, that's the place to go.
link4 comments|post comment

Natural Feet [May. 7th, 2009|09:16 pm]
[Tags|, ]

I've been aware of Vibram Five Fingers Shoes for a little while (thanks to [info]istar and others). I haven't tried them.

Tim Ferris had a very interesting post on the topic which cites a 1905 journal article about what natural human feet aught to look like:

as opposed to



Interesting.
link12 comments|post comment

MPI & Python [Apr. 13th, 2009|09:46 pm]
[Tags|, , ]

Dear Lazyweb,

There appear to be more than a few MPI bindings for Python. Which should I use?

In particular, which should I use if I want to use Python to call C++ code that needs to take an MPI_Comm object?


Do any of you have any other experience with using Python with MPI? As one new to Python, I am particularly curious how garbage collection might interact with MPI if you have an object shared across computers.
link3 comments|post comment

Matlab is dead. Long live Python [Mar. 30th, 2009|09:04 pm]
[Tags|, , , , ]

Over the past year and a half I've incorporated Matlab into my daily work. It's a tremendously useful tool for experimenting with image processing and linear algebra. It's got a nice array-slicing syntax, so the second column of a matrix, M is M(:,2), and every other row in reverse order is M(end:-2:1,:). It also has some very useful easy graphing commands, so if you have an array of values sampled at a corresponding array of x and y positions, you can say surf(x,y,A) and get a nice 3D surface plot. It also has other nice language features like the ability to return a list of results from a function and assign those results separately as in [V,D]=eig(A).

However, it's got some serious serious shortcomings. First, it's closed source and expensive, so if you prototype with it, you have to then either port it to another language or kludge together scripts to call Matlab—not cool. Second, unlike any language other than assembly, values returned from functions are magic in that you can't index into them. So while the function eig(A) returns a vector of eigenvalues of A, if you want just the first one, you can do v = eig(A); v = v(1) but you can't do v=eig(A)(1). This is particularly tiresome with a language geared for matrices in which you might want to nest a series of functions indexing each as you go. That is, you couldn't do foo(bar(baz(A)(1:2:end))(:,:,0)), you'd have to assign each result to a temporary. Third, Matlab indexes from 1. Yes that's what everyone expects when they start programming, yes mathematicians index from one, but for twiddling with arrays, zero is just easier.

Finally, Matlab doesn't lend itself to creating functions or data structures. In general each function is in exactly one file, leading to terrible code reuse. You can add more functions to the end of a file but those can only (?) be used as subroutines within that file, leading to a terrible lack of code reuse. Worse, what little support Matlab has for classes is done through a special directory for the class and a separate file for each method(!)

Fundamentally, there is a need for an interpreted language capable of being run interactively but that is also a real standard programming language, not some kludgy interpreted dialect of Fortran. That something needs to have mathematical and graphing batteries included.


Fortunately, there is a collection of Python packages that have a very solid chunk of this covered: matplotlib, scipy, and ipython. Not only do they have all of the 2D graphing that Matlab has with a similar syntax, but they use the (awesome) Anti-Grain Geometry library for graphing, so you get plots way better than the aliased 1990s-style plots that Matlab dumps out.

Python has language support for array slicing and for returning tuples, but it is also a Real Programming Language in that you can write a linked list or a graph without having to hack it on top of arrays. It isn't designed with array programming in mind the way Matlab was, so the syntax for arrays is slightly more cluttered, but not by much. The big differences being that Matlab has special element-wise operators and has concise array construction notation, so a.*b in Matlab returns the array formed by multiplying a(i) by b(i).

So give it a try. Install the appropriate packages and start doing your scientific computing in an actual programming language.


ben@endash:~$ ipython -pylab
...
In [1]: x=r_[0:100:0.1] # Generate [0, 0.1, 0.2, ..., 99.9]
In [2]: plot(x, sin(x)/x) # Nice pretty plot.
Out[2]: [<matplotlib.lines.line2d object="object"
at="at" 0xa0ee8cc="0xa0ee8cc">]
In [3]:


Can Matlab rasterize images to look this nice?:
pylab_examples_polar_scatter


PS
If you want a blast from the past, Python even has a turtle library, giving it the same drawing sematics as Logo.
from turtle import Turtle
t = Turtle()
for in in (0,1,2,3):
    t.forward(100)
    t.right(90)

Not only is Python making programming as fun as it was in my hard-core Logo days, it's doing it in a language that can simultaneously be used for Logo-like simplicity and Matlab and driving high-performance computing. Go Python!
link9 comments|post comment

φ! [Mar. 16th, 2009|07:51 pm]
[Tags|, , , , ]

So I stumbled upon this useful page: list of strange units of measurement and learned a very interesting fact: One mile is within 0.5% of φ kilometers. The golden ratio is 1.61803399; a mile is 1.609344 kilometers. So if you ever forget how many km to a mile, that's a good way to remember (or conversely if you forget the golden ratio or forget the eigenvalues of [1 1; 1 0], but you remember the number of km in a mile, this could come in handy).

And as the above-linked page points out, similar useful facts, see mathematical coincidence for fun facts like π2=10 to within 1.3%, or that sin(666°) = cos(6·6·6°) = −φ/2, exactly(!)
linkpost comment

Helvetica [Mar. 11th, 2009|11:03 pm]
[Tags|, , , , ]

Fifty one years ago, Max Miedinger found the perfect sans-serif typeface, Helvetica. That claim is debatable, and there are certainly some very nice sans-serif faces that have come since then, but Helvetica has gotten a tremendous amount of mileage. Somehow over all those years it has managed to still look cool, hip, slick, and corporate while also being used on perfunctory signs like the NO SOLICITORS sign on the glass door of my apartment. That's a little uncanny.

I hadn't paid much attention to Helvetica until I watched the film about the font that came out recently.



One thing it got me thinking about is infinite-dimensional design optimization (like things do). The shapes of a font can be tweaked, so for any font there are other fonts in some neighborhood of it. Helvetica has horizontal terminals, so the ends of the C, S, s, 2, 3, and the tail of the e, g, etc., are all horizontal. The R has a gentle foot to it, and the t has a flat top and the G has an arrow shape to it. Similar fonts in the neighborhood of Helvetica don't have these features and that arguably makes them hold together less well and come off as less crisp. If you tried to improve such fonts, I suspect you'd get back to Helvetica, like some typographic local-energy minimum. If this weren't the case, then why would Helvetica have stuck so well for 50 years despite its apparent overuse? One person in the film suggested that the horizontal terminals gives the curvy letters a sense that they aren't going anywhere, that the C or the 3 won't spring open and that the R and G won't fall over or roll away. This seems very apt. In the table below, which version says the plane will get there safely, the cars will work, all while also saying the tape will stick, the notes will unstick, the taxes will be OK, and the chocolate-chip cookies will make you feel better? It's a lot for such a simple font, but subtleties go a long way.

For example, Arial (which has an interesting dubious history as a Helvetica knockoff) never quite looks right to me. From a design-optimization standpoint, it seems that Helvetica, with it's characteristic horizontal terminals just looks more solid. Compare various weights of Arial to various weights of Helvetica; one column is Helvetica, the other just looks wrong in some subtle knock-off sort of way.

Helvetica vs. Arial logos
The big C in Crate&Barrel is drawn slightly differently in their logo, so it's nearly a perfect circle.[cite]


On a typographical note, If you want to know what fonts people are using, try What The Font?. Send it a picture (or a URL for a picture) and it guesses the font. There's even an iPhone app.

See also

link3 comments|post comment

Urban Camo [Mar. 7th, 2009|09:07 am]
[Tags|, ]

From swissmiss: What happens when you go to Ikea dressed as a pile of cardboard boxes or a pile of Ikea bags: http://www.urbancamouflage.de/.
linkpost comment

Balls: out, and to the wall [Mar. 4th, 2009|07:44 am]
[Tags|, , ]

It appears that two seemingly colorful expressions, balls out and balls to the wall are actually perfectly innocent expressions no more crude than the expression petal to the metal; all three expressions basically mean the same thing and appear to have similar origins just for different machines. As far as a I can tell, balls out refers to steam engines with centrifugal governors [1], in which the balls are out when the engine is running at top speed. Similarly, balls to the wall refers to the throttle position on airplane that have spherical throttle knobs with multiple throttles; full throttle means pushing the balls all the way to the wall. [2][3]

Correct me if Slate and Urban dictionary have lead me astray.

PS
It appears that, contrary to the story I had heard about cannon ball racks being called monkeys, the phrase cold enough to freeze the balls off a brass monkey is, in fact, crude.
link12 comments|post comment

Car Art [Mar. 2nd, 2009|08:07 pm]
[Tags|, , ]

After seeing a NYTimes article on his amazing custom car work (kitbashing a modern car to have '50s-style fins), [info]mew0422 tracked down the creator's website. He's an artist in the Catskills in upstate NY; he does amazing art, including woodworking and welded scrap metal, but the best part is his car-based art such as this fender guitar or any number of googie car-inspired lamps. [Caution: Frontpage resizes browser window, but none of these links are to that.]
link2 comments|post comment

std::istream, why have you forsaken me? [Feb. 20th, 2009|08:31 pm]
[Tags|, ]

Today I was burned by a very surprising behaviour of std::istream. If you print out a double that happens to contain infinity, you get inf, but when you try to read in the string inf you get... well in the case below, the double didn't get written to at all, it stayed undefined. I can see treating NaN weird (more on that) but what's going on here? Is there some pedantic reading of standards that means double may not be a 64-bit IEEE float and so may not have inf? Does it really have to be this way? If I had an ieeefloat64 type, I would hope that would convert to and from a string cleanly, right?!?

#include <iostream>
#include <sstream>
#include <limits>
#include <boost/lexical_cast.hpp>

using namespace std;

int main() {
  double x = 42;

  x = numeric_limits<double>::infinity();
  //  x = numeric_limits<double>::quiet_NaN();

  stringstream ss;
  cout << "x is " << x << endl;
  ss << x;

  cout << "ss is " << ss.str() << endl;
  //double y = boost::lexical_cast<double>(ss.str());
                              // ^ This will thorw an exception.

  double y; 
  cout << "y started as " << y << endl;
  ss >> y;

  cout << "        y is " << y << endl;
  return 0;

}


Now regarding NaN. The above works similarly if you use NaN. That's not supprising; NaN as less of a number than is infinity.

On the topic: fun (scary) fact: std::set and std::map both use red-black trees keyed on operator< on their key. Now recall that NaN has weird properties like NaN != NaN and !(NaN > NaN) and !(NaN < NaN). That means that throwing NaN into a set or map key can lead you into the land of undefined behavior. Of course, you can define your own Compare operator, so if you don't care about ordering, you could create a Compare object that reinterpret_casts your float to an int and your double to an int64, and if you do care about ordering, a fun fact is that, aside from the sign, ints and IEEE float bit patterns are in the same order; negative floating-point numbers are just backward since floating-point numbers have a sign bit as opposed to having negative values correspond to the bit pattern of the next larger chunk of numbers above the maximum value.

But seriously, who would think reading the string inf to a double would produce undefined behavior? This makes me a sad panda.
linkpost comment

On Fortran linear algebra "codes" [Feb. 12th, 2009|11:25 pm]
[Tags|, , , , ]

There are a lot of solid, useful libraries out there for scientific computing such as ARPACK, CHOLMOD, LAPACK, and others. These all seem old (with some pages last modified over a decade ago) and all seem to work reliably, but all have lousy APIs with cryptic documentation lacking any examples; none of these Just Work.

For example, using ARPACK to compute the n smallest eigenvalue–eigenvector pairs of a large sparse matrix requires calls to two functions from ARPACK as well as a call to your own linear solver. (LU decomposition so the repeated x = A\b solves are efficient is left as an exercise.) First, you call DSAUPD in a loop.

What is DSAUPD? I think it's something like Double-Precision Symmetric Arnoldi U? Positive Definite. This function takes sixteen (24) arguments, all by non-const pointer. Some of these are magic numbers (as opposed to enums), and some of these are magic strings(!) I've seen this in other Fortran APIs; what are people thinking passing strings around? Sure for solving large-scale eigenproblems, the overhead is small, but it's just the Wrong Way.

It returns a magic number and you the calling code are supposed to perform different operations depending on what is returned until it says it is done.

As if that's not enough, you then have to call DSEUPD with 22 arguments(!!!); that actually gives you the resulting eigenvalue–eigenvector pairs you were looking for.


It's frusterating that this good code is out there tangled behind a lousy, archaic API. Boost.uBLAS provides a decent general-purpose generic C++ classes for linear algebra, but for some reason, Boost (which usually has libraries that Just Work) appears to provide no built-in solvers or wrappers to these old Fortran solvers. Am I missing something or are we really missing a good API to these tremendously useful functions?

The bright light in the midst of all of this appears to be SciPy which provides Python bindings to a lot of this stuff, as well as providing Python bindings for some nice nonlinear optimization libraries (which again wind up with kludgy Fortran calls at their core, but hide those gory details). Still, it seems like (short of rewriting these libraries in a more expressive language than Fortran) these things should be wrapped in a clean, efficient C++ interface and then wrapped in a nice friendly interpreted language like Python (or an ugly kludgy interpreted language like Matlab).

PS
Why must Fortran people call everything a "code"? 0xDEADBEEF is a code; ROT13 is a code (although I guess pedants would beg to differ); I'd even call MOV and NOP codes. A source file contains code and a library is a library, not a code. Come on people, talk like software engineers. </rant>
link9 comments|post comment

DTV [Feb. 11th, 2009|10:41 pm]
[Tags|, , , ]
[mood |frusterated]

We don't have cable; we watch a few shows on the Providence, RI CBS affiliate (heading: 212°, distance: 11.8 miles). With analog, we get OK signal. It's sometimes a bit snowy and occasionally black and white, but it's there and there is always good audio.

A month or two ago, the broadcasters all teamed up to put a DTV infomercial in the middle of Criminal Minds on all channels. We had been planning on getting a converter box and turning it on by February 17, but noooo, they had to go and make it seem like we couldn't trust analog TV to actually carry the last quarter of our crime dramas, making it worse than useless.

After filing for a $40 government discount (why are my tax dollars paying to help people watch TV?) I waited. And waited. And finally caved and went to Best Buy where (as usual) I got overcharged by $20, but walked out the proud owner of a DTV tuner.

I plugged it in and (after realising that the battery to the remote was wrapped in clear shrink wrap making it not provide any power) it worked crystal clear color picture and great sound!

Except for when it doesn't. When the signal fades, the entire screen crumples out and worse, the audio seems to go first. It might be watchable if the video dropped out first, but with the audio jumping in and out, it's worthless.

I just got a Philips MANT-410 Amplified Indoor dipole antenna, but it seems to be next to useless.

The infomercial said something about never needing rabbit ears; as it is we are this close: ⇥⇤ to giving up on broadcast TV and trying to just watch TV online.

All that said, antennaweb.org mysteriously lists a bunch of "Live Dates", including WPRI-DT channel 12.1, live 17 February. It thinks that will come in better than the otherwise identical entry without that live date. This suggests to me that they may be going to boost their signal strength on the 17th, but the station hasn't mentioned anything of the sort. I'll be really pissed off if they are making me jump through these hoops only to discover that I shouldn't actually expect DTV to work properly until the 17th.

For reference, I posted to this WPRI discussion board as well.

PS
How do antennas work? It's magic. Why is a tiny little spindle of metal the best way to pick up radiation from a long way away. One pair of bunny ears doesn't exactly subtend much of the sphere around the tower 11.8 miles away.

Tune in tomorrow for a rant about old-fashioned Fortran-based large-scale sparse eigensolvers that turn their inner loop inside out, making you do all the dirty work. Grrr.
link5 comments|post comment

Ubuntu keyboard issue [Feb. 1st, 2009|12:33 pm]
[Tags|, , , , ]

For a while, my keyboard has been misbehaving in Ubuntu. In particular, some of the keys just don't work or are mapped strangely. In particular, my arrow keys don't work at all, forward delete (as opposed to backspace) doesn't work, and page down is mapped to the context-menu key and page up is mapped to forward slash. With NumLock turned off, the number-pad arrow keys work.

The keys appear to work normally in the console (Ctrl+Alt+F1).

How would I debug this? I figure some keyboard mapping must be set somewhere since this is a regular keyboard that is just not working right...

Any ideas? This seems to be the same with my PS/2 keyboard plugged in via a USB adapter as with my Apple USB keyboard.
link8 comments|post comment

Job Opening: Research Scientist [Jan. 30th, 2009|10:10 pm]
[Tags|, , ]

We have an opening for a Research Scientist in the R&D team in Lexington, MA.


Paraphrasing the job posting:

If you are or know someone with experience in computer vision, graphics, etc., there is a lot of fun work to be done, particularly in...

  • Single lens camera motion recovery
  • 3D Model recovery and reconstruction
  • 2D and 3D Image processing
  • Multi-view geometry
  • Non-linear optimization methods
  • Fusing data from multiple sources
  • Dense image registration
  • Spatio-temporal image processing methods
  • Camera models and calibration


The candidate will have earned at least a Master's Degree in Computer Science, Mathematics, Physics or a related field.
2 years experience working alongside PhD-level engineers is required. The candidate must be able to communicate effectively with senior scientists and algorithm developers.

Preferred qualifications:
  • The candidate will have a solid mathematics background with a day-to-day working knowledge of linear algebra and non-linear optimization methods.
  • Programming Experience in:
  • Linux Environment
  • C or C++
  • MATLAB
  • Experience developing medical imaging products or consumer imaging products
  • The candidate must be energetic, capable and interested in working in a fast-paced, high-growth early stage company.


Brontes Technologies is on the leading edge of imaging technology for specialized dental applications. We are building a hand-held, real-time 3D scanner with unprecedented accuracy, based upon patented technology from MIT. Individuals joining our group will contribute to the development of a completely unique 3D medical imaging system that will transform an industry. Brontes was acquired in October 2006 and is now a 3M Company.

Product page
linkpost comment

LOL To Never Never Land [Jan. 23rd, 2009|11:14 pm]
[Tags|, , , ]

LOL Cat sings Metallica (in pictures)
link1 comment|post comment

Home Theater Lazyweb [Jan. 18th, 2009|10:46 am]
[Tags|, , ]

Dear Lazyweb,
I got a long-term loan of a projector from my brother-in-law elect. Our current A/V situation is as follows:
We have an office with speakers shared between our two computers. We have a Living/dining/kitchen area that includes one CRT TV with built-in sound. We have a bedroom with no sound. We both have iPods, of course.

In the big room, we would like to be able to plug in an iPod, to watch movies/TV with big sound, and to listen to the radio. I suppose digital radio would be nice while we are at it, but it's not necessary.

What does a basic home-theater audio system look like? I don't need to go all-out, but don't want chincy crap.

Any suggestions?

Maybe I can take advantage of Circuit City's liquidation...
link4 comments|post comment

Ski photography [Jan. 15th, 2009|07:49 pm]
[Tags|, ]

[info]mew0422's mom got me an awesome camera bag for Christmas, a Lowepro Slingshot 200 All Weather. With it, I can take my camera skiing. (It was cold, I gave it a chemical hand-warmer to keep it warm.)

Last weekend I took some pictures at Wildcat which has a spectacular view of Mt. Washington and a fair amount of bumpy narrow terrain and tree skiing, which I mentioned last year. I gather that if I like that terrain, I need to get myself to over to Mad River Glen.

Here's my favorite trail at Wildcat, Feline:
 

And a nice part-gladed part rocky area, Mountain Jag Glade:


...and the view:


linkpost comment

The "Blog" of "Unnecessary" quotes; Heavy Metal band names [Jan. 14th, 2009|07:32 am]
A Blog devoted to unnecessary quotation marks
Also: Diagram of Heavy Metal band names
link1 comment|post comment

Skis [Jan. 6th, 2009|10:00 pm]
[Tags|, , ]

I finally got new skis, Blizzard Magnum 7.6 (170cm, 7.6cm under foot). They replace my venerable old K2s which will stay around for screeing.

Out with the old, in with the new.

I got 'em for $500 at the Ski and Snowboard Outlet in North Conway, NH, which generally seems like a good place, with much better prices than the local competition up there.

While shopping, I found that skis are decidedly non-quantitative. All of them have steel edges and P-Tex bottoms (which then get waxed) so the surfaces that touch the snow are all the same. As far as I can tell, the bindings all hold you in and then let you go when you pull too hard in the wrong direction, so that shouldn't be too different. That leaves length, curve shape, and elastic properties and weight.

As for length, that's obvious and they give that number. They also give the width under foot (more gives you floatation in loose snow; less gives you more carving ability since the steel edge makes a curved shape when you lean on it); they also give you the thickness at the tip and tail. Between the tip and tail, it's a pretty smooth curve so there can't be too much variation.

There is the shape of the tip and tail, but that can't matter too much unless you are trying to land jumps while skiing backward, which I'm not.

Weight is weight. You can heft them. Along those lines there's the full moment-of-inertia tensor, but really the largest component of that is rotating the ski the long way; the other two principal moments are tiny for any skis. So I don't think that's a big issue.

That leaves elastic properties. I gather Völkl is selling ridges in the skis to do... something about stiffness... but really, I'm being sold on gimmicks that supposedly produce stiffness/damping properties; just sell me on the properties and let the ski engineers figure out how to make it happen. Make it out of unobtainium for all I care. So really, they should list the bending stiffness and torsional stiffness. If you want to go nuts, give the stiffness as a function of position along the ski, since that can clearly vary. Similarly, there is damping.



With the above in mind, building the best ski for particular conditions seems like a relatively simple problem. It shouldn't (directly) matter how wavy the tops of the skis are or how many layers of titanium they contain or how many carbon rods they have or what the fashion is for side cut. It should be a function of the above criteria (unless I've missed something?)


Given that, I got the skis I did because their gimmick make sense: their binding mounting is designed to allow the ski to bend smoothly through the binding section of the ski. I can't tell you if this should really make for a better ride, but the design clearly does what it is supposed to: The ends of the binding are connected with a strip of plastic/metal that is attached to the ski in exactly one place and allowed to slide on a track, so when the ski tips bend up, the ends of the binding move out along the ski (the slack being taken up by a big red spring in the release lever).



Most importantly, they are great skis. I'm looking forward to putting them all the way through their paces this weekend...
linkpost comment

Why don't they have an image format for regular people? [Dec. 7th, 2008|10:02 pm]
[Tags|, , , ]

Here's a great illustration of why you should use PNG for line art rather than JPG:



After a discussion with a technical person who doesn't worry much about the details of image formats, I came away with this thought: There should be an image format, (maybe .image) that automatically packages things up in the right image format so regular people don't have to think about it. In terms of reading, it would just be a wrapper format for PNG, JPG, and SVG. I think these three open standards pretty well cover all the images you might want to save.

If such an image format were to exist (does it?) that orthogonalizes the problem of smartly deciding how to save an image and actually storing the image. Storing is obviously trivial.


Saving is the interesting part, but it shouldn't be too difficult to do something that works pretty well.

If the image is vector graphics, store it as SVG. Done.

If the image has alpha blending in it, store it as PNG. Done.

Now for the fun part: JPG vs PNG. Given a compression level, ℓ a scalar between zero and 1.0, try saving the image as JPG at that compression level, try saving it as PNG. If the PNG is smaller, use it. Done.
Finally, we need to decide when it's OK to throw away data by using JPG. We could just measure JPG compression artifacts, so if we start with an image, I, we use JPG compression if, e.g., ||jpg(I)−I||/area(I) < 0.001 (1−ℓ), for some compression level, ℓ (or something along those lines).

You could get fancier and try using a reduced palette for the PNG, but that's a bit much and could be left to the implementer. Basically, once you define a measure of acceptable image artifacts as a function of compression level, you just have to come up with the best way to store the image. You could vectorize it for all I care. But most users wouldn't even care about that. Space and bandwidth is cheep. A default of ℓ=0.9 would produce either a standard PNG for any case that PNG is smaller and produce a 90%-quality JPG for photos. That would pretty much cover it.

There's lots you could do behind the scene to make a compression-level or image-quality slider meaningful, but first you need image support. Does this sort of format exist? Could it all be done in SVG (with embedded raster graphics)? (That would let you do this process on large image blocks which would help for heterogeneous content like screenshots.) Compression quality should be a job for a computer; users shouldn't have to worry about it.
link3 comments|post comment

navigation
[ viewing | most recent entries ]
[ go | earlier ]