Quantcast

Cookie Monster Knows How I Feel


Cookie Monster Searches Deep Within Himself and Asks: Is Me Really Monster?

Me know. Me have problem.

Me love cookies. Me tend to get out of control when me see cookies. Me know it not natural to react so strongly to cookies, but me have weakness….

Me was thinking and me just don’t get it. Why is me a monster? No one else called monster on Sesame Street….

How can they be so callous? Me know there something wrong with me, but who in Sesame Street doesn’t suffer from mental disease or psychological disorder? They don’t call the vampire with math fetish monster, and me pretty sure he undead and drinks blood…

(cookie monster knows how i feel)

On Software Development

PaulR said this at lunch and we all lost it:

Software isn’t finished until the last user is dead.

Original source unknown…

Using git For Large Scale Digital Archiving: An Outline

Here are some notes on how one might re-architect Internet Archive infrastructure to meet some additional goals:

  • easy to set up and replicate
  • provide versioning and transactions
  • handle more media types well
  • better ingest/locate/read apis
  • better search

The current architecture looks like this:
iaarch.png

The diagram is simplified a lot. There are currently about 1800 nodes in the cluster, most of which are storage nodes (low power 1U nodes with 4 1TB hard drives). The deriver nodes are used for crunching things like pdfs and h.264s, and there are about 300 of those. There are 5 www frontends, hidden behind a couple load balancers, and database server has at least one read-only secondary.

What I like about the current infrastructure:

  • Easy to add more storage. Some other archival solutions do not scale well, since they insist all hard drives be connected to the same machine. This starts to break down at the petabox scale.
  • Easy to add more bandwidth. Currently IA is pushing 5+Gbps of outbound bandwidth. Every storage node runs an Apache server, which lessens load on the homenode, which is a problem with other archival systems.
  • Database hits are not required to locate an item on the cluster. When an item is requested through the Locator service, a multicast is sent, and machines that have the item will respond. The lessens load to the DB server, which is important when getting thousands of web requests per second.

What I find interesting about the current infrastructure:
  • RAID is not used. Items are backed up on to a secondary machine when added to the archive.
  • This is mostly due to “RAID is hard to get right” and cost
  • This means there are two machines (and two apaches) ready to serve the same content.
  • One machine can be taken down for repair while the content is still online.
  • I would like to see use of either RAID or maybe RAID_Z

An idea on how to re-architect things using git as a storage backend to provide versioning and transactions
  • git is the version control system used for the linux kernel.
  • git is a totally new way to operate on data. Read this if you are a non-believer.
  • We could keep the infrastructure mostly the same as IA, but store items as git repositories. This would not be a large architecture change.
  • git would become a supported access protocol, in addition to http, ftp, and rsync. Backups could be simple a git pull. We could git clone the entire cluster.
  • We would get versioning!

Changes needed to repo.git to make it useful in an archive cluster:
  • Change reguser.cgi to tie into the existing user database (talk to dbserver)
  • Change regprog.cgi to work in a cluster environment. Repositories are inited in /{0-4}/items/id/id.git on a primary node (talk to catalog/homenode)
  • Use post-commit hook to queue backup and derive tasks (talk to catalog)
  • Change gitweb to show custom view of movie, audio, texts (book), and photo collections. Software collections would show standard gitweb view.

I don’t think this would take too long to implement, but I’m lacking co-conspirators these days.. Maybe when shag makes it to SF we will have to knock something out :)

David Sedaris delivers a pizza


(via)

Ruby 1.9 gains block-level scope

I was watching this Google TechTalk that Yukihiro Matsumoto gave on Ruby and learned that Ruby 1.9 had block-level scope.. cool!

Apparently, block scope is some sort of thing with me:

Page-Turner Coffee

Peliom sends in this observation about Philz:

I got the “fire alarm” coffee from philz this AM


sooooo good!


certain coffees I call “page turners” becaues I take a sip and then I have to take another sip, and on and on


just like a book I can’t put down


CC by-nc Photo by Scott Beale/Laughing Squid

Memories of Programming the Mac, Pre-OSX

