ISO 8601 for dates and times

In a comment on my recent post about C and concatinating strings, there were some very cool suggestions about ways to handle creating a string full of comma separated values (like a .csv file to open in a spreadsheet).

The always helpful MiaM asked:

“Why slash for dates? ISO 8601 specifies the minus/dash sign :)”

-MiaM

In my posted example, there was a date/time at the start of each entry like this:

2024/10/18,12:30:06,100,0.00,0,0,0,902.0,902.0,928.0, . . .

I recall these log files certainly had date/time in them before I ever touched the code, though I do not recall what the format was back then. In the USA, the standard convention for a date is month/day/year using slashes, such as 10/21/2024.

When I started using the OS-9 operating system on my Radio Shack Color Computer, it would prompt for date/time on startup using a different format — yy/mm/dd:

OS-9 Level 1 on a 64K Radio Shack TRS-80 Color Computer (emulated).

And yes, that would have caused problems when Y2K came around, but by then we already had updated utilities that allowed four-digit years.

But listing year first seemed “weird and backwards” to me. Folks who started using PC-DOS on an IBM PC got used to it in a more “normal” way, it seems:

IBM PC DOS 1.00 | PCjs Machines

At some point, I got used to it, and learned a great reason to putting the year first: sorting! Over the past 28 years, I have taken hundreds of thousands of digital pictures. The default filename on my first camera was:

1031_001.JPG - taken October 31, image 001 of that day.

This was due to the 8 character filename limit that PCs had back then. If they had put the year in, like “103196”, there would only be room for a 2-digit number after it like “10319601”, “10319602”, “10319603”, etc. Considering the lack of memory on that early camera, that might have been fine for most folks. After UPGRADING the storage to 5MB, the camera could take 99 photos before you had to hook it up to a computer via an RS232 serial cable and download the images.

But I digress.

Once long filenames were a thing, I started naming photos with the full date. I could have used “MMDDYYYY_number.jpg” like this:

01011996_001.jpg - first photo taken on 1/1/1996
02011996_001.jpg - first photo taken on 2/1/1996
01011997_001.jpg - first photo taken on 1/1/1997
01011998_001.jpg - first photo taken on 1/1/1998

…but if you sorted those photos by filename, you would not get them in date order:

01011996_001.jpg - first photo taken on 1/1/1996
01011997_001.jpg - first photo taken on 1/1/1997
01011998_001.jpg - first photo taken on 1/1/1998
02011996_001.jpg - first photo taken on 2/1/1996

Above, you can see it shows me a photo from 1996, then 1997, then 1998, then 1996. Placing the year as the first number solves this, and allows files to be grouped by year, then month, then day. (I mean, I know we like “mm/dd/yyyy in the USA, but how often do we want to sort to find “all the files taken in January of any year” beyond looking for birthday or holiday photos, anyway?)

By doing year first, everything sorts as we expect:

19960101_001.jpg - first photo taken on 1/1/1996
19960201_001.jpg - first photo taken on 2/1/1996
19970101_001.jpg - first photo taken on 1/1/1997
19980101_001.jpg - first photo taken on 1/1/1998

Side Note: I gave up on image numbers waybackwhen, and use the format YYYMMDD_HHMMSS.jpg for my photos. See my theme park photos, and my Renaissance festival photos, for an example, though many of the earliest photos may still be in the old MMDD_XXX format. I highly recommend the Mac utility ExifRenamer for renaming photos to various formats.

Anyway . . . MiaM brought up ISO 8601:

ISO 8601 – Wikipedia

It specifies a universal standard for date/time values. This table was copied from the wikipedia page:

Date2024-10-21
Time in UTC11:24:56Z
T112456Z
Date and time in UTC2024-10-21T11:24:56Z
20241021T112456Z
Date and time with the offset2024-10-20T23:24:56−12:00 UTC−12:00 [refresh]
2024-10-21T11:24:56+00:00 UTC+00:00 [refresh]
2024-10-21T23:24:56+12:00 UTC+12:00 [refresh]
Week2024-W43
Week with weekday2024-W43‐1
Ordinal date2024‐295

