Categories
Uncategorized

Bitwise Fresno

Fresno Bee: “We’re putting these companies in an environment where they are thriving by virtue of who their neighbor is and the shared intellectual capital that’s here,” Soberal said.

If for no other reason this is why Bitwise Fresno is important to techies in the San Joaquin Valley. I’ve been in the building and felt the energy, it’s fantastic.

Maybe some day, when I grow up, I’ll be able to actively participate in this awesome community.

If you’re in, or around, the Fresno area and are a developer, designer, or involved in computing technology I’d encourage you to visit Bitwise and talk to Mr. Soberal. He’s very approachable and a great guy, more importantly, he believes in what he’s doing.

Categories
Uncategorized

Apps I Use Most

AHHHHHH!I’m not into year end posts or making resolutions, so I thought I’d share a list of apps I use daily, on my phone. Inspired by M.G. Siegler.

  • Twitterrific – My favorite app on my iPhone and iPad. I also use it on my Mac. The fine folks at Iconfactory make great software.
  • Riposte – A client for Alpha/App.Net. Since Twitter has clamped down on third party clients App.Net clients are where great UI/UX is happening.
  • Path – What a great replacement for the disaster that is Facebook.
  • Pocket – This is a “read later” app. I prefer it to others, there are a few that compete in the space. I think they’ve done a great job with the UI.
  • Fantasrical – A great replacement for the mess in iOS 7 called Calendar. The recent update includes reminders support. Another great indie shop, Flexibits.
  • Malt – I use a fun image service called mlkshk. Malt is a great iOS client. It’s fairly new and the developer is top notch.
  • Evernote – My note taking service of choice. My electronic brain.
  • Launch Center Pro – Another indie shop; Contrast.
  • WordPress for iOS – I’m using it to compose this post, nuff said.
  • Elixr – A specialty app for keeping track of your adult beverages. Beautifully designed and fun. Made by the folks that brought us Tumblr for iOS and Instapaper for Android; Mobelux. Great shop.
  • Interesting – From Designer/Developer Mike Rundle. It’s another way to look at news.
  • Mail – Almost forgot this one! Yes, I use the built in Mail client. Works great.
  • Safari – Apple’s web browser, based on their open source project, WebKit, that forms the core of Chrome as well as Safari. (Yes, I know Google has forked WebCore.)
Categories
Football

2014 BCS National Championship Tournament

2014 BCS Tournament

Click the image to view it full size.

Categories
Football Life Uncategorized

NFL: The Biggest Con

The Atlantic: “Nearly all NFL franchises are family-owned, converting public subsidies and tax favors into high living for a modern-day feudal elite.”

I love pro sports, and the NFL in particular, as much as the next person, but this is ridiculous. Of course the common folk will never attempt to stop the insanity because we love watching millionaire sports heroes take to the gridiron to play a game.

Here’s the kicker. We pay to go to the stadium, which isn’t cheap, and if you live in an area with a pro team you pay tax money to build and support luxury stadiums.

We’re sick.

Categories
fun Life Movies

Christmas Movie List

Say 'Hi' to the Christmas Turkey!My brother, Jay, mentioned a few movies he thinks of as Christmas Movies; Christmas Vacation, Die Hard, and he gives honorable mention to Elf. Not a bad list. Believe it or not, I’ve never seen Christmas Vacation. Die Hard and Elf are great films, regardless of the season.

Here’s the list of movies we watch, I may miss a few, but here goes.

Of course we don’t watch A Christmas Story until Christmas Eve when TBS does 24 Hours of A Christmas Story. I watch it a few times while I’m wrapping presents for my wife late into Christmas Eve, because, you know, there’s nothing like waiting until the last minute to wrap your wife’s gifts, right?

UPDATE: 12/24 – Here’s a list that’s a bit on the dark side, I thought I’d add these while I was updating the list above.

Categories
Life

Pathetic

