Sunday, October 27, 2013

Exploring New Places with Girlfriends

I just got back from a week long vacation in the Santa Fe area with two girlfriends - Nancy, whom I've known for 20 years and Rebecca whom I've known for 15 years. What a treasure it is to be able to experience a new place with old friends! Full set of photos here: http://www.flickr.com/photos/27108151@N03/sets/72157638477039385/



Sunday, October 20, 2013

We arrived in Albuquerque mid day. We stopped for lunch at Lucia Restaurant in downtown in the Hotel Andaluz (one of 3 original hotels built by Conrad Hilton in the U.S.). I had a salad with pears and sweet potato fries.

We stopped at Kokopeli on Old Santa Fe Trail in downtown Santa Fe. Then, we proceeded to Casa Archuleta at 839 East Palace - our little abode for the week - a traditional adobe about .6 miles from the plaza.


After putting groceries away, we strolled down to the plaza and took some photos. We shopped at Trader Joe's and Whole Foods to get breakfast and lunch rations for the week as well as food for a couple dinners.

We finished off the evening at The Pantry. I had the chile relleno omelette and we shared a sopapilla. I drank a cheap margarita made with agave wine.

Monday, October 21, 2013

We slept in and then hiked the Aspen Vista trail just below the Mt. Baldy ski basin. We started at 9,000 feet elevation amongst the aspens and hiked to around 11,500 feet before encountering some significant snow and heading down. Most of the aspens were emptied of leaves, but there were some stunning trees on the lower parts of the trail.


We dined that evening at the Blue Corn Cafe. I had a nice seasonal IPA to drink and a cup of chili verde, a cup of creamy corn bisque. Both were spicy. We shared a spinach salad.

Tuesday, October 22, 2013



We got up early and headed north by car. We started in the town of Chimayo, photographing the tiny church with its healing dirt - Sanctuario de Chimayo. We stopped immediately after at Centinela Traditional Arts, where husband and wife team Irvin and Lisa Trujillo are 7th generation weavers. Their tapestries commanding up to 6 months to make and $50,000 to own. 


We drove the high road through the area where the Milagro Beanfield Wars was filmed and ended up in Taos. We had lunch at Gutiz. I had the Mexican hot chocolate and the Taoseño, a vegeterian chili dish with a scrambled egg on top.

We spent an hour or so at the Millicent Rogers Museum - a collection of jewelry, native American artifacts and religious art created by a New York socialite who spent her last years in Taos.


The last 1.5 hours of daylight were spent at the Taos Pueblo, photographing in the waning sunlight. We spent a tiny while in the Taos plaza on the way out of town, as the Sangre de Cristo mountains were bathed in blood-red setting sun.




We drove home in the gloaming as we practiced using gloaming in every sentence. Dinner was carnitas tacos, salad and green beans prepared at our Casita.

Wednesday, October 23, 2013



We started the day with a hike up Atalaya Mountain. At the junction of "steeper route" and "easier route", Rebecca and I headed steeper, determined to summit before our 1:30 turnaround time. Nancy continued on the easier route. We arrived at the summit at 1:05 and headed back down after a short break.

We ended the day at 10,000 Waves - a Japanese-inspired spa in the hills above Santa Fe. Rebecca and I had Shiatsu massage and Nancy had a foot and head/neck treatment. We spent time in the relaxation room and lounging in the thermal pool. I even managed a second or two in the cold plunge.

We dined that evening at La Choza near the rail yard. I had a tamale and a blue corn vegetarian burrito, smothered in red and green chile sauce with a jalapeño margarita.

Thursday, October 24, 2013



We set out in the morning for Bandalier National Monument - some old cave dwellings near Los Alamos. After a visit to the information center, we plotted the rest of the day. We hiked, climbed into caves, and photographed the stunning former native dwellings. After enjoying a cup of pozole, we headed out.


Our next stop was the White Rock Overlook in Los Alamos, where we met an older gentleman who grew up in the area and educated us about the native people groups and the rift valley where we stood overlooking the canyon.

We took the long road around to the Valles Caldera and photographed the low sun and the grazing elk.


