Monday, August 26, 2013

XOFilmmaker: To Mux or To Demux

Whew!

Tonight I had some open time and managed to get back to my XOFilmmaker development work, which rocks.

Inspiration from Peru
I recently joined OLPC's laptop.org support mailing list and it's been super interesting to see the chatter on there. I had a conversation with a teacher out in Peru, working with kids on the XO laptops. They said they are very excited to try XOFilmmaker when it is done, and they really look forward to making movies with it!! Wow. They said they will "definitely use it" and are excited. Talk about the motivation I need to get back into the fray and bend the (increasingly complex) GStreamer library to my will! For the good of the kids, I *will* solve this!!!!!!!!

What were my goals tonight?
My goal for tonight was to jump back in whole-heartedly. I haven't had time for the past 2 months to work on this given my travel in Texas and SIGGRAPH conference talk, so I wanted to pick things up from where I left them back in June.

In June I had written some code which took in an Ogg video file filmed with an XO Laptop's webcam and then successfully spliced a portion of video A with a portion of video B, and then played that video back. Pretty good start. But, there is no audio attached, and I'm not sure why.

I have 2 goals which I was hoping to chip away at tonight, and I managed to make some progress.
  1. Figure out how to get it to play back sync'd audio along with the video.
  2. Write the file to disk, instead of play it back on screen.
So, how did it go tonight?
At first, slooooooooooowly. I ran into a lot of problems and some roads that looked promising but led nowhere.

I spent a bunch of time digging into GStreamer and GNonLin more, but kept running into more walls.

I started with the attempt to write to disk... it didn't work at first attempt, though I did get a 0-length file written to disk. So, not exactly sure how to do this, but I probably need to remove the streamer from the playback UI and just run a command which does not sync to the UI. I suspect I need a "filesink" for this, not the playback  "autovideosink". Anyway, I decided to leave this for another time and jump into figuring out the missing audio.

With every night like this, I end up pushing through the frustration of not getting anywhere and banging my head against the GStreamer API, making a few silly mistakes, and then eventually learning something and making some minor progress. Just need to keep at it and make sure I make time for lots of these evenings before the end of the year... then, just maybe, I'll be able to get this open source software out the door and into the hands of kids in Peru!

Let's look at where I started:

=======================================================
#!/usr/bin/python
import pygst
pygst.require("0.10")
import gst
import pygtk
import gtk
import gtk.glade

class Main:
    def __init__(self):

        # set up the glade file
        self.wTree = gtk.glade.XML("gnonlin.glade", "mainwindow")
       
        signals = {
            "on_play_clicked" : self.OnPlay,
            "on_stop_clicked" : self.OnStop,
            "on_quit_clicked" : self.OnQuit,
        }

        self.wTree.signal_autoconnect(signals)

        # creating the pipeline
        self.pipeline = gst.Pipeline("mypipeline")

        # creating a gnlcomposition
        self.comp = gst.element_factory_make("gnlcomposition", "mycomposition")
        self.pipeline.add(self.comp)
        self.comp.connect("pad-added", self.OnPad)

        # create an audioconvert
        self.compconvert = gst.element_factory_make("audioconvert", "compconvert")
        self.pipeline.add(self.compconvert)

        # create an alsasink
        self.sink = gst.element_factory_make("alsasink", "alsasink")
        self.pipeline.add(self.sink)
        self.compconvert.link(self.sink)
       
        # create a gnlfilesource
        self.audio1 = gst.element_factory_make("gnlfilesource", "audio1")
        self.comp.add(self.audio1)

        # set the gnlfilesource properties
        self.audio1.set_property("location", "/home/mjutan/high_1.ogg")
        self.audio1.set_property("start", 0 * gst.SECOND)
        self.audio1.set_property("duration", 5 * gst.SECOND)
        self.audio1.set_property("media-start", 0 * gst.SECOND)
        self.audio1.set_property("media-duration", 5 * gst.SECOND)

        caps = gst.Caps("audio/x-raw-float")
        self.filter = gst.element_factory_make("capsfilter", "filter")
        self.filter.set_property("caps", caps)
        self.pipeline.add(self.filter)
       
        # show the window
        self.window = self.wTree.get_widget("mainwindow")
        self.window.show_all()

    def OnPad(self, comp, pad):
        print "pad added!"
        convpad = self.compconvert.get_compatible_pad(pad, pad.get_caps())
        pad.link(convpad)

    def OnPlay(self, widget):
        print "play"
        self.pipeline.set_state(gst.STATE_PLAYING)

    def OnStop(self, widget):
        print "stop"
        self.pipeline.set_state(gst.STATE_NULL)

    def OnQuit(self, widget):
        print "quitting"
        gtk.main_quit()

