Attendance2 new CSV import and backup features

This post discusses new features in version 7.0 of my iOS/iPadOS Attendance2 app released August 18, 2020.

These new features for my iOS/iPadOS Attendance2 app work on iOS 13 and higher. The old import and Dropbox backup features continue to work on earlier iOS versions and the old import/backup options can still be used on iOS 13 and higher. Importing your roster is probably the most difficult thing to do since there are so many different ways a file with the roster might be formatted. I’ve added a new option for importing comma-separated-value (CSV) files (for iOS 13 and higher) that hopefully is easier to use and also less likely to crash on files with bad data. Details on how it works are below. If you want to continue using the old import options, they are still there. I’ve also added the option to automatically backup a course to iCloud Drive instead of Dropbox. I, like some of you I’ve heard from, have become frustrated with some of Dropbox’s changes the last year or two and would prefer to use iCloud Drive instead.

Specifying iCloud Drive folder for photo import and auto-backup

Since this feature is used both for importing CSV files that contain paths to photo files, I’ll cover it first. Use the iOS Files app to make a folder in your iCloud Drive folder; if you want to make a subfolder in it for Photos, do that. Launch Attendance2, scroll down and select Pick iCloud folder for Photos/Backups and select the folder you made in the Files app and choose the Done option. If you want Attendance2 to backup course files you modify, turn tap the option that says iCloud Auto backup is off. Tapping this option toggles between off and on. Next time you open a course and modify the data for that course and close the course file (either by opening a different course, or going all the way back to the main menu with the list of courses), and then go back to the home screen or the display sleeps, Attendance2 will backup the course file to that folder as a file with a .adz file extension. To restore from this .adz file (either on a different device using the same iCloud account or the same device if you’ve deleted the file), use the Files app. In the Files app, tap and hold the .adz file, choose the Share option, and then choose Copy to Attendance2. This will import the course into Attendance2. If the course already exists, the existing course will have a -backup suffix and the data restored from the .adz file will be restored.

New CSV import option

On iOS 13 and higher, after opening a course, there is a New CSV Import/Update option. To use it, select that option. If you have copied the contents of a CSV file, you can press the Paste option, but more likely you will want to use the Select File option. From here you can select a comma-separated-value (CSV) file with either a .csv or .txt extension. If you have an Excel .xls or .xlsx file, use Excel’s option to export it as a CSV file. This file may have a header line (or multiple extra lines before the student data) or the first line may contain student data.

After selecting the file, the interface will show you the data for the first line and the number of lines in the file. You may use the + and - buttons to switch between different lines to see each line of the file. The contents of a line is shown as list. Each row in the list corresponds to a column of the CSV file and which field that column will import into. To change which field that item will import into, select a row and tap the field you want it to import into. If the file contains one mo more header lines, tap the + button in the top section to indicate the number of header lines and these lines will not be imported.

If your first line headers match the names of the fields in Attendance2, you may choose the option to Auto Match Columns By Header or if you’ve previously imported a file with the same columns into this course, you may choose the option to Auto Match Columns By Previous Import.

Once you have the columns matched up, you can press the Import button at the top right to import the data from the file. A dialog will show you how many new names were inserted, how many updated with new data, and how many were ignored. You are given the chose to Save or Cancel (such as if you accidentally imported the header line or realize you made another mistake). If you have a unique identifier value for each student/person, you may re-import the same file or updated file (with updated information such as a phone number or email address you didn’t have initially) and it will use the identifier field to match the data from the file to an existing student/person and update them with the new data from the file rather than inserting a duplicate person. I use this feature as I collect cell phone numbers and some other information such as their major and advisor the first day using a web form that creates a CSV file and update my data with that information.

If you have photo files (.jpg, .tiff, or .png) of the students, you may import them along with the CSV file. Put the photo files in the iCloud Drive directory you chose for Photos/Backup as described in the previous section. One of your CSV columns must contain the name of the photo for that student. If the files are in that folder, just specify the name of the photo file. If you made a Pictures subfolder in that folder, the CSV column for the photo should be Pictures/photo-name.jpg where photo-name.jpg is the photo file for that person. Match that column with the import photo path choice when picking the field for that column. The photos will be imported along with the other data from the CSV file as long as the folder containing the photos is the one you picked for the Photos/Backup option.

I think this version has a nicer interface and is less likely to crash due to missing columns in a file or a bad file format and allows you to put the files in iCloud Drive. But if you prefer the old version to import a CSV file from Dropbox, you may continue to use it.

Updating roster from existing course