The use of a dash in the year (2024-10-21) versus the slash like we tend to do in the USA would be a simple change. Yet, when I look at Excel, when you select the “short date” format, it defaults to “mm/dd/yyyy” (see image to the right).

I might expect slashes were used so the .csv file could import in to Excel, but Excel doesn’t seem to care. It figures it out. I also now wonder if using this format was intentional, and it may have originally been mm/dd/yyyy to match what Excel defaults to.

Speaking of defaults … in other parts of the world, the date/time format is different (such as dd/mm/year in Europe, which always message me up if the day is 12 or less since I cannot tell if 1/10/2024 is January 10th, or October 1st).

But now that I have been pointed to this standard, I think I am going to try to force myself to adopt the ISO 8601 standard when I start representing dates in software. No doubt, seeing the USA format in the Windows application I maintain may be odd to folks in other parts of the world. If I switch it to use the ISO 8601 standard, it might seem odd to some folks, but at least there is a reason that can be referenced.

The more you know.

C and concatenating strings…

Imagine running across a block of C code that is meant to create a comma separated list of items like this:

2024/10/18,12:30:06,100,0.00,0,0,0,902.0,902.0,928.0,31.75,0,0,100 ...
2024/10/18,12:30:07,100,0.00,0,0,0,902.0,902.0,928.0,31.75,0,0,100 ...
2024/10/18,12:30:08,100,0.00,0,0,0,902.0,902.0,928.0,31.75,0,0,100 ...
2024/10/18,12:30:09,100,0.00,0,0,0,902.0,902.0,928.0,31.75,0,0,100 ...

And the code that does it was modular, so new items could be inserted anywhere, easily. This is quite flexible:

snprintf (buffer, BUFFER_LENGTH, "%u", value1);
strcat (outputLineBuffer, buffer);
strcat (outputLineBuffer, ",");

snprintf (buffer, BUFFER_LENGTH, "%u", value2);
strcat (outputLineBuffer, buffer);
strcat (outputLineBuffer, ",");

snprintf (buffer, BUFFER_LENGTH, "%.1f", value3);
strcat (outputLineBuffer, buffer);
strcat (outputLineBuffer, ",");

snprintf (buffer, BUFFER_LENGTH, "%.1f", value4);
strcat (outputLineBuffer, buffer);
strcat (outputLineBuffer, ",");

snprintf is used to format the variable into a temporary buffer, then strcat is used to append that temporary buffer to the end of the line output buffer that will be written to the file. Then strcat is used again to append a comma… and so on.

Let’s ignore the use of the “unsafe” strcat which can trash past the end of a buffer is the NIL (“\0”) zero byte is not found. We’ll just say strncat exists for a reason and can prevent buffer overruns crashing a system.

Many C programmers never think about what goes on “behind the scenes” when a function is called. It just does what it does. Only if you are on a memory constrained system may you care about how large the code is, and only on a slow system may you care about how slow the code is. As an embedded C programmer, I care about both since my systems are often slow and memory constrained.

strcat does what?

The C string functions rely on finding a zero byte at the end of the string. strlen, for example, starts at the beginning of the string then counts until if finds a 0, and returns that as the size:

size_t stringLength = strlen (someString);

And strcat would do something similar, starting at the address of the string passed in, then moving forward until a zero is found, then copying the new string bytes there up until it finds a zero byte at the end of the string to be copied. (Or, in the case of strncat, it might stop before the zero if a max length is reached.)

I have previously written about these string functions, including showing implementations of “safe” functions that are missing from the standard C libraries. See my earlier article series about these C string functions. And this one.

But what does strcat look like? I had assumed it might be implemented like this:

char *myStrcat (char *dest, const char *src)
{
// Scan forward to find the 0 at the end of the dest string.
while (*dest != 0)
{
dest++;
}

// Copy src string to the end.
do
{
*dest = *src;

dest++;
src++;
} while (*src != 0);

return dest;
}

That is a very simple way to do it.

But why re-invent the wheel? I looked to see what GCC does, and their implementation of strcat makes use of strlen and strcpy:

/* Append SRC on the end of DEST.  */
char *
STRCAT (char *dest, const char *src)
{
strcpy (dest + strlen (dest), src);
return dest;
}