start=Main()
gtk.main()

=======================================================

I spent an impressive amount of time stuck on a Python error. Whoops.

I was trying to force the "type" (or "caps") of the format to be audio/x-raw-int, trying to get the audio layer of the Ogg file extracted and get that to play back.

I should explain: Ogg is just a container. And it contains 2 pieces in my case, a "Vorbis" audio stream, and a "Theora" video stream. I've already successfully extracted the Theora video stream and can splice that together, so that rocks. But I gotta figure out what the deal is with the audio.

As you can see here, the file I recorded with the XO webcam is a combo Ogg file which contains Theora and Vorbis together.

=================================================
 [mjutan@localhost Downloads]$ ogginfo high_1.ogg
Processing file "high_1.ogg"...

New logical stream (#1, serial: 4428c820): type theora
New logical stream (#2, serial: 35df27fa): type vorbis
Vorbis headers parsed for stream 2, information follows...
Version: 0
Vendor: Xiph.Org libVorbis I 20120203 (Omnipresent)
Channels: 1
Rate: 16000

Nominal bitrate: 48.000000 kb/s
Upper bitrate not set
Lower bitrate not set
User comments section follows...
    ARTIST=Mike Jutan - San Francisco
    COMMENT=olpc
    ALBUM=olpc
    TITLE=Video by Mike Jutan - San Francisco
Theora headers parsed for stream 1, information follows...
Version: 3.2.1
Vendor: Xiph.Org libtheora 1.1 20090822 (Thusnelda)
Width: 400
Height: 300
Total image: 400 by 304, crop offset (0, 4)
Framerate 10/1 (10.00 fps)
Pixel aspect ratio 1:1 (1.000000:1)
Frame aspect 4:3
Colourspace unspecified
Pixel format 4:2:0
Target bitrate: 0 kbps
Nominal quality setting (0-63): 16
Vorbis stream 2:
    Total data length: 23413 bytes
    Playback length: 0m:05.767s
    Average bitrate: 32.472954 kb/s
Logical stream 2 ended
Theora stream 1:
    Total data length: 31776 bytes
    Playback length: 0m:05.900s
    Average bitrate: 43.086102 kb/s
Logical stream 1 ended
=================================================
Ok so where next. I got caught up on the syntax for the "Caps", trying to supply a similar arrangement to this code below in Python which did not work at all.

There is a command-line version of GStreamer that you can access with gst-launch and that allows you to sort-of "prototype" out a streamer Pipeline on the command-line to see if it works before then trying to integrate it into Python. So that's pretty cool.

Problem is, I was getting supppper weird results from this below. This was telling me that GStreamer was missing some plugins which turned out to be a pretty awesome red herring/wild goose chase.

I also was silly and tried to set a caps value on something using this format:
self.audio1.set_property("caps", "audio/x-vorbis")

And I got a pretty clear TypeError from Python. I was so confused though that I went on a search trying to figure out what I was doing wrong. As it turns out, it was a simple type error and you need to create a Caps object, like this:
        caps = gst.Caps("audio/x-raw-float")
        self.filter = gst.element_factory_make("capsfilter", "filter")
        self.filter.set_property("caps", caps)

But,  as it turns out, I may not even need that. D'oh.

Anyhow, this took me on a trip to attempt to install all the other gstreamer plugins, consider building gst-plugins-base myself, and a bunch of other things that didn't work. All because of this weird message about missing plugins.

=================================================
gst-launch gnlfilesource name=video location=$PWD/high_1.ogg \
start=0 duration=5000000000 \
media-start=0 media-duration=5000000000 \
! identity single-segment=true ! progressreport update-freq=1 ! ffmpegcolorspace \
! theoraenc ! oggmux name=mux ! filesink location=$PWD/outputResult.ogg \
gnlfilesource name=audio caps="audio/x-raw-int" location=$PWD/high_1.ogg \
start=0 duration=5000000000 \
media-start=0 media-duration=5000000000 \
! identity single-segment=true ! audioconvert ! vorbisenc ! mux.

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
ERROR: from element /GstPipeline:pipeline0/GnlFileSource:audio/GstURIDecodeBin:internal-uridecodebin/GstDecodeBin2:decodebin20: Your GStreamer installation is missing a plug-in.
Additional debug info:
gstdecodebin2.c(3576): gst_decode_bin_expose (): /GstPipeline:pipeline0/GnlFileSource:audio/GstURIDecodeBin:internal-uridecodebin/GstDecodeBin2:decodebin20:
no suitable plugins found
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
=================================================


Bah. So anyway after that, I then managed to get through the Python errors and then ended up with this pretty hard-to-understand error. It's basically saying that my audioconvert module is failing and that sortof implied again that maybe I was missing a plugin. Hmm...

 =================================================
** Message: pygobject_register_sinkfunc is deprecated (GstObject)
play
pad added!
Traceback (most recent call last):
  File "gnonlin-tutorial1.py", line 64, in OnPad
    pad.link(convpad)
TypeError: GstPad.link() argument 1 must be gst.Pad, not None
stop
quitting
 =================================================

After more searching I finally came across this useful line. And enter the magical demuxer....

 =================================================
gst-launch filesrc location=$PWD/high_1.ogg ! oggdemux name="demuxer" \
  demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink \
  demuxer. ! queue ! theoradec ! ffmpegcolorspace ! autovideosink
=================================================

I ran this line and... voila!!!!!!!! My video clip played in a viewer, WITH AUDIO!!! Huzzahh!!

So this is great news. I suspect the problem turned out to be that really I just need to essentially "unpack" the Vorbis audio file from the OGG container... I can't just "read the audio portion" from the Ogg file... though that seemed to work fine with the video portion. I guess I actually need to "demux" the Ogg file first, essentially unpacking it into it's audio and video portions. From there, I should hopefully be able to then compile up the start and end time segments that I want, and then re-compile them into a new Ogg file ("muxing them") and save that out to a filesink on disk. And of course, I'll need to do that in Python.

So after a lot of tripping over the wrong things, I feel like I managed to make some progress. The issue with my specific file is likely that I need to demux it first or something like that. I just tried an initial version of this in Python and I don't get any audio playing... but at least there are no failures.

One other odd thing in that this seems to work ok with the filesrc object. But I need to use the "gnlfilesource" object so I can splice it. That seems to hang up the pipeline for who knows what reason...
gst-launch gnlfilesource location=$PWD/high_1.ogg start=0 duration=5000 \
  media-start=0 media-duration=5000 ! oggdemux name="demuxer" \
  demuxer. ! queue ! vorbisdec ! audioconvert ! audioresample ! autoaudiosink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...

Maybe you have to have a  gnlcomposition for this to work. Anyway, I should go to bed. 3am on a "school" night :)

Something to try to continue another night. Off to bed to dream of video editing in developing nations.

Mike :)