Last night, I had a dream about programming the Mac back in the old days, before OS X. The more I think about it, the more I think I’m still dreaming. Did this stuff really happen? I remember:

  • MPW, the Macintosh Programmers Workshop. The old mac didn’t have a console, or even run.exe. We had MPW, which gave us a commandline of sorts. We could access cvs using MPW. It is still being distributed by Apple.
  • MacsBug. The low-level debugger. Its hard to believe this is all we had. We loved it. DebugStr() was the poor Mac Programmer’s console. My SE/30 (and all Macs) had a “Programmer’s Key” that would invoke MacsBug. If you didn’t have MacsBug installed, the built-in MicroBug would come up instead. Apple still distributes MacsBug. Fortunately, I’ll never need it again.
  • Vague memories of Projector, which was Apple’s version control thing, and Jasik Debugger (The Debugger)
  • MrC. This was Apple’s C compiler. We used MPW to compile our code with MrC. Even if we used Metrowerks to initially write the code, MrC was what we used to compile the engineering builds. Back in the the day, the shipping versions were actually compiled by a *third* compiler, from Motorola, which ran on an AIX box or something.
  • Metrowerks CodeWarrior. I loved CodeWarrior. It was blazingly fast. It has a source-level debugger, which often ignored my breakpoints. It had a great IDE. It had a great Editor. The project files had a .µ extension, no joke. I bought my first copy of CodeWarrior in 1995, at the student rate, using the proceeds of my first real programming job (which is where I met peliom). CodeWarrior still brings back warm memories.
  • BBEdit. I’ve been using BBEdit since forever. It doesn’t suck. It makes me happy, in a security blanket kind of way.
  • Pascal. The Mac Toolbox interface was originally Pascal. Pascal was *the* way to write mac apps way back when. I tried to learn Pascal before I learned C, but never got anywhere.
  • Think C and Think Pascal. Compilers sold by Symantec. I learned C programming using Think C on a SE/30.
  • EvenBetterBusError. I don’t remember BusError, or BetterBusError, but EvenBetterBusError sticks in my mind. I don’t remember what it did, or why I needed it, but I think it was a System Extension.
  • System Extensions. Marching across the screen on boot up. Little friends there to make your life better. The thing people noticed when booting OS X for the first time was that their little friends were all gone.
  • Inside Macintosh. This was the Mac API documentation, originally in Pascal. A giant set of bound volumes, or available in electronic form. I think they were in HelpViewer or DocView format or something..
  • Pascal strings. You still needed them for DebugStr and window titles and such. c2pstr() was often used.
  • PlayMPEGInWindow(). I don’t remember if this was the exact function name, but peliom and I were trying to display MPEG video, and when we tried to see how QuickTime programmers did it, we found this function, and it cracked us up. So easy! When peliom and I both ended up working at Apple, we ended up working directly with the guy that wrote PlayMPEGInWindow(). Small world.
  • System7 Pack. SpeedyFinder7. Greg’s Buttons. These were crazy programs that modified the system in crazy ways.
  • Talking Moose.
  • Hypercard. A programming environment that was way too easy to use. Kids could write awesome, fully-functional programs. It was obviously too powerful, and had to be killed off. One day I found out the guy who worked across the hall was the guy that wrote the HyperCard parser. I was in awe.
  • MoreMasters(). You had to call this several times at app startup to allocate master pointers. Really.
  • WaitNextEvent(). You had to call it in your stupid event loop. If you didn’t, no other apps would get scheduled on the CPU.
  • The MultiFinder. WTF? Finder->Special->Set Startup->Start Up System with MULTIFINDER!!!
  • The Chooser. Background Printing. AppleTalk. I never understood the Chooser.
  • RAM Cache. Built right into the System 6 Control Panel.
  • Command-I Get Info. Increase the Application memory size.
  • Option+”About this Mac”. You can see the sun setting over the hills in Cupertino. When I worked at the lab with peliom, we made a video streaming app, and I rendered a 3D version of this scene using Bryce for our About Box. I wish I still had that around somewhere. When I got to Apple, I saw this same view out of my office every day.

That’s all for now. I’ll leave by thanking all those responsible for gcc and gdb. And UNIX. Thank you.

Only One More Year of Email!

Prof. Knuth on email:

I have been a happy man ever since January 1, 1990, when I no longer had an email address. I’d used email since about 1975, and it seems to me that 15 years of email is plenty for one lifetime

I’ve been using email since 1993, and I am so done with it. One more year, and then I can pull a Knuth.(via)

Ruby is SERIOUS BUSINESS!

