Posts Tagged 'iPhone'

Optimizing Network Traffic: CocoaSPDY and FastCoding

Ever have discussions of this pattern?

BOSS: Do me this obviously ludicrous so data heavy as to be next to impossible to make work at all network-based thing.

YOU: Uh … ok. <do next to impossible thing>

BOSS: It’s too slow! And too expensive! Waaaaaah!

Here’s a couple of options to be aware of when you’re trying to squeeze every last bit of juice out of your network traffic:

CocoaSPDY: SPDY for iOS / OS X

For over a year now, Twitter has supported the SPDY protocol and today it accounts for a significant percentage of our web traffic. SPDY aims to improve upon a number of HTTP’s shortcomings and one client segment in particular that has a lot of potential to benefit is mobile devices. Cellular networks still suffer from high latency, so reducing client-server roundtrips can have a pronounced impact on a user’s experience…

One of our primary goals with our SPDY implementation was to make integration with an existing application as easy, transparent, and seamless as possible. With that in mind, we created two integration mechanisms—one for NSURLConnection and one for NSURLSession—each of which could begin handling an application’s HTTP calls with as little as a one-line change to the code…

We’re still actively experimenting with and tuning our SPDY implementation in order to improve the user’s experience in our app as much as possible. However, we have measured as much as a 30% decrease in latency in the wild for API requests carried over SPDY relative to those carried over HTTP.

In particular, we’ve observed SPDY helping more as a user’s network conditions get worse…

If you’re slow because you’ve got a whack of back and forth traffic with a SPDY-enabled data source, this could be a pretty big win — as noted above, especially with the absolutely horrible latencies seen on cell networks that us developers tend to overlook since we’re always developing with wifi connected.

More likely though, your only big wins are going to come from optimizing your data representation, optimizing its JSON, switching to binary plists, and so forth, and here’s an interesting-looking new option to consider for that step:

nicklockwood / FastCoding: A faster and more flexible binary file format replacement for Property Lists and JSON

FastCoder is a high-performance binary serialization format for Cocoa objects and object graphs. It is intended as a replacement for NSPropertyList, NSJSONSerializer, NSKeyedArchiver/Unarchiver and Core Data.

The design goals of the FastCoder library are to be fast, flexible and secure.

FastCoder is already faster (on average) for reading than any of the built-in serialization mechanisms in Cocoa, and is faster for writing than any mechanism except for JSON (which doesn’t support arbitrary object types). File size is smaller than NSKeyedArchiver, and comparable to the other methods.

FastCoder supports more data types than either JSON or Plist coding (including NSURL, NSValue, NSSet and NSOrderedSet), and allows all supported object types to be used as the keys in a dictionary, not just strings.

FastCoder can also serialize your custom classes automatically using property inspection. For cases where this doesn’t work automatically, you can easily implement your own serialization using the FastCoding Protocol…

Looks like a pretty nice set of advantages for your local serialization needs, and would likely be applicable to network transmissions as well; the format is simple chunk based so should be easy to create/parse as applicable with your network service development environment of choice.

As always, if you’ve got any more unconventional or obscure tricks you use to speed up and/or cut down size of your network traffic, let us know!

Continue Reading →
0

Cocos2D V3 + SpriteBuilder 1.0

Not too many open source projects survive the founder leaving, most especially when it’s to a direct successor of that project, but those of us who were distinctly out of sorts at the thought of sacrificing our friendly Objective-C Cocos2D in blood and tears to the fixation on the cross-platform development chimera of the people who pay us to have fun can celebrate today:

Cocos2D V3 RC1 release

We are excited to announce the coordinated release of Cocos2D V3 and SpriteBuilder 1.0!

This release of Cocos2D brings three major improvements to the Cocos2D community: SpriteBuilder, which is a professional GUI editor for easy iteration on games; Chipmunk2D integration for rapidly developing physics-based games; and Apportable support out-of-the-box for all this, so that your Objective-C games can run on Android!

So for those that haven’t been keeping score so far, the number of cross-platform development environments using Objective-C just went from zero to one. Pretty cool, huh?

SpriteBuilder’s visual editor enables developers to quickly prototype and build high quality games with intuitive, elegantly designed tools. Designers and developers can work seamlessly together and drastically cut development time. SpriteBuilder is the only game development suite that allows you to run your Objective-C code as a native app on Android. Apportable compiles Objective-C programs directly to ARM or x86 machine code, so a game built with SpriteBuilder will run faster on Android than a game written in Java or other languages…