After the caldera, we stopped at a trailhead where we could hike to Jemez Falls. We were fortunate to capture the only part of the day where light would hit the falls perfectly.


We made a final stop at Red Rock on the way out of the mountains where we caught a couple shots in the dying twilight.


After a two hour drive back in the dark, we dined at Cafe Pasqual's - the definitive best meal of the trip. We shared a vegetarian stuffed sugar pumpkin, cochinita pibil, and chile en nogada along with a dessert sampler before rolling home.

Friday, October 25, 2013

It rained overnight and through the morning, so we planned a town day on Friday.

We started above the city at the Musem of International Folk Art where they had an exhibition on Japanese kites. We each made a miniature kite that we then tested in the courtyard outside.

We had lunch at Palacio Cafe, where I consumed a boat of coffee and had huevos rancheros with mixed chile sauces.


We then went to the Georgia O'Keefe Museum and looked at her works from the Lake George area, stopping at the Chile Shop on the way back for gifts of local chiles. A final stop took us to C G Higgins Confections for some piñon brittle on the way home.


In the evening we strolled through the open artist studios of Canyon Road, and then enjoyed roasted brussel sprouts with pomegranetes, green beans and sausages, prepared at the house.

Saturday, October 26, 2013

We left the house at 9:30, dropping our keys off at the rental office and heading to the rail yard to visit the Santa Fe Flea and Farmer's Market. We enjoyed the smell of roasting chiles along with some pumpkin piñon oven bread while walking through the market.

We each purchased a little turquoise from Roberta's Fine Jewelry stand - at much better prices than we'd seen in the Plaza. At noon, we jumped in the car for the drive back to Albuquerque to catch our plane home.

Monday, May 13, 2013

Ask A11y Volume 2


About A11y:  I answer a lot of questions about Web accessibility best practices at my job, so thought I would bring some of those topics online for the larger community. 

Dear A11y,

As a web developer, I make sure to include alternative text on all my images via the alt attribute. Why the heck would I ever want an empty alt attribute?

Signed,
Alternative in California

Dear Alternative,

As you already suggest, it is important to include alternative text for image tags in your markup. This provides blind and low-vision users a text explanation of what the images are, which helps provide context. This is especially important when an image takes a predominant position on a Web page and there is little surrounding text content for context. 

You may have also heard that you should not provide an alternative for decorative icons, which is true....unless the icon has a specific meaning that is not covered in the text content. A perfect example is an edit pencil. In that case, you'd want to use alternative text in the img tag or in the tag containing the background image:

<a href="edit.html"><img src="pencil.png" width="20" height="20" alt="Edit"/></a>

<button style="text-indent:-999em;background-image:url(pencil.png);">Edit</button>

If the icon is purely decorative and has no meaning, like a stylistic bullet point, then you want to include the alt attribute, but leave it empty. Why? Because, if you omit the alt attribute entirely, screen readers will read the URL of the image. As you can imagine, this is incredibly frustrating for those who are using screen readers. So, it's best to include an empty alt attribute in this case, so the screen reader will skip the description of the image: 

<img src="dot.png" width="20" height="20" alt=""/>

-A11y

Thursday, April 25, 2013

Ask A11y Volume 1

About A11y:  I answer a lot of questions about Web accessibility best practices at my job, so thought I would bring some of those topics online for the larger community. 

Dear A11y,

As a web developer, I'm trying to practice progressive enhancement. A lot of the time, I receive specs that have a link that kicks off a JavaScript interaction when clicked. However, often these links don't have any logical landing URL. Is it better to use <a href="#">Link</a> or <a href="javascript:void(0);">Link</a> in this situation?

Signed,
Progressive in California

Dear Progressive,

Both suggestions have practical and accessibility issues. First, on the practical side, <a href="#"> will cause a hashchange event unless you also prevent the default behaviour of the click event in your JavaScript. This can cause issues with single-page-apps that use hashchange events for routing. Also, if the user is scrolled down the page, it will have the result scrolling to the top. If you use <a href="javascript:void(0);">, the anchor now has a return value of undefined, which can open you up to security issues. That should be reason enough not to do it, though it does not suffer the hashchange or scrolling concerns. HTML requires us to provide an href attribute on an anchor in order to be valid. In order for non-sighted users to not anticipate linking behaviour, we can use a role="button" attribute to set the expectations for the link. However, adding role="button" does not change the HTML Node Object type from an anchor to a button, so the spurious href attributes are still required, which brings us back to the practical issues.