When you use strcat on GCC, it does the following:

  1. Call strlen() to count all the characters in the destination string up to the 0.
  2. Call strcpy() to copy the source string to the destination string address PLUS the length calculated in step 1.
  3. …and strcpy() is doing it’s own thing where it copies characters until it finds the 0 at the end of the source string.

Reusing code is efficient. If I were to write a strcat that worked like GCC, it would be different than my quick-and-dirty implementation above.

This is slow, isn’t it?

In the code I was looking at…

snprintf (buffer, BUFFER_LENGTH, "%u", value1);
strcat (outputLineBuffer, buffer);
strcat (outputLineBuffer, ",");

…there is alot going on. First snprint does alot of work to convert the variable in to string characters. Next, strcat is calling strlen on the outputLineBuffer, then calling strcpy. Finally, strcat calls strlen on the outputLineBuffer again, then calls strcpy to copy over the comma character.

That is alot of counting from the start of the destination string to the end, and each step along the way is more and more work since there are more characters to copy. Suppose you were going to write out ten five-digit numbers:

11111,22222,33333,44444,55555

The first number is quick because nothing is in the destinations string yet so strcat has nothing to count. “11111” is copied. Then, there is a scan of five characters to get to the end, then the comma is copied.

For the second number, strcat has to scan past SIX characters (“11111,”) and then the process continues.

The the third number has to scan past TWELVE (“11111,22222,” characters.

Each entry gets progressively slower and slower as the string gets longer and longer.

Can we make it faster?

If things were set in stone, you could do this all with one snprint like this:

snprintf ("%u,%u,%.1f,%.1f\n", value1, value2, value3, value4);

Since printf is being used to format all the values in to a buffer, then doing the whole string with one call to snprintf may be the smallest and fastest way to do this.

But if you are dealing with something with dozens of values, when you go in later to add one in the middle, there is great room for error if you get off by a comma or a variable in the parameter list somewhere.

I suspect this is why the code I am seeing was written the way it was. It makes adding something in the middle as easy as adding three new lines:

snprintf (buffer, BUFFER_LENGTH, "%u", newValue);
strcat (outputLineBuffer, buffer);
strcat (outputLineBuffer, ",");

Had fifty parameters been inside some long printf, there is a much greater chance of error when updating the code later to add new fields. The “Clean Code” philosophy says we spend more time maintaining and updating and fixing code than we do writing it, so writing it “simple and easy to understand” initially can be a huge time savings. (Spend a bit more time up front, save much time later.)

So since I want to leave it as-is, this is my suggestion which will cut the string copies in half: just put the comma in the printf:

snprintf (buffer, BUFFER_LENGTH, "%u,", value1);
strcat (outputLineBuffer, buffer);

snprintf (buffer, BUFFER_LENGTH, "%u,", value2);
strcat (outputLineBuffer, buffer);

snprintf (buffer, BUFFER_LENGTH, "%.1f,", value3);
strcat (outputLineBuffer, buffer);

snprintf (buffer, BUFFER_LENGTH, "%.1f,", value4);
strcat (outputLineBuffer, buffer);

And that is a very simple way to reduce the times the computer has to spend starting at the front of the string and counting every character forward until a 0 is found. For fifty parameters, instead of doing that scan 100 times, now we only do it 50.

And that is a nice savings of CPU time, and also saves some code space by eliminating all the extra calls to strcat.

You know better, don’t you?

But I bet some of you have an even better and/or simpler way to do this.

Comment away…

Selling five 6TB Western Digital Red Pro hard drives

Now that my Synology DS1522+ has had all its drives upgraded, I am selling the five 6TB drives I was using before. These drives were purchased during July-August 2022. I chose them because they offered a five year warranty, which means the drives still have warranty coverage in to 2027.

These drives went as low as $150 on Amazon (so, $750 of drives) and I will sell them for half that — $375 for all five. All have had a 2-pass “secure erase” done with no issues reported. Since they still have warranty in to 2027, if there was an issue, they should still be covered.

Let me know if you are interested. I am about to list them on eBay — I’ve always had success selling batches of drives there for beyond my minimum, but maybe someone here wants them first.

Data paranoia, Drobos and Synology NAS

I am in the slow process of upgrading five WD 6TB hard drives in my Synology DS1522+ NAS to Seagate 8TB drives. While folks I asked overwhelming say the larger drives (16TB, 20TB, etc.) “have not had any issues,” I am old school and do not want to make that large of a storage jump just yet. For those as data paranoid as I am, some tips:

  1. Do a low-level format (or “secure erase”) on each new drive first. This will write to every sector, and can catch issues. I have only caught one (or maybe two) drive with issues of the years, but the time spent is worth it to me. I’d rather catch a problem before I install and send them back for a replacement, rather than having an issue show up much later (possibly when the drive is out of warranty).
  2. Until someone can say that a “20TB” drive is as reliable as a smaller drive, upgrage to the next size up that gives you enough storage. The less dense the data, the safer it “should” be. Also, if a 6TB drive fails, the rebuild time to replace it will be significantly faster than replacing a 20TB drive. And, during the rebuilt time, your data is at risk. I run dual drive redundancy so during the 12 hours my NAS rebuilds, if I have a second drive fail, I am still okay… but if that happens I have no protection from a third failure. Doing 20 hours rebuilds creates a much larger window for data loss if something goes terribly wrong.
  3. And, of course, make sure anything important is on a backup drive (I use a standalone 10TB just to clone my most important “can’t live without” data), and have an offsite backup of that (I then have that entire drive backed up to a cloud backup service).

If my home burns down, I should at least be able to get back the 10TB of “can’t live without” data from my offsite backup.

Hardware Redundancy is Better

Sadly, Synology units are much more expensive than my Drobos were. My Drobo 5C was $300 retail. I had two that I paid maybe $250 each for. That let me have two 5-bay units for hardware redundancy. This means if a Drobo suddenly died, I still had a second unit with duplicate data (I would sync the two drives). Spending $500 for two 5-drive units was an easier investment than the $1400 it would take for me to buy two DS1522+.

Eventually I do plan to have a duplicate Synology unit. It doesn’t matter what features the device has if one morning it has died. I would have zero access to my data until the unit is replaced or repaired. Having backup hardware is what I prefer.

But I am data paranoid.

How about you? Are you unlucky, like I am, and have had drives “die suddenly” over the years? After that happens enough, the paranoia sets in. I can’t think of a time in the past decades where I didn’t have three backups of everything important ;-)