A wonderful bouquet of flowers.The New York Times: “Mary Elizabeth Phillips, a retired accountant, is fighting eviction from the rent-controlled apartment where she has lived for almost half a century. If her new landlords have their way, she will have to move in April, shortly after her 98th birthday, because they want to sell the units.”

It’s nice to see San Francisco embrace technology companies, but not at the expense of others. People that work in the city cannot afford to live there; teachers, police, and fire fighters have to live outside the city and commute. That feels wrong. I know it’s typically more costly to live in a city, but San Francisco is heading toward New York prices, a place only the rich can afford to live.

Categories
Visio

Visio is 21 years old

It just hit me. Visio is 21 years old this month. When I started at Visio I was 24 years old. To date it was the most amazing experience of my software development life.

Happy Birthday, Visio. Here’s to many, many, more.

Categories
Cloud Development Uncategorized

Web.Next

Dave Winer: “But all that has changed with the ability to access cloud storage from apps written in JavaScript that run in the browser. Software that used to require a central server, and was easy to attack, and had to scale for all sizes of use-cases, now can run in the browser, with little if any loss of power.”

Dave is excited he can host a JavaScript on a server and pull it to the browser to execute because it affords him the ability to do simple applications without the need of web services. I can understand his excitement. It’s less expensive than running a GIGANTOR set of servers to host your services and answer requests thrown at them from the client. Point taken. It’s a step in the right direction, but I still think services are necessary for all but the smallest of apps because browsers still don’t make great hosts for applications.

Bringing in the Harvest
I think designing services first is the more appropriate thing to do. Don’t think about the UI first. UI’s are a dime a dozen and should be lowest common denominator (browser), up to native, high performance, best of breed (platform specific; iOS, Android, etc.) Because mobile is so important today you can’t leave that out of any discussion about web based services. Most web apps I’ve run on my phone are pretty horrible performance wise, but I can run them. If I have a choice to get a native mobile client I always opt for it because of that.

Dave accused me of calling him stupid.

Far from it, Dave. I know you’re not stupid, I just have a different idea than you, that’s all. A differing of opinion, and that’s ok. I think you’ll be very happy with your new model and out of that we’ll see some great browser apps.

I’ve talked about it before. I’d like to see the browser evolve way beyond what it is today if this is the new “OS” for the web based world. It must if we expect to create beautiful, highly usable, fully functional applications like we did on the desktop before the invention of the browser.

When the browser can evolve to a faceless shell that is language agnostic and allows us to control it like a native application controls the desktop environment, man, then we’ll have something special, until that time it will provide the lowest common denominator gateway to the web.

Web Next

Can you imagine the explosion of high quality code and components that would flow out of a world where we’re not limited to the confines of the browser and JavaScript? It would be industry changing.

I’d love to see the browser community embrace the idea of a full CLI implementation and create a way to hit and endpoint URL that pulls a fully built application to the desktop that’s hosted by an “invisible” browser. [UPDATE: This part, about pulling a full app plays nicely with what Dave is talking about.] The browser should serve as the new OS giving the developer full access to a virtualized machine.

We’ll get there, some day.

Categories
Development Pelco

Pelco SDK 3.3.1 – Collecting Devices C++ Sample

Disclosure

By day I’m the Development Lead for a small group of folks responsible for the Pelco SDK. This post is not an official Pelco article, just something I wanted to share.

Background

Last August I rejoined Pelco to help design a new object oriented version of the SDK and that’s what we’ve been doing for the last year plus. We’ve released four revisions of the SDK over that time period and are working on our fifth.

Something I’ve wanted to share for a very long time is how simple it is to work with our new Object Model to collect devices and play video. We’ve simplified the entire process. The original version of the SDK evolved from need, as a lot of things do, but over time it becomes more and more difficult to maintain and enhance that code without breaking backward compatibility. In the new Object Model we’ve worked very hard to make it easy and give you the power you need to code new solutions and give us a platform to build on in the future.

I plan on sharing a sample application after a very brief overview of our Object Model. The application, called EnumDevices, is a C++ application. You can find it on GitHub. I’d be happy to create the same application in C#/.Net. If you’re interested get in touch, rob@crabapples.net.

