By Robert Ellison. Updated on Thursday, November 12, 2015.
I've wanted to play with Twilio's voice and SMS service for a while and finally got the chance at an all night hackathon.
Twilio is almost perfect. Very easy to use, well documented and generous with a self service free trial. They give you enough rope to fully build out a client before you need to think about paying them.
I gave up on AT&T's platform after navigating a bazillion forms before discovering they wanted $99 before I could even get a taste.
The one hitch with Twilio is that the voice transcription they offer is appalling. Just absolute gibberish. Unless it's just my accent, or the hackathon whisky. Seems to be a common complaint though and so to take my IVR app further I'd need to bolt in another solution. A pity given how much Twilio gets right.
(Published to the Fediverse as:
Twenty-Four Hours with Twilio #code#ivr#twilio Using Twilio's SMS API in a hackathon - I got a full phone version of our product working in 24 hours.)
Here’s how to share a picture to Facebook, Twitter and so forth from MonoDroid:
A fun mix of Java and C#. The directory got me to start with so check to see if the ExternalCacheDir is available and if not fall back to the internal CacheDir. Frustratingly Facebook doesn’t pick up on the text associated with an image regardless of the intent ExtraWhatever specified.
By Robert Ellison. Updated on Sunday, September 5, 2021.
I’ve just released a WebCam app for Android. It’s based on WebCamSaver but allows you to control the webcam – you tap the edges of the screen to pan, pinch to zoom in and out. A fun little time waster.
This is the first app I’ve released using Xamarin’s MonoDroid framework. This integrates nicely into Visual Studio and allows you to program an Android app in C#. This is fantastic for productivity and code reuse and I enjoyed the process a lot more than previous work I’ve done in Java / Eclipse. The main drawback is that the framework adds around 5MB (significant for mobile) and the documentation isn’t always the best, especially when you search for something and find out you’ve been dumped into iOS reference material. Digging around the sample code and cross-referencing the official Android documentation helps a lot. I’m going to take a stab at something a little more ambitious next…
(Published to the Fediverse as:
Not a Private Key #code#monodroid Check that you have the right password when jarsigner says Key Associated with alias not a private key.)
By Robert Ellison. Updated on Friday, September 13, 2019.
Here’s a quick code snippet that configures SmtpClient to send email using Gmail’s SMTP server:
This can be frustratingly difficult to get right so I’ll run through each setting quickly.
DeliveryMethod: Set to SmtpDeliveryMethod.Network, the alternatives are copying the email to a directory for pickup by a different application. We want to connect directly to Gmail.
UseDefaultCredentials: False, as we’ll be providing our own credentials later. Setting properties in the right order is apparently important for SmtpClient, although the Microsoft documentation doesn’t mention this. Make sure you set UseDefaultCredentials to false before setting the Credentials property.
EnableSsl: True. SSL or TLS is required.
Host: smtp.gmail.com for this example. Note that this server restricts you to sending 2,000 emails per day. There is a less restrictive option for G Suite customers (smtp-relay.gmail.com) and a more restrictive server that can only send messages to Gmail or G Suite addresses (aspmx.l.google.com).
Port: Google says to use 465 for SSL and 587 for TLS. I’ve found that 587 with EnableSSL set to true works fine.
Credentials: Your Gmail address and password in a NetworkCredential. If your account has 2 step (multi factor) authentication then this won’t work. You can generate an app password easily and use this instead of your regular password. It’s also possible to use OAuth.
In the comments below Shika Helmy suggests also setting the Timeout property to 20000.
You can now use smtp.Send() to send the email.
Because it’s likely to be your personal account and there is a 2,000 message cap on sending I’d only recommend using this for small scale projects. You don’t want to get your Gmail account blocked. For higher volume I’d look at using SendGrid or similar.
One last note - while I’ve used SmtpClient for all sorts of trivial email needs over the years the latest Microsoft documentation marks it obsolete and warns:
(Published to the Fediverse as:
Sending email via GMail in C#/.NET using SmtpClient #code#smtp#email#google How to use the C# SmtpClient to send an email through the Gmail SMTP server (updated for two factor authentication).)
By Robert Ellison. Updated on Thursday, November 12, 2015.
I've developed a bunch of stupid, niche and vaguely promising apps on top of the Twitter API. During that time I've slogged through various painful and rapid shifts like changing IDs, authentication schemes and diktats handed down on which parts of the ecosystem Twitter would like to control. I've had to roll my own OAuth and even re-word a blog post to Twitter Support's satisfaction to get a blocked application unblocked again. It's been a pretty frustrating experience but worth rolling with the punches until the past week.
Twitter suspended Cleat, a tool for posting from the command line. So I emailed to ask why, too much effort for them to explain the rationale at the time they're putting the suspension in place I guess. I got an auto-response asking for information they must have already had and I replied to this. A few days later I still hadn't heard back so I emailed again and the ticket had been automatically closed.
So far just the standard fuck-off-and-die support that you'd expect from a growing company that no longer wants to talk to it's users. But the auto-reply directed me to https://support.twitter.com/forms/ to file a new ticket. None of the options there relate to developers or a suspended application. I tried filing a ticket under 'deactivated account' which seemed the closest.
That form has a hard-coded 'With love,' valediction. Whoever thought that was cute should go through the process of trying to get help a few times.
This attempt auto-responded to say that my account was not suspended, and would I like to fuck-off-and-die or got back to the forms center?
So I tried another form that actually seemed to submit but haven't heard anything back.
I'd be happy to update my software if I know which vague shifting facet of the Twitter terms of use I'd fallen foul of. Or at least I would have been. I'm just so sick of it that I've pulled Cleat and I'm done with any more personal projects that use the Twitter API.
(Published to the Fediverse as:
Twitter's API has got too painful for me #code#twitter#cleat#commandline#api Twitter's opaque API policies have led to me no longer developing on the platform.)
Catfood PdfScan 1.40 is a small bug fix release. PdfScan converts documents to PDFs with the help of a flatbed or automatic document feeder (ADF) scanner.
Today I upgraded this blog to the latest and greatest version of BlogEngine.NET. Not entirely smooth sailing, so here are my notes for others (and the next time I have to do it):
The IsCommentsEnabled property BlogEngine.Core.Post has changed to HasCommentsEnabled. Not sure why this was worth changing but easy enough to fix.
BlogSettings.Instance.StorageLocation doesn't exist any more. After some digging it turns out that you need to use Blog.CurrentInstance.StorageLocation instead.
WidgetBase and WidgetEditBase in a couple of custom widgets complained that the type or namespace could not be found. This is fixed by adding a using statement for App_Code.Controls.
Updated 2012-03-11:
Getting the blog running locally was as usual only half the hassle. The next step is deploying to my hosting provider, Server Intellect. Things always start going wrong at this point. Luckily Server Intellect has some really great support staff and they respond quickly even on a Saturday night.
The first problem is that my backups were broken. Backups always succeed, restores always fail. After restoring my App_Data folder the last month of posts were missing. After digging for a bit it turned out that recent files were invisible over FTP but present in the control panel for the domain. My server had been migrated and some sort of permissions issue had broken access to new files. Not specifically a BlogEngine.net issue, but took a while to figure out and then for Server Intellect to fix.
Once the files were all there I uploaded and the blog itself was working fine, but the admin pages were screwy. It turns out that my server doesn't have ASP.NET MVC 3 installed. Server Intellect offered to migrate the server, but instead I copied System.Web.Mvc.dll to the Bin folder after finding a post on MVC 3 deployment from Scott Hanselman. I also needed to add a MIME type for .cshtml (text/html). With this in place the fancy new admin pages are up and running.
Updated again, 2012-03-11:
Another namespace issue, ExtensionSettings in an extension doesn't resolve any more. Need to add a using statement for BlogEngine.Core.Web.Extensions. There are also some changes required to make an extension support multiple blogs.
I've just released a small update to my C# Shapefile library on Codeplex. Catfood.Shapefile 1.50 fixes a couple of bugs related to metadata and adds the ability to access metadata records directly via IDataRecord.