DJI RC-N3 remote won’t work with Otterbox Defender Case

Updates:

  • 2024-10-15 – Added link to replacement cable that will fit.

Finding accessories that do not work with a phone in a protective case is not new. Ever since I bought the first iPhone in 2007 I have encountered this issue. It seems accessory makers expect everyone to use their phones unprotected.

It gets worse when you want actual protection (not just a scratch guard case) and use something like a rugged Otterbox Defender case. Almost no accessories seem to work with it, though today’s Defender case is a bit better.

But not with the DJI RC-N3 remote controller.

The unit comes with a USB-C to USB-C cable preinstalled, but includes a USB-C to Lightning cable in the box. Unfortunately, they run the cable out of the side of the plug just a tiny bit too low for it to plug in to the Otterbox Defender opening.

As you will see in this photo, it “almost” works. Had the cable coming out of the side (going down in this photo) been a tiny bit closer to the right end (in this photo), it looks like it would work without issue.

In chatting with DJI Support, I learned that this cable connection is required (at least when pairing to a DJI Neo drone). I thought it might just be used for charging the phone while it is being used with the screen on.

“The Neo can be connected to the Fly APP wireless, but if you want to use the RC-N3 to control it, it’s necessary to connect it with a cable.”

They recommended me take the phone out of the case when using the drone./

“Actually, we suggest you remove the protective cover when connect RC-N3 with your phone.

Because the phone case may cause the disconnection or not recognized.”

Imagine if you had a fancy $1500 phone and needed to remove it from its protective case to use a $199 drone. This is not an optimal solution. And, not any type of solution for a Defender case, which requires disassembly. It would be fine for those rubber slip over covers, but those are more scratch protectors (though I expect they do help from minor dumps and drops).

They did suggest I could try a charging cable, and somewhere I should have the USB-C charging cable that came with my iPhone. I’ll give it a go and see if it works.

Until then, if you plan to use this remote with a phone in a Defender case, you may need to look for an alternative cable to hook it up with.