I often have the same student for multiple classes over multiple semester. To copy their photo and the other demographic data I collected the first time I had them as a student, I added a new option Import from existing course option. Choose that option, then select a previous course that contained some of the students. Next, select Update Enrolled People and tap the Copy option at the top right. This will find any people in the old course with the same identifier value and copy the data for that person from the old course to new course. It will not add any new names to the course so it doesn’t matter if the old course contained people who are not in this course. You can repeat this process for multiple old courses.


Here’s a video showing how to use the new CSV import option and restore a backed-up course file from iCloud.

Thanks to @danielpunkass for the quick fix to MarsEdit. As always, he provided polite and responsive support.

Obligatory #InternationalDogDay post.

#WWDC19 had some interesting announcements. Glad to see full speech dictation added to macOS since Dragon Dictate for Mac discontinued by Nuance. Suspect Apple bought the Mac version of Dictate from Nuance and did an acquihire of the team but I have no inside information.

Congrats to @Omni on the release of OmniFocus 3 for Mac. I’ve been using the iOS version since its release in May and the Mac beta for a few weeks. Tags and the new perspective options are fantastic.

I’m more interested in a Series 4 Watch than an iPhone XS but we’ll see if I order either one on Friday. My Series 2 watch didn’t seem to auto start an outdoor walk after updating to GM, but my iPhone 7 ran well before and runs well with iOS 12.

A minor update to my iOS Attendance2 app is available now. It mostly updates the code to work with future iOS versions but also fixes a few minor bugs.

Made a few videos with detailed instructions for creating and importing your roster as a CSV file into my iOS Attendance2 App Store link app. Videos on Attendance2 website for the app.

Remembering Wyndy

Wyndy, we miss you so much right now. You came into our lives at a time when we needed you and you needed us. We lost one of our two boxers to lymphoma in December 2008 and a month later our other boxer was moping around and we thought she missed her constant companion for seven years so Sherri started looking for a new dog. She found you on Craig’s List and we set a time to meet you. The story we were told was they were your second home (probably third since you were born) as the first people had kept you outside. Apparently their neighbors complained about you barking so they got rid of you. Your second home had three other larger dogs and they decided they couldn’t afford to keep all four. The papers they had for you said you had just turned one year old a few weeks earlier. I believe the registration papers they had said your full name was Shawnee Wind, but they said they called you Wyndy so we stuck with that. When you first met us, you weren’t certain about us but you hopped up in the car and went home with us. Your previous owners had smoked so you got two baths that night to try to get the smell off you.

We tried to send you out to go to the bathroom that first night but you wouldn’t go out. After recalling that you had to sleep outside at your first home, I got a leash and led you outside until you went and then immediately brought you back inside. We repeated this process one or two more nights and then you became confident you would be let back in and went out with our other boxer. Unfortunately our other boxer wasn’t moping because she had lost her friend. The tumors on her spine that were treated with radiation four years earlier had come back so her time with us ended only a few weeks after we got you.

You comforted us from the loss of our other two boxers and were about as perfect a dog as one could imagine. You followed us from room to room and rested at our feet. We put large pillows for you in the bedroom office and family room where we spent most of our time. If one of us wanted a nap, as soon as a part of our body touched the bed, you hopped up and were ready to curl up next to us. At night you slept between us with your head resting on one of our legs.

You quickly decided this was your perfect home. If anyone you didn’t know came to our house, you sat on either Sherri’s or my foot stating we were your humans and nobody was going to take you from our house. Once you realized they were just visiting and not a threat, you would give them this strange friendly bark/growl mix while you did the boxer kidney bean dance and waited for them to pet you. Strangely, overnight guests often had this strange bark/growl ritual repeated the next morning as if they were first arriving.

When I would get up early to go to work, you would immediately move and lie down with your head on my pillow next to Sherri and go back to sleep with her for another hour. Sherri would feed you and walk you except on those very coldest of winter days. You loved your walks. When it looked like you were half asleep, if the “w” word was mentioned as part of a conversation, you hopped up and looked at us to say “let’s go.” Wanting your walk was about the only thing you demanded. You would sit by the door looking up at us as if to say, “please let’s go on a walk.” Even in cold weather you wanted your walks. We got you a coat to keep you warm and eventually got some boots for your feet so packed snow didn’t get stuck in your paws and rock salt didn’t irritate them. You looked at us like we were crazy for putting the boots on you and that you were embarrassed to wear them but once you figured out you could walk normally with them, you waited patiently while we put them on so your feet would stay comfortable.