Tim Bray is MAD that RubyConf was on a weekend. _why agrees:

People, Ruby isn’t a game. It isn’t a hobby. It’s certainly not a very good food source and it’s not an article of clothing. You can’t just put Ruby in the wash with a load of whites. Nice try, but no. No. Jeez, grow a brain. Ruby isn’t a tambourine you can bang loudly in my ear. I’m trying to use my iPhone here, guy.

And Ruby is not some bachelor’s party with a foxy lady in a sherlock holmes hat. Hardly: Ruby is all dads. Put a petticoat on, woman. Pop those balloons. We’re all getting paid here and we’re all having kids here. Get with the program.

Ruby is serious business. Real business and totally bankable. Fact: You cannot do it late at night. The office is closed during those hours. You should be in bed like all the other dads. Now, have a nightcap and go put your PJs on, we’ve got to wake up early tomorrow, it’s pancake day.

I love why. Read the whole thing, it’s spot on.

Let me see… I think I can pencil you in between Ubuntu installs.

I did two things last week: sleep, and install Ubuntu. That’s all I did. Acutally, I didn’t really sleep very much, because I was busy installing Ubuntu about 54,000 times. Here, I made a chart:

Liveblogging an Ubuntu 7.10 installation

Photo_102.jpg

Bob, Shag and I are trying to move our book scanning hardware to Ubuntu 7.10 - the Gutsy Gibbon. It’s a ridiculous process, and our hardware is crap. Here are some notes:

  • chai:20 (4:20) - Started up the installer app on the live cd. Unfortuantely the screen rez is 800×600, so we can’t see the important back/next/ok buttons on the bottom of the installer panel. What kind of installer requires greater than 800×600 screen rez?
  • chai:23 - Somehow, by logging the Live CD user out and fucking with the screen rez, we got the screen to display a larger screen res, but we can’t see the entire desktop on our screen. Moving the mouse around seems to pan the desktop, which would kinda work, if we could see the mouse cursor.
  • chai:25 - We are asked for the timezone, and San Francisco isn’t one of the available options. Los Angeles is. However, we opt to move to La Paz.
  • chai:30 - It is now officially time for chai.
  • chai:40 - We have found that starting a lot of xeyes processes lets us estimate where the invisible mouse cursor should be. There are fifty eyeballs on our screen
  • chai:45 - Bob starts playing minesweeper
  • chai:48 - Someone figures out that this version of xeyes lets us resize the window, so there is a GIANT EYEBALL staring at me
  • chai:50 - Installation done, rebooting!
  • Mouse works after reboot! Now to try and scan books!

Photo_101.jpg

Photo_10.jpg

The world would certainly be a better place…

if every tech company wrote customer service letters like this!

To all Woot customers:

I have received more than three emails from Zune buyers who are upset about Woot dropping the price of the Zune by $20 one month after it went on sale the first time. After reading every one of these emails, or at least scanning their subject lines, I have some observations and conclusions.

First, I need to make a better effort to hide my email address.

Second, I am sure that we are making the correct decision to lower the price of the 30GB Zune from $149.99 to $129.99. This confidence is based on more than the holy doctrine of corporate infallibility. The Zune is a breakthrough product, and we have the chance to “ride the lightning” and “shoot the curl” this holiday season, not to mention “kill the messenger” and “rock the vote”, further enabling us to “pay the rent” and “keep the lights on”. It benefits both Woot and every Zune user (but especially Woot) to drag as many new victims as possible into the Zune “dungeon”. We strongly believe that misery loves company this holiday season.

Third, being in technology for 1+ years, give or take a year, I can attest to the fact that the technology road is bumpy. There is always some idiot changing lanes without signaling, and the potholes never seem to get fixed. If you always wait for the next price cut or to buy the new improved model, you’ll never buy any technology product. I mean, why should you? Truth is, you don’t really need any of this junk. We’re afraid you’ll catch on to that fact and overpaid frauds like me will have to go back into fields like telemarketing and burrito construction. Fortunately, most of you continue to languish in a consumerist stupor, wallets spread wide for us to plunder as we please. The bad news for us is that if you buy products from companies that support them well, you will receive years of useful and satisfying service. But we’re hoping you’ll buy from Woot instead.

(more…)

Something for you to listen to: audio from Fray Day 8 SF!

