Poor software design on the Pizza Hut website

It has been a while since I have actually posted a “rant” against software craziness. However, now is the time to let loose on a trend which has completely dominated our software world. Usability is not accorded the respect that it requires. It appears that development teams do not apply the logic of “how will our users use this application,” especially in the world of web and mobile programming.

PizzaHut1 PizzaHut2

As you can see above, this is a part of the mobile website for Pizza Hut. I am picking on this site specifically because yesterday I ran into a major usability issue. My wife and I were driving from North Carolina to New Orleans and had a hankering for some good old Pan Pizza. Since I was riding shotgun, I pulled up the Pizza Hut website to be greeted by the garbage above (mobile.pizzahut.com).

The “garbage” is not in the appearance. It is not even in the “I want to order a pizza from my hometown store.” Where it lies is in the fact that the designers and developers never ONCE seemed to have considered the first word in the website address: “mobile.”

Mobile signifies that someone is on the move and while that person 7 times out of 10 may be using their phone to order from their local store, the other 30% of the time it is being used by someone who desires to find a store! Look at the menu on the page…nothing about “store locator” is there.

PizzaHut3

In fact, the only thing under “About us” is “Careers.” Really?? Is the most common use of a restaurant chain website on a mobile app apart from ordering pick-up or delivery the quest for a job? No freakin’ way!

Now, don’t get me wrong. I don’t care that they have ordering or career searching on their mobile site. I DO care that there is not a single link for finding a restaurant. BTW, I forced my phone to get the normal website and there was an option there to find restaurants but they still did not provide the information that we most needed as we cruised down I-65 at 70mph.

I knew from Googling for Pizza Hut restaurants near Mobile, Alabama that there were a few in town. The question that Google did not answer, and Pizza Hut’s site did not either (to their shame), is whether or not the locations were full-service restaurants or just carryout locations!!

Folks, let me appeal to you if you are involved in development. Please consider all the possible use cases for your customers’ use of the various parts of the website. Usability is a prime factor in reducing frustration. BTW, other restaurant sites were very easy to use to find locations. They prominently exposed this functionality to their mobile users.

Anyway, we determined to go to one of the Pizza Hut locations which was next to a Five Guys restaurant. We decided to give it a look-see and if it indeed was a dine-in Hut, we would go there. Otherwise, we would fall-back to the Five Guys option. It was a good decision…the restaurant was a dine-in and the service and piping-hot food was absolutely incredible. We almost gave up on a good dining experience because of poor software design!!

(Note: The images above are taken from the mobile Pizza Hut website as of 5/1/2015. The content is copyright its respective owner…the images are to illustrate the point of this blog. My beef is not with Pizza Hut itself but with the software development and business use-case teams.)

Posted in Creative writing, Process, Programming, Rants, Software architecture and development | Tagged , , , , , | Leave a comment

DataTables version 10+ and .NET AJAX

It has been ages since I have posted a software development post. The last week, I have been working on some MVC 4 code and had to figure out how to do server-side support for the most excellent DataTables package. This, of course, triggers off AJAX requests whenever data is required to populate the on-screen client-side gridview table.

If you are using the DataTables package prior to v10 or use it in compatibility mode then you don’t have many problems because the JSON generated to the AJAX service is not built with arrays and complex data. This compatibility is triggered by using the sAjaxSource parameter or by setting $.fn.dataTable.ext.legacy.ajax to true. However, what is the point in a new project to depend on backwards compatibility that may go away in the next version of the library?

The server side support for DataTables is documented here. Information on how to use it in v10+ mode with MVC is slim on the net so one has to cobble together a solution based upon several different sources especially if one plans to create a simple ApiController to handle the AJAX callbacks. I am sharing what I have discovered for whatever it is worth to anyone facing the same hurdles I did and hope that it does help.

First of all, here is the page code for the DataTables on the website:


.
.
.
<!-- Kick off rendering of DataTable -->
<script type="text/javascript" language="javascript">
$(document).ready(function () {
$('#CountryTable').DataTable({
serverSide: true,
ajax: {
url: '/api/data',
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: function(data)
{
return data = JSON.stringify(data);
}
}
});
});
</script>

