During an internal company meeting in early 2023, Toby Deshane gave a talk about the capabilities and potential risks of AI tools such as ChatGPT and CoPilot, both quite new at the time. It also addresses common questions such as ethics, cost, privacy concerns, and the growing possibility of open-source alternatives. The rapidly evolving nature of the field has aged some material here, but in general it still provides a unique insight into this exciting nascent era in history.
We recently were a part of a project with what was, in many ways, a
typical successful startup. The company makes hardware for a niche
market, powered by their own firmware and driven by a suite of web
applications running both on a server and locally as
Electron apps. They make a great
product that is disrupting the space and they’re growing rapidly, both
in company size and number of users.
What started as a small integrated team has spun up to several groups
overseeing various aspects of the product and as that happened the
developers became somewhat siloed from the QA folks. Each group had
its own process for keeping the quality high in the face of rapid
growth, namely thorough unit tests on the development side and a
series of step-by-step documents used by a number of testers to
manually go through every page and every button of the web
applications. Releases were coming quickly and the testers were
spending hours upon hours methodically testing only to have to start
all over again when another release came out of development. They were
overworked and almost overwhelmed, and called Infinity for help.
With an estimated 3.2 billion smartphone users in 2019, the mobile app
industry is growing and not showing any signs of slowing down. Along
with this growth in smartphone usage comes increased demands and
expectations from end users. Apps need to use the latest smartphone
features, be fast & easy to use. This is further complicated with the
need to develop for both Android and Apple smartphones as well as
tablets. For someone with an app idea, considering all these factors
can be a bit overwhelming. This is where Infinity Interactive steps
in. Infinity has extensive experience in the mobile app arena and can
help you identify the best approach for your app and target audience.
Today, companies are not just restricted to developing a native mobile
app. They can also build mobile web apps, progressive web apps, and
cross-platform apps. This post will cover the pros and cons of each
with the hope of giving a clear path for taking an app idea into app
reality.
At Infinity, we’ve been a fully remote, on-shore tech consultancy and
custom software development company since 2005 (founded in 1998), so a
lot of our friends and contacts have been asking us for advice on
effectively managing remote co-working. We thought it would be helpful
to share some of our tips and tricks from both the leadership and
employee perspectives.
Even on mobile, sometimes you need to show people a PDF. In your Xamarin Android app, for most situations, having the user download the document to view it outside of the app using Android's native document viewer is probably fine. But what if the design specifies displaying the document in the app? And what if that document is 100+ pages long? We recently ran into this here at Infinity Interactive and needless to say, displaying a PDF in your Xamarin Android app is not as straightforward as one might expect.
In the beginning, there were iOS, Android, and the Web. Entirely separate
platforms that had to be developed as such.
Then, along came Xamarin. Developers could write iOS and Android apps
using a single codebase, but we were still on our own for Web development.
Now, Uno has emerged. Building on top of Xamarin, it gives us the
power to write iOS, Android, Web, and even UWP applications using
shared logic and UI!
Cloud functions are a great way to run small programmatic services in the
cloud. They are easy to create and use, are very secure, and need little
maintenance. They even scale on-demand in a way that is very difficult to
achieve using regular servers.
Here at Infinity Interactive, we are an entirely remote team. As such,
high availability of our communication tools is paramount to our
success. Our daily methods of communication include JIRA, email,
commit messages, and even, gasp, telephones. While these are
effective at doing their job, they are not a replacement for that
“human” feel you get when you go into an office and have the ability
to have group and individual conversations with your co-workers. For
that piece of the puzzle, we use Slack.
System monitoring. A pretty vital part of any network management.
That is, unless you're one of the few who live for the visceral thrill
of flying blind. For the rest of us partial to our lack of heart condition,
an ounce of prevention is worth ten thousand gallons of Saturday morning
intervention.
In this blog entry, I'll go through the exercise of putting
together a simple but working and easily
extensible system monitoring setup leveraging common pieces of technology.
In an ecosystem riddled with large, portentous frameworks,
Redux is a refreshingly ascetic
little store management system. Driven more by its functional
programming-inspired tenets than supporting code, it offers — and
needs — only a few helper functions to manage its stores.
Minimalism is good. It's also a good idea to abstract oft-used
patterns into more expressive forms. Ideally, code should be crafted
such that its intent comes out on first read, while making deeper digs
possible when required.
Happily enough, the judicious use of delightfully succinct
higher-order functions is often all that's required to tailor-suit
some ergonomics into the manipulation of middleware and reducers. This
blog entry will showcase some of those helper functions that work for
me.
This article assumes you're already familiar with Redux. If this isn't
the case, you might want to check out first one of my
previous articles,
which provides a gentler, if a tad unconventional, introduction to the
framework.
JSON Schema is a neat way to describe or
prescribe structural expectations of JSON documents (or, indeed, any
data structure, let it be a JavaScript plain object or the equivalent
in another language). But JSON schemas are themselves JSON documents
and, while machines love a good ol’ JSON format, let’s face it: for us
humans it’s a lengthy, picky, and mildly onerous format to write and
read.
Fortunately, there are many ways to craft JSON schemas while
circumventing most of its JSON-born tediousness. Let me show you a few
of them.
When we developed the
TPC 2017 mobile application,
we wanted to create a repeatable process for delivering white-labeled
mobile applications in this space. This new delivery model did not end
with the mobile application’s UI and data. The backend had to be
configuration-driven and easy to redeploy as well. This way we can
spin up a mobile application with a working backend in minutes.
This summer I had the wonderful opportunity to represent Infinity and
speak at a number of conferences. Earlier in the year I was doing a
much better job of keeping up with writing up my experiences at each
conference soon after it happened, but as things got busy over the
summer, I got behind. Below the fold, I’ll do a brief recap of each
of the five (yes, five!) conferences I’ve spoken at and not yet
recapped here.
So, what is Azure? Azure is
Microsoft’s cloud solution. It’s a collection of services used to
build, deploy, and manage applications. We do a lot of work with Azure
here at Infinity. The great thing about Azure is that it’s not limited
to Microsoft platforms but also fully supports PHP, Node, Linux, and
many other Open Source technologies.
This past weekend I visited Grand Rapids, Michigan for the first
ever Beer City Code on the campus of
Calvin College. I took a class on how to write .NET applications on a
Mac, saw some great talks, presented a
talk on JSON Web Tokens,
and more. My full wrap up is below the fold.
The nice thing with knowing a technology well, is that you can create
a lot of nifty things. The nicer thing with knowing a healthy
smattering of technologies, is that with the right amount of cunning
and slyness you can gather things here and there and build something
that is niftier than the sum of its parts.
We do a lot of work with apps and Xamarin here at Infinity. We’ve seen
that adding animations to our Xamarin.iOS or Xamarin.Android app makes
for a more appealing user experience. But if those animations are
overly detailed, programming them may take quite a bit of time. Well,
thanks to Lottie (an Open Source
animation tool from Airbnb) and
Lottie Xamarin (a set of
Xamarin bindings for Lottie created by
Martijn van Dijk), it's a lot easier to
add animations into our apps. Let's check it out.
The first weekend in May, I had a chance to attend
LinuxFest Northwest in
Bellingham, WA. I also got to present a couple talks. I had a great
time --- read on for all the details!
I recently had the opportunity to attend and speak at
SCaLE 15x in Pasadena, and
it was an awesome experience. Read on for an overview of all the great
talks I got a chance to see!
Infinity's own Paul Zolnierczyk attended (and presented at)
MKE DOT NET, a one-day development
conference in the Milwaukee area. MKE DOT NET brings together .NET
developers from the Midwest to explore new ideas, code, share
knowledge and discover best practices. Here’s his recap.
Some of the folks here at Infinity Interactive are avid players of
fantasy sports, and
this year, they convinced me to join their Fantasy Football league.
Two months into the season, what started as a casual game has turned
into a trip through a data analytics wonderland as well as what will
hopefully be a recurring series of posts here looking at various
aspects of the data analysis that I've been doing.
I'm still playing around with Redux and, as
usual, I'm always on the lookout for ways to optimize my laziness.
One thing that I found irks me just a little bit are the Redux
actions. They are nothing but raw Javascript objects, meaning they are
very easy to set up and manipulate. But since anything goes, they are
also very easy to subtly get wrong. For example, I'm working on a
spaceship game and I have an action called MOVE_SHIP. But what
arguments was I using for that? Was it this:
{ type: 'MOVE_SHIP', ship: 'enkidu' }
or rather, that:
{ type: 'MOVE_SHIP', ship_id: 'enkidu' }
Sometimes, I remember to double check myself, but other times, I'll
use the wrong property and set myself up for a long, protracted,
somewhat less-than-joyful debugging session.
YAPC::EU is Europe's premier event for the Perl programming language.
This year the conference was held in Cluj-Napoca, Romania, from August
24 through August 28. Infinity sent one of our developers, Sweth
Chandramouli, to attend, and we asked him to give a quick recap of his
experiences there.
YAPC::EU recently hosted their annual
Perl Conference in Cluj-Napoca, Romania, and Infinity Interactive is
proud to have partnered with them in releasing the YAPC::EU mobile
application on iOS and Android. Today, we’ll cover some of the
technical challenges we faced in creating this app, which we built on
the foundation of the
Open Source project that
provided a similar app for
Xamarin Evolve 2016.
Redux is a small JavaScript library that is
quite popular at the moment. Liberally inspired by functional
programming principles, it offers a state container that is accessed
and modified via message passing.
Thanks to this message passing, and a strong emphasis on immutability
and pure functions, it minimizes surprises and maximizes sanity. One
of its beautiful promises, for example, is that since the state is
only modified via messages (or actions) and pure functions, one can
consistently replay the actions of an application and end up in
exactly the same final state.
As I was reading and playing with Redux, I began to wonder... This is
a blissfully small library. How easy would it be to port it to Perl?
In the name of science, I had to try.
If you’re part of the Perl community, you probably know how much
Infinity loves Perl and Open Source. However, you may
not know how much we also love Xamarin
and mobile development --- but after you check out the new
YAPC::EU::2016 app on iOS or Android we've put together, we hope
you’ll appreciate how our love for Open Source is too big to be
limited to just one language or platform.
OpenWest is “the largest regional tech conference devoted to all
things OPEN: Hardware, Standards, Source & Data”. This year the
conference was held in Sandy, UT from July 13th to July 16th.
Infinity sent a large contingent of folks to Sandy for the conference,
and a number of them have summarized their experiences in this blog
post.
We're back with the second part of our post on iOS Animations in
Xamarin. In this post I'm detailing some of the animations seen in
TaxChat,
an iOS App we recently launched. In
the first part
we discussed AnimateNotify, AnimateKeyframes and
AddKeyframeWithRelativeStartTime. In this continuation we will look
at animating rotation and scale using
CGAffineTransform,
then animating a
CAGradientLayer
using
CABasicAnimation.
From time to time, it comes in handy to tie various types of
information (ticket id, bug or feature, task owner, sprint
information, deadline, etc.) against a branch. Often we can get away
with just adding them to the branch name, but it can get ludicrous
real fast. In those instances,
'bugfix/jira-613-sprintD-deadline20160523-by_yanick' just doesn't
cut it.
We recently launched the app
TaxChat,
"tax preparation for people who have better things to do." The iOS app
saves you from having to do your taxes by yourself; instead you just
answer a few questions, snap a couple of photos and a certified tax
professional will take care of your tax return for you. All through a
beautiful & intuitive interface. You can read more about it at
tax.chat.
Since we built TaxChat using Xamarin, I
figure this is a great time to write a post on iOS animations in
Xamarin and detail some of the animations seen in the app. If you
don't already know about Xamarin, check out this
introduction to Xamarin
by our resident Xamarin MVP, Sean
Sparkman. Essentially, Xamarin allows you to build native apps for
multiple platforms all in C#, which is pretty sweet.
They say that no man is an island. Likewise, no software runs in a
void. Well, except maybe for Voyager's main control. But that's not
the same. And beside the point.
So, as I was saying, no software runs in a void. There are
dependencies to think about. And depending of where you are in the
overall stack, those can come in two flavors. There are, obviously
enough, the dependencies that you are using, and there are the reverse
dependencies; the other pieces of software that depends on your own.
Fortunately, testing is a very deeply ingrained characteristic of the
Perl world. Modules come with their test suites, and the
ever-vigilant, ever-running CPANtesters
ensures that if a new release of a CPAN module breaks tests of
another, authors are more likely than not to learn about it rather
quickly.
That's already mightily fine. But sometimes one needs more… custom
arrangements. Recently I had such needs, and with the judicious use of
already-existing tools I was able create a little setup that would not
only allow me to test a selection of modules on my box, but also let
me painlessly upgrade those modules when they'd change on CPAN.
Jake: Recently, I was working on an internal project and started
thinking about the infinity symbol. After reading Will's great post on
recreating the Archer title sequence with CSS animations,
I came up with the idea to create a loader using the symbol. A loader
is an animation used to signal to the user that something is
happening, like data loading or when submitting a form.
Welcome to the second installment of our
Bread::Board tutorials. In
the previous article, we've
covered what type of situation calls for Bread::Board, and we had a
high-level overview of how to use it. In this installment, we'll begin
to dig deeper into the inner workings of the framework. More
specifically, we'll look beyond the DSL we used thus far for our
examples, and learn how to manually create the underlying objects of a
Bread::Board application.
Perl 6 will be ready for production in 2015,
according to Perl creator Larry Wall. At least, that's what he said
during
his FOSDEM 2015 talk.
This news reminded me that it has been quite a while since I tried
anything interesting with Perl 6. I decided to spend my weekend
installing and playing with Rakudo, the primary
Perl 6 implementation.
Lately I've been wanting to experiment a little more with CSS
animations. I already use them for small effects, but to really get to
know something, I need a project. A while back I was watching one of
my favorite cartoons, Archer, and as the title sequence was rolling I
realized, "this would make an awesome CSS animation project!"
Whenever you try to recreate something, it's best to study the
original. A quick search led me to
Art of the Title a site dedicated to
title sequences. Lucky for me, they have the
Archer title sequence
posted for our viewing pleasure. Have a look at it to see the sequence
I'm building towards.
The recent release of Django 1.7
comes with built-in support for database migrations. In previous
versions of Django, the popular way to manage migrations was a
third-party tool called South. Thanks to
a successful
Kickstarter
project, the creator of South worked to build support for migrations
into Django 1.7.
I originally bought my iPad back when tablets were becoming a fad. I
had expected to use it for everything from reading ebooks to playing
elaborate new games. But no, it has been sitting idle, collecting
dust, for years. Even the promise of a shared, coffee-table web
browser has fallen flat. Whenever there's a task to be done, I instead
reach for my laptop or my phone. After all, as phones get larger and
more capable, and laptops get lighter and extend their battery life,
the sweet spot that tablets offer gets squeezed out from both above
and below. So for the past year or so, my usage has been limited to
ordering food online with friends, passing the iPad down the couch.
But now I've finally figured out the perfect job for it. I've mounted
it right next to my front door. My previously-unused iPad now serves
as a dashboard and control panel for my apartment.
Bread::Board. It has one
hoary hairy heck of a scary reputation.
But while it's not totally undeserved—Inversion of Control as a
concept tends even at its best to, well, turn one's mind inside-out
like a sock—the truth is much less daunting than the hype would have
you think.
Nancy is a lightweight framework for building
HTTP-based services on .NET and Mono. The goal of the framework is to
stay out of the way as much as possible and provide a
"super-duper-happy-path"
to all interactions. This approach to sensible defaults and
conventions means that it is very easy to write a stand-alone
self-hosted web site or API that runs as a desktop application. In
this post, I'm going to discuss the equivalent happy-path for
deploying such an application as a Windows Service.
The recent disclosure of a critical security flaw in the widely used
bash command-line shell for Unix operating systems sent many
technology professionals scrambling to update their systems. We were
certainly among them.
I want to create a fountain that can entertain guests. Namely, I want
to be able to control the flow of the fountain with my hand. Recently,
at our last summit, Jay Hannah
introduced me to the Leap Motion, which
is basically a Kinect for the hands. A little research introduced me
to Arduino, an open source solution for
programming microcontrollers.
The fountain will be built using base electrical components. The
actual physical basins for the water may be taken from an existing
fountain, but I plan on making that decision later. This post details
my initial goals for the project, as well as the first steps I took
towards a side-project, and the coding hurdles I had to overcome to
complete the side-project.
That's right folks. The annual North American Perl conference,
YAPC::NA, was held in sunny Orlando,
Florida last week. Infinity Interactive was well represented and many
of our developers presented talks.
In a
previous post
I demonstrated how to consume a stock web service using WSDL2JAVA.
Although WSDL2JAVA is a great tool, it can generate some long and
difficult-to-read code. In this post, I'm going to demonstrate an
easier, more concise way of calling the same web service using Groovy.
Recently, I was working on a team project with a number of independent
components each with their own data, logic, and presentation layer. I
was assigned the task of creating an API for capturing large amounts
of real-time data. Since other developers needed to use it, the API
had to be documented.
Technical writing is probably one of the most difficult things to do.
The intended audience most likely does not want to read it. It needs
to have just enough detail, but it needs to be short. And even if it
does meet all those requirements, people still may not read it.
When working with non-technical clients, often their preferred means
of exchanging structured data is via spreadsheets. Using a custom tool
is not always practical due to cost or training time constraints, and
using a type of document that doesn't have its own standard editor
(such as XML or JSON) will generally result in having to deal with
malformed files on a regular basis, since these files are often edited
by hand.
Excel is the only program for managing structured data that is widely
used by both technical and non-technical people, and being able to
leverage that structure can make the whole data exchange process much
smoother, even though it can be frustrating at times.
Leap Motion is a slick little infrared
sensor unit you can buy for $80 online, or at your local Best Buy. A
quick install later and you can now wave your hands in space above the
unit and interact with your computer in three dimensions.
I had the pleasure of working with Leap for a partner proof of concept
and thought I'd give you some of my early thoughts and observations.
If you've come across the task of consuming a web service via a WSDL
you were given, there's a chance you may have cringed a bit. All that
XML involved and then determining your approach is a challenge as
well! Do you want to use a SOAPConnectionFactory or create an XML
message by hand and parse the response? These approaches will work but
it will likely take time away from what you really want to do and that
is develop the application you're working on. Along comes WSDL2JAVA, a
tool which will build Java proxies and skeletons for services with
WSDL descriptions. In this article I'll highlight the steps needed to
consume a web service with WSDL2JAVA.
HTML 5 has proven to not be the silver bullet everyone hoped for. By
their own admission, Facebook's biggest mistake was betting on HTML 5.
While it works well for content, anything more than that needs native
performance. Mobile users demand native performance. The first few
seconds of any mobile user's experience is the most important. Users
will uninstall or never again open an app if they are dissatisfied in
those crucial first moments. So what is the answer if it's not HTML 5?
There's a case to be made that it's Xamarin.