Good luck! Let me know in the comments if you run in to this problem, and what your solution is (if you have one).

Update

I found an $8 cable on Amazon that will fit in the Otterbox Defender case just fine:

https://www.amazon.com/dp/B09MB2YW88

It has the cable moved out. This is all DJI needs to do.

However, this cable will not “store” inside the remote. The USB-C end is also taller, and the phone holder part that slides out will not slide fully back when this cable is plugged in.

I will keep looking and see if I can find a “more better” cable that will fit the Otterbox Defender and also fit inside the remote when stored.

To be continue…

What are the odds?

Back in the early 1980s, a friend of mine had TRS-80 Model III in their house. His mother was a writer, and had gotten it to use for writing books.

I believe it was this TRS-80 where I saw a version of Monopoly that taught me a strategy I had never learned as a kid:

The computer bought EVERYTHING it landed on, even if it had to mortgage properties to do so.

This simple strategy was a gamble, since you could end up with too many mortgaged properties and no source of income from rent. But. by doing this, the computer would end up owning so many random pieces it made it difficult to own a monopoly yourself.

And since then, that is how I played Monopoly. When it worked, it created some awfully long games (if no one had a monopoly to quickly drive other players bankrupt when they landed on their hotels).

In more modern times, I have watched YouTube videos concerning Monopoly strategies. They will break down the statistical odds of landing on any particular piece of property. For example, you know a pair of dice can produce values from 2 to 12. If truly random, the odds of getting a “1 and 1” should be the same as getting a “3 and 5.” Rather than focus on dice rolls, the strategies take into consideration things that alter locations: Go To Jail, Advance to Go, Take a Ride on Reading, etc.

These cards existing means there are more chances for a player to end up on Go, Reading Railroad, Jail, etc. This means the property squares after those spots have more chances of being landed on.

Board with board games. Move along…

But I digress… As Internet Rabbit Holes do, this led me to watch other videos about statistics in things like card games. In a randomly shuffled deck, there should be as much chance for the first card to be Ace of Spaces as there is for it to be Three of Clubs. It is random, after all.

For that first card drawn, that is a 1 out of 52 chance to be any card in the deck. (52 cards in the deck.)

But as a game plays on, there are fewer cards, so the odds of getting any of the remaining cards increases. For the second card drawn, you now know there is a 0% chance of getting whatever the first card is, and a 1 in 51 chance of getting any of the rest.

And so it continues…

For games like Blackjack or 21, you do not really care if it is a Ten of Diamonds or a King of Hearts or a Queen of Clubs or a Jack of Spades. They all have the value of 10 in the game. Thus, the likelihood of drawing a ten card is much higher than any other card in the deck.

You have four suits (clubs, spades, hearts, diamonds) so there are four of each card – Aces, Two through Ten, Jacks, Queens, and Kings. This means there are 16 cards in the deck that could be a value of 10 in the game. When you draw the first card, you should have a 16 in 52 chance of it being a ten card. That is about a 33% chance!

If you pay attention to what cards have been seen (either by you having it, or seeing it face up with another player), you can eliminate those cards from the possibilities — changing the odds of what you will get.

This is basically what I understand card counting to be. If you play a game, and you know you’ve seen three Kings so far (either in your hand, or played by others), you now know instead of four chances to draw a King, you only have one.

Math is hard. Make the computer do it.

I know this has been done before, and quite possible even on a Radio Shack Color Computer, but I thought it might be fun to create a program that displays the percentage likelihood of drawing a particular card from a deck. I suppose it could have the Blackjack/21 rule, where it treads 10, Jack, Queen and King the same, versus a “whole deck” rule where each card is unique (where you really need an 8 of Clubs to complete some run in poker or whatever game that does that; I barely know blackjack, and have never played poker).

I plan to play with this when I get time, but I decided to post this now in case others might want to work on it as well.

I envision a program that displays all the cards on the screen with a percentage below it. As cards are randomly drawn, that card’s percentage goes to 0% and all the others are adjusted.

It might be fun to visualize.

More to come, when time allows…

M1PQ

Grade school (and junior high, and high school, and college) would have been easier if I could remember all the “facts” I read in text books, or that my teachers told me. But, most of them left my mind moments after they entered. Yet, somehow I can remember…