<h2>Countries</h2>
<table id="CountryTable" class="display" cellspacing="0" width="800px">
<thead>
<tr>
<th>ID</th>
<th>Code</th>
<th>Country name</th>
<th>Currency</th>
</tr>
</thead>

<tbody>
</tbody>
</table>
.
.
.

Let me share a couple comments concerning the code above. Notice that DataTables wraps the standard table (CountryTable) which, as you will notice does not have any body items. This, and the ajax verb in the Javascript code, will trigger DataTables to work in the server-side mode. Notice that the ajax function is defined with a type of POST (we will capture this on the server side) and the contentType MUST be specified otherwise the string will not be interpreted by the ASP.NET side as being JSON. One of the most common mistakes in working with JSON in either direction is to miss setting the JSON content type and the resulting string is interpreted as just plain text by the AJAX mechanism.

So, how to capture and process this AJAX request in MVC 4? There are several options, of course, but I chose to vector through the standard ApiController.


public class DataController : ApiController
{
public HttpResponseMessage Post(Newtonsoft.Json.Linq.JObject param)
{
return HandleRequest(DataTableRequestModel.DecodeDataTableRequest(param));

The AJAX call to /api/data will vector to look for a controller named DataController in MVC. This controller extends ApiController and handles the POST request by exposing a Post method. The method could be named something else and merely be decorated with an [System.Web.Mvc.HttpPost] attribute. Dealer’s choice on that one.

Notice that I capture the parameter as a JObject. It could have been created like this:


public HttpResponseMessage Post(DataTableRequestModel param)

which would have decoded the non-complex items automatically using the Model class below but there is no way to decode the complex items out of the box. If one feels really adventurous, it is possible to write your own binder code but since the JSON from DataTables is not really too complex, I chose to handle it externally. The JObject is initialized with the JSON from the call (since the content type was set to application/json) and so the data is ready to be plucked from the object. In the Models folder, I created a generic DataTableRequestModel with the fields expected from the request:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCGridTester.Models
{
// See article by Chris Laforet (claforet.wordpress.com)
// Sample request sent JSON stringified:
//
//{"draw":1,"columns":[{"data":0,"name":"","searchable":true,"orderable":true,"search":
//{"value":"","regex":false}},{"data":1,"name":"","searchable":true,"orderable":true,"search":
//{"value":"","regex":false}},{"data":2,"name":"","searchable":true,"orderable":true,"search":
//{"value":"","regex":false}}],"order":
//[{"column":0,"dir":"asc"}],"start":0,"length":10,"search":{"value":"","regex":false}}
//

/// <summary>
/// Class that encapsulates common parameters sent by DataTables plugin
/// </summary>
public class DataTableRequestModel
{
/// <summary>
/// Since the DataTableRequest includes arrays of data elements (columns, order), it cannot be
/// correctly parsed out in its entirety by the native API which only handles single root-level
/// elements. This static call can take the raw JSON object and populate the DataTableRequestModel
/// correctly.
/// </summary>
/// <param name="param">The passed in JSON object from the POST</param>
/// <returns>A DataTableRequestModel populated with the correct data</returns>
public static DataTableRequestModel DecodeDataTableRequest(Newtonsoft.Json.Linq.JObject param)
{
dynamic json = param; // recast the parameter as a dynamic object

DataTableRequestModel dtr = new DataTableRequestModel();

dtr.draw = json.draw;
dtr.start = json.start;
dtr.length = json.length;

dynamic columns = json.columns;
if (columns != null)
{
List<DTRColumn> list = new List<DTRColumn>();
foreach (dynamic token in columns.Children())
{
DTRColumn c = new DTRColumn();
c.data = token.data;
c.name = token.name;
c.searchable = token.searchable;
c.orderable = token.orderable;

dynamic columnSearch = token.search;
if (columnSearch != null)
{
DTRSearch s = new DTRSearch();
s.value = columnSearch.value;
s.regex = columnSearch.regex;

c.search = s;
}
list.Add(c);
}
dtr.columns = list;
}

dynamic order = json.order;
if (order != null)
{
List<DTROrder> list = new List<DTROrder>();
foreach (dynamic token in order.Children())
{
DTROrder o = new DTROrder();
o.column = token.column;
o.dir = token.dir;

list.Add(o);
}
dtr.order = list;
}

dynamic search = json.search;
if (search != null)
{
DTRSearch s = new DTRSearch();
s.value = search.value;
s.regex = search.regex;

dtr.search = s;
}

return dtr;
}

/// <summary>
/// Draw counter. This is used by DataTables to ensure that the Ajax returns from server-side processing requests are drawn in sequence by DataTables
/// </summary>
public int draw { get; set; }

/// <summary>
/// Paging first record indicator. This is the start point in the current data set (0 index based - i.e. 0 is the first record).
/// </summary>
public int start { get; set; }

/// <summary>
/// Number of records that the table can display in the current draw. It is expected that the number of records returned
/// will be equal to this number, unless the server has fewer records to return. Note that this can be -1 to
/// indicate that all records should be returned
/// </summary>
public int length { get; set; }

/// <summary>
/// Comma separated list of orderable column data.
/// </summary>
public IEnumerable<DTROrder> order { get; set; }

/// <summary>
/// Comma separated list of column data
/// </summary>
public IEnumerable<DTRColumn> columns { get; set; }

/// <summary>
/// Global search value. To be applied to all columns which have searchable as true.
/// </summary>
public DTRSearch search { get; set; }
}

/// <summary>
/// Encodes an Order from within the Data Table Request
///
/// "order":
/// [
/// {"column":0,"dir":"asc"}
/// ]
/// </summary>
public class DTROrder
{
public const string ORDER_ASCENDING = "asc";
public const string ORDER_DESCENDING = "desc";

public int column { get; set; }
public string dir { get; set; }

public bool IsAscending
{
get
{
if (dir != null && dir.CompareTo(ORDER_ASCENDING) == 0)
return true;
return false;
}
}
}

/// <summary>
/// Encodes a Search within a Column from the Data Table Request
///
/// "search": {"value":"","regex":false}
/// </summary>
public class DTRSearch
{
public string value { get; set; }
public bool regex { get; set; }
}

/// <summary>
/// Encodes a Column from the Data Table Request
///
/// "columns":
/// [
/// {"data":0,"name":"","searchable":true,"orderable":true,
/// "search": {"value":"","regex":false}
/// },
/// {...}
/// ]
/// </summary>
public class DTRColumn
{
public string data { get; set; }
public string name { get; set; }
public bool searchable { get; set; }
public bool orderable { get; set; }
public DTRSearch search { get; set; }
}
}

Not a lot of complication here. Notice how the array and complex types are handled by simple container classes. In order to populate the data, it is merely a matter of walking the JSON string and loading the contents of the model. Many of the ideas in the parser were developed based upon this blog article by Rick Strahl so if you want to delve deeper into the how and the why everything works, give it a read.

At the end of the process, one has an object containing every element in the DataTable’s request. These items can be actioned by the data manipulation code (e.g. selecting, sorting, filtering) and returned as a JSON string. The implementation of this data manipulation and the construction of the return string are left to the reader.

So, that’s all there is to it. Happy coding!

Posted in General Computing, Programming, Software architecture and development | Tagged , , , , , , , , | Leave a comment

À La Carte Christianity?

As an observer of the Church, it never ceases to amaze me how Christ’s simple call to his disciples that “if anyone desires to come after Me, let him deny himself, and take up his cross, and follow Me” (Matt 16:24 NKJV) is completely ignored. We all bring our expectations, greed, and desires to the foot of the Cross and then demand that God accept the whole package.

While it is true that this occurred ever since the beginning of the church (see 1 Corinthians for a good example), it seems to have become a de facto standard in Christendom in today’s world. People approach the altar expecting it to be laid out as buffet of God’s requirements of which they can pick and choose what they might deign to put on their plates.

“Yes, I want a side of God’s love but leave off His justice, please.”
“Mmmmm, give me a couple spoonfuls of sweet compassion but no, there is no need for God’s judgement on my theological plate.”
“Slather on the justification but who needs a side of relinquishing lordship to Jesus?”
“Yeah, I can enjoy a good dessert of Christ’s sacrifice for sin but who wants to hear about Hell?”
“Give me a healthy scoop of sanctification so I can cover over the immoral behavior I refuse to give up.”
“I can’t get enough of that salvation but that righteousness is too sour for me to tolerate.”
“Yep, give me some good old contemporary Christian music…it is so much better to hear the gospel sung than to read the Word of God.”

Wasn’t Jesus’ requirement clear enough? He expects us to deny ourselves, to empty ourselves of everything as He did, and to take up the cross upon which we must sacrifice everything as we constantly follow him. Luke 9:23, the parallel passage to this inserts the word “daily” into the commandment. Every morning we have a choice, to choose to follow Christ in abject obedience, or to prefer to be the lords of our own destinies.

So today we have a weak Church filled with weak Christians (see How to Reform the Church). The picking and choosing has helped splinter Christ’s Body into millions of little pockets. Even within any single denomination, there are microcosms of smorgasbord belief that actually separate church from church. Although they may pay lip-service homage to the fact, Jesus is not the Lord of His Church, at least in the hearts of many (maybe even most) Christians. The underlying root of this is a desire for Lordship but no desire for Surrender.

It is imperative for this discussion to expand the context of the passage quoted above. “Then Jesus said to His disciples, ‘If anyone desires to come after Me, let him deny himself, and take up his cross, and follow Me. For whoever desires to save his life will lose it, but whoever loses his life for My sake will find it. For what profit is it to a man if he gains the whole world, and loses his own soul? Or what will a man give in exchange for his soul? For the Son of Man will come in the glory of His Father with His angels, and then He will reward each according to his works….’ (Matt 16:24-27 NKJV)

One can boil this passage down to Jesus saying, “Pick a side!” If you want to follow Him, you must deny yourself. If you don’t, you are not following Him. If you want to follow Him, you must take up your cross daily. You must choose to sacrifice anything that gets between you and Him. If you don’t, you are not following Him. If you want to have a cushy life instead of letting it be dedicated to Him, then you are not following Him. Pick a side!

The Christian life is not a buffet that we choose from. When we surrender our all to Christ, He gets to put the things on our plate that He knows will profit us and His kingdom. We must accept what He gives us and let our faith and trust in God’s incredible wisdom override our petty and limited human vision. There can never be true service without complete submission. There can never be Christ’s Lordship without a total surrender of ourselves. For me to be a true disciple of Jesus Christ, there has to be (as Oswald Chambers stated) a relinquishing of the rights to myself.

Which brings me to my final point. It is too common for people to desire to apply the moniker of “Christian” upon themselves without any desire to abandon moral failures. This is the schism we can easily see throughout the people of the Church today. There is a Sunday morning persona which is all pious and loving and then there is a “rest-of-the-week” persona which indulges in immorality, hatred, lies, faithlessness, and filthy talk. The name of Christ is tarnished in the world. Almost reminds me of Paul’s admonition to the pious Jews in Romans 2:21-24, the highlight quote which I will appropriate and rephrase as, “For the name of God is blasphemed among the world because of you….”

The call is certain and specific. We are not invited to a buffet spread out at the foot of the Cross. We are invited to a decision, one with deep ramifications either way. May we be sober-minded and deliberate in picking Christ’s side and may we be committed to following Him every day wherever He leads…only if He is truly our Lord will the Church reflect Him.

Posted in Christian thoughts, Philosophical ramblings | Tagged , , , , , | Leave a comment

“Monumental Sunrise” – a painting in oils

December has been a wonderful month of painting for me. My paints lay fallow for well over a year and a half and really needed some use. I was able to take the time to work on watercolor, acrylic, and an oil canvas and it was a truly marvelous time well spent. I am a strong believer in the fact that developing one’s “right-brain” through artistic endeavors serves to improve one’s “left-brain” activities such as software development (see the article Pragmatic Wetware and my journey into painting) and I can certainly attest to how frustrating development had become during this artistic dry spell. There is something liberating to releasing one’s mind to explore subjects in something other than a linear-logical way….

Anyway, this painting is based upon photos I captured when, early in 2013, I had the incredible opportunity to go into Monument Valley and photograph the dawn. Working on the painting transported my mind back to the crisp cold of that morning and reminded me of the excitement of being in such a wonderfully scenic area of God’s creation! Anyway, since I had not painted in quite some time and as I am a relative “newbie” to oil painting (see My first oil painting), I was very concerned about the challenge I had presented for myself! On the other hand, I could have worked this in a more familiar medium but I felt the scene cried out for the luscious depth of oil paints.

This was a bit different because I decided to try a black-toned canvas as my starting point. As light as my photos may have been processed, my greatest impression of that morning in the valley was the sense of the depth of the dark. Sunrise was spectacular but the shadow areas still were heavily dark. So, what the heck…starting with a dark canvas was bound to be a different experience! First of all, I sketched in the basic elements with white chalk which I subsequently rubbed down. Here is a shot of the sketch with an inset of the basic reference photo:

MonumentalSunriseInOils01

The first painting session was a long one since the goal was to cover the canvas with the basic values of the elements in the scene (sky, cliffs, Totem pole, Yei Bi Chei, foreground, etc.). The sky was a graded dark blue to a buttery yellow around the sunrise, the background cliffs were picked out in purple hues, and the foreground and Totem area structures were brought forth with orange shades and tints.

MonumentalSunriseInOils03

This was given a short period of time to slightly dry and then details were incorporated wet-into-wet especially in the cliff side and the monument areas. It made a good time to start sorting out the foreground frosted and shadow areas also. This process started the process of adding depth to the various elements of the painting.

MonumentalSunriseInOils04

Throughout the whole process, the sky area around the cliffs also was continually refined to keep the relative tonal values pleasing. In fact, it became clear that there was too much darkness still in that area so I brought in some drastic white to cover the darkness of that area and to create a more suitable base to build the tonality difference with the adjacent cliff. One of the critical elements for me in this image is the light streaming around the cliff and Yei Bi Chei and so this received a considerable amount of attention. The next major milestone was achieved by working wet into mostly dry in which the foreground received a fair amount of attention. The rock formations also needed a bit of dimensionalizing (to coin a word) and you can see where I brought in the whiteness in the sunrise area to prepare a base for final adjustments.

MonumentalSunriseInOils05

The canvas was then allowed to dry for just short of a week before finalizing. The finalization process involved mostly adjusting background elements with transparent dark and light washes. The snow and frost was refined and the scrub brush was livened with dabs of light and dark. The final painting also received some attention in the sky area and the painting was brought to a close before being overworked.

MonumentalSunrise Final

“Monumental Sunrise” – Oil on canvas – 24″ x 12″

Posted in Art, Painting, Process | Tagged , , , , , , , , , , , , | Leave a comment

How to Reform the Church?

Nebuchadnezzar's dream of the statue in Daniel 2 - from Kestenbaum.net

Nebuchadnezzar’s dream of the statue in Daniel 2 – from Kestenbaum.net

In one sweaty, toss-and-turn, disturbed night of broken sleep, King Nebuchadnezzar dreamed a visionary dream about a statue made of different metals. Daniel 2:1-45 outlines the entire dream and its God-provided interpretation. Each part of the statue represented a subsequent kingdom which extended from the Babylonian through the post-Roman times. It is concerning these post-Roman times that I would like to dwell for a moment.

“This image’s head was of fine gold, its chest and arms of silver, its belly and thighs of bronze, ts legs of iron, its feet partly of iron and partly of clay….Whereas you saw the feet and toes, partly of potter’s clay and partly of iron, the kingdom shall be divided; yet the strength of the iron shall be in it, just as you saw the iron mixed with ceramic clay. And as the toes of the feet were partly of iron and partly of clay, so the kingdom shall be partly strong and partly fragile. As you saw iron mixed with ceramic clay, they will mingle with the seed of men; but they will not adhere to one another, just as iron does not mix with clay.” (Dan 2:32,33,41-43 NKJV)

The post-Roman times are indeed well described as kingdoms wrestle with one another and nations rise and fall. There has been a gradual disuniting of people and there is certainly no authority that rules in any sort of united way. Culturally, militarily, religiously, socially, and economically the world is divided and even within nations, division rules. Iron is mixed with clay at every turn and there is no rigid backbone binding everyone together. This post, however, is not concerned with the civil implications of a weakened authority.

I believe that the Church has fallen prey to the same ailment that consumes its surrounding society. It is fragmented, weak, and establishing its own authority. This did not come about overnight, of course. It has been building ever since the moment that Jesus gave the Great Commission to the disciples and ascended to heaven. It is clear from the Epistles of Paul and the General Epistles that different congregations had issues with staying true to the central authority of Christ. Later Church history degraded into factional infighting, dictatorial control, and demonstrated anything but the love that Jesus commanded the Church to have and to exhibit.

Whole denominations and even local congregations have arisen to exert man’s authority on the things that belong to God. Phariseeism is alive and well in some sectors of Christ’s Body and rampant non-believing, liberal hedonism dominates others. Between these extremes, one can find every possible permutation of church bodies that have established authorities other than that of Jesus. Sure, lip-service is paid to Jesus being the lord of these churches but rarely is He truly Lord. There is an urgent need for a true reformation of the Church in general!

In the interpretation of Nebuchadnezzar’s dream, God led Daniel to point out that the rock that was cut out “without hands” of a mountain adjacent to the statue which rolled down, smote it, and destroyed it is the “kingdom which shall never be destroyed.” (Dan 2:44) This kingdom is the one set up by God Himself and certainly is the kingdom of God proclaimed by Jesus, sealed with His sacrificial blood, and guaranteed by His resurrection. From the moment His earthly ministry kicked off, “Jesus began to preach and to say, ‘Repent, for the kingdom of heaven is at hand.'” (Matt 4:17 NKJV) This is the kingdom ushered in by the Lamb chosen before the foundation of the world and which continues in the life and growth of the Church.

The Apostle Paul described the Church as “For as the body is one and has many members, but all the members of that one body, being many, are one body, so also is Christ. For by one Spirit we were all baptized into one body—whether Jews or Greeks, whether slaves or free—and have all been made to drink into one Spirit. For in fact the body is not one member but many.” (1 Cor 12:12-14) There is very little change that anyone could pick any random member of any congregation and any other member of another congregation elsewhere and hold them up side-by-side and see a oneness in them. We, to our shame, are a loveless and backbiting group of people. We play nepotistic games for those we “like” and reject those we don’t. We fight tooth-and-nail over the non-important issues of Scripture and allow ourselves to be misled concerning the non-disputable issues! Hallmarks of the Church today are that our prayer-lives are weak, our ministries are self-serving, our giving is poor, our leaders are self-indulgent, our theology is faulty, our preaching is ear-tickling, our worship is pleasure-seeking, our worldview is hedonistic, and our morality is not very different from that of our surrounding society’s. Our “yes” cannot be counted upon to be “yes.” Our people sink into sexual immorality, lies, and cheating at the drop of a hat. Our primary obsession is to work diligently in casting out the specks from our brothers’ eyes (cf. Matt 7:3-5) instead of concentrating on growing our relationship to God through Christ.

The Church needs a total and complete reformation. The problem is that there is no centralized Church through which a reform can occur. Technically, of course, the authority of the Church is Jesus Christ Himself and such a reformation must come through Him by the Holy Spirit’s guidance. Be aware that I am not saying that the Lord cannot do this for all things are possible with God. The question remains though on how will Jesus exert authority upon those who have not yielded their “rights to themselves” (cf. Oswald Chambers) up to Him. He was clear in His teaching that there will be false teachers (pastors/priests/missionaries) and false churches in these days and He certainly did not indicate that He is going to sway His authority on them. In the Parable of the Wheat and Tares, Jesus said: “The kingdom of heaven is like a man who sowed good seed in his field; but while men slept, his enemy came and sowed tares among the wheat and went his way. But when the grain had sprouted and produced a crop, then the tares also appeared. So the servants of the owner came and said to him, ‘Sir, did you not sow good seed in your field? How then does it have tares?’ He said to them, ‘An enemy has done this.’ The servants said to him, ‘Do you want us then to go and gather them up?’ But he said, ‘No, lest while you gather up the tares you also uproot the wheat with them. Let both grow together until the harvest, and at the time of harvest I will say to the reapers, “First gather together the tares and bind them in bundles to burn them, but gather the wheat into my barn.”‘” (Matt 13:24-30 NKJV)

It is my prayer and should be the prayer of every believer that they and their congregational body be submitted and submissive to Jesus as Lord. May God be merciful towards us and bring about a cleansing and restoration of the Body so that we may be distinct from the world around us. May Christ’s Church no longer be iron mixed with clay but be one even as God is One. Lord, have your way with your people and move us to faithfulness… Amen!

Posted in Christian thoughts, Creative writing, Philosophical ramblings | Tagged , , , , , , , | 1 Comment

My Frustration with Photosharing Sites

A little over a year and a half ago, I wrote an article about the Flickr makeover and how atrocious it was. I could not stand the new look (and, for the record, I still can’t) and decided to head off in other directions to find a suitable place to host and showcase my photos.

Now, before I discuss what I have encountered, let me recognize that different folks use photosharing sites for different reasons. For some, photosharing can easily be done on a social media website like Facebook. Others desire a larger forum to run their creations past the world while folks like me desire an organized and central location to showcase their work. Admittedly, I do the Facebook thing with friend- and family-related snapshots, and I would be lying if I did not desire showcasing some of my photos too to have the world-at-large comment and vote on them. Anyway, my greatest need is an organized place to hold my work…

Flickr used to be this place but their new design just is, in my opinion, messy. The way that photos are bashed together causes subject-matter, color, and tonality clashes that were not a part of any individual photo. To my way of thinking, a photosharing site should be somewhat of an art gallery: what if the Louvre, the Rijksmuseum, or the Guggenheim smashed as many paintings as possible together on their walls? This is an example of my photostream on the new and improved Flickr:

FlickrExample

It is not pretty. Sure, it is a bunch of photos but there is no room for any of them to breathe. To be fair to Flickr, there is another mode of viewing images in which each one shows up in its own dark background but this is not the mode that most folks would pick to quickly review photos in a photostream or in a group.

So, I moved my photosharing to two different sites after the Flickr debacle: iPernity and 500px. iPernity is my standard hosting site for my post-Flickr work. In many ways, it looks like the old Flickr, with nice clean white “walls” upon which your photos are showcased. There is plenty of space around the images in the general review area to minimize the clashes noted in Flickr’s layout and, for people like me who take time to comment on each image, captions are plainly visible. In other words, the art-gallery paradigm is in play here. Very nice…

IPernityExample

One of the greatest features of Flickr is the incredible, vibrant community of users. These fuel hundreds of excellent groups, some which are pools of images centered on some specific subject (e.g. Sunsets, Seascapes, North American Birds) and others which are active contest groups in which one can field photos for critique and voting. When I swore off Flickr, iPernity’s groups proved to be weak by comparison. While Flickr groups tend to have membership in the thousands and tens of thousands, iPernity’s groups rarely have more than a handful to a few hundred users. While I may have a good showcase location in iPernity, I certainly have discovered that there is no competition driving its members to higher and higher photographic goals.

Which is one of the reasons that I also joined 500px. This is a very exciting photoshare site, populated by a large number of extremely talented photographers. Like Flickr’s pool of high-end photogs, 500px’s members will stimulate you to reach higher and improve your capture and processing skills. It was my hope that 500px would be a similar experience to the Flickr contest groups but, unlike Flickr in which there are umpteen contest groups available to field your photo, 500px only gives you one opportunity to score when you first upload your image. Bummer, but still it is exciting to field occasional shots.

500px’s look is somewhere between the clean gallery of iPernity and the messy approach of Flickr. All the images are sized into square format but there is enough of a gap to prevent mashing of images together. The photographer can actually pick the square crop themselves if they do not like the automatic one. Thus, for me, 500px is not a showcase site…it is only a competition site.

500PXExample

I am trying to dip my toes back into the Flickr waters. I have so many good contacts out there and the competitive groups are something I have sorely missed over the last year and a half. Of course, every time I go to the site, I find myself gritting my teeth… Without the sense of competition and inspiration, I find that my photography is

Anyway, maybe you have some photosharing woes of your own you don’t mind sharing in comments to this post? Perhaps you might also have some good site suggestions…

Posted in Creative writing, Photo, Photography, Rants | Tagged , , , , | Leave a comment

Hoping that Idiot Drone Users don’t spoil it for all

Why is it that a few fools can totally mess up something good? I am speaking specifically about the people who are doing their level-best to bring drone usage under strict regulation or costly regulation. Instead of drone use being something positive, thanks to these foolish folks it is becoming reported negatively in the press.

I believe the primary reason for this is that people think that drones are toys. Sure, they can appear toylike, but if misused they can be dangerous or lethal. Drones are not playthings and require care and responsibility while being used. Anything other than a micro drone does not belong in the hands of a child or a child-like person.

Drones can be lots of fun and being able to use them as filming platforms brings a tremendous amount of power into the hand of the hobby- and independent-filmmaker. Along with this convenience comes a lot of responsibility though. It is imperative that the user of the drone understand that what they are doing is regulated under the laws of the land. Even though the FAA has not devised a licensing policy for drones as of yet, the FAA has rules that affect their use. They fall under the regulations of model aircraft usage. Thus, operators of drones must conform to the rules of airspace usage defined here:

FAAAirspace

and explained in this excellent article. Depending upon your location, you must adhere to the scaled 0-700 foot ceilings (or a max of 400 feet if you prefer to follow the FAA recommendation rather than the published rule).

So, who are the bone-headed folks who are flying drones around airports? What do they think that they are going to do to the hobby use of the drones that they are using? Incidents such as this where multiple drones were reported flying around JFK last weekend will ground us faster than anything. Don’t these idiots know, or did they even care to research, that there is an FAA restriction to flying within 5 miles of any airport? See? That is exactly what has me ranting. I am one of countless folks who have plowed a considerable investment into our drones and we face the possibility of losing it all because of foolishness!

Be sensible with drones, folks. First of all, make sure that you acquire considerable flying time in a safe environment. My wife and I practiced at our town’s empty soccer and baseball fields (see Phantom of the Skies) and we will go every so often to practice new techniques in a place where we know that should something go wrong, it would be contained. Second, do not terrorize wildlife like this fool did to a ram. As tempting as it is, keep a reasonable standoff distance and respect their space. Third, do not fly over people’s heads unless you have a specific reason and have them warned. What would happen if you dropped a several-pound object from several hundred feet onto someone’s head! Fourth, don’t fly over highways and busy roads – for one, it can be confusing to a driver and might lead to an accident, and again what would happen if your drone misbehaves and crashes? This has happened several times, but this one got a lot of coverage and prompted the FAA to act. Fifth, stand off from buildings unless you have made legal arrangements to be near one unlike these folks in St. Louis. Sixth, do not exceed the FAA altitudes EVEN THOUGH YOUR DRONE CAN. Set a ceiling max of 400 or 700 feet and ensure the drone enforces the limit for you to avoid stuff like this from even being a possibility.

It is my hope that as the FAA and NTSB act on drone usage that they will not let the “bad boys” drive their decisions. I think that maybe they should use something similar to the FCC’s no-code licensing scheme as a model. A reasonable fee for a 5 year license, a certification test to ensure that you know the flight rules, a certification statement that you understand and will abide by the rules, and proof of liability insurance (maybe in the range of $100K-$250K) to be maintained during the period of the license would be a good deal. They could rven implment a cutoff for hobbyist (no license but very limited altitude and range) and serious (licensed) users of drones. They could require drone manufacturers to create firmware so that a valid license can be entered into a drone’s software to unlock the advanced features. Another feature of licensing would be the ability to commercially shoot video or photos from the drone, maybe as a second-level fee to not penalize those who want to film non-commercially but not sell their footage.

Anyway, my desire is that the bad apples don’t spoil the whole batch for all of us….

Posted in Creative writing, Photo, Photography, Rants | Tagged , , , , , , | Leave a comment