And what’s awesome sauce on that awesomeburger is that SpriteBuilder is open source, so writing yourself a custom level editor just difficulted down fantastically to boot. Check out this reddit Q&A for some more interesting tidbits.

If you’re in a hurry to check it out, as you should be, here’s the Getting Started page, and there’s already some tutorials and demos out there:

How To Make A Simple iPhone Game with Cocos2D 3.0 Tutorial

Clone Angry Birds with SpriteBuilder

CocoRoids: Example game for Cocos2D v3 using CCPhysics and SpriteBuilder features.

CCPhysicsColorMatch: A simple CCPhysics based color matching game.

We’re certainly hoping this investment works out well for Apportable; can’t think of any other development suite anywhere where the tool chain is fully open sourced and also backed by a sustainable revenue model, which aligns the interests of everyone involved in remarkable consanguinity. So do your part by paying up to Apportable for at least an Indie license, so they can keep their “about seven engineers” working on it!

UPDATES:

The Guide to Building and Customizing SpriteBuilder v1.x

Building a real time multiplayer game with SpriteBuilder

Layouting with SpriteBuilder and Cocos2d 3.0

Migrating to cocos2d-iphone v3 – Tips & Tricks

Using PhysicsEditor with Cocos2D V3

Continue Reading →
0

Pods in Poses Pro 2

So the last couple weeks we’ve been working on rewriting our very first nontrivial app to act like a decent citizen of iOS 7. Which remained essentially unchanged architecturally from late 2008 up until last month, save for the grafting in of IAP to download content instead of ship separate apps in early 2010. Have you taken an iOS 2 architectured app and rewritten it for iOS 7? Makes you really, seriously, appreciate just how far and fast this business of ours is moving, that’s for sure. So in the spirit of those tool posts people like making, let’s list the third party goodies we used, none of which existed when this product was written, just for a get-off-my-lawn chuckle at how hard things were in those sadly primitive days five whole years ago. And to point out some nicely iOS 7 savvy convenience pods that might have escaped you thus far.

1) mogenerator and Core Data reduced the data management code by three full orders of magnitude. Not to mention that being able to preload all your data with an OS X command line tool and test it at creation time saves multiple weeks’ worth of futzing around tracking down mistypes in your plists like we did back in those iOS 2 days. Ah, automation is wonderful.

2) Urban Airship is of course the unquestioned leader in push notification these days — we’d actually started working with iLime at some point here, remember them? — and it took just a few lines to use it to implement remote unlocking of iTunes Store hosted IAPs; functionality the current version manages with delusions of adequacy via a Google App Engine backend and our own content hosting. All of which we will be absolutely enthralled to send packing.

3) Flurry likewise for analytics. We’d almost got around to successfully integrating Pinch Media — remember them? — at some point, but ran into some kind of link problem or something that we forget now and didn’t bother holding up shipping for. And never got back to. Add four years, and why, it’s just amazing how free and easy analytics are to drop in, isn’t it now?

4) Speaking of free and easy, wow does Crashlytics ever rock. Remember when dropping in PLCrashReporter was bleeding edge state of the art crash management? This project does.

5) And finally getting around to our post title here, CocoaPods takes in a walk the Best Damn Hero Award for Awesomeness Of Expedited Development compared to five years ago. For anybody, but especially for us; twenty years of making a living mostly out of porting from Windows before this iPhone thingy happened along has trained us to crank up our compiler warnings to self-righteously OCD level — why yes, everything we write for our own projects does compile just fine with -Weverything, how about you? — and -Werror in release builds too. Which makes it always a time sucker to integrate other people’s code. CocoaPods sidesteps that nicely, as well as real problems, and even sorts acknowledgements for you. What’s not to like, indeed. Bonus mention to CocoaControls for including CocoaPod savviness in their likewise intrinsic awesomeness.

Here’s the pods that we’re linking into the version shipping off to the Apple approval gauntlet soon as we pull all the non-code stuff together:

pod 'AFNetworking', '~> 2.0.3’