The Fray audio archives are up on the Internet Archive. These recordings from Fray Day 8 San Francisco are superb! This was the last Fray Day, held in November 2004.

Kevin Smokler’s story is very touching. Unfortunately, the recording doesn’t do Kid Beyond’s set justice.

Part 1:
Part 2:

The Return of FRAY!

Today I was thinking about Fray, the old-school story-telling website from back in the day. Unfortunately, they went on hiatus a couple days ago, and and have definitely been missed. It’s odd that the same day that I decided to check up on Fray is the same day that they announce the return of Fray, as a printed quarterly publication! Submissions are being accepted until October 1, so get busy!

I hope they resurrect the Fray Day events as well. We went to Fray Day 7 in SF and got to hear Armistead Maupin read and Noe Venable sing. It was magic.

Update: OK, it’s not odd that Fray picked today to relaunch; today is their 11th anniversary. But it is weird that I picked today to randomly start think about Fray.. hmm…

Four Posts About Copyright

Copyright issues are so technical and complex that it makes talking about copyright in a public forum very hard. Who wants to listen to me talk about “changes to traditional contours of copyright protection”? Nobody! Not even me, and I *love* listening to myself talk!

Well, here are four posts about copyright that hopefully won’t bore you to death.

1. Rick Falkvinge and the Pirate Party of Sweden

IMG_0389.JPG

I got to hear Rick speak when he came to visit the Internet Archive, and he blew me away. Due to lobbying by the (mostly US-based) entertainment industry, broader copyright protection laws are enacted around the world every year. These expanding copyright laws threaten privacy and other civil liberties. In response to this, Rick founded the Piratpartiet in Sweden. They are now the 10th largest political party in Sweden, and are starting to influence real policy change. Rick does a great job about explaining problems with complex copyright laws to the general public. Check out his Google tech talk:

2. Antigua, Online Gambling, the WTO, and Hollywood
The WTO has ruled that the US ban on offshore internet gambling is illegal. The US disagrees, and refuses to lift the ban. Antigua argues that the ban has cost the country $3.4 billion in damages, and has asked the WTO for permission to violate copyright law and distribute US movies and music as a form of compensation.

3. SQLite, the public domain, Germany, and submarine patents
sqlite is an awesome, free, open-source filesystem-based database engine that is in the public domain, which means anyone can use it for any purpose they want. Almost every large technology company embeds sqlite into one of their products.

In Germany, the public domain doesn’t exist as it does in the US. In Germany, authors can’t dedicate a work into the public domain, and thus can’t contribute to sqlite!

Also, due to patent concerns, sqlite uses 17-year old technology, exclusively.. Crazy stuff!

4. A big victory: Golan v. Gonzales

Remember when Kahle vs Gonzales was heard in the 9th Circuit? Well, that went poorly. However, in the case of Golan v. Gonzales, the 10th Circuit has voted unanimously that First Amendment review clause in Eldred has been triggered, and the case has been remanded to the district court. This bodes well for a Supreme Court review of Kahle vs. Gonzales as well.

iLike rocks Facebook




Web 2.0 companies lined up for a mass start at the Facebook F8 Launch this past Thursday. Facebook has 24 million users, set to have more than MySpace’s 150 million users by the end of the year, and an unprecedented empty application market. Just a few days after launch the dust has yet to settle, but iLike is clearly the shot heard around the Facebook. Less than 72 hours after launch of the F8 platform, iLike has over 200,000 users, almost 1% of the Facebook user base and ten times higher than the second place contender picnik, a Flash-based photo editing widget.

Apparently Facebook users like them some music.

Link to iLike Application on Facebook

Massively Asymmetrical Bandwidth

Results of the Speakeasy bandwidth test, 60Mbit down/1Mbit up:
picture6.png
Can you imagine how different the net would be if everyone had this kind of bandwidth at home, and it was symmetric? I think the market for desktop apps would collapse overnight, and owners licensers of broadcast spectrum would pass laws to cripple YouTube bitrates.

A non-profit story

One of the perks of working as a programmer for a non-profit is that you get to collaborate with some top-notch hackers. The other day, I needed to find out the return values of the rm command, so of course I type ‘man rm’ on the Ubuntu command line. The manual page for rm didn’t list the return values, but it did list the authors. One of the names in the Authors section seemed vaugley familiar. “Hmmmm…”, I thought, “isn’t that the guy upstairs?” We ran upstairs and caught him off guard. “Um… that was a long time ago…” he told us. We suggested that he add a return values section to the man page, and then ran back downstairs, giggling like schoolkids. He probably thought we were nuts :)