I would get the joy of arriving home first and seeing your pure excitement that one of us had returned. We would go out and play with your squeaky felt-covered mini-football that you loved to chase. Our neighbor with a huge yard graciously allowed us to use his back yard so I could throw it 30-40 yards and you could chase it at full-speed and often catch it on the first bounce. You enjoyed when our niece would come over and play ball with you in the back yard. You loved playing with those footballs and would keep squeezing it while it squeaked repeatedly. You would wear out the squeaker in a couple months so we had a constant supply of new ones on hand. My parents would send you one for Christmas every year after watching you play with it when they visited.

When Sherri arrived home you were always excited to see her. The alarm system sends a notification to my phone whenever the garage door goes up so anytime an alert came through on my phone you would look at me and wonder if Sherri was home. You learned the phrase “false alarm” which told you that you could go back to sleep for a bit and wait. But when I told you Sherri was home, you would run down the stairs sliding and turning on the hardwood at the bottom of the stairs so you could be at the door to the garage ready to do your kidney bean dance when Sherri walked inside the house.

We walked most evenings with my uncle and his boxer. When we went out to dinner or were gone for a few hours on the weekends you would often go to my uncle’s house and play with his boxer. You stayed with them a few times since you didn’t like to travel. You had one other boxer in the neighborhood who you liked to play with and we would often seen him on his walk. That boxer’s family had raised generations of boxers and you even stayed with them a few times when we were out of town for family weddings and baptisms. They spoiled you as much as we did. Other than those two special friends, you tolerated other dogs as long as they didn’t bark at you, but I think you liked your human friends better. We took you to a dog park a few times but instead of playing with the other dogs you just walked next to us to make certain you didn’t lose sight of where we were.

We wished you had liked to travel with us as our other boxers did, but you hated going in the car. You panted the entire trip. We tried taking you to the beach with us twice. After the second time we decided that even though you enjoyed being with us there, the car trip made you too anxious that it wasn’t worth it. I suspect you were worried you were being taken to yet another new home. That meant about the only time you went in the car was to the vet for annual checkups which didn’t help your anxiety of riding in the car. The vet couldn’t even get you to walk in the back room to be weighed unless I went with you. Fortunately, Sherri’s cousin was your first vet and he had us go with you to the scale and to the room where they took blood samples. And when he retired, the staff let the new vet know we always had to do that. As long as one of us went with you, you would go willingly.

You loved your permanent home and enriched our lives. Last summer you had your first bout of pancreatitis. You stopped eating so the vet took some blood samples and found the level in your blood that indicated pancreatitis was about four times higher than it should be. We started mixing your food with a new lower fat food and that helped get it back down to about twice what it should be. That level didn’t seem to bother you as you went back to being your normal playful self. At 9.5 years old you still acted like we did when we first got you although for shorter periods of time before you were ready to rest. In November you stopped eating again and had to go to the bathroom much more frequently. We took you to the vet again and the pancreas levels were about six times what they should be and your kidneys were working overtime to pull out too much water. The vet gave you IV fluids but the stress of being at the vet for the day was hard on you. The vet showed us how to give you fluids subcutaneously so we could do it at home. My uncle came over during the day while we were at work to let you out and see if you would eat something Sherri had made for you as eating is crucial to getting over pancreatitis. We started giving you fluids at home three times a week splitting a liter bag across those three times and within a few weeks you were your usual self again. We had the levels checked again in January and your kidneys were back to normal and the pancreas level was back down to about twice what it should be. The vet said to be on the safe side, it would be a good idea to continue giving you fluids since you were doing so well on them. You didn’t like me sticking you with the needle but once it was there, you were content to lie down with Sherri while the fluids were administered.

You didn’t like your new low fat food so Sherri tried numerous things to get you to eat. Flounder and salmon were favorites for a while. You liked egg whites so those were mixed in with your food so you would eat it. Sherri started making french toast with egg whites for you every morning and you would your dog food mixed with a piece of bread cooked with egg white to make eating more appealing.

We were thankful for every day that you continued to be your usual happy self. Around the 4th of July, you didn’t want to eat and your kidneys were working overtime again. The next week the vet confirmed the pancreas level was now 10 times what it should be and your kidney levels were also elevated. She suggested we give you fluids every day to see if it would help so we did and gave you pain pills the vet prescribed. Even with the pain pills, we could tell you were still in pain from the pancreatitis. But you were still happy to see us and followed us from room to room. We knew you weren’t sleeping well as at times you would shake from the pain. You sniffed your food and tried to eat but the vet said nothing tasted good to you with those levels. We occasionally had some luck with different food items, but you weren’t eating enough.