Pretty sure most everybody uses AFNetworking these days for their networking needs, RIP ASIHTTPRequest. The funny part here is that after setting up CocoaPods for the new version’s project thinking “we’ll throw in AFNetworking for one pod to start out with, OBVIOUSLY we’ll be using THAT” we ended up not actually having any networking needs in the 2.0 release — everything that we absolutely had to do ourselves over the network in the first version was replaced by the libraries above or rendered obsolete by free Apple-hosted IAP, and what little remained hasn’t turned out important enough to bother with right now. But we probably will later, so we didn’t bother taking it out. Besides, it gives us a chuckle thinking of all the time spent tracking down networking issues back in the day every time we look at it.

pod 'CTFeedback', '~> 1.0.4’

CTFeedback adds a nice info-providing wrapper around your standard mail feedback writer.

pod 'FastImageCache', '~> 1.2’

FastImageCache is woo-hoo! fast. Got any gallery-type displays? Use it.

pod 'JPNG', '~> 1.2’

nicklockwood / JPNG “is a bespoke image file format that combines the compression benefits of JPEG with the alpha channel support of a PNG file.” And you can use it just like a JPEG where you’re not concerned about alpha, convenient that.

pod 'MRProgress', '~> 0.2.2’

MRProgress has all kinds of looking right at home in iOS 7 progress display options.

pod 'RMStore', '~> 0.4.2’

RMStore in our opinion does by far the best job of actually helping you instead of mostly getting in your way of any of the IAP helpers out there. And does iOS 7 receipt verification! Hosted downloads aren’t integrated into the main distribution yet, but this pull request works just fine for us.

pod 'TDBadgedCell', '~> 2.4.1’

TDBadgedCell does up your cell badges nice, looking fittingly in place in iOS 7.

pod 'TWSReleaseNotesView', '~> 1.2.0’

TWSReleaseNotesView shows release notes — either included with the app or pulled from the store automatically.

pod 'UAAppReviewManager', '~> 0.2.0’

UAAppReviewManager is like your usual review beggar alert, and extra niftiness like affiliate support and OS X support.

pod 'WYPopoverController', '~> 0.1.7'

WYPopoverController is pretty darn sweet for laying out your iPhone + iPad storyboard-based iOS 7 UI with optimal aplomb.

Kinda cool to look at this list of third party goodies that made your 2013 app development faster and better and compare with the “absolutely nothing” that would have made up an empty post on the same topic for the 2008 version of the app, isn’t it now?

Continue Reading →
3

RMErrorRecoveryAttempter

So, you ever written any objects conforming to the NSErrorRecoveryAttempting protocol?

“The what?” you say?

NSErrorRecoveryAttempting Protocol Reference

The NSErrorRecoveryAttempting informal protocol provides methods that allow your application to attempt to recover from an error. These methods are invoked when an NSError object is returned that specifies the implementing object as the error recoveryAttempter and the user has selected one of the error’s localized recovery options…

Must admit, we’d managed to completely miss the existence of that protocol up until now. And so has pretty much everyone else in the world, going by all the other people’s Cocoa code we’ve ever looked at. But the clever sparks over at Realmac are an exception to that pretty much:

Cocoa Error Handling and Recovery

We’ve developed our very own RMErrorRecoveryAttempter class which harnesses the power of blocks to provide recovery options for an error. The class conforms to the NSErrorRecoveryAttempting informal protocol.

Let’s assume we’ve an entry object that a user has created. The user then tries to save this entry but because they haven’t set the required date property a save error occurs. To recover from this error we’ve created an RMErrorRecoveryAttempter object that has two recovery options.

RMErrorRecoveryAttempter *errorRecoveryAttempter = [[RMErrorRecoveryAttempter alloc] init]; [errorRecoveryAttempter addCancelRecoveryOption];

  [errorRecoveryAttempter addRecoveryOptionWithLocalizedTitle:NSLocalizedString(@"Use Today\u2019s Date", @"RMEntry date error use today's date recovery option") recoveryBlock:^ BOOL (NSError *recoveryError) {

  [entry setDate:[NSDate date]];

  return YES;}];

The first is a cancel recovery option that does not attempt to recover from the error and whose recovery block returns NO. The second recovery option has the title Use Today’s Date and a recovery block that sets the entry’s date to today and then returns YES. The errorRecoveryAttempter is added to the user info dictionary of an NSError object and then presented in an alert. For iOS projects we wrote the category UIResponder+RMErrorRecovery to present the error that includes a completion handler. If the recovered parameter of this completion handler is YES then the user chose a recovery path and so the message to save the entry can be resent.