So, the answer to your question is: neither. In my opinion, the semantic and accessible solution is to use a <button> element for these behaviours. The button element does not have the href attribute situation and properly sets expectations for all users. There are some practical concerns when using buttons, especially if you plan for them to appear as links on the page. This can be handled in the CSS layer, which also gives you a proper separation between meaning (markup), presentation (CSS), and interaction (JavaScript).

Here is how the situation can be resolved:

<button class="link">Link</button>

button.link {
  background:none;
  border:none;
  padding:0;
  appearance:none;
  -moz-appearance:none; /* Firefox */
  -webkit-appearance:none; /* Safari and Chrome */
  color:blue;
  text-decoration:underline;
}


Or, if you are using SASS and Compass as we are in our workplace, you can do the following:


@mixin link {
  color:blue;
  text-decoration:underline;
}
@mixin unstyled-button {
   background:none;
  border:none;
  padding:0;
  @include appearance(none);
}

button.link {
  @include unstyled-button(); /* removes button styling */
  @include link(); /* applies link styling */
}

Happy button-making!

-A11y

Monday, December 31, 2012

Christmas Week Training block

I had from the 22nd of December through the 1st of January off from work. So, in addition to catching up on housework, finances, and reading, we got in a mini training block.

Saturday, December 22 - Short hike at Rancho San Antonio


Sunday, December 23 - Torrential downpours, did wine tasting in Healdsburg

Monday, December 24 - Moderate hike in Annadel State Park


Tuesday, December 25 - More torrential rain, saw a movie

Wednesday, December 26 - Moderate hike at Rancho San Antonio


Thursday, December 27 - Los Altos Hills bike ride


Friday, December 28 - Out n' Back recovery to light rail in downtown SJ (was supposed to be longer, but Rick mucked up his pedal)

Saturday, December 29 - Hike at Hidden Villa