Saturday, August 24, 2013

Introducing, the Menurkey

This is hilarious and awesome.

The Menurkey!

This year, the Jewish celebration of Chanukah and the American tradition of Thanksgiving land on the same day for the first time ever. There is this hilarious video, a song that goes with it, and an opportunity to actually order a 3D Menurkey Menorah for your very own, via their Kickstarter project.

Check it out!!!
http://kck.st/1d2vZrq

The 9-year-old inventor of the Menurkey (and his creative parents) reached out to Matt and Me, and we will be partnering with them to make a special version of iMenorah for this year. We'll announce that when it's ready sometime in October. But right now you can order your very own real-life Menurkey via the Kickstarter link :)




Texas 2013 Day 11: Wrap up

7/8/2013
Texas 2013 Day 11: Wrap up

Howdy!
And... here we are. What an awesome trip. It went by SO fast! Everyone had a great time and it was a huge success.

For the last day in Texas, we started by cleaning the lake house and packing up all of our stuff so we could chill out and enjoy the day. After prepping everything and heading back to Buc-ee's to get some more beef jerky for me to take home, and going to H.E.B. so I could buy some of their amazing coffee to take home... we got everything ready to go and then headed to the Dry Comal Creek winery.

Dry Comal Creek winery
It was great to actually have a chance to go there as we were worried about potentially missing it. The tasting was great and I really liked the White Black Spanish wine I'd already bought. The had a great French Colombard which she called a "front porch wine" which is exactly the kind I like. :) It said "Demi-Sweet" but it was pretty sweet, just not over-the-top. Great stuff. Their Sangria was also amazing and I got an extra glass of that.