Overview

The Object Model is pretty simple, here are a few objects, just to get us started. You can view the entire list on PDN(it’s a PDF file.)

  1. SystemCollection
  2. System
  3. DeviceCollection
  4. Device
  5. Camera
  6. Display
  7. Stream

Of those we’ll discuss System, DeviceCollection, and Device in the sample. There is some boilerplate code you’ll need to write, but we’ll skip that for now, so we can get on with the sample. Look at main() in the EnumDevices sample, the boilerplate happens prior to calling the EnumDevices function. Something to note. This sample uses version 3.3.1 of the SDK, which introduced an explicit Startup() and Shutdown() function, keep that in mind if you’re using version 3.0 through 3.3, these functions don’t exist in those releases.

EnumDevices C++ Sample

On to the sample code. If you haven’t grabbed the code yet, head over to GitHub and pull it down, I’ll wait.

Some things to note about the sample code. It’s only available for Visual Studio 2010. Our SDK only supports Visual Studio 2008 and Visual Studio 2010 for the time being. I have no idea how it will behave in Visual Studio 2012 or Visual Studio 2013.

Ok, on with the code. We’re going to focus on one function in the sample; EnumDevices. This little bit of code will add, or get, a System, get the DeviceCollection and enumerate it. As it does it will print out the Device Friendly Name. That’s it.

Here’s the code, we’ll break it down below.

static void EnumDevices()
{
        // Create or get an existing system
        PelcoSDK::System system("admin:admin@pelcosystem://[insert your ip and port here]?alias=Enum Devices Sample System");

        // Get the Device Collection from the system
        PelcoSDK::DeviceCollection devices(system.GetDeviceCollection());

        // Iterate over the DeviceCollection and print out the device friendly name.
        devices.Reset();
        while (devices.MoveNext())
        {
                PelcoSDK::Device device(devices.Current());
                printf("Device Friendly Name: %s\n", device.GetFriendlyName().c_str());
        }
}

PelcoSDK::System

Dissecting the code. I’m sure the first line of code, where we create the System, will have folks asking questions. When we were trying to decide our model for creation and access of Systems we wanted to make it as easy as possible and provide a great deal of power without forcing the user to jump through a lot of hoops. In the end it was decided we’d fashion it after a URI Scheme. Today most people know what a web address looks like.

Here’s the line of code in question:

PelcoSDK::System system("admin:admin@pelcosystem://1.2.3.4:80?alias=Alias");

The interesting portion of that line is "admin:admin@pelcosystem://1.2.3.4:80?alias=Alias". In our scheme “pelcosystem” represents the scheme name, we’ve put the username and password information to the left of the scheme, before the @. Following the :// is the host name, followed by the port, and a query string. We use the query string for arguments, in this example we’re assigning an alias name to the System so we can use that to look it up later, or display it in our user interface.

Something else to note about the use of the scheme in the sample. It serves to do the initial add of the System to the SystemCollection and works to look the System up later, without going to the SystemCollection. Our sample could have also added the System to the SystemCollection by using the Add method directly on the SystemCollection, but it’s not required. That said, the first time you run this code it will be a bit slower than subsequent runs. The first time through the System and all its devices will be added to a local device cache so the next time you startup will be much quicker.

PelcoSDK::DeviceCollection

The second line of code is pretty straight forward. After we’ve created, or retrieved, a System we’d like to get the DeviceCollection so we can do something interesting. Maybe we’d like to populate a tree control with a list of devices, or just dump out device information to a simple console application, like this sample.

PelcoSDK::DeviceCollection devices(system.GetDeviceCollection());

There’s not a lot to talk about here. We’re constructing a C++ object of type PelcoSDK::DeviceCollection using the results of a call to system.GetDeviceCollection(). Now we have a DeviceCollection Object we can enumerate.

All of the collection classes in the SDK implement an interface called IEnumerator, it’s a template class that exposes three methods; Current, MoveNext, and Reset. These methods make it really easy to iterate all collections in the SDK with a simple while loop.