POKE 113,0:EXEC 40999

I also remember things like:

POKE 65495,0

And even…

FOR A=0 TO 255:POKE 140,0:EXEC 43345:NEXT

Those Radio Shack Color Computer BASIC commands seem to be forever stored in my long term memory. Even some 6809 assembly remained after decades of non-use:

START LDX #1024
LOOP INC ,X+
CMPX #1535
BNE LOOP
BRA START

Why do I still remember this!?

Another thing that is etched in to my memory is M1PQ.

In my junior high school English class (around 1981-1982) I met a boy named Jimmy. Jimmy was my gateway in to home computers, Hitchhiker’s Guide to the Galaxy, phone phreaking and much more. I believe he also introduced me to bulletin board systems.

Neither of us had a home computer (as we called them back then) yet, but we’d visit the local Radio Shack (so long ago, it not only existed, but has a space in the name separating the words). Using a TRS-80 Model III and their 300 baud modem, we’d dial in to local Houston, Texas BBSes. Radio Shack is also where I learned to program BASIC. I recall using a book Jimmy had, and writing programs out on paper, then going in on Saturday to type them in and see if they worked. (Back then, Radio Shacks and most everything else was closed on Sunday in Texas due to “Blue Laws,” whatever they were.)

Apple NET-WORKS

At the time, few “home computers” existed. The IBM-PC, if it existed at all, would have been brand new and not generally known by non-business customers. If a school had a “computer room” it would have been most likely populated with Apple 2 machines or TRS-80s. (Though one of my schools had some Commodore PETs.)

Most of the bulletin board systems I dialed in to ran on Apple 2s using software called NET-WORKS. Here is the Wikipedia entry:

https://en.wikipedia.org/wiki/Net-Works_II

The BBS Documentary website has a disk image of it:

http://software.bbsdocumentary.com/APPLE/II/NETWORKS/

And as I wrote up this article, I even found a website about this BBS, including some documentation!

https://www.callapple.org/documentation/networksii-bbs/

In those early days, many BBSes did not have the concept of “username” and “password.” Some just used a password! I guess we were more honest back then, since if you registered and tried a password someone else already had, the BBS would just say “that password is already taken.” Security? What’s that?

Some systems used a username and password, similar to today, but you didn’t even get to choose your password. They used a user number encoded in to a randomly generated password. Apple 2 Net-Works (and, I believe, BBS Express for the Atari 8-bits) did that. For example, if you were user 42, your randomly assigned password might be “A42BC”. I have never seen the source, but it appeared to just chose three random letters and stuck the user number after the first letter. I recall my BBS Express password was a similar format, but “A42BCD” with an extra character.

But Apple Net-Works had a flaw. When you first ran the software to configure it, it would assign a password for the SysOp (system operator) who would be in control of the BBS. It would generate the password M1PQ. SysOps who did not realize this would be using a password that hackers would most certainly try as their first guess.

I don’t know where I learned about this, but probably on some hacker or phreaker BBS … which was probably running the Net-Works software ;-)

At the time, I thought this was some kind of secret backdoor built in to the software, but today I expect it may have been caused by the non randomness of random.

See also: my article on the RND command in Color BASIC.

If you powered up an Apple 2 fresh, and printed ten random numbers between 1-100, I expect you’d get the same series of numbers each time you powered up and did that. (Any Apple 2 users here who can confirm?)

You get these same random numbers every time you power up the CoCo.

If Apple BASIC worked like that, then perhaps it was just code not taking any steps to seed the random number generator so each time it ran from a fresh power up, it would generate the same sequences of “random” numbers.

Either way, M1PQ was a well-known SysOp password for the NET-WORKS BBS software.

You can see I have even referenced it here on this site:

The 1983 Radio Shack Color Computer BBS package is back… This time on Arduino!

The reason I mention this is convoluted. Yesterday I received a letter from Change Healthcare, which I had never heard of. It was informing me of a data breach that happened this past February 2024. I was affected, and could sign up for free credit monitoring.

I had never heard of this company, and suspected this to be a scam. What a clever way to get folks to give out their personal information — “hey, sign up to free credit monitoring. Just give us your social security number, date of birth, and account numbers to monitor.” Yeah, right.