Help! Disney is breaking the copyright protection on my movie!

I made a movie, encrypted it with a ZIP password, and put it online on my website and so only paying customers can view it. Paying customers can download it from here and watch it.

However, it appears that Disney has published the key needed to decrypt this movie on their website! In fact, a quick google search shows that every web page on disney.com contains this key!!

Does anyone have any advice on how get Disney to cease and desist their copyright circumvention???

AJAX Best Practices

I saw this banner while surfing the web:

Here, I’ll save you $1300:

Best Practices for AJAX content development, rule #1: When developing AJAX web apps, don’t waste your time trying to work around Safari’s many DOM/Javascript/Canvas bugs. Instead, force your mac users to upgrade to Firefox*.

*Corollary to rule #1: At least force them to upgrade to a nightly build of WebKit, but even then, you’re walking into a very buggy minefield.

I would have saved a few weeks of development time if I had followed rule #1 sooner.

Firefox: It sucks, but it sucks much less.

Rules for the New Bubble

Remember the previous bubble?

Remember how we used to go out every day of the week?

Remember dancing all night and watching the sunrise? On a Wednesday? Remember the Best Tuesdays Ever?

Remember how much beer we drank? Remember how much beer we drank at work?

What happened? Now we all work too much. And type to much. We’re old and sober, with hurty wrists.

Rules for the new bubble:

  1. You must see at least five friends every week. Housemates and workmates don’t count. Have more dinner parties. Eat more sushi.
  2. At least twice a month, you must go out on a weeknight. Listen to music, go dancing, go out on a date.
  3. Once a month, you are to go on an adventure. A real adventure. Mountains, Hot Springs, and Playa are all recommended.
  4. Re-institute the 11-o’clock rule: you have to leave for work by 11am. The best thing about this rule is that you are highly encouraged to break it, and if you aren’t out of the house by 11, you might as well go to brunch.
  5. One day a week you are to not touch the computer. No web browsing or email. No typing! Go outside and enjoy the beautiful city and hang out with your awesome friends!

What do you guys think?

Pushy Architects Unveil Groundbreaking Technology For Teen Titans

I just got the strangest email.. It came from pandemicrawfrankfurters at yourhippyfriendskilledaroosterbyblowingtoomuchsmokeinitsbeak.com

I don’t know what you are selling, dude, but I want in. Just let me know where to bury the shoebox full of money.

BREAKING NEWS – BREAKING NEWS – BREAKING NEWS – BREAKING NEWS

Pushy Architects Unveil Groundbreaking Technology For Teen Titans, Brush Aside Conspiracy Theorists Claims of Failure*

BUTTE, MT – NOVEMBER 31, 2008 –

In a remarkable discovery by Scientists who know things of importance, Banned substances composed of gold, freeze-dried tomatoes, bunions, cold frankfurters and extremely wet paste made in Peru have been combined in an innovative fashion to reveal what man has always feared: granite no longer weighs as much as it did in the Stone Age.

Against all odds and despite incredible circumstances of little merit, these Scientists determined this astounding fact while testing 5-year-old Beowulfs infected with the passive-aggressive DNA of long-extinct wooly mammoths.

During the initial testing phase of this mouth-watering experiment, Scientists were surprised to realize the 5-year-old Beowulfs responded with extreme vim and vigor to granite containing the aforementioned banned substances, adamantly licking the granite for days on end with little concern for their surroundings. Eventually, these Scientists came to the conclusion that their test subjects were drawn to the granite because the highly toxic DNA injections created an additional saliva gland completely obsessed with granite. The obsessive licking stripped the granite of its mineral exoskeleton, which proved to be the majority of granite weight.

“It’s a startling discovery, one for the ages. I suspect this will alter the future of man for days to come,” exclaimed Dr. Waz, one of the lead Scientists assigned to the project by his lazy neighbor, Jo-Jo. “I enjoy making things that people look at with their eyes, not their ears. This will eventually cure leprosy, we believe. If Lazarus were alive today, he’d be shooting arrows into the ground.”