Sunday, December 30 - Mt. Eden bike ride the hard way (but I'm pretty sure not 428 miles!)



Monday, December 31 - Los Altos Hills bike ride, a bit longer and hillier than earlier in the week


Tuesday, January 1 - TBD - probably a hike or trail run

Wednesday, December 19, 2012

Thanksgiving Pre-training-camp-camp

I hope to attend the "real" Velo Bella training camp in February this year. There is one potential glitch. I am volunteering with a group called "Technovation" - mentoring high school girls in creating an Android app for 12 weeks. Our mentoring day may end up being Saturday, which would muck up the opportunity to go to camp. So, we ended up getting in a mini camp over Thanksgiving in the Paso Robles area. We had only done one ride in the area prior, so it was a chance to do some exploring of the north part of San Luis Obispo County.

We spent Thanksgiving day and night with my parents in Grover Beach. Then, we headed north to burn the turkey. We made our late morning stop in Santa Margarita - just a mile off of 101. We left our car in the town park and headed out for the Pozo loop. We'd tried to reach Pozo from Hi Mountain Road in Arroyo Grande in the past, only to be hampered by too much mud for our road bikes to handle on the steep dirt terrain. This was our chance to see the "town". The loop is about 43 miles with only moderate climbing - nothing too steep - just lots of rollers. The roads are very quiet, and generally in OK condition. There is one section of about 7 miles of rough road and one significant climb - the second significant climb is less noticeable, as it is more stair-steppy. Rick got a flat tire on the descent from the climb into Pozo, but other than that, the ride was delightful!

We took a quick late-afternoon refueling in Santa Margarita before driving the last 15 miles to our stay for the night. We spent the remainder of the weekend at the Chanticleer Bed & Breakfast just off the 101 and 46 junction in Paso Robles. It was a really nice and quiet spot.

Saturday, we headed out after breakfast to replace tire supplies at The Bike Zone - a Velo Bella sponsor. The owner came out and greeted me, as she saw my VB jersey. It was really nice to meet her. Then, we left our car in downtown for a loop of Peachy Canyon. We were having a hard time picking a route, so we ended up combining two routes. We headed up Peachy Canyon, but instead of heading immediately back on Adelaida, we turned down the Vineyard and Willow Creek loop before turning back to our route. The climb on Peachy was long and steady and exposed. I would not want it on a hot day! We saw a tarantella on the road. Ick! The Willow Creek section was super-nice, though the road surface could be better. The descent of Adelaida was completely epic - gentle, swooping, great surface and only one car the whole time. No brakes. Weeeeeeee!

In the afternoon, we did some wine tasting. The outstanding stop was Ecluse - a winery recommended by our hosts, which was doing barrel tastings and had some really nice varietals.

Sunday, we did some morning wine tasting and then headed home. The outstanding stop was Oso Libre, where we joined the wine club. It was also recommended by our hosts. We did the requisite stop at Turley as well, but found the 2010 vintage a bit lackluster.

All in all, it was a great way to kick off the fitness building of Winter and enjoy a special weekend with my sweetie!


Saturday, November 17, 2012

Interesting bug & how I squashed it



I was working on a Scrollview implementation using YUI3 library for my personal web site. The idea was to make a re-usable JS for travel slideshows. Basically, for Scrollview implementation, you take a list structure and then configure the swiping to work vertically or horizontally with some additional configurations.

I had the added complexity that I was building my DOM on the fly from a Flickr feed via YQL open tables. So, the object has a constructor function which creates an instance variable for the container where the Scrollview will plug in, an overlay container and elements within the overlay, which will be used to show a larger version of the images once the preview is clicked from the Scrollview slider.

There is a getPhotos method, which fetches the photo metadata from YQL using the Flickr photoset ID.  The getPhotos method then builds the DOM for the Scrollview container (a list) and then attaches some additional listeners to the container.

I noticed a bug where sometimes the whole set of photos was not scrollable in the slider. Each page reload would have the slider end in different spot - almost never including the entire set. I made the assumption that Scrollview was dynamically calculating the "width" or "height" of the scrollable area (right assumption), and that I had a timing bug (wrong assumption). Below is how the method started out:


getPhotos : function(e) {
  var t = this,
  handleJSONP = function(data) {
    var html = '<ul>';
    for (i=0, x=data.query.results.photo.length; i<x; i++) {
      html += '<li><a href="http://farm'+data.query.results.photo[i].farm+'.staticflickr.com/'+data.query.results.photo[i].server+'/'+data.query.results.photo[i].id+'_'+data.query.results.photo[i].secret+'_c.jpg" target="_blank"><img src="http://farm'+data.query.results.photo[i].farm+'.staticflickr.com/'+data.query.results.photo[i].server+'/'+data.query.results.photo[i].id+'_'+data.query.results.photo[i].secret+'_q.jpg" alt="'+data.query.results.photo[i].title+'"/></a></li>';
     }
    t.container.set("innerHTML", html + '</ul>');
    t.pluginScrollView();
    
  },
  url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20flickr.photosets.photos(0)%20where%20(photoset_id%3D'72157631913782316'%20and%20api_key%3D'dd0a6e3d9ef751ea725c2c0b8ec81259')&format=json&diagnostics=true&callback={callback}";
  Y.jsonp(url, handleJSONP);
},

So, I first thought that the timing issue was that the DOM had not finished constructing before I called the pluginScrollView method. So, I modified the code to be as follows:

getPhotos : function(e) {
  var t = this,
  handleJSONP = function(data) {
    var html = '<ul>';
    for (i=0, x=data.query.results.photo.length; i<x; i++) {
      html += '<li><a href="http://farm'+data.query.results.photo[i].farm+'.staticflickr.com/'+data.query.results.photo[i].server+'/'+data.query.results.photo[i].id+'_'+data.query.results.photo[i].secret+'_c.jpg" target="_blank"><img src="http://farm'+data.query.results.photo[i].farm+'.staticflickr.com/'+data.query.results.photo[i].server+'/'+data.query.results.photo[i].id+'_'+data.query.results.photo[i].secret+'_q.jpg" alt="'+data.query.results.photo[i].title+'"/></a></li>';
     if (i === x-1) {
      t.container.set("innerHTML", html + '</ul>');
      t.pluginScrollView();
     }
    }
  },
  url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20flickr.photosets.photos(0)%20where%20(photoset_id%3D'72157631913782316'%20and%20api_key%3D'dd0a6e3d9ef751ea725c2c0b8ec81259')&format=json&diagnostics=true&callback={callback}";
  Y.jsonp(url, handleJSONP);
},

This way, I would not call the pluginScrollView method until the last iteration through the photo data (ensuring the DOM would be complete before instantiating ScrollView on the container). But, the bug persisted. I finally realized when inspecting the DOM in Chrome and Firebug that the <li> elements containing the photos had no width. And, I had failed to set a width and height on the images in the method that built the DOM. So, it turns out that fixing either problem resolved the bug. 

html += '<li><a href="http://farm'+data.query.results.photo[i].farm+'.staticflickr.com/'+data.query.results.photo[i].server+'/'+data.query.results.photo[i].id+'_'+data.query.results.photo[i].secret+'_c.jpg" target="_blank"><img src="http://farm'+data.query.results.photo[i].farm+'.staticflickr.com/'+data.query.results.photo[i].server+'/'+data.query.results.photo[i].id+'_'+data.query.results.photo[i].secret+'_q.jpg" alt="'+data.query.results.photo[i].title+'" width="150" height="150"/></a></li>';

The above fixes the bug. Additionally, it was fixable in the CSS with the following change:

#scrollable li {
  display:inline-block;
  *display:inline;
  *zoom:1;
  padding:0 3px;
  width:150px;
}

