Technology
-
Google’s Bard and ChatGPT Write a Blog Post
I asked Google's Bard and OpenAI's ChatGPT to both write a blog post. Here's what I found.
-
Speech to Text Accuracy
I wanted to test the relative accuracy of various speech to text engines. I tested Line 1, Amazon, Deepgram and Google. All vastly exceeded my expectations. Here is my original text. I tried doing a normal speaking voice. I left myself a voicemail and used the resulting recording as the basis for the other tests, so all tests were from the same file: "The quick brown fox jumps over the lazy dog. Fourscore and seven years ago our fathers brought forth, on this continent, a new nation, conceived in liberty, and dedicated to the proposition that all men are created equal. His palms are sweaty, knees weak, arms are heavy…
-
Electric Car Comparison
I watched this interesting YouTube video where they drove various electric cars to exhaustion and compared their real-world ranges vs. their stated ranges. They mentioned a lot of data, but never gave a summary. I decided the world needed a summary. Here it is: https://docs.google.com/spreadsheets/d/1RAgzfUFiGO1j3UQZCXljc5kC00Qsg1lKhlTIi6oyByU/edit#gid=0
-
What is WebRTC
At a high level, WebRTC is a way for browsers to have access to video, speakers and microphone directly without an intermediary like Java or Flash. It’s most common use to-date has been for voice and video calling. WebRTC does NOT have a built-in protocol for call setup. You can use an existing call setup protocol like SIP or make your own. OnSIP has open-sourced sip.js (https://sipjs.com/) as an OpenSource javascript library to add the SIP protocol to WebRTC. When using SIP as the call setup protocol for WebRTC, WebRTC is simply the conduit to the camera, speakers and microphone. SIP does all the heavy lifting of notifying each end…
-
Do Not Play the Paperclip Game
I saw The Link at exactly 10:11pm last night. I noted the time because the article I saw it in said that the game would occupy at least the next couple hours. “No way,” I foolishly thought, but I noted the time anyway. A couple thousand clicks and optimizations later I look up and it’s 12:33am. I swore I had only been a few minutes. An hour tops. Nope, 2 hours 22 minutes. I played until 1:11am and went to bed with the screen running. I awoke to a couple trillion dollars invested and the planet slowly running out of resources left to turn into paperclips. Never fear, once you consume…
-
MD5 Authentication – Working Example
Ok – here is MD5 authentication: The PhD Course: SIP REGISTER is authenticated via MD5 authentication. Everything you need to know is sent in the ‘Authorization’ line except the SIP Method which is at the top of the packet and in this case REGISTER – it could also be INVITE for example – and the user’s password. That’s the key – that password. Here’s a sample REGISTER Authorization string: Authorization: Digest username="agrabah_aladdin", realm="jnctn.net", nonce="5d02c49e00007aeb4d90b8fe974cf38a6d6a5b7515c24c19", uri="sip:agrabah.onsip.com", algorithm=MD5, qop=auth, cnonce="59f4a2601ec0874", nc=00000001, response="bb9ee2c392839058a01abcfa8192db47" You create an A1 string for the user. This string remains the same for the lifetime of the user’s password. For this example we will assume Aladdin’s password is…
-
Easily Create and Edit your Gmail Signature
Gmail allows you to have an HTML markup e-mail signature. That means you can get pretty fancy with how you sign your e-mails. The only problem is that the area where you edit that signature does not have HTML edit tools and you can’t cut/paste HTML directly into that box. You CAN, however, cut/paste from a Web page into the e-mail signature box and all of your HTML markup (tables, bold, links, etc) all come through. After a little work, here’s what worked for me to create/edit my own e-mail signature for Gmail. Take the code below and cut/paste into your favorite text editor. I recommend TextWrangler. Edit the information…
-
Verizon Caught Blocking VoIP Traffic
I was just on a phone call with a new customer who is setting up multiple retail locations. The reason for the call was their backup network wasn’t working. Whenever they tested the Verizon 4G LTE Wireless connected to Cradlepoint modem backup network, the phones would not be able to make or receive phone calls. Their IT staff was on the line and they were running Wireshark and grabbed a PCAP that seems to show that OnSIP at 199.7.175.101 was responding to their request with a “500 Server Error”. The actual text was: SIP/2.0 500 Server Internal Error Warning: 399 sipalg “Internal Error” Call-ID: b876f6fb4aad25a55546217e07dd4f82 CSeq: 47 REGISTER From:…
-
Remove Bitnami Logo in Amazon Lightsail
Amazon Lightsail is their new low-volume Web hosting environment. One of the options for Lightsail is to launch with WordPress. This site is on Lightsail with WordPress in an Linux environment. When you first launch a WWW Site, you get a “Bitnami” logo on the bottom right corner of every page. This is convenient at first to allow you as the site administrator to log in to your new WWW site to make posts like this. However, once you get the swing of things, that logo is a blight on your otherwise lovely WWW Site. Luckily, it’s very easy to remove the logo. Log into AWS and into the Lightsail…
-
Amazon Lambda – E-mail via SNS the URL of an S3 file when created
I threw together the following Lambda function to send an e-mail via SNS (Amazon’s Simple Notification Service) whenever a file is created in S3 (Amazon’s Simple Storage Service.) Yes, it’s barely commented and overly loggy, but you get the idea: 'use strict'; console.log('Loading function'); const aws = require('aws-sdk'); const s3 = new aws.S3({ apiVersion: '2006-03-01' }); exports.handler = (event, context, callback) => { //console.log('Received event:', JSON.stringify(event, null, 2)); // Get the object from the event and show its content type const bucket = event.Records[0].s3.bucket.name; const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); const params = { Bucket: bucket, Key: key, }; s3.getObject(params, (err, data) => { if (err) { console.log(err); const…