The class is fit for use in both iOS and OS X projects and we use it throughout all our apps…

Check it out at realmacsoftware / RMErrorRecoveryAttempter!

Continue Reading →
0

Custom Objective-C Literals: OCUDL

Now this is a truly awesome example of Gratuitous Preprocessor Abuse™:

Introducing OCUDL

OCUDL is an experiment to bring user defined literals to Objective-C. A literal is a shorthand expression that creates a value of a certain type. For example, 25ul creates an unsigned long of 25, and @”hello” creates an NSString of hello. User defined literals bring this brevity and expressivity to our own types…

OCUDL defines literals using prefixes or suffixes. Here, we’ve defined a UIColor literal that uses the # prefix.

myView.backgroundColor = $(#FE22AA);

Pretty cool huh? Or how about

  • NSNull *n = $(null);
  • NSURL *url = $(http:www.apple.com);
  • NSUUID *uuid = $(68753A44-4D6F-1226-9C60-0050E4C00067uuid);
  • UIImage *img = $(pic.img);
  • UINib *nib = $(MyNib.xib);
  • UIStoryboard *board = $(MyBoard.storyboard);

The basic trick here is that “$” is a macro that sends the bracketed string to a factory method that keeps track of what to do with strings of a registered prefix or suffix. And of course, you can register your own for whatever class strikes your fancy. The savings in typing time and reading conciseness might or might not be worth the trouble, but seeding these throughout your shared code quietly and forgetting to notify your teammates of the new preprocessing tricks lying in wait to confuse them utterly, well that’s just priceless.

More details in OCUDL in Depth;

Code at dbachrach / OCUDL;

CocoaDocs at OCUDL Reference;

h/t: ManiacDev!

UPDATES:

Categories To Shorten Your Objective-C Code Including JSON Helpers, And NSComparisonMethods For iOS

Continue Reading →
0

Hosted IAP And Receipt Validation

So today we’re adding hosted IAP content to a project for the first time — right out on the cutting edge with those iOS 6 features, that’s us — so that makes it a good time to check out what’s new in the way of IAP support libraries since a long time ago we last had occasion to check out the state of the art. The two we checked out then are:

  • MugunthKumar / MKStoreKit: Seems quiet for the last year, latest README notes “I’m working on In App Purchase hosted content support on iOS 6. It’s implemented, but for some apparent reason, download doesn’t happen.” Next!
  • anystone / AnystoneStoreKit: Also appears to be languishing since initial release, nothing in nine months.

Hmmm. Alright, let’s check on other libraries that we’ve noted the existence of since then:

And let’s go trawling around to see what other libraries we can dredge up that we hadn’t noted the existence of until now. Making the probably reasonably safe assumption that anybody serious these days is doing a CocoaPod for their project and/or will be listed on CocoaControls, that gives us the new entrants

CargoBay has a couple extensions out there as well:

And here’s a selection of tutorials and snippets regarding the hosting and verification process to help smooth out all the rough edges on your choice (if any) of framework:

Introduction to In-App Purchases in iOS 6 Tutorial

Apple In-App Purchase: Creating App Store Hosted Content

Configuring and Creating App Store Hosted Content for iOS 6 In-App Purchases

In-App Purchase content downloads in iOS6

Updating content when using Apple-hosted content for In-App Purchase

App Store Receipt Validation on iOS 7

rmaddy / VerifyStoreReceiptiOS “parses and validates the payload and the PKCS7 container itself.”

DarkHorseComics / DHAppleReceiptParser “A library to parse the apple receipt file in iOS 7 “

A complete solution to LOCALLY validate an in-app receipts and bundle receipts on iOS 7 — check out the epistle from hpique the RMStore author

Well, adding hosted download support is pretty straightforward looking, and iOS 7-savvy receipt validation is most assuredly not straightforward looking in the slightest, so we’re going to go with RMStore here. It looks very nicely done indeed — check out these slides — for making things simpler without getting in your way a lot, which is a pretty fine line to walk. You may find that line for you somewhere more congruent with some of the other options up there of course; and CargoBay is definitely worth a very close look if you’ve already got (or insist on getting) server side verification. We’re perfectly good with the on-device verification here, because there just isn’t enough money at stake with our handful of IAP options to bother getting overly uptight, so RMStore being apparently the current best available drop-in solution for that floats our boat just fine. And besides, there’s already a pull request for download support — yep, looks just about as straightforward as our guess at doing it ourselves would be — so chances are, by the time we get all the content sorted packaged and uploaded, it’ll be there waiting!

Continue Reading →
0

Sales Tracking: AppViz 3 and App Annie Advertising

Well, it’s been quite a while since we last made any note of developments on the sales tracking tool front … oh, wait, that’s because there really haven’t been any of note until this week. But then, there were two!

First off, our desktop tool of choice AppViz has undergone quite the revamp, becoming now a cloud-stored subscription. As should shock to the core nobody sensible really, as the economics of maintenance for a tool of this type are pretty ridiculous.

So what’s new? It would be easier to say what isn’t. In partnership with the Iconfactory, we’ve rethought, redesigned, and redeveloped AppViz, resulting in a more polished, elegant and powerful experience. The app was rewritten from the ground up, its code reviewed and optimized. In addition to a beautiful new interface, we focused on improving performance so that the new features and UI will scream on even modest hardware.

AppViz 3 is packed with powerful features we think you’ll love, from a Dashboard that gives you a bird’s eye view of your market performance, to the Financial module that can reconcile your bank statements with Apple’s financial reports and compute revenue splits with partners. Even our graphs have been redesigned, providing a greater level of detail and analysis…

You can check out all the features here, but we’ll just highlight the two we stopped reading at:

• Partner Splits – Add partners to your apps & calculate monthly splits

• Financial Reconciliation – Reconcile monthly reports with your bank account

Shut-up-and-take-my-money.jpg

That ‘Reconcile’, that’s the key. If there exists any other method to have that sorted for you, we don’t know of it. Good-bye, annoying spreadsheets!

Of course, if that isn’t a compelling feature for you, hey have a look at appFigures’ current feature set. We paid for it for a while to get the email reports, which caused us more headaches than they saved anyways because exchange rates are estimated (see ‘Reconcile’ above, did we mention we find that compelling?) but dropped it when App Annie started sending out sufficient enough emails to satisfy our reporting requirements; and if anything new and exciting has happened over there we’ve missed it, but check if you want and let us know if you find anything overly useful that AppViz is missing.

Which brings us to App Annie, where the big news is integrated ad network reporting:

Screen Shot 2013-11-19 at 6.03.27 PM.png

Our Advertising Analytics service is free and simple to set up, no SDK or app-coding required. Just log-in to your App Annie Analytics account and click on “Connections” to get started. To find out more, we’ve set up a page to tell you about all these new features.

It all begins with 7 ad networks today, but over the coming months we’ll be aggressively adding more and more so you get the most comprehensive list of networks possible. Currently, you can connect to AdMob, Chartboost, iAd, Jumptap, Tapit, TapJoy and MDotM. If there’s a particular ad network or feature you would like to see added to Analytics next, email us at iwantthis@appannie.com and let us know.

So if you use any of those networks, hey it’s free. As is their basic tracking service, which might be all you need. As long, of course, you can live with the discrepancy problem noted above with appFigures:

Currency conversions. Apple’s “Financial Reports” use Apple’s own currency rates, whereas App Annie always uses today’s exchange rate.

Did we mention already that ‘Reconcile’, that there’s a killer feature we’ll happily pay for? Why yes, yes we think we did. And far as we know it’s only available in the new AppViz, and there aren’t any particular pain points we’ve noticed troubling us about sales tracking otherwise, so that pretty much narrows down our choice of service to no choice needed. With a mental note that if we ever get into the ad-pushing business on our own behalf, App Annie has a unique to our knowledge integrated offering there. But if any of you think I’m dismissing or have overlooked some important consideration in one’s sales tracking tools, be sure to let us know!

Continue Reading →
0

iOS Dev Tools List

Here’s a handy site to add to your feeds collection:

iOS Dev Tools

iOS Dev Tools is a list showcasing the greatest iOS development tools, including websites, desktop and mobile apps, and back-end services. I’ve tried to group the tools into logical categories and will mark any newly added tools as NEW.

Think most everything there of great interest we’ve bothered mentioning at some point over the years — with the notable exception of the ‘Networking and APIs’ section, have to check those out sometime —but it certainly is nice to have them all nicely curated in one place!

While we’re on the subject, here’s a recentish list along the same lines:

75 Essential Tools for iOS Developers

and here’s another:

My Ultimate Developer and Power Users Tool List for OS X (2013 Edition)

The only real comment we have here is, where the @)(#$&!! are the translation/localization helpers? Yes, we’re thinking in particular of that poor sad orphan which has been THE. MOST. AWESOME. EVAR. at making our multilingual duties much less effort and far more correct, but none at all? Really?

Any-ways, check those out in case there is something you missed.

And here’s a last one to throw in here, as hey managing a website is a fairly common aspect of iOS development too, right?

Inside BraveNewCode.com: Some Tools We Use

I was going through our own administration panel here at BraveNewCode today and thought it would be interesting to share our set-up with other people. Our WordPress website isn’t just a blog, it’s also a full-featured eCommerce store, support centre and product licensing/upgrade server. To turn a normal WordPress website into one that can handle all of that takes quite a few tweaks, external services, and WordPress plugins.

Here is a list of all the tools we use here at BraveNewCode.com – from hosting, to sales, to support…

By the way, in case you didn’t know, the best way to get your WordPress site mobile painlessly is BraveNewCode’s

Screen Shot 2013-11-17 at 9.01.05 PM.png

Buy and enjoy!

UPDATES:

The nice people at Binpress would like me to remind you all to check out their commercial open source offerings when you’re putting together your toolkit. And hey, if CocoaPods and CocoaControls don’t turn up anything absolutely perfect for your needs, that looks like the next possibly worthwhile stop, sure.

100 Great Resources For IOS Developers

Krzysztof Zabłocki’s iOS Developer Tools

13 Valuable Tools for iOS Development

Tools for Running an iOS Consulting Studio

Continue Reading →
0

Tutorial: MapKit Clustering

Now this is a tutorial you should bookmark for next time you need to display point info on a MapKit map:

How To Efficiently Display Large Amounts of Data on iOS Maps

This tutorial will demonstrate how to handle and display thousands of points of data on an iOS map in a way people understand and enjoy.

We are going to make an iOS app which ships with 87,000 hotels, each with a coordinate, a name and a phone number. This app will never ask the user to “redo search in area”; it will update the map as the user pans and zooms, allowing the user to freely explore the data.

This will require us to come up with an ultra quick data structure built for the task. We will need to build it in C for it to be performant. Once we have constructed our data structure we will come up with a clustering system, as to not overwhelm the user. Finally, we will give it the professional polish that is required for apps to compete in today’s market…

That is one seriously detailed tutorial. Check out the accompanying app at thoughtbot / TBAnnotationClustering!

h/t: iOS Dev Weekly!

UPDATES:

choefele / CCHMapClusterController implements this as a simply usable component.

Open Source iOS Library For Maps WIth Directions, Travel Estimates, Places Search And More

Continue Reading →
0

Monetization: Bitcoin

Now here’s a truly novel approach to monetizing your apps:

New Plugin Allows Developers to Turn iOS Devices Into Bitcoin Mining Bots

Unity plugin developer Icoplay has come up with a new way for developers to monetize free apps on the App Store while avoiding in-app purchases, through the use of bitcoin mining.

Because new bitcoins are generated via complex math problems, Bitcoin mining requires an incredible amount of processing power. Icoplay is aiming to use mining software hidden within apps and games to take advantage of the latent processing power of mobile devices, rewarding the developer with bit coin…

Mind you, the economics don’t seem to make any sense. Checking the latest stats,

Bitcoins Mined — 3,525 BTC

Electricity Consumption — 55,866.44 megawatt hours

we’re somewhere in the range of 16 megawatts per Bitcoin. Takes an awful lot of iPhone 5.5-odd watt-hour charges to add up to one of those. And somewhere in the region of $2300 of electricity. Which would only produce you a couple cents per user-year expected return, at best, and burning out a couple dozen Li-Ion batteries along the way. That would seem to put the usefulness of this somewhere between “laughably negligible” and “wasteful on a scale qualifying as downright evil”.

But hey, if you want to give it shot, check out their FAQ; maybe if you’re really super lucky, you’ll earn enough to buy a coffee in the trendy places around town here sprouting Bitcoin ATMs these days!

h/t: @justinlbaker!

Continue Reading →
0
Page 3 of 95 12345...»