(quick & dirty blog post. I intend to start blogging about my adventures with K8S, will probably find another platform, but this is a way to get things out there.)
I'm still on iOS 10.3.3. The main reason is that I still have nearly a dozen old film development recipies in the Dev Chart app. They stopped updating the version I was using ages ago, the
new version costs $10 and probably wouldn't import my old notes.
Now, the "easy" part is that I have a backup of my iPhone saved from last year. This is good because (a) a more updated backup is taking 4 hours, and (b) using employer email requires that further backup be encrypted.
Still, in my iPhone backup directory there are only four unencrypted files, as noted in
The iPhone Wiki entry about them. That entry,
plus this Quora answer, contain 90% of the detail I needed. But I'll write the rest out anyway.
The application on the phone is called "Dev Chart", and the app info says it's
(c) Digitaltruth Photo Ltd, Code and Design by Martin Man. However, not much* matches that in the Info.plist:
plutil -p Info.plist | less
But searching the Manifest.plist (plutil -p Manifest.plist | less) I found the next set of clues:
"com.martinman.mdc" => {
"CFBundleVersion" => "1.5"
"ContainerContentClass" => "Data/Application"
"CFBundleIdentifier" => "com.martinman.mdc"
"Path" =>
"/var/containers/Bundle/Application/80A0931C-0D67-427C-BE75-0EBBDE38FB0F/MassiveDevChart.app"
}
So now I know that the iPhone internal app name is "com.martinman.mdc" and thanks to the Quora entry quoted above, I can search the Manifest database for it. Oddly, I could not read the database file in-place, but I could after I copied it to /tmp. Maybe as its original location was a NFS mount.
cp Manifest.db /tmp
sqlite3 /tmp/Manifest.db
sqlite> .tables
Files Properties
sqlite> .schema Files
CREATE TABLE Files (fileID TEXT PRIMARY KEY, domain TEXT, relativePath TEXT, flags INTEGER, file BLOB);
CREATE INDEX FilesDomainIdx ON Files(domain);
CREATE INDEX FilesRelativePathIdx ON Files(relativePath);
CREATE INDEX FilesFlagsIdx ON Files(flags);
sqlite> .mode csv
sqlite> .output /tmp/Manifest.csv
sqlite> select * from Files;
sqlite> .exit
Right, now I have a CSV file with fields: filename-in-backup, domain, path-on-iPhone, flags, file-blob. Filter and search that for my application of interest:
awk -F, '/com.martinman.mdc/{print $1", "$2", "$3}' /tmp/Manifest.csv
604f8275b55c3c5ca703597e19ddb232acabe010, AppDomain-com.martinman.mdc, Documents/MyData.sqlite
and *HURRAH* I have something that looks like it might contain the data I'm looking for! Sure enough, after a bit more investigation of that file I can dump the contents in a reasonably readable format. Here's the raw data and my effort at a translation to what you see in the app. I'm off to upgrade my phone from iOS 10 to iOS 12!
sqlite3 -line 60/604f8275b55c3c5ca703597e19ddb232acabe010 'select * from ZDEVCHARTENTRY;' | head -35
Z_PK = 2
Z_ENT = 2
Z_OPT = 26
ZHYPOCLEARTIME = 0
ZSORTORDER = 0
ZFILMTYPE = 1
ZDEVELOPMENTTIMEB = 0
ZPHOTOFLOTIME = 30
ZINVERSIONSREPEAT = 60
ZFIXINGTIMEB = 180
ZORIGINALDEVELOPMENTTIMEB = 0
ZSTOPBATHTIME = 60
ZDEVELOPMENTTIMEA = 1272
ZORIGINALDEVELOPMENTTIMEA = 1272
ZCOMPENSATED = 0
ZRINSINGTIME = 420
ZFIXINGTIMEA = 180
ZINVERSIONSNEXT = 5
ZINVERSIONSINITIAL = 60
ZLATITUDE =
ZLONGITUDE =
ZORIGINALDEVELOPMENTTEMPERATURE = 20.0
ZDEVELOPMENTTEMPERATURE = 20.0
ZDEVELOPERVOLUME = 520.0
ZSTOPDATE =
ZSTARTDATE =
ZDEVELOPERDILUTION = 1+7
ZDEVELOPMENTNOTES = Agitation notes
ZFAVORITENAME = Rollei Retro 400S in Rollei RHS High Speed
ZDEVELOPMENTNOTESLONG = shake for 1m then 4 inversions every min
ZDEVELOPERNAME = Rollei RHS High Speed
ZFILMNAME = Rollei Retro 400S
ZFILMISO = 3200
ZNOTES =
...and my notes on what those fields mean:
ZSORTORDER = 1 [order in the list]
ZFAVORITENAME = Rollei Retro 400S in Rodinal
Film Type (Film Name, ISO, Size)
ZFILMNAME = Rollei Retro 400S
ZFILMISO = 1600
ZFILMTYPE = 1 (0 = 35mm, 1 = 120)
Developer (Name, Dilution)
ZDEVELOPERNAME = Rodinal
ZDEVELOPERDILUTION = 1+75
70:31 + 70:31 min at 18C (Temperature, Development Time A, Development Time B,
Temp/Time conversion [*on*|off])
ZDEVELOPMENTTEMPERATURE = 18.0
ZDEVELOPMENTTIMEA = 4231
ZDEVELOPMENTTIMEB = 4231
ZCOMPENSATED = 1 [temp/time conversion is on]
ZORIGINALDEVELOPMENTTEMPERATURE = 20.0
ZORIGINALDEVELOPMENTTIMEA = 3599
ZORIGINALDEVELOPMENTTIMEB = 3599
ZDEVELOPERVOLUME = 760.0
(The desired volume, calculated to be 10ml developer + 750ml water)
Stop Bath, Fixing (Step Bath, Fixing A, Fixing B)
ZSTOPBATHTIME = 60
ZFIXINGTIMEA = 180
ZFIXINGTIMEB = 180
Hypo Clear, Rinsing... (Hypo Clear (time), Rising (time), Photo Flo (time))
ZHYPOCLEARTIME = 0
ZRINSINGTIME = 600
ZPHOTOFLOTIME = 30
Agitation Scheme (Initially (time), Afterwards (time), Repeat Every (time))
ZINVERSIONSINITIAL = 30
ZINVERSIONSNEXT = 10
ZINVERSIONSREPEAT = 3540
Notes
ZDEVELOPMENTNOTES = 10 agitation @ start & 60m
ZDEVELOPMENTNOTESLONG =
Misc
ZNOTES =
ZLATITUDE =
ZLONGITUDE =
ZSTOPDATE =
ZSTARTDATE =
Z_PK = 4
Z_ENT = 2
Z_OPT = 51
* ok yes I only copped to Martin Man's name after the fact
PS: I haven't done film development since 2010, but I have a
Lab-Box coming via Kickstarter in the next few months, so I'll probably do some next year. Here's a dump from a quick search for apps that aren't $10 - in case I don't get that dedicated.
https://itunes.apple.com/us/app/develop/id568421864?mt=8https://darkroom-solutions.com/app_ios