Arguably, from a performance standpoint, the former fix is better. Likely both should be employed.  I hope others are able to learn from both my mistake and my bug fixing process. 

The result can be viewed here: 


Saturday, September 22, 2012

Musings on Peru

It's been a week since we returned from Peru. I've been unpacking my many thoughts about the trip over that time. It certainly lived up to the "adventure" billing that I crave in a vacation. I am grateful for the experience and opportunity to go. It was epic in many ways. It was also exciting and at the same time uncomfortable (mentally challenging). Here are some of my high-level impressions, stream of consciousness style (full diary and photo set forthcoming).


Machu Picchu
This archeological site is a logistical nightmare to get to, and also quite expensive. But, it is worth the trouble. It is really quite amazing in many ways. Go while you are young. It is on top of a mountain, and if you are really going to enjoy it, you need to be able to walk deep, uneven granite steps all day long. The most spectacular thing that is hard to capture in photos is the symmetry of the place. The Andean builders valued a reflection of the surrounding landscape in their construction, and you can see peaks inside peaks inside peaks when you look down on the city and its surroundings. You will be amazed with what these people created without wheels, iron or steel.

Driving
Driving (or riding in a car) in Peru is quite "adventurous". Double yellow lines are merely a suggestion.  We witnessed a fatal head-on on a highway between a milk truck and a taxi. After that, I noted a memorial on every blind curve. A taxi driver will take you on a 100 kmh weave through a city if they can. A taxi driver will try to charge you more than a fare in NYC if they can. The standard response to this suggestion is "Eres loco". Much like in Rome, if your car can fit, it is a lane. The lane markings are merely for decoration. You can turn from any lane on the road in any direction. This seems to be cooperative during busy times in the city where everyone wants to do the same thing. You haven't lived until you've ridden in a bus over a 16,000 foot pass on a less-than one lane dirt road with no guard rails and significant vertical exposure. The locals do this standing in an open-air truck. Sometimes you've got to appreciate our litigious society in the USA.