Then we headed to Frank's parents' place to chill out and enjoy ourselves before heading out for the drive back to Austin to the airport. We took a little break out at a funny outdoor furniture store, which had some funny stuff.

Outdoor furniture craziness
Rawrrrr!!
USA
We then spent the rest of the afternoon and evening at Frank's parents' place. It was great to chat and enjoy their company some more, and also play with the cats. I was particularly excited to see sweet Gracie again because he was so sweet and rolled around a lot outside while I was petting him. He is an amazing and awesome cat.

We had some great food for dinner and Frank's parents as always made us feel so happy and welcome and comfortable. It was a real pleasure to get to spend so much time with them and to be welcomed into their home with such open arms. What a great time! We enjoyed it there and chatted for a few hours before heading back to get our stuff and off to the airport in Austin.

Here are a few photos of the cool souveniers that I took back to San Francisco.

Awesome ceramic bird I bought
Bright shoes from the Adidas outlet
Hilarious socks I got at Buc-ee's... seems like they should almost be Canadian. A moose with a beer and a beaver in a life jacket?!
The beaver in the speedo is hilarious
Iced Tea tea bags and Pecan Pralines to take into work
My awesome belt, steer buckle, and extra buckle
My boots!
Oh these boots are so awesome
Don't mess with it
Spicy Jams
Franklin BBQ sauce
Whiskey and Wine
Amazing coffee from H.E.B.
Flavoured salt, Texas keychain and Mango tea from Jess's family
What a great time we had in Texas. I was so happy that Frank and Jess invited us to come see life as they lived it as children. It was really cool to see some of the places that Jake and my other Texan friends have talked about and to experience the culture for myself. As usual, that's the part I find the most interesting.

Also, WOW. That Franklin BBQ brisket was REALLY good.

Y'all like it? Y'ount'to go to Texas someday too?
-Mike Jutan
July 2013

Texas 2013 Day 10: Franklin BBQ

7/7/2013
Texas 2013 Day 10: Franklin BBQ

Heeeerrre we gooooo!!!!!!!!!!

We got up SUPER early today to drive from New Braunfels to Austin, just to get in line for 3+ hours for BBQ. But not just any BBQ... the place defined as "one of the 10 most important restaurants in the US" and consistenly voted the top BBQ in Texas since they opened. They have sold out of their food on EVERY SINGLE DAY OF OPERATION. Think about that for a second. They have NEVER *NOT* SOLD OUT of all of their food on any day they are open. Amazing.

So you can imagine our excitement this morning.

8:20am, Austin. Let's do this.
A nice message while we wait in the sunshine
Franklin BBQ, you epic place
The line gets longer and longer

We got in line at 8:20 and we were far from the first people there. There were perhaps 30 or 40 people ahead of us already, which had us a little worried that we might not get any brisket... but thankfully it all worked out. Fortunately they are super organized and they have a guy walk down the line and take your orders and give you any warnings of food that might be out by the time you get in. Eventually, the line actually gets cut off so that people don't wait forever and end up with no food. Franklin BBQ opens at 11am, and it was already getting hot at 8:20.