Because this information is just now being released to the general public, there are fears of rampant rationing of atrophied orangutan livers, especially among sonar enthusiasts. But Jordan Jordanian, co-director of the experiment, dismisses these fears as short-sighted superstition.

“Spaghetti and meatballs will never be quite the same, as long as I have anything to say about it,” whispered Mr. Jordanian while sipping a bowl of spinach. “We stand by our findings. The results speak for themselves.”

The results quickly added, “Why can’t we save all the rhinoplasty victims, for God’s sake? Man wasn’t placed here to erect large monuments. We were placed here to erect social and sexual mores for the needy. What more needs to be said?”

What happens next, only the future knows. And the future isn’t talking in a loud voice anymore.

“Bacon will always be better than pork chops, that’s one thing you can count on,” echoed the future from a previous interview edited for television.

Yet, there are some who believe the Scientists need to conduct further tests before releasing these findings to the public.
“As a pushy architect with a zest for killing wild boars on partly cloudy days, I fear for the safety of teen titans from sea to shining sea,” brayed dr. P. P. timmmii, founder of the Swiss Foundation for Found Founders. “It’s still OK to prefer pavement. Granite is for the weak and ill-fitted. But I will say this – those stupid jackoffs who go to Burning Man every year will finally be able to ride faster, once we replace the granite. Gravity isn’t pretty.”

For more information regarding this important discovery by the Scientists, contact your local Notary and ask for more peanuts. Zygotes not included without written permission from your kidnapper. For less information, please
visit:
http://yourhippyfriendskilledaroosterbyblowingtoomuchsmokeinitsbeak.com/

DIY MultiTouch Keyboard Roadmap

avrusbkey

Today my AVR USBKey dev board finally came and I’m on my way to making an open source clone of my beloved TouchStream keyboard. I’m using the Cypress CapSense parts for the multitouch sensing and AVR parts for doing the processing and communication. The first prototypes will have most the processing done in software, actually, and then I’ll decide between AVR and ARM7 later.

Here is the roadmap:

  1. Write OSX userspace app to communicate with AVR over USB and emulate mouse/scroll wheel
  2. Prototype (onetouch) CapSense slider using Cypress PSoC chip
  3. Have PSoC chip communicate with AVR using SPI or CAN bus
  4. Implement slider that emulates scroll wheel that I can attach to the side of a Cinema Display (using userspace app for processing).
  5. Prototype small 2D multitouch touchpad using one PSoC chip communicating with AVR
  6. Make larger 2D multitouch surface with multiple PSoC drivers, all talking to the AVR
  7. Work on gesture recognition code in the userspace app
  8. Port gesture code to the AVR or ARM7
  9. Get keyboard to work as a HID device without drivers or the userspace control app.
  10. Done with version one!

Making MUNI Suck Less

I’ve been spending many hours criss-crossing the city on public transit lately, and I’ve decided I don’t like those MUNI buses shrinkwrapped in gigantic ad banners. They’re like billboards on wheels, except even larger, and somehow even more lame.

We’re doomed to live with both billboard and advertising-wrapped buses, right? Well, maybe not.

What if San Francisco banned billboards, like some other communities do? The cost of putting giant ads on the side of a bus would go up, and MUNI would get more money, and maybe they would use the extra money to make their service suck less. And we would have no billboards, expect the ones on wheels. What do you think?

Note that in real life, I don’t think banning stuff is a good idea, even if the stuff is lame, like billboards. I also don’t think MUNI would actually use the extra money to help me get around the city any faster.

Obre

obre.jpg So, I wish I could give you guys a run down of last week at SXSW, but my brain is still a little fried from it all, so I can only say I had an awesome time and met lots of super interesting people, one of whom gave me this funny business-card-sticker and whose name i totally forgot so I googled the only word on it today and voila!…I find that he’s an artist and video-podcaster for Make magazine and has a blog called “I Make Things.” Anyways, SXSW was full of moments like these where almost everyone I met was working on something neat and there was no shortage of interesting conversations.

Also, I know you guys are skeptical but Austin is a totally fun place! I mean how can you not love a town that’s the birthplace and headquarters for Whole Foods as well as a major center for artery-clogging-all-you-can-eat-big-ass-barbecue!!

And did I mention there were robots?!
dorkbotAustin02.jpg

Older Posts »