Food
The food really is good in Peru. Don't eat lettuce from the local market. You will puke. I don't know any Spanish colloquialisms for this, but let's just say I was "calling the vicunas" all night in the mountains. And, I didn't exactly get the tent open every time. So, there were 6 loads of laundry when we got home. Other than that, I was astonished at the variety and deliciousness of the food. Inka cola is pretty gross, but I did try it once. It looks like Mountain Dew, but does not taste even close. Rick reports it is available at Target if you want to try it. I also had the cuy (guinea pig). It tasted like chicken. Really. I doubt I'll order it again. The skin was crispy, but there wasn't a lot of meat. Stuffed rocoto pepper with alpaca meat is brilliant. I ate that several times. Just remember the red pepper looks like a bell pepper, but is muy picante! It is not mild-mannered. They have mastered quinoa, potatoes, corn and cream soups. They are all good. Sometimes you get rice and potatoes on your plate. That seems a little starch-tastic. The guacamole will blow your mind. The produce is great. Mangos taste like nothing I have ever eaten in the States. The tomatoes and asparagus are great. Get the suckling pig, and the Peking-style duck. They are both great. Also, the seafood soups (chupe) in Lima are fantastic and the trout (trucha) in the mountains is fantastic. Ceviche is not to be missed when in Peru. We had a few of them...all great.

We had 4 world-class meals in Peru, 2 of which had a world-class price tag. The food on our trek was also consistently gourmet-quality and amazing - especially given the cooking facilities. Here are the world-class spots to try:
$$ El Punto Azul in Lima (Miraflores) - can you eat a plate of ceviche as big as your head? Why yes, you can!
$$ Chi-Cha in Arequipa - fresh, fresh, fresh. Cutting edge.
$$$ Brujas de Cachiche in Lima (several locations) - best meal of the trip.
$$$ Sonccollay Pre-Inka Cuisine in Arequipa - don't miss the passion-fruit ceviche.


Beer/Drink
We sampled pretty much all the beer. Cusquena malt and regular, Arequipena, Pilsen, and Cristal. I think I liked Arequipena and Cristal the best. The malt Cusquena is a lot like Guiness, but sweeter. If you order sparkling water at altitude, open it slowly. You have been warned. Chicha (corn beer) is an acquired taste.

Cities
I had mixed impressions of the cities in Peru. I'm not really a big-city gal...add to that the slums and other sub-standard housing, tons of traffic, and a "thriving nightlife", and well, there you have it. The center of Arequipa and Cusco are both charming if you can dodge the street vendors and keep your head about you. The Miraflores neighborhood in Lima is the same, though walking around at night isn't great. There are fabulous restaurants in all 3 cities, and some pretty interesting museums and archeological sites. Downtown Lima is a zoo. I could only take a couple hours of the chaos. Though, we did get a cheap and tasty lunch there. Staying and eating in a good neighborhood in a city will cost you about the same in the U.S. The nuevo sole is pretty strong against the dollar and the economy of Peru is outpacing ours.

Tours
It seemed all the tours (other than our trek) were focused more on shopping than on historical sites. This was the most true for the Sacred Valley tour. The others at least struck more of a balance. They are cheap, so I suspect a kickback system is in place. If you really want to focus on the archeological sites, hire a private driver and guide.


The Andes
The Andes are truly spectacular. They are not to be missed. The only bummer is that you have to get above 14,000 feet to really see the stars. This is due to a lot of burning in the air - the fields are burned, the ovens are all wood-burning, and there are not a lot of trees on the leeward side of the mountains to freshen the air. They are also a bit overrun with camping trekkers. I feel that Peru could benefit from a refugio system like in the Alps and Dolomites - permanent structures to house trekkers and provide a meal would help keep human waste contained and provide a clean cooking source and an income source for the local villagers. The smaller cities in the mountains are quite charming - like Chivay. They are big enough to have services and a nice community feel, but small enough to lack crime. And, while still impoverished, the locals seem to have a nice rhythm and quality of life in these towns. The mountains also have a bit of a technological paradox - you can be at 16,000 feet in between villages of stone houses without electricity or running water - and you can talk on your cell phone. There seems to be coverage everywhere. Don't miss the exquisite beauty of the ladies' hats. Every drainage/village you enter in the Andes has a different style of hat, and they are all stunningly beautiful.


Language
Most of the people in the Andes speak Quechua as their first language and Spanish as their second. My name means "maize" in Quechua. My Spanish understanding remains quite good, while my speaking is  a bit rusty. But, I got along OK. We had two tours in Spanish + English and I understood both equally well - it was like hearing an echo the whole way. Let's just say I can't speak any Quechua other than "chicha" and "sara". So, I can order corn and corn beer. I have a ways to go.