But some searching led to many news articles about the data breach, including one on my insurance provider’s website. Apparently they used Change Healthcare and thus, this alert was legit.

I decided to sign up for the credit monitoring. During that process, I saw that the site had some tools you could use. One was a password verifier. I typed in “monkey123” (a famous password of modern times) and it said it was medium strength. Well, that password verifier sucks, I thought. But then I noticed it explained this password was in leaks and should not be used.

Interesting. Instead of just telling you the quality of your password, it could tell you if that particular password has been found in a data breach.

So naturally, I had to type in M1PQ:

M1PQ – The Apple Net-Works BBS default password.

Somewhere, out there, someone actually used M1PQ – the most infamous default password from the early 1980s BBS scene – on the internet, somewhere, and it got leaked.

So, kids, don’t use M1PQ. It wasn’t a good password in 1984, and it is not a good password in 2024.

Yet, it’s one password I have never forgotten.

DJI Neo drone app bugs and problems

Last Updated: 10/1/2024

NOTE: This article may be edited as new problems are found.

I just received my DJI Neo drone. This page will try to document various problems I have had with the DJI Fly iPhone app.

  • iOS App Version: 1.14.2 (on an iPhone 15 Pro)
  • Neo Firmware Version: 01.00.0300

Problems

Repeated Firmware Updates – So far, my DJI Neo has wanted to download a firmware update three times (maybe four). Each time, it completes, and tells me to restart the Neo. After that, the firmware remains 01.00.0300. Perhaps it is updating something else and this is a poorly worded message.

Connection Issues – Multiple attempts are needed almost every time I have tried to connect the phone to the Neo. I get the “Join network” iOS message, tap “Join”, and then it says it is unable to connect. When I check the WiFi settings of the phone, it shows it is connected to the DJI Neo’s WiFi hotspot.

Unable to Download Photos/Videos – There are two bugs here. One is that it just won’t download, and the workaround is shutting of cellular. That seems to help “most” of the time. The second issue is when you select photos/videos, but the “download” icon remains greyed out. Even killing the app and re-running it does not always make this work. Trail and error eventually makes it work for me.

Chinese (?) Pop-Up Message – I have no idea what this means, but I have seen it multiple times when “FlySafe requires update.” (And how often should this be updated? I’ve seen this message several times and I have only played with the drone yesterday and today, so far.)

    Various Lockups on Gallery Screen – Multiple times, I have seen the gallery screen become unresponsive. I cannot tap on anything. This usually happens when it is trying to download, and changes.

    Comments?

    If you have encountered any of these bugs, or different ones, please leave a comment with details. Thanks!

    More to be added…

    DJI Neo error downloading videos to phone

    And how to download them, in the first place…

    If you have a DJI Neo selfie drone, and you find yourself unable to download videos to your phone (in my case, an iPhone), try turning off Cellular Data. Once I did that, mine worked as expected.

    This is my first experience with a DJI product. I was surprised that the app was a bit clunky. I had difficulty trying to figure out how to batch download photos and videos. In case anyone else runs in to this, here are the steps:

    1. Connect the DJI Neo connected to the DJI Fly app. (Does yours work? Mine takes multiple attempts, even with the current latest firmware.)
    2. Select “Album” from the bottom left of the control screen. (Or, if you worry about accidentally flying the drone, you can exit out of the control screen and back to the connection screen and select it from there.)
    3. Select the Checkmark box near the top right. That will enable checkboxes on each thumbnail. You can tap just the ones you want, or…
    4. You may have to swipe down on the thumbnails to find it, but you can tap on the text “Batch Select“. That will check all the files.
    5. The bottom right will be a “download” icon. Tap that and your videos/photos will be downloaded in to your Photos app. (Does yours work? Mine has, once, but most of the time that icon remains greyed out.)
    6. To get out of this mode (so you can exit back to the control screen), you have to tape the checkbox at the top right again to turn off the image selection. It seems awkward that the “exit” goes away when you are in select mode.

    This app is clearly not ready for prime time, but the drone itself seems very neat. Actually, what it can do at this size and price point borders on “magic” in my eyes.

    More to come…