Susie kindly showed up to bring us coffee and doughnuts, what a champion. Michal and I at one point were so hot we headed to the CVS around the corner to get some water. Whew!! But with lots of drinking of water and lots of staying in the shade, we were all good and still excited when 11:30am rolled around and we got to go inside into the glorious A/C.

Susie brought us doughnuts!
Chillin' out in line
And the line gets longer!
11:30am: We're in!

We waited in line for about 30 min inside and all bought T-Shirts to commemorate what was going to be the tastiest brisket of all time. We got up to the front and got to watch the owner of the place in awe while he worked his magic.



We really wanted to try the turkey as well, but the lady in front of us ordered the entire thing for her son's birthday party. Nooooo!!! That was too bad and the owner must have overheard us. He sliced off a small piece for us to taste... what a nice guy. Excited about my new shirt (and trying not to get BBQ sauce on it), I ordered exactly what Anthony Bourdain ordered when he was there: 1lb brisket - 1/2 lean, 1/2 fatty. No nonsense stuff like sides or extras. Just straight amazing brisket.

Here's the man himself, slicing some brisket for us!
Ohhhhhhhhhhh so good
Check out the "smoke ring" on this brisket
SO PSYCHED
This was amazing
They had free pickles and also they gave us some plain white bread to dip in the sauce. The sauces were fantastic, and the Espresso one was my favourite. Glad I have the bottled versions of those to take home to California with me! I did also get a small Banana Bourbon pie to take away for dessert later.

The food was absolutely phenomenal. The brisket was exceptionally soft and tasty, the smoke flavour was just permeating perfectly through the meat, and the fatty and lean versions of the brisket were both excellent. The lean one was a little easier to just eat the whole piece at once, while the fatty one was a little juicier (just a little bit) but you had to eat around the fat. This was literally the best brisket I've ever had. It was insanely amazing.

After a truly stellar meal of 1lb meat only and nothing else, it was time for a break in the park. We headed to sit by the water and relaxed and digested our massive meal. It was nice to walk around a bit there and to just enjoy Austin after such an epic food experience.

From the park, we headed to the UT area and went to a coffee shop where I bought a Freddo, which is something like my favourite Cafe Shakkerato! That was really good. We then headed down to do some random shopping and I saw a "Keep Austin Weird" t-shirt. I also saw those hilariously small Texas flag shorts that girls wear for July 4th, and joked about buying them for myself.

Out for a drink
From there we went to the Driskill Hotel to look around the lobby and also to get a drink and chill out from the heat outside. This was fun and a relaxing break after so many hours outside again today. There was a possibility of a cool bat show in the evening, but we were all so tired that we headed back to the lake house instead. When we got there we were so tired from the day that we just stayed in for the rest of the evening and chilled out. What an amazing day!!

Texas 2013 Day 9: Tubing and Cowboy Boots

7/6/2013
Texas 2013 Day 9: Tubing and Cowboy Boots

Tubing today!! This was another big reason for the trip to Texas -- Frank and Jess had told me all these great stories of "Tubing on the Guadalupe" and I was really keen to take part in this honoured pasttime from their childhood summers.

We headed off a little later than usual and stopped first at Buc-ee's for breakfast food and extra drinks. Then off we went to Gruene to "put in" at Rockin R rentals. They were very organized, we paid for the tubes and dropped off anything we didn't need for the trip, tied the drinks onto the tubes and tied on a garbage bag, and off we went!

Tubing
Tubing
Tubing
It was really fun. Most of it was quite slow, very much like a lazy river. There were lots of people out there, having fun and just taking it easy. There were some nice views along the way of cool lakeside properties, and we chatted along the way about which ones we liked the best -- Frank getting to geek out about his architecture knowledge as well.

After about 2.5 hrs, we got out and were driven back to the first spot. We changed back into our shorts and headed for the outlet malls! First we went back to the boot place and they had all the boots out at this point and organized into their appropriate size areas, and separated out male vs. female. They had done a lot of work to get organized in the last few days! I tried on LOTS. I tried on a size 9 square toe and it fit fine, but I preferred a rounded or pointed toe because it looked so much more like a cowboy boot. Rounded was the best though. I tried the different widths too: B, D, EE... and it turned out that 9.5 D was my best fit. I liked a plain brown one, but after trying it on it was a bit too plain. I tried on a few others that looked too ornate on the toe and looked too girly. Then I tried a brown one with nice stitching work, but it was too tight on the toe which would be an issue later.