By the end of the week it was clear you weren’t feeling good even though you tried not to let us know. I know you wouldn’t have been upset with us if we had continued to give you fluids to see if you could recover again, but at 10.5 years old and with the pain caused by these extreme pancreatitis levels, we knew we couldn’t continue to put you through that. Thursday night had been rough for you and we made the difficult decision to bring you in Saturday if you didn’t feel better by then. Friday evening you acted like you felt a little better. You saw my uncle and the neighbors who had helped us take care of you at times. But overnight you were shaking from the pain again. We gave you fluids Saturday morning to make you more comfortable and you ate a few of your favorite treats but we knew it was time to make your final trip to the vet.

We know our pain of missing you will subside and will be replaced by the fond memories of all the joy we brought to each other’s lives, but right now I don’t know how we will ever get to that point. I keep looking down expecting me to see you follow me up the stairs or waiting at the door to the garage to greet me when I come home. The house is so quiet without your paws tap dancing on the tile and wood floors. For the first time in 17.5 years, there is no dog in our house. I’m certain some day another dog will bless our lives but the intense bond you had with Sherri and me will make it difficult for any other dog to have the special place in our hearts that you will always have.

Favorite WWDC announcements: * Shortcuts app * Do Not Disturb updates * Watch workout detection * Xcode improvements * looking forward to seeing iOS on Mac next year

Congrats to @Omni on their release of OmniFocus 3 for iOS. I spent the morning cleaning out my OmniFocus database, adding tags, and setting up new perspectives (these features allowed me to get rid of fake due dates).…

As someone who recently tried to set some limitations on an iOS device used by a 12 year old, I’d love to see Apple include many of these features.

Great discussion about screen addiction, especially with kids, by Georgia Dow and Rene Ritchie on Vector podcast (episode 075).

Overcast link

Tech Addiction

EdSurge article

“Supercomputers play chess against your mind to extract the attention out of you. The stock price has to keep going up, so they point it at your kid and start extracting the attention out of them. You don’t want an extraction-based economy powered by AI, playing chess against people’s minds. We cannot win in that world.”

iOS Economy

The iOS Economy, Updated (via @gruber Daring Fireball)

I’d love to know where the money is going. I suspect the largest single category is the various video services (Netflix, HBO, Showtime, etc.). I worry the second largest category (based on seeing television ads for the games) is for “virtual coins” so you can be successful in freemium games.

My experience as a (hobbyist) developer writing productivity apps (for a niche market) and seeing various apps that aren’t sustainable Transmit for iOS is that most productivity/utility apps don’t generate much income. I averaged less than $10 a day in total sales from a couple iOS apps and one Mac app in 2017. I suspect with some marketing, switching to a freemium model so you could try the apps before purchasing them, and more effort in improving those apps (localization, etc.), I could increase that to $50 to a day, but I doubt I could make enough to quit my day job.

There are, of course, exceptions as I assume OmniGroup must make a reasonable amount of money from their iOS apps and a few indie developers make a reasonable living from the App Store (although @manton and @danielpunkass and others supplement it with podcast advertising and other sources of income).

I worry that a large portion of the $100 million a day being spent in the App Store is on consumable virtual coins and that doesn’t seem healthy to me.

How does the weather channel app use background activity when I have it turned off for the app in iOS settings? Need to look for a new weather app I like. Dark Sky is great for near term forecast but not for longer term forecast.

Amazon AppleTV app released according to release notes for their Amazon Prime Video iOS app. I can’t find it in AppleTV App Store yet but I suspect it will be there later today.

Used Apple Pay Cash today. Loaded $10 in it to try it (loads immediately). I had purchased some items for a friend so he paid me via Apple Pay Cash and I set up a transfer to my bank account (that takes 1-3 business days). Seems like a nice system.

Congrats to Daniel Jalkut of @redsweater on the release of MarsEdit 4.…

Released version 6.1 of Attendance2 today with a few new features I’ve been working on for a while.

My math colleague @JonStadlerMath had the perfect Halloween costume.

Saw this Advice for early-career developers

Overall seems like pretty good advice. My favorite quote: “Being willing to read is a superpower in our industry. It really is.”

Starting to cross-post my posts to Twitter. Will still reply on Twitter but will initiate new posts from

Technology is amazing but can also be debilitating. I wish I could convince my students to ignore their cell phones when studying and working on assignments. NYT article

There’s lots of software I have purchased because I would occasionally find them useful, but not enough to pay a subscription for. I think the reason subscription prices are higher than previous upgrade prices for same app is they realize they’re going to lose a lot of customers.