devices.Reset();
while (devices.MoveNext())
{
	PelcoSDK::Device device(devices.Current());
    printf("Device Friendly Name: %s\n", device.GetFriendlyName().c_str());
}

After getting our collection it should be in a “reset” state, but the first line of code above shows how to reset the internal iterator back to the beginning of the collection. Notice the while loop checks the result of the devices.MoveNext(). The MoveNext method will move the iterator to the next item in the collection and returns a boolean value, true if it has a next device, false if it doesn’t. Once there are no longer devices in the collection we’ll break out of the loop.

If we do have a device in the collection you can retrieve it by asking the DeviceCollection for its Current() object. Since IEnumerator is a C++ template the type of object returned is a PelcoSDK::Device. You can read more about the Device Object on the Pelco Developer Network(PDN).

EOL

Hopefully this sheds a bit of light on the direction of the Pelco SDK. We’re off to a nice start, but we have a long way to go, and we’d love to hear back from developers and partners. Please, reach out. Let us know how we’re doing, where we need to improve, and share your stories.

Until next time, happy coding.

Categories
Apple Design Development iOS iPad iPhone

iOS 7 Lowers the Bar

iOS 7

A gift for you!If you’re an iPhone or iPad user Apple had a shiny new gift for you this week; iOS 7. I know, I know, it’s a bit of a jolt. I won’t lie. I hated it for a few days, but it’s beginning to grow on me. I’ve heard this time and again “Give it a few days.” I’ve given it a few days and it still seems a bit stark, but overall I’m happy with it. My trusty iPhone 4 seems much faster than it did with iOS 6. Bonus.

Benefit to Developers

I’ve written a few iOS apps over the last few years. Some have been lovingly designed by professional designers, others, like our own RxCalc were kept intentionally simple. Why? Truth be told Jay and I don’t possess the ability to make beautiful imagery for our app, so the design has to be simple. We developed our app using plain old UIKit, it works really well, is fast, and the binary is tiny.

With iOS 7 the bar has been lowered. A generic looking application looked fresh when iOS hit the streets. There were developers that created their own style and look, and, in turn, third party developers began to define the look of the OS, not Apple. Think about developers like Iconfactory, Tapbots, and Path. They all introduced applications that took the look and feel of applications way beyond standard UIKit, and that’s great. They stood on the shoulders of giants and moved the bar higher so the rest of the app ecosystem had something to reach for.

Third party developers created Pull to Refresh, the Hamburger and the Basement, and alternatives to UITabBar. All were very good innovations and gave us beautiful, very functional, applications. But there is a downside.

If you go against the Apple playbook, which isn’t a bad thing, you may end up creating something that doesn’t feel at home on a future release of an OS. Since iOS 7 shipped I’ve seen numerous folks comment about how outdated forward thinking and innovative applications like Tweetbot look.

I’m sure we’ll see an update for Tweetbot soon, but the point is, if your app has a completely custom UI it may take a lot of time and effort to make it look right in iOS 7.

Back to RxCalc and our choice to use UIKit, without custom design elements. Here’s how RxCalc looks on iOS 6 and prior, and it looks this what on iOS 7 before being recompiled:

RxCalc, UIKit for iOS 6 and older.

It’s not flashy, but it looks similar to Apple’s own Settings app, or Mail, on iOS 6.

Making an app new again

If you created a simple UIKit application your road to iOS 7 is simple. Most of the hard work has been done. You can recompile and your application looks new again.

Here’s what RxCalc looks likes when it’s recompiled with the iOS 7 SDK. No additional work, just a simple rebuild.

RxCalc, UIKit for iOS 6 and older.

Can it be spruced up a bet? Sure it can, but I can put this in the store today and it will look like it belongs.

That’s why I tweeted this a few days back:

It is super easy to get a fresh UI if you stuck to generic UIKit.

Reset

The bar has been reset, time for a new generation of user interface innovation.

Thanks, Apple.