My boots!!!!
My epic boot purchase
The best fit after trying on about 15 boots was a Cherry Black goat and lizard boot! I really liked it and though the lizard part is a bit unusual, it's also pretty subdued and not in-your-face like the alligator ones, so I like it. It's a great fit and looks great with jeans. It's also super funny to be getting these, but Frank and Michal and Jess all approve so it's go time! Apparently I shouldn't wear these with shorts unless I am a girl, so that's too bad. I'll need to invest in some boot cut jeans I guess. I bought them and I'm so excited as to how they will look with a suit and with my regular jeans too. They were a super good deal too. The regular price on these, since they have "exotic leather" is about $540, and I got them for $299! A great deal given how much cowboy boots tend to cost, and this brand (Lucchese) are some of the best.

Awesome Texas whiskey and wine I got
The boot outlet appeared to be a new business venture for the owners of the next-door Gabriel's Liquor Warehouse! So we went in there as well, and I got some wine from Dry Comal Creek winery in case we don't get there before we leave. I also got a great Texas whiskey called Rebecca Creek, which we had tried at the rodeo earlier in the trip.

From there, we headed out for dinner and to go meet Alex and Tammy and their baby!! It's so nice that they made the trip. We headed to Root Cellar Cafe, and they had great food. We started with spinach artichoke dip and bruschetta. We also got beer bread with honey butter which was excellent. I got a Pecan-Bourbon chicken salad with fried zucchini sticks, and Michal got a salmon and salad which was also excellent. The food was fantastic and it was awesome to have time to catch up with Tammy and Alex... they are so cool. :)

Salmon for dinner
Fried asparagus!
Frank very seriously cutting his burger
Jess and some leafy green salad situation
Good times!
Tammy and little Mr. Texan!
After this tasty dinner and good chat, we headed back to the lake house. Frank's parents arrived and we chatted and unpacked and showed off our boot purchases. We had an ice cream snack and I caught up on my journal, heading to bed thinking about how glorious Franklin BBQ in Austin will be tomorrow.

Tuesday, August 20, 2013

Texas 2013 Day 8: San Antonio

7/5/2013
Texas 2013 Day 8: San Antonio

Day 8 in Texas started with a bang. Not literally like the fireworks last night, but more culinary in the form of epic breakfast tacos. We were off to San Antonio for the day and started off at Frank's favourite place, Taco House. I got an egg and potato, carne guisada (naturally!), Potato Mexicanos, and Chilaquiles. It was all fantastic and super tasty, but had some kinda hefty heartburn after such a heavy breakfast! Was super tasty and fun to try though.

Frank losing his crap over breakfast tacos
Frank enjoying every bite
Jess and Christy at breakfast time
From there it was off to Frank's Grandpa's house to have a little visit. It was super nice to hang out with him and lovely to chat with his wife too, to see their place, and to hear some stories. So fun!! After our visit, we headed off to Market Square in downtown San Antonio for a wander and to look at some crafts. It was really cool, the shops were great and I saw some pretty cool belts. There were also some gun holsters and shotgun holders, pretty crazy stuff! Lots of Mexican artwork too, and some Mexican vanilla extract which is apparently the best you can get. I got a cool little ceramic bird made by Mexican artists, which was awesome.

San Antonio Market Square
A variety of fruit on a stick
Haha awesome pic of me and Michal and an awesome mango-on-a-stick
Gun holders and whips?
Cool ceramic work
Honorary Texan :)
Market
Haha, so Texas-y
Rifle holders, don't often see this at home!
Cool hanging ceramic peppers
"We don't dial 9-11" haha
Artisan Mexican Candy
Cool store


Then it was off to Mi Tierra's for desserts. We got a vanilla cream filled churro which was the best, especially when dipped into Mexican hot chocolate. I also got a Mexican fudge which rocked, a coconut thing which was too sweet and a guava pastry which was pretty good. It was all pretty good but VERY sweet. We needed some water after all the sugar!

Time for some sweets!
Beautiful flower with sunset-like gradient colours
Guava Campechana
Crazy pralines
Churros
Guava and coconut sweets
Amazing caramelized fudge-like item
Then we headed out of the market area, aiming to head down the San Antonio River Walk. We saw some more shops including one that looked like it might have a good belt for me... and we walked in to an amazing experience. The place was called El Vaquerito and I was just totally blown away by how amazing it was. What an AMAZING place. Definitely come here for leather goods, belts, buckles, boots, whatever Western Wear you might need. This place is amazing and the store proprietor, David, is truly an awesome guy.

David was just so wonderful. He blessed us for being there and said "Thank you for blessing me today and for being here", he had his kids with him there too and you could see how genuine of a guy he is as well as how good of a salesman he is as well. He showed me a few things but nothing over-the-top and nothing way out of my price range or anything like that. He showed us a few things and then left us so we could shop but was there to answer questions if we need him. He knew the exact kind of store atmosphere someone needs to feel completely comfortable in. It is the kind of place where I walked in and immediately knew I was going to purchase my belt there -- it didn't matter if the price was going to be a bit more or less or whatever (it turned out it was a good deal as well, so that was a bonus!) but I said to myself, "This guy is definitely getting my business." He was knowledgeable, and a very kind salesperson, but also very hands-off so you could shop in peace. A real pro.

I found a cool belt buckle with a gun on it with a chamber that rotated, a little silly but kinda cool and very Texas-y. It was a little much for me to wear back at home in San Francisco so I ended up getting one with a cool steer on it. It was awesome and I loved the belt as well as the buckle. I also got an extra silvery buckle that can be changed out with the steer one. Very cool!

I was gonna throw out my old existing belt and just wear the new one out of the store... but David stopped us from throwing it out and said, "I can take it for you if you like, I'll pass it along to someone who needs it. The more you give, the more you get. That's what I believe." WOW!!!!!!! What a nice guy!! Just incredible. So in the spirit of David's good nature and genuineness, I felt I owed him a solid online review :) I'm gonna post this on Yelp too. You should all go shop there if you are in San Antonio, he is awesome and you should support him.

River Walk
From there, we headed to the river walk. We walked along there and it was a little different than what I expected, it was mostly restaurants and not too many shops. We got some water at some point which was a bazillion dollars but was worth every penny... it was HOT. We then headed to a place for a Margarita called Cafe Ole which was a funny name but an epically terrible spot with terrible service. As good as David was at the belt store was as bad as the service was at Cafe Ole. Oh well. It was at least a cool spot to take a break and drink some more water to avoid melting.

Michal and Me at The Alamo
From there it was off to The Alamo. I enjoyed learning about the history of the place as well as the hilariously Texan and really incredible/crazy story of the "Come and Take It" flag that I'd seen around in Texas a few times. I also saw an early Texas flag and learned about the fortification of The Alamo as well as where the phrase "Remember The Alamo" came from. Very interesting stuff.

We were then getting pretty tired of the heat so we headed to the indoor A/C gloriousness of the mall. I had a free Starbucks reward that was perfectly spent on a HUGE "Trenta" (30oz) iced tea!! Worth it :) Frank picked us up and then we drove to an amazing place called La Fogata for dinner.

It was truly epic. They had a mango magarita which was super tasty and had mango flavouring swirled through it. The guacamole was amazing and was made for us at the table. Michal and I shared the fajitas which were perfectly spiced and had excellent flavour. Dessert was Sopapillas, with honey on them... sortof like clouds of perfection. It was incredible!

Cute one of Michal and a flowery drink
Sopaipillas, spanish for "HOLYCRAPAMAZING"
Ohhhhh man what a great dinner, and a busy day of eating too much! But what a way to finish the day... it was so good.

I was so exhausted from all of the sunshine that day that I slept all the way back to the lake house. I was still pretty tired on arrival at the lake house, so a bit more of a nap before getting up to hang out a bit more and play some Spaceteam on our iPads before going to bed. What an action-packed day!