Build: 2024-04-07-583

Release Notes:

  • Sunday, April 7, 2024:
    • Fixed/updated Azure Function that manages SQL exception table.
      • Switched to isolated worker model.
      • Added deletes for bootstrap and signalR not found.
    • Updated nuget packages to latest.
  • Monday, March 11, 2024:
    • No site crashes since the March 1 update.
    • The intermittent 503 locks when in .net 8 appear solved!
  • Friday, March 1, 2024:
    • Added options.EnableRetryOnFailure() in several places where it was missing.
    • This may affect the intermittent 503 locks when in .net 8.
    • Updated nuget packages, mainly entity framework core.
  • Saturday, January 20, 2024:
    • Looking into the intermittent 503 locks when in .net 8.
    • Executed a completely clean build and deploy, with website wiped of files previous to deploy.
  • Sunday, January 14, 2024:
    • Added [HttpPost] to DeleteRecipeLine().
      • Some oddball crawler blasted the site with GETs, and it surfaced this missed attribute.
      • Thank you to whoever or whatever you are using servers in California and Germany.
      • I still wasn't compromised.
    • SetRecipeJsVars() made private.
  • Friday, January 12, 2024:
    • Application returned to .net 8.
    • Fixed wrong amount update in foods browser, UpdateNutritionLabel().
      • This has been there for years!
      • Only caused display dissonance when a default serving amount was not one, e.g., "2 oz".
    • Removed ChangeMeasureRetainWeight() from FoodItem model.
      • It was only called once.
      • Replaced with two lines of code.
  • Thursday, December 14, 2023:
    • Fixed a diary issue related to user login and timeouts.
    • Application reverted to .net 7
      • With .net 8, the application hangs after ~96 hours, no exceptions, no logs, no stdout.
      • Verified with several restarts.
      • Unsure whether it is the hosting environment or .net 8 itself.
      • Deferred until I have some time to solve.
  • Tuesday, October 31, 2023:
    • Added logging to track memory cache use.
    • Verified cache use and memory stability (no leaks).
    • Sliding expiration in minutes split to user vs anonymous, stored in HealthyEatingDomain.Constants.
      • User session objects sliding expiration increased to 60 minutes.
      • Anonymous session objects sliding expiration reduced to 15 minutes.
  • Sunday, October 29, 2023:
    • Added a ClearPreviousCachedLoginEntries() to Login, Logout and session expiry in SessionAuthController abstract base class.
      • This cleans up application cache entries associated with a logged in user.
      • It occurred to me that we would (and did) have memory leaks associated with session and identity expirations.
      • We must always remember that session timeout and identity timeout are independent, even if set to the same value.
      • This is also called to clean up expired user sessions via SessionAuthController, see the next comments.
    • Added a cache entry on login to save sessionId against userId (as key) in application cache.
      • This has a 30 minute sliding expiration, after which the key returns a null value.
      • This also has a PostEvictionCallback to clear expired cached values associated with this user.
        • The PostEvictionCallback executes ClearPreviousCachedLoginEntries().
      • This entry is queried by SessionAuthController abstract base class in every controller constructor.
      • Remember, PostEvictionCallback is NOT called on the sliding expiration, but on the eviction.
      • Eviction occurs on the next action on the cache, resulting in the callback and cleanup.
      • This works, as the callback occurs before the return to the cache action call.
  • Thursday, October 26, 2023:
    • Updated nuget packages, mainly entity framework and identity.
    • Updated bootstrap, signalr, jquery and jquery-validate to latest versions (libman.json).
  • Tuesday, October 24, 2023:
    • Removed all code and references to Branded Food Products Database (BFPD, from USDA).
    • Added "::MainFoods" override to label entry filter, to allow back fills from the main foods database.
  • Saturday, October 14, 2023:
    • Adjudicate.cshtml was missing script tag for kendoGrid.min.js. Oops.
  • Tuesday, October 10, 2023:
    • Fixed recipe analyzer where changes from secondary input are not recognized.
  • Wednesday, October 4, 2023:
    • Updated favicon and manifest files for such.
  • Sunday, October 1, 2023:
    • Fixed issue with guest labeling on progress screens.
    • Fixed background launch task for diary model and progress model on login.
    • Updated numerous nuget packages, mainly entity framework and support packages.
  • Friday, September 29, 2023:
    • Fixed thrown exception when entree input line ends in a number.
    • Updated maintenance SQL stored procedures to better screen logged elmah exceptions.
  • Monday, August 7, 2023:
    • Increased to 225ms the delay in the dispose function in deleteAllBootstrapToolTips().
    • Added option EnableRetryOnFailure() to AddDbContext in Program.cs.
    • Fixed food diary exception when "item" view is mistakenly propagated on an item delete.
  • Monday, July 31, 2023:
    • Fixed error in ReportSeriesUpdateAsync().
  • Tuesday, July 25, 2023:
    • Fixed deleteAllBootstrapToolTips() to hide and wait for completion prior to delete.
  • Sunday, July 23, 2023:
    • Tech Debt (.NET 7, C# 11.0):
      • Cleared unnecessary async/await.
      • Minimal new() declarations.
      • Changed regex to use regular expression source generators via [GeneratedRegex] attribute.
      • Changed string functions to use Span<> where applicable.
      • Changed string functions to use Concat with spans where applicable.
  • Wednesday, July 19, 2023:
    • Fixed account settings weight options.
    • Fixed account settings nutrition label options.
    • Optimized account settings.
    • Optimized the flow through of account setting changes.
    • Optimized and cleaned up the login async initializers.
  • Monday, July 17, 2023:
    • Updated nuget packages (Entity Framework, etc.)
    • Tweaks to tooltips.
    • Fixed userPrefs null exception issue in admin functions.
  • Sunday, July 9, 2023:
    • Updated nuget packages.
    • Fixed minor labeling problem in food diary DailySummaryString() with edit to GetNutritionByMasterLabelString().
    • Added semaphore to UpdateSeriesForDay() to gate database update.
    • Re-factored Admin, Diary, Foods, Progress Reports, Labels, and Recipe Analyzer controllers:
      • Replaced Session Set/Get (serializers) with direct use of ApplicationCache.
      • Added semaphores to code that needed to be gated.
    • Replaced Session Set/Get (serializers) with direct use of ApplicationCache in all other cases.
    • Cleaned up and simplified SessionAuthController abstract class.
    • Cleaned up and updated Logout(OnPost) to correctly delete login dependent cache entries.
    • Cleaned up and re-factored LoginHealthyInitializer() to reflect cache re-factoring.
  • Wednesday, June 28, 2023:
    • Updated Bootstrap to 5.3.0.
    • Re-factored html in Food Diary, with flex in mind. It was a Frankenstein mess implemented over 10+ years.
    • Re-factored food diary UI for useability, appearance and speed.
    • Object semaphoreSlimDiary now instantiates specific to user.
    • Moved DiaryModel to the main cache for speed, with sliding expiration.
  • Saturday, June 24, 2023:
    • Fixed Food Diary issues involving multiple simultaneous posts:
      • Added await HttpContext.Session.CommitAsync() to _semaphoreSlimDiary protected code locks.
      • Refactored constructor and index of DiaryController.
      • Re-added OnPostInitializeModel() to all posts.
    • Fixed issue with client DateTime and iso time string.
  • Saturday, June 17, 2023:
    • Fixed UpdateEditFoodAmount():
      • Added ParseFirstLeadingNumber() to get first leading number and pending operation.
      • Properly replace leading number string with underlying float value as necessary.
  • Friday, June 16, 2023:
    • Fixed display issues with food diary nutrition labels. Buildstrings() was required prior to label serialization.
    • Added !string.IsNullOrEmpty(TodayDiaryItems[ItemIndex].Entity.AmountString) in UpdateEditFoodAmount() to fix null exception.
  • Monday, June 5, 2023:
    • Fixed slight round off errors when adding or editing food diary entries.
    • General code cleanup and commenting.
  • Thursday, June 1, 2023:
    • Continued refactoring and documenting NutritionLabel:
      • Removed redundant LOADRECIPE type.
      • Fixed NutritionLabel adder LOADRECIPE executions.
      • Renamed properties to reflect current, rather than historical, origins/use.
      • Renamed nutrition label types to better represent use.
      • Eliminated CompositeLabel boolean. It was unnecessary.
      • Removed dead code in NutritionLabel adder after CompositeLabel elimination.
  • Monday, May 29, 2023:
    • Updated node and lint.
    • Cleaned up typescript files with lint.
    • Rebuilt diary nutrition labels in the database to correct for yesterday's fixes.
  • Sunday, May 28, 2023:
    • Fixed Twilio/SendGrid account settings. Email was out. Sorry about that.
    • Removed LabelNutritionUnits, as it was extraneous.
    • Debugged using MasterNutritionUnits directly.
    • Fixed a lingering issue rendering nutrition strings to the displayed nutrition label.
    • Fixed nutrition label adder to preserve display order of nutrition units.
  • Saturday, May 27, 2023:
    • Removed the deprecated nutrition label version.
    • Removed options allowing display of the deprecated nutrition label version.
  • Thursday, May 25, 2023:
    • Cleaned up Measure() code.
    • Updated nuget packages.
    • Updated libman libraries.
  • Wednesday, May 3, 2023:
    • Shortened portion descriptions with trailing parentheses when they are applied to labels.
    • Screened pluralization of portions for end words like raw, frozen, etc.
    • Added a pluralization function with simple lookup, and pluralization rules when lookup fails.
  • Tuesday, May 2, 2023:
    • Fixed HumanReadableAmountStr() to retain/return float amount un-rounded to the readable string amount.
    • Fixed BuildStrings() to adjust for un-rounded floats from HumanReadableAmountStr().
    • Fixed DiaryController constructor to initialize _diaryModel, which is needed by post(s).
  • Monday, May 1, 2023:
    • Updated UpdateSeriesForDay() to retrieve ("Calories").CalculatedForPortion rather than ("Calories").BasisWeight.
    • Updated nuget packages.
  • Friday, March 8, 2023:
    • Fixed issues around asynchronous/out-of-order calls to DiaryItemInsert, DiaryItemSave, ItemEditAmountChanged, and DiaryItemDelete in the Food Diary.
    • Fixed the lack of EntreesRestoreNextPrev() in the re-factored code from last week.
    • Fixed issues around login/logout and diary model initialization.
    • Updated TypeScript to ES2021. Don't know why I haven't done this sooner.
  • Friday, March 3, 2023:
    • Added inputmode="numeric" where appropriate to use numeric keyboard on mobile devices.
  • Monday, February 27, 2023:
    • Fixed FoodDiaryModel.GetNutritionLabel() when just a single diary entry.
    • Cleaned up diary daily summary.
    • Fixed concurrency issues when Diary amount changes.
      • If insert new item or save item are pressed after the amount edit, multiple concurrent posts occur.
      • These are onchange for the amount field, and the insert or save for the button.
      • Amount is now posted with the insert/save and updated if necessary.
      • A semaphore slim is used to allow each call to complete synchronously.
  • Saturday, February 25, 2023:
    • Fixed save edit after other item click exception in diary.
    • Added a GetDiaryModel to diary "inProcess" loops to ensure that a changed amount is caught.
    • Corrected a typo in the diary food input partial view.
  • Friday, February 24, 2023:
    • Cleaned up Diary controller.
      • Moved entries cache generation in model to constructor.
      • Entries cache retains cache entries on date changes and when data user id doesn't change.
      • Cleaned up the timeout logic.
      • Verified single model creation as needed, no multiple calls.
      • Cleaned up and sped up diary initialization.
      • This speeds up diary overall.
    • Fixed single quotes in toISOStringWithTimezone() javascript.
    • Updated various libraries.
  • Thursday, February 5, 2023:
    • Eliminated the use of moment.js. It is no longer required.
    • Upgraded TypeScript to ES2017.
    • Upgraded to .NET 7.0.
    • Removed unused code/arguments in diary.ts.
    • Updated nuget packages, including Entity Framework, Serilog, various build and code analysis libraries, etc.
    • Replaced checkboxes with javascript Font Awesome control in order that Mac Safari displays them correctly.
    • Checked diary local time for zero, re-adjust as necessary.
    • This was actually a fairly large set of updates.
  • Thursday, November 3, 2022:
    • Updated nuget libraries, mainly entity framework.
    • Read the release notes from Monday. Scared myself.
  • Wednesday, November 2, 2022:
    • Fixed issues around changing diary views with an edit open.
  • Tuesday, November 1, 2022:
    • Fixed return from entrée edit bug I introduced yesterday.
    • Fixed the non-persistence of text lock in entrée edit. This has eluded me for years!
  • Monday, October 31, 2022:
    • BOO!
    • Fixed nutrition label update for current DiaryItem on SaveEntree().
    • Fixed entrée tooltip to reflect description lock.
    • Fixed entrée tooltip to update after an edit.
    • Fixed recipe tooltip to reflect description lock.
    • Updated FoodDiaryModel.GetNutritionLabel() to use persisted nutrition labels.
  • Sunday, October 30, 2022:
    • Fixed administration recipe label regeneration to output correct entrée labels.
    • Fixed SaveEntree() to update its persisted NutritionLabel.
    • Fixed SaveEntree() to update corresponding DiaryItem.
    • Fixed bug in EntreeFoodsPortionsUpdateAsync() to correctly update portions and ingredients.
    • Fixed NutritionLabel update in EntreeMasterSaveFromParsedRecipe().
    • Fixed EntreeUpdateFromParsedRecipe() to persist NutritionLabel.
  • Friday, October 28, 2022:
    • Fixed insert entrée error introduced by refactor.
  • Thursday, October 27, 2022:
    • Fixed ParseLineToMeasure() to correctly output human readable amount strings on edge cases.
    • Fixed GetNutritionByMasterLabelString() to return proper display string.
    • Fixed up entrée amount strings where they were not in kitchen readable form.
  • Saturday, October 22, 2022:
    • Added [JsonIgnore] to NutritionLabel.LabelUnits, as they are display only.
  • Friday, October 21, 2022:
    • Corrected rebuild of entrée and diary buffered nutrition labels.
    • Ensured proper nutrition label typing in food diary model.
    • Removed useless nutrition label calls in food diary model.
    • Removed unused column in entrée ingredients table.
    • Corrected the nutrition label string builders to properly handle entrées and diary entry types.
  • Thursday, October 20, 2022:
    • Fixed entrée nutrition label errors introduced by re-factor.
    • Sped up processing of entrées when adding as a diary entry.
    • Sped up processing of entrées when loading in general.
    • Fixed edit amount as one error introduced by re-factor.
  • Monday, October 17, 2022:
    • Fixed recents select bug. Javascript property needed rename.
  • Sunday, October 16, 2022:
    • Fixed entrée save when deprecated, where deprecated was not properly cleared.
    • Fixed master entrée select list to exclude deleted/deprecated entrées.
  • Saturday, October 15, 2022:
    • Complete re-factor of Food Diary model. Vast speed improvements!
    • Fixed entrée add bug introduced on October 10. Mea culpa.
  • Monday, October 10, 2022:
    • Added multi-day loading/caching of food diary entries for performance increases when browsing diary history.
    • Added additional use of saved serialized nutrition labels, increasing food diary performance.
    • Updated nuget packages and various libraries.
  • Friday, September 2, 2022:
    • Massive speed-ups (again) to the food diary by greatly reducing redundant sql server queries.
  • Saturday, August 27, 2022:
    • Fixed the sample progress message on the progress page, as it did not disappear on login.
  • Thursday, August 18, 2022:
    • Added crossorigin="anonymous" to javascript requests as needed.
    • Corrected some references to signalr.js causing unnecessary javascript errors in the debug environment.
    • Added try/catch to commom.js/action.action(execScript) to ignore selected and spurious 3rd party errors.
    • Added sodium to progress reports series table in the database.
  • Friday, August 5, 2022:
    • Fixed and greatly sped up food diary initialization and sundry routines.
      • Mostly, this involved greatly reducing reads to the SQL database.
  • Thursday, August 4, 2022:
    • Fixed and greatly sped up login process:
      • The asynchronous food diary initialization was being called twice. Fixed.
      • Maximized asynchronous food diary initialization.
    • Updated nuget packages.
  • Wednesday, August 3, 2022:
    • Added tooltip to food diary entrée/recipe field when in edit mode.
    • Defaulted food diary entrée amount/measure to most recent entry when adding a new entrée entry.
  • Monday, June 6, 2022:
    • Food diary move up/down bug on new entries fixed.
  • Thursday, June 2, 2022:
    • Added the ability to scan (with text scan) nutrition labels with your phone, or pad, or initialize via a paste.
  • Friday, May 27, 2022:
    • Fixed diary error when a label portion is changed in an update.
  • Wednesday, May 25, 2022:
    • Fixed wait spinner to be centered on VISIBLE screen.
    • Added the desired Unit at all levels, to facilitate international unit changes to grams.
    • Added fixup maintenance for labels and recipes, tu update/convert nutrient units.
    • Nutrition units now convert iu <==> mcg, mg as needed.
  • Saturday, May 14, 2022:
    • Renamed [FoodDiary].[DiaryItems].[Alias] to [FoodDiary].[DiaryItems].[RecentsGroup].
    • Fixed food diary save RecentsGroup omission.
    • Added rename function for user entered labels.
  • Wednesday, May 11, 2022:
    • Meal name property 'Hidden' is now implemented.
    • If all meals hidden, a generic 'Add to Diary' is used.
    • Legacy meal assignments are preserved (as much as possible) when hidden is enabled later.
    • Updated nuget packages, mainly entity framework.
    • Updated bootbox to 5.5.3 (with added fix for bootstrap 5), moment to 2.29.3, and signalr to 6.0.5.
  • Saturday, May 7, 2022:
    • Updated nuget packages.
    • Meal Names may now be customized on a per user basis.
    • Meal name 'Hidden' property stored, but not yet implemented.
  • Thursday, April 28, 2022:
    • Added UserId and Hidden to Meal definitions.
    • Refactored to get Meal definitions by UserId, allowing for individual customization.
    • Refactored to use MealOrder in diary entries, rather than MealId.
    • Added Elmah to admin dropdown.
  • Monday, April 18, 2022:
    • Fixed issues in account options razor pages resulting from session expiration.
  • Saturday, April 16, 2022:
    • Fixed masking of deprecated entrées in diary recent list.
    • Regenerate diary model on label or recipe delete.
  • Wednesday, April 13, 2022:
    • Re-ordered maintenance dropdown.
    • Cleaned up imminent shutdown message.
  • Wednesday, April 6, 2022:
    • Fixed entrée issue involving past versions with changed portions.
  • Monday, April 4, 2022:
    • Added signalR and bootstrap not found clears to elmah admin.
  • Sunday, April 3, 2022:
    • Converted diary recipe/entrée tooltips to Telerik, for better behaviour on touch screens.
  • Thursday, April 1, 2022:
    • Added tooltip to diary entries showing ingredients for recipes and entrées.
    • Fixed additional issue around bootstrap tooltips.
  • Tuesday, March 29, 2022:
    • Fixed issue in progress report graphs, where total calories appear higher than those reported in the diary.
      • A manufacturer's carb calories may be less than x*4, since they account for metabolically dead carbs used in low carb products
      • Examples include Atkins Shakes and Mission low carb tortilla.
      • This is to be expected.
    • Updated nuget and libman libraries.
  • Sunday, March 27, 2022:
    • Fixed error in asynchronous application bootup process.
  • Friday, March 25, 2022:
    • Added net carbs column to report series sql server database table.
    • Updated database with net carbs series data.
    • Added net carbs and grams info to pie chart progress report tooltips.
    • Moved BuildReportSeries() to administration functions.
  • Thursday, March 24, 2022:
    • Fixed issue with entrée past/future related to conversion to System.Text.Json from newtonsoft.
      • There was a missing { get; set; } in the cached model. Silly me!
    • Clarified text hints in entrée manager for 'Last Time' and 'Next Time' buttons.
  • Wednesday, March 23, 2022:
    • Added calories and grams to pie chart progress report tooltips.
  • Saturday, March 19, 2022:
    • Changed PostLocalDateTimeOffset() to always post on a get.
    • Fixed more issues with "sticky" bootstrap tooltips in food diary and recipe analyzer.
  • Monday, March 14, 2022:
    • Fixed issues with "sticky" bootstrap tooltips in food diary.
    • Fixed issue with progress reports when we enter weight into diary immediately after login.
  • Tuesday, March 8, 2022:
    • Removed some noisy logging.
    • Log user name on logins and logouts.
    • Threaded off login initializations, greatly speeding up the login process.
    • Removed redundant calls in food diary.
  • Friday, March 4, 2022:
    • Adjusted recipe analyzer when trying to add a recipe name AFTER we have entered ingredients.
      • We now ask before obliterating work in progress.
    • Fixed issues around changing entrée entries in the food diary.
  • Wednesday, March 2, 2022:
    • Tuned javascript and css loading for performance.
  • Tuesday, March 1, 2022:
    • Fixed bootstrap tooltip issues.
  • Monday, February 28, 2022:
    • Bundled kendo scripts to reduce loads.
  • Monday, February 21, 2022:
    • Fixed issue in recipe analyzer where the portion is incorrectly swapped to "1 Recipe".
  • Saturday, February 19, 2022:
    • Moved landing page content to static file for easier updates.
    • Updated various nuget packages.
    • Cleaned up login and register pages.
    • Admin can now read log file from ui.
    • Cleaned up logger messages.
  • Thursday, February 17, 2022:
    • Cleaned up the deploy, reducing file load and footprint.
  • Wednesday, February 16, 2022:
    • Added sitemap.xml generator. It was about freakin' time.
    • Updated various nuget packages to latest.
  • Monday, February 14, 2022:
    • Generalized some static html content for non-deploy content/documentation updates.
  • Sunday, February 13, 2022:
    • Additional UI cleanup.
  • Saturday, February 12, 2022:
    • Cleaned up various html/bootstrap formatting issues.
  • Friday, February 11, 2022:
    • Cleaned up navbar html.
    • Added vertical navbar for major functions.
    • Added instruction areas in label and recipe functions.
    • Added a cute salad to the logo, with egg.
    • Cleaned up tooltips, still some to go.
    • Continuing signalR work.
  • Tuesday, February 8, 2022:
    • Adjustments to address errant signalR not defined.
  • Monday, January 31, 2022:
    • Updated to ElmahCore 2.1.1.
    • Fixed navbar toggle set point.
    • Continued work on diet partnerships, chat and signalR.
  • Wednesday, January 26, 2022:
    • Fixed/refactored various bootbox scripts.
    • Removed/replaced deprecated HTML.
  • Tuesday, January 25, 2022:
    • Switched to Font Awesome Kit for CDN loading, which fixes previous FA loading bug.
    • Re-started signalR work for diet clubs and chat.
  • Sunday, January 16, 2022:
    • Entrée cog now spins when active/available.
  • Saturday, January 15, 2022:
    • Expanded profile and settings navbar dropdown.
    • Updated to Font Awesome Pro 5.15.4
  • Wednesday, January 5, 2022:
    • Centered "Nutrition Facts" at top of nutrition labels.
    • Preliminary work to allow upload of food images.
    • Preliminary work to enable Azure blob storage.
  • Wednesday, December 29, 2021:
    • Updated icons for various operating systems and devices. This hadn't been looked at in years.
  • Monday, December 27, 2021:
    • Fixed bootstrap fallback path in layout.
    • Fixed missing DateCreated on new user registers.
    • Defaulted DateCreated to latest DateLastAccess for remaining legacy null DateCreated.
    • Fixed the cookie opt-in dialog.
    • Fixed Bootstrap 5 CDN fallbacks. Silly me.
  • Saturday, December 18, 2021:
    • Added AddSessionStateTempDataProvider(); as appropriate to program.cs, to resolve lost status messages in identity UI.
  • Friday, December 17, 2021:
    • Updated to Bootstrap 5.
    • Cleaned up scaffolded identity and management pages.
    • Fixed up bootbox close button styleing for Bootstrap 5.
    • Embedded bootbox in site.min.js, at least until a Bootstrap 5 version of bootbox becomes available.
  • Tuesday, December 14, 2021:
    • Fixed problems with displayed nutrition info when selecting recipes and entrées in the food diary.
    • All files edited to file scoped namespaces to improve readability.
  • Monday, December 13, 2021:
    • Replaced Microsoft.AspNetCore.Mvc.NewtonsoftJson with System.Text.Json.
    • Fixed clear measure javascript error in browse foods.
    • Fixed default measure when entering from a label, on submit/verify.
    • Fixed delete master entrée from add/delete screen when no name.
    • Fixed various and sundry .net 6 conversion issues.
  • Thursday, December 2, 2021:
    • Disabled nullable context across all projects. This is a non-trivial migration.
    • Fixed issue in Convert() in MeasurementTranslator that caused exception on non-convertible measures.
  • Wednesday, December 1, 2021:
    • Enabled nullable context and implicit global usings across all projects.
    • Fixed EF core/database issues enabled due to nullable context.
    • Removed all unnecessary "using" statements.
    • Moved all startup.cs code to top level code in program.cs, preserving asynchronous startup tasks.
  • Wednesday, November 17, 2021:
    • Updated all projects to .net 6.0
    • Updated nuget packages, mostly 6.0 updates.
  • Saturday, September 25, 2021:
    • Fixed various Typescript issues
    • Fixed issues with tsconfig.
    • Updated various nuget packages.
  • Wednesday, September 22, 2021:
    • Added ChangeMeasureRetainWeight() to FoodItem model.
    • Added CurrentAmount to FoodItem model.
    • The food browser now maintains weight equivalence when changing the measurement units.
    • The food browser now maintains the current FoodItemWithNutritionLabel across posts, greatly speeding up queries.
  • Wednesday, August 25, 2021:
    • Fixed the recents query in the diary database.
    • Fixed error in measurement converter synonym lookup.
  • Monday, August 23, 2021:
    • Fixed exception in add label when serving size is inconsistent.
    • Minor html formatting in secondary lists.
    • Restored full length recents list in food diary.
  • Thursday, August 12, 2021:
    • Fixed several entrée chaining bugs.
    • Updated various libraries, mostly Microsoft framework stuff, via Nuget Package manager.
  • Monday, August 9, 2021:
    • Fixed update errors in foods database and re-consolidated SR, FNDDS, and CN.
    • Added leftovers to recents list in food diary.
  • Monday, August 2, 2021:
    • GetRecents() stored procedure adjusted to return only top 100.
  • Sunday, August 1, 2021:
    • Improved default measure selection when searching for food items in food browser, food diary and recipe analyzer.
    • Added options (user and global levels) to display sugars as teaspoons.
    • Added global and user preference levels of "display sugars as teaspoons" toggle.
      • User level SugarsAsTeaspoons defaults to true, takes precedence over global level.
      • Global level SugarsAsTeaspoons defaults to true.
    • Fixed missing "drop" entry in "DefaultConversions.txt".
    • Fixed error in CompareInexact() that excluded some matches in food searches.
    • Added sugars imputed to zero when total sugars are zero.
    • Fixed display of imputed sugars on nutrition label.
  • Wednesday, July 28, 2021:
    • Guid integrity check on save preferences added.
    • Preferences date modified on save fixed.
  • Tuesday, July 27, 2021:
    • Reset various food models when nutrition label options are set/reset.
    • Fixed edge case in product label add/edit involving non-weight and non-volumetric serving size.
    • Fixed food browser to use proper userId when logged in.
    • Label entry with mixed weight and volume measures enters both.
  • Wednesday, July 21, 2021:
    • Updated json packages and nuget packages.
    • Fixed javascript errors in SelectedFavoriteChanged().
  • Sunday, July 18, 2021:
    • Fixed miscellaneous javascript quote mark bugs in 'diary.ts'.
  • Saturday, July 17, 2021:
    • When adding entrée to diary, default to former measure if entrée was used previously.
  • Thursday, July 15, 2021:
    • Additional javascript errors related to diary editing fixed.
  • Tuesday, July 13, 2021:
    • Fixed javascript error on return from master entrée edit.
    • Fixed disable food selection on edit of existing diary entry.
  • Sunday, July 11, 2021:
    • Updated elmahcore from local build to get current fixes.
  • Saturday, July 10, 2021:
    • Added javascript error capture with post to elmahcore.
    • Added the elmahcore font resources.
  • Friday, July 9, 2021:
    • Complete refactor of smart cache rebuild for speed and accuracy.
    • Moved log files to the Everleap default logfile directory.
  • Thursday, July 8, 2021:
    • Refactored smart cache rebuild.
    • Added entrée ingredients to smart cache rebuild.
    • Added original text column to smart cache table.
    • Fixed duplicate id in administration cshtml/javascript.
  • Monday, July 5, 2021:
    • In food diary model, skip hints required in AnalyzeHeuristics() when screening recents and entrées. Fixed.
    • Javascript error (benign) related to new nutrition label fixed.
  • Sunday, July 4, 2021:
    • Fixed DateTimeOffset error in progress series update/save.
  • Saturday, July 3, 2021:
    • Changed the term "Menu" to "Entrée" across the app and the database.
    • Fixed edge case in add food from label where we needed >=1 rather than > 1.
    • Fixed label display error in add food from label when specifying an ad hoc container/package.
  • Tuesday, June 29, 2021:
    • Adjusted update on amount change when making diary entries.
  • Sunday, June 20, 2021:
    • Site hosting migrated to Everleap.
    • This results in an almost 3x performance boost.
  • Saturday, June 19, 2021:
    • Re-implemented food grid used for browsing foods.
    • Fixed weight units error when entering body weight in diary.
  • Friday, June 18, 2021:
    • Smoothed graph when displaying weight in stone.
    • Re-implemented the footer.
    • Fixed (somewhat) the data grid size when browsing foods.
  • Thursday, June 17, 2021:
    • Edited about and release notes layout.
    • Increased session timeout to 60 minutes.
  • Tuesday, June 8, 2021:
    • Fixed MenuUpdateFromParsedRecipe() exception when there are no matches for an item.
  • Monday, June 7, 2021:
    • Menu previous/next added dates of entry.
    • Diary menu small format (phones) fixes.
  • Sunday, June 6, 2021:
    • Layout updates begun.
  • Friday, June 4, 2021:
    • Fixed a subtle regex problem affecting subtraction on an edge case.
  • Wednesday, June 2, 2021:
    • Added an image of The Programming Chef. It only took 10+ years...
  • Wednesday, May 26, 2021:
    • Moved special rules from ParseLeadingNumber to NormalizeRawrecipe for efficiency.
    • Fixed special rule that broke subtraction of string amounts.
  • Tuesday, May 25, 2021:
    • Fixed issue where unicode thin space (0x2009) is pasted into a recipe, generally directly from a web page.
    • Generalized white space solution for pasted recipes.
  • Monday, May 24, 2021:
    • Fixed newly exposed Datetime/DateTimeOffset issue in food diary entries.
    • Fixed javascript ajax post error that sometimes called Diary/RecentChanged twice.
  • Wednesday, May 19, 2021:
    • Updated nuget and libman libraries.
  • Monday, May 17, 2021:
    • Additional smarts (heuristics) added to portion/measurement interpolation.
  • Sunday, May 16, 2021:
    • New menus now insert in date order.
    • Fixed javascript disabled on menu next.
    • Added tooltips for menu next/prev to indicate day of entry.
    • Publish is now self-contained, winx-64, and pre-compiled.
  • Monday, May 10, 2021:
    • Fixed additional display errors when adding from a commercial label.
  • Monday, May 3, 2021:
    • Fixed save new master menu error (Newtonsoft.Json.JsonSerializationException).
    • Fixed amount display error when adding from a commercial label.
  • Sunday, May 2, 2021:
    • Increased nutrition label width.
    • Fixed revised nutrition label formats.
  • Wednesday, April 28, 2021:
    • Fixed edge case size error in saving commercial labels.
    • Fixed sugar amount hints when total carbohydrates is zero.
    • Fixed some minor javascript errors.
  • Wednesday, March 10, 2021:
    • Turned off BFPD database to increase performance.
    • Fixed legacy bad data in food diary entries.
    • Added disable/enable during update posts in food diary.
    • Added search memory to grid food filtering.
  • Wednesday, February 24, 2021:
    • Added delays to incremental searches to increase responsiveness.
    • Fixed grid filtering to return mimimum result.
  • Tuesday, February 23, 2021:
    • Fixed bootup initialization out of memory problem.
  • Thursday, February 4, 2021:
    • Updated Telerik libraries.
    • Updated Nuget packages.
    • Updated robots.txt.
    • Updated InitializeDomain for faster debug time.
    • Miscellaneous edits.
  • Tuesday, January 5, 2021:
    • Fixed progress report update on weight changed.
  • Monday, January 4, 2021:
    • Fixed "second operation was started on context" errors that occurred on production database.
    • Fixed food search in diary.
    • Fixed diary menu management errors.
    • Fixed recipe analyzer delete error.
    • Added wait cursors to several diary commands.
  • Sunday, January 3, 2021:
    • Happy Birthday Matthew G!
    • NuGet updates.
    • Elmah 2.x update.
    • Finer admin detail on delete unconfirmed registrations.
    • Added last accessed datetime to user login.
  • Friday, January 1, 2021:
    • Fixed created date on new user registrations.
    • Added deployment slots in Azure.
  • Wednesday, December 30, 2020:
    • Added "Friend" as screen nickname when nickname not set.
  • Monday, December 28, 2020:
    • Register new user clean up.
  • Sunday, December 27, 2020:
    • Debugged password reset.
    • Refactored email for DI.
    • Adjusted SendGrid settings.
  • Friday, December 25, 2020:
    • Food search fixed to filter correctly.
    • Food search refactored for speed.
  • Wednesday, December 23, 2020:
    • Fixed weight diary bugs.
    • Fixed home page links.
    • Added Application Insights telemetry.
  • Tuesday, December 22, 2020:
    • Removed legacy directories and paths.
    • Fixed delete ingredient buttons on the recipe analyzer view.
  • Monday, December 21, 2020:
    • Label entry button fixup.
    • Analyze recipe button fixup.
    • Logging levels adjusted.
  • Sunday, December 20, 2020:
    • Deployed refactored site to production.
  • Saturday, December 19, 2020:
    • --- Updated to .NET 5.0 ---
    • Fixed up error page handling with custom pages and proper ajax failure response.
  • Sunday, November 29, 2020:
    • Not dead yet!
    • Full tech stack retooling to .net Core 3.1
    • New updated USDA nutrition label added.
    • Many bug fixes during the single ship transit out (and back) to the Kuiper Belt
    • ..... DISCONTINUITY.....
  • Thursday, May 16, 2019:
    • Added menu repair on the fly. Fixes multiple chain issue in Food Diary menus.
    • Fixed time resolution (milliseconds) from moment.js and Food Diary model and controller.
  • Friday, March 15, 2019:
    • KM entered 3000 for the year in Diary. Good one! Patched.
  • Monday, February 11, 2019:
    • Fixed the Recipe and Menu comment editor.
  • Monday, January 28, 2019:
    • Updated to Telerik UI for ASP.NET MVC 2019.1.115.
    • Fixed editor access error in diary. (Menus comments still do not edit.)
  • Thursday, August 16, 2018:
    • Fixed major bug calculating data series in progress reports when alcohol is reported.
  • Friday, July 27, 2018:
    • Updated all nuget packages.
    • Updated to Telerik UI for ASP.NET MVC 2018.2.620.
  • Sunday, June 24, 2018:
    • Fixed recipe portion string loses count after page switch bug.
    • Fixed egg/eggplant, water/watermelon type search bugs.
  • Tuesday, June 19, 2018:
    • Fixed rounding error on number to human readable string.
  • Saturday, March 24, 2018:
    • Fixed create/update food label bug.
    • Fixed two menu chain issues in the food diary.
  • Saturday, February 17, 2018:
    • Fixed portion bug(s) in Menu Add/Delete.
  • Sunday, January 28, 2018:
    • Updadated Telerik libraries to 2018.2.620.
    • Updated all nuget packages (bootstrap, jquery, etc.) to latest versions.
  • Wednesday, January 17, 2018:
    • Fixed menu chaining bug.
  • Tuesday, September 19, 2017:
    • Meaningless first word exclusion added to search.
    • "thick" added to ignore list.
    • Foods and Recipe controller null model fixes.
    • On meal stacked bar chart, you can click through to the meal diary for that day.
  • Thursday, July 6, 2017:
    • Recipe line analysis is improved:
      • Mixed quantities are now combined if possible (1 tbsp + 1 tsp = 1 1/3 tbsp, etc.)
      • The word "plus" used in a line actually adds quantites together.
  • Monday, June 26, 2017:
    • Added endsWith() polyfill. Damn you, IE12!
    • Fixed null reference in RecipeEditor.
  • Sunday, June 25, 2017:
    • Fixed edge case string compare on portions. Curse you StringComparison.OrdinalIgnoreCase!
    • Fixed edge case in ParsLineToMeasure introduced with inclusions/exclusions.
    • Updated Telerik libraries to 2017.2.621.
    • Re-activated efficient Telerik script bundling.
  • Sunday, June 11, 2017:
    • Re-implemented "Delete Recipe" for users and admins on recipe analyzer screen.
    • Recipes and Diary Menus now allow for comments, directions, pictures, etc.
    • This latest feature will need debugging, and will be added to the diary going forward.
    • You cannot upload pictures yet, but that will be coming. This will be useful for recipes.
  • Monday, June 5, 2017:
    • Fixed edge case bug in Food Diary Recents/Favorites.
  • Tuesday, May 30, 2017:
    • Excluded "NS" from plural processing.
    • Turned "Suggest" and "HighlightFirst" off for combo controls on food diary entry.
  • Monday, May 29, 2017:
    • Added exclusions (skips) and inclusions (required) to recipe and diary food item searches.
      • Any word that starts with a minus sign is used to exclude matches that contain that word.
      • Any word that starts with a plus sign is used to only include matches that contain that word.
      • This is useful when a search produces a long list, and you wish to winnow it quickly.
      • For instance:
        • "2 oz asparagus -boiled", will not return any matches that contain the word "boiled".
        • "8 oz ribeye +australian -petite", will only return matches that contain the word "australian" and not "petite".
    • Food Diary dropdowns now manage their widths.
  • Saturday, May 20, 2017:
    • Fixed 1 5/8+1-1/4 math/regex bug.
    • Fixed LocalBootTime null error.
    • Fixed food diary menu future/past/save issues.
    • Generalized Session expiry/auth code.
    • Sample reports and food diary are now displayed for the current live Programming Chef entries.
    • Fixed reports public name bug.
    • Varoius admin refactors and fixes.
    • Label save bug fixed.
    • Default label measure bug fixed.
    • Report alchohol threshhold value added to suppress very small percentages.
    • Fixed return from Add/Delete Menu to food diary bug.
  • Monday, March 27, 2017:
    • Fixed Chrome rendering of input on a Macbook that caused overflow/visibility problems.
      • This was a real pain in the rear! Very subtle stuff.
      • Slight overflows were being hidden, but only in Chrome on the iPad and Macbook, with retina display.
      • Again, only Chrome failed, and only on iPad and Macbook.
      • Setting overflow to visible on the enclosing div solved the problem.
    • Fixed Chrome autocomplete problem on label input, by setting autocomplete to "off" on enclosing form.
  • Saturday, March 25, 2017:
    • Fixed issues around past/future menu choices (leftovers).
    • Refactored diary code to reduce unnecessary and complicated code blocks.
  • Friday, March 24, 2017:
    • Recipes and menus with unknown items save and restore properly.
    • The unknown items are preserved.
    • This refines yesterday's fix to preserve information as expected.
  • Thursday, March 23, 2017:
    • Save Recipe with unknown item bug fixed. Unknown items are dropped on a save.
  • Sunday, March 19, 2017:
    • Menus now appear in Recipe Analyzer searches when a user is logged in.
    • Menus can now be saved as a recipe in the Recipe Analyzer.
  • Saturday, March 11, 2017:
    • Major clean up/fixes of session and identity timeouts.
    • Fixes/adjustments to login and threaded initialization.
    • Telerik library updated to 2017.1.223.
    • Updated to Microsoft.Net.Compilers.2.0.1.
  • Friday, March 10, 2017:
    • Progress indicators added to ajax calls.
    • Admin clear elmah 404 functionality.
    • Elmah 404 filter for emails.
    • Google AdSense preliminary work.
    • Bread crumbs at top removed. They were pointless.
  • Tuesday, March 7, 2017:
    • Safari textarea issues "fixed":
      • Safari displayed menus/recipes raw text as a single line.
      • It appeared to ignore the CR/LF between lines.
      • This required "white-space: pre" rather than "white-space: nowrap".
      • Interestingly, I think Safari is correct, and Chrome is wrong!
    • Textarea resize in menu management fixed.
    • Guest user copy menu links fixed.
  • Monday, March 6, 2017:
    • Major rewrite of Food Diary Menus:
      • There has always been a problem logging leftovers from a menu.
      • Menus are now added/updated via an Add/Delete dialog. These are the "Master" copies.
      • Logging a menu in a meal adds a local/temporal copy.
      • Local/temporal copies are editable without affecting the master or other entries.
      • When one adds a menu, previous copies can be called up via "Last Time"/"Next Time" buttons.
      • So a tweaked menu from yesterday (or last week) can immediately be used to log leftovers.
    • Various guest user fixes various.
    • Data caching fixes.
    • Progress (graph) fixes and adjustments.
    • Various maintenance stored procedures re-factored / added.
    • Pulldown resize adjustments.
  • Sunday, February 26, 2017:
    • Quick fix: Register emails are now re-enabled.
  • Monday, January 30, 2017:
    • Recipe/Menu analysis views refactored for ease of use:
      • Analysis results/editors and controls moved above text area.
      • Delete button per line added.
      • Search result combobox now uses optgroup to display user's value.
      • Textarea controls now dynamically size.
      • Edge case bug involving letter case correction fixed.
    • 100 day trial begins for The Programming Chef!
  • Sunday, January 29, 2017:
    • Orphaned recipes have been deleted.
    • The SearchCache has been regenerated.
    • The SmartCache has been regenerated.
    • The SmartCache has been adjudicated.
    • We are ready for a trial!
  • Saturday, January 28, 2017:
    • Menus are now fully integrated with SmartCache learning AI and adjudication.
    • Menus now include 'Lock Text' buttons (like the recipe analyzer).
    • Several menu/analyzer bug fixes, edge cases around locked text.
  • Friday, January 27, 2017:
    • Menu save bug when no entry chosen fixed.
    • Menu 'alias'/'original text' issues.
  • Thursday, January 26, 2017:
    • Telerik library updated to 2017.1.118.
    • Kendo 'All' bundle duplication fixed.
    • Robots.txt updates.
    • Orphaned recipe cleaner added and exposed to admins. Recipes from the old site whose users have not migrated are deleted.
    • Fixed cache bug that duplicated search/analyze entries.
  • Sunday, January 22, 2017:
    • SmartCache adjudication is in place for admins.
  • Wednesday, January 18, 2017:
    • Updated Cache administration views.
    • Added SmartCache statistics to admin view.
    • SmartCache statistics persists adjudication information on rebuild.
    • SmartCache potential deadlock fixed.
  • Tuesday, January 17, 2017:
    • Added the SmartCache!
      • Learning AI: When a person selects an alternative choice from an analyzer search, it can be remembered.
      • Knowledge persistence is predicated on recipe saves.
      • This was previously implemented and removed, because that version was crap.
      • Frequency of use for such a search is remembered.
      • Different choices for the same search are remembered.
      • These alternate choices and frequencies are used to make subsequent analysis smarter.
      • These smart entries are human adjudicated for global use, though still TBD.
    • Broke out admin functions to partial views.
    • SmartChoice Adjudication is still TBD.
  • Tuesday, January 10, 2017:
    • Streamlined the food browser.
    • Added creation date for user registrations.
    • Added some admin information on user registrations.
  • Wednesday, January 4, 2017:
    • Fixed a rounding issue caused by inconsistent food labels affecting Progress Reports.
  • Tuesday, January 3, 2017:
    • Hello from Denver, Colorado!
    • Happy Birthday, Matt!
    • Fixed a null reference in Progress Reports.
  • Sunday, January 1, 2017:
    • Updated to jQuery 3.1.1.
    • Worked with Telerik to resolve jQuery 3.x.x issue(s).
      • Updates to the DOM are now asynchronous, and execution order is guaranteed.
      • See: Breaking change: document-ready handlers are now asynchronous
      • On an ajax update, javascript executed after an html update needs to execute on document ready to allow full DOM update.
      • This required a closure on the json array returned, and passing an eval() function to document ready, e.g.:
        • var scriptFunc = function (text) { return function () {eval(text);}; };
        • $(scriptFunc(views[v].script));
      • Interestingly, the previous code was NOT correct, since excecution order was not guranteed. We and everyone else lucked out.
      • Fixed a scrolling/positioning annoyance on mobile devices when a soft keyboard opens.
      • Fixed email repository async error when called as part of asp.net page life cycle.
      • Fixed mis-nested recipe update using(context) code.
      • Fixed mis-nested label update using(context) code.
      • Fixed save/update recipe to already deprecated owner/name; we now un-deprecate!.
      • Happy New Year!
  • Thursday, December 22, 2016:
    • Fixed minor update issue with weight report.
    • Attempted to create a test web site for Telerik over on GoDaddy.
      • Myriad bogus security failures.
      • GoDaddy Windows hosting not up to running a complex MVC site.
      • That was a day I will never get back.
      • The decision made previously to migrate all my hosting off GoDaddy was correct.
      • That said, GoDaddy is good for simple sites and blogs, and cost effective for that.
  • Monday, December 19, 2016:
    • Telerik is still incompatible with jQuery 3.x.x. This is getting old. Reverted to 2.2.4.
    • Progress Reports data loading has been re-factored/optimized.
    • Added "Nested Files" to solution to clean up Visual Studio solution view.
    • Updated multiple libraries via nuget.
    • jQuery is now current (3.1.1). It had been held back by Telerik compatibility, but the latest release fixes this.
    • Note: "Santa Claus" is and was the first White Walker, the "Night King". Close your flue.
  • Friday, December 16, 2016:
    • Re-factored some strong name conflicts and issues.
  • Thursday, December 8, 2016:
    • Added food database source table.
    • Added source field to all USDA food sources. This enables audit trailed recipe analysis.
    • Updated to SR28rev, FNDDS 2013-2014, and CN20.
    • Wrote a wee triple left joined stored proc to delete all unused deprecated food items across all tables.
    • Re-factored the Admin update database functions to handle all the above.
  • Saturday, December 3, 2016:
    • Updated some nuget packages.
    • Refactored the build number to a global static.
    • Improved initialization thread for progress reports, including LocalBootDateTimeOffset(), login, and logoff.
  • Friday, December 2, 2016:
    • Oops. Had [Authorize] decorating "Contact". My bad.
  • Thursday, December 1, 2016:
    • Progress reports had a mis-named cached object, fixed.
    • Added a thread upon login to pre-load initial progress report series.
    • Added sample data to the progress reports when not logged in.
  • Wednesday, November 30, 2016:
    • Spelling and admin screen edits.
    • Removed volume after cooking from recipe analyzer. It is never used.
  • Tuesday, November 29, 2016:
    • ProcessDegenerateSingle: startswith for cases like "egg" vs "eggs".
    • Added enable/disable AI search cache to superuser administration.
    • Added regenerate AI SQL-server cache to superuser administration.
  • Monday, November 28, 2016:
    • Regenerate guest user cleaned up.
    • Guest preferences now reset for a better view.
    • Login now properly clears cached preferences.
    • NormalizeRawRecipe: Fixed bug that improperly split a line when adding line breaks to raw recipe pasted from allrecipes.com.
    • Fixes to caching and cache regeneration.
    • Slight improvement to raw ingredients in targets of heuristic compare.
    • Edge case in elimination of measures from existing analyzer recipe lines.
  • Sunday, November 27, 2016:
    • De-coupled reports from meal diary.
  • Saturday, November 26, 2016:
    • Simplified menus in the food diary.
    • Fixed update issues associated with menus in the food diary.
  • Tuesday, November 22, 2016:
    • Fixed personal preference persistence. This broke when I robustified contexts for thread safety.
    • Added personal preferences to display fructose and/or alcohol on nutrition labels.
    • Fixed edge case indexof bug in recipe analyzer.
    • Fixed "crumbs" ==> "crumb" in AnalyzerHeuristicItem.ScoreDietItem.
    • Fixed false promotion of "raw" in AnalyzerHeuristicItem.ScoreDietItem.
    • Advanced menu exclusions moved to a pref and reflected in UI. Default is hidden.
  • Monday, November 21, 2016:
    • Since January 9, 2016:
      • There have been 643 commits.
      • Hundreds of bugs have been fixed.
      • Myriad improvements to the algrothms and heuristics have been added.
      • Countless deploys to Azure have been pushed.
    • The landing page has been updated.
  • Saturday, January 9, 2016:
    • I got tired of waiting for view compiles on the app server. All views now deploy compiled.
    • Tonight continues Elvis Fest in Chapel Hill, NC. Team Chef drop-shipped yesterday.
    • See you all again tonight!
  • Friday, January 8, 2016:
    • There have been daily builds and deploys since my last entry here.
    • Many bugs fixed, many bottlenecks opened up.
    • Recipes and labels can be entered and saved, but please use the old site if you wish the data preserved.
    • Programming Team Chef is currently re-establishing the Meal Diary function.
  • Thursday, December 17, 2015:
    • Well, here we are on Azure...
    • USDA databases are all current.

Comments from the original site...

  • Monday, March 23, 2015:
    • Fixed a bug in the recipe analyze page for LEROY9804. I cannot email back as his account blocks me.
    • Fixed a number of bugs in the Food Log. Editing favorites now works as it should.
    • In Food Log, I now default to a custom portion in a recipe, if it exists.
  • Sunday, November 2, 2014:
    • Myriad bugs and adjustments.
    • Updated with SR27, CN18, and FNFDDS 2011-2012; this adds 4900+ items from the USDA databases.
  • Sunday, April 6, 2014:
    • Added a report tab for logged food. One must log in for this to enable.
    • Pie chart displays percentage energy from each energy source, plus calories.
    • Stacked bar chart displays daily consumption over time.
    • Options for today only, end time series on today, skip days under a threshold, and start and end dates.
    • Options auto-save to preferances and are in effect on subsequent visits.
    • Added an admin tab, just for me.
  • Sunday, March 29, 2014:
    • Fixed some annoying bugs in the diet logger (I am using it to lose weight).
  • Sunday, January 12, 2014:
    • I have decided to keep this sandbox active for a few more months in order to:
      • Implement an HTTP web service using ASP.NET Web API and Json
      • Start re-implementing functionality for GeeksWhoCook using MVC
      • Implement reasonable authentication/authorization
      • Open the API to those who might find it useful, especially cooking apps on mobile devices
    • Bottom line, this looks like fun.
    • Stay tuned!
  • Sunday, January 5, 2014:
    • Added some location path="." inheritInChildApplications="false" tags to accommodate downstream sites.
    • Implemented an instance of blogengine.net to experiment with. It may still be running at geekshocook.net.
    • Redid the table SQL scripts for all the data bases to preserve structure, keys, constraints and indexes.
    • If a fog person reads this, ping me. It would be interesting.
  • Sunday, December 29, 2013:
    • We celebrate the birth of Kahless, on this most Klingon Khristmas! Qapla'!
    • The nutrition label now has information decoupled from flow on extended nutrition information.
    • I added Vitamin D. About time!
    • The extended nutrition label can optionally skip any N/A values, and auto size.
    • Duplicates from USDA databases are removed. Specifically, CN has many duplicated from SR.
    • All things being equal, food searches sort with most complete data nutrition information first.
    • Created admin routines to regenerate the search cache. Useful for deprecations and updates.
    • Worked on admin routines used to update databases and references to databases as updates from outside occur.
    • Julia's associative memory is more specific. Duplicates with base references eliminated.
    • Search results are now cached. The second time a phrase is analyzed, the results can be retrieved directly.
    • The food logger now saves alias strings, to aid in admin functions and recovery.
    • Fixed a LINQ to SQL Optimistic Concurrency problem when deleting recipes in production.
  • Wednesday, November 27, 2013:
    • This site will NOT move to Azure after all!
    • I implemented a full copy of this site and its data in Azure.
    • I tested across free, shared, standard, and even 2-processor sized sites.
    • Azure was always slower by at least a factor of three, and often much, much more.
    • Often, identical back to back runs had significantly different times (all slower) for no reason.
    • Holy moly! Who would have thunk!
  • Sunday, November 24, 2013:
    • Many changes are coming!
    • This site will migrate by late January.
    • The new sites, GeeksWhoCook and GeeksWhoEat, will replace this development site.
    • These sites will emphasize cooking skills, weight loss and maintenance, and meeting others.
    • Hosting will migrate to Azure, with a test site extant later today.
    • All USDA databases (SR, CN, FNDDS) are now consolidated.
    • Various admin tools have been implemented to allow me to update USDA and other databases as regular updates of them are released.
  • Sunday, October 27, 2013:
    • Julia has undergone some surgery.
    • Julia associative memory wipe/regenration implemented.
    • Administrator can now edit and resave any recipe.
    • Loaded recipes can be re-analyzed.
    • If they send back a Terminator from the future to shut down SkeyChef and Julia...
    • ... it will look like Chef Ramsay.
  • Sunday, October 13, 2013:
    • Today is the day the artificial intelligence Julia has gone live.
    • This was the last major brain section for the food analysis AI.
    • This is the part that learns patterns from users who save and edit recipes.
    • The more people analyze and refine food choices, the smarter Julia gets at choosing her matches.
    • Queue the SkeyChef Terminator jokes...
  • Saturday, September 28, 2013:
    • Many new heuristic additions.
    • Nut Butter Dude, ping me if you see this....
  • Sunday, September 22, 2013:
    • Converted all varchar to nvarchar in databases.
    • Duh.
  • Friday, September 13, 2013:
    • Spooky day...
    • Recipe measurements now round to nearest 1/8, 1/4, or 1/3, in keeping with common kitchen measurements.
    • Number rounding and string conversion is now more regular.
    • Updated help info on analyzer tab.
    • Added item to "No Matches" message.
    • Fixed "Do NOT Copy Food Name" issues.
  • Wednesday, September 11, 2013:
    • Bug! Edge case!
    • When a database supplies a measure in grams with Amount greater than 1, the converter got crazy.
    • Amount and weight are now normalized around one in ParsePortionLoadedFromDatabase().
    • One pound of basmati rice no longer weighs 22680 grams!
  • Monday, August 12, 2013:
    • Noticed that micro-nutrient percentages were displaying incorrectly on the long label. Fixed.
    • Holy crap! I forgot to re-initilaize HA objects on some search list regeneration! Fixed!
  • Sunday, July 21, 2013:
    • Working on better structured exception handling.
    • Errors email directly to me.
  • Wednesday, July 17, 2013:
    • A bunch of clean-up entering food items from their nutrition labels.
  • Saturday, July 13, 2013:
    • Recipes and foods entered from labels can be deleted by their owners. (or me!)
    • Recipes or foods entered from labels are deleted smart: if referenced by a log or another recipe, they are deprecated, else they are removed.
    • Recipe analyzer matching lists are now ajaxified with search. Hoo ya!
    • Recipes can now "lock" user text. A food typed by a user can prevent the description from the backing database item from replacing that text.
    • As always, numerous bug and display fixes.
  • Sunday, June 30, 2013:
    • Food logger fixes. I had become too clever by half. Better now.
    • Food, recipe, label, and food logger databases tuned for performance (indexes added or fixed).
    • Various layout and bug fixes.
  • Sunday, June 16, 2013:
    • A lot of work on the recipe analyzer has been done.
    • Many errors corrected, two factor analyzer moved into the object, portions works as it should, etc.
    • A user brought to light problems, so I dove in all the way on the recipe analyzer.
  • Sunday, June 2, 2013:
    • Added favorites to food logger.
    • Still needs deletes and some debugging, but still kind of cool.
  • Tuesday, May 28, 2013:
    • Whoa! Food Label addition was screwed up.
    • Hopefully fixed now...
  • Sunday, May 26, 2013:
    • Lots of work cleaning up and robustifying Food Log.
    • Food Log may be ready for prime time!
    • Have begun cleaning up the overall de-modeling creep: Moving inappropriate functionality to model from controller and view.
  • Sunday, May 19, 2013:
    • Un-oops, sigh of relief. Primary keys were set incorrectly in the production database. Silly me.
    • OOOPS... Cannot add a new foodItem. Well, I'll be fixing... Odd, it works in the local test environment.
    • You may now log your food habits.
    • There may be bugs, but a LOT of work is finished!
    • WOO DAMN HOO!
  • Saturday, May 18, 2013:
    • More work on the food logger...
    • If the hot dog guy from the Farmers Market reads this, please email me.
    • I will be cooking some duck breasts tonight.
  • Sunday, May 12, 2013:
    • Login required for food logger.
    • Food logger persists selection across tab changes.
    • Other food logger controls persist states.
    • Login pops back to page you logged in from.
    • I will next finish entry of food log foodItems and their persistence.
  • Saturday, May 11, 2013:
    • Telerik update.
    • More food logger work...
    • I have been to Yosemite. It was grand.
  • Monday, Thursday 28, 2013:
    • Fixed nasty little exception in recipe analyzer.
    • Playing with on demand combo box in food logger.
  • Monday, March 25, 2013:
    • Monkeyed around with food logger...
  • Sunday, March 3, 2013:
    • Improved drag and drop on the food logger.
    • Drag and drop on the food logger should now work as advertised.
    • Slow cooking two kinds of pork ribs this afternoon.
  • Saturday, February 23, 2013:
    • Resumed work on logging one's food consumption. See the "Food Log" tab.
    • AJAX-ified the nutrition label and data grid.
    • Wired up the nutrition label to the current meal in context.
    • Making a goat cheese, chard, and herb pie in a phyllo crust tonight.
  • Monday, February 18, 2013:
    • Added synonyms. This came as a result of "oe" plurals, like tomatoes and potatoes. Very gnarly.
    • BTW, Dan Quayle was treated unfairly over this.
    • Recipe analyzer now handles duplicates much better.
    • Recipe analyzer algorithm optimized. Only new foodItems are re-analyzed.
    • Better handling of updated recipe via the text box.
    • Better handling of updated recipe via the controls after an initial analysis.
    • Better resolutuion of contention when changes occur in both text and controls.
    • Better handling of wordy measures supplied by the databases.
    • Addition of a new RawRecipeCompare object, allowing fast and intelligent detection of differences between two text recipes.
  • Friday, January 25, 2013:
    • Added a ReaderWriterLock() to manage access to the treeview node map in BrowseFoods. This was needed because when a session adds a recipe or label, the first session to hit BrowseFoods performs an application wide update of the TreeNodes.
  • Thursday, January 24, 2013:
    • Happy Birthday to me! (Unlike Gandalf, I have not been on (middle) Earth for ~18,000 years.)
    • Fixed insidious timing/lock bug involving static initialization during the application start thread.
    • Fixed a number of little irregularities from my "C" level to do list:
      • Fixed RadTreeView to restore selection on return to browse food tab.
      • Made recipe and label treeview updates application global.
      • Moved buffered treeview structure creation to application start thread.
      • Sorted the recipe list.
      • Etc.
  • Wednesday, January 16, 2013:
    • Adding new databases is now completely independedent of the NutritionDataCollection dll. A custom configuration section in web.config now registers a database and allows deprecation and visiblity.
    • This had been bugging me for a while, so kudos to me for finally fixing this once and for all!
  • Monday, January 14, 2013:
    • Added FNDDS5.
    • Excluded old databases from recipe analysis.
    • Turned search threading back on.
  • Saturday, January 12, 2013:
    • Added SR25 and CN16 updated USDA databases.
    • Updated FNDDS5 tomorrow...
  • Wednesday, January 9, 2013:
    • The managed environment launches multiple instances of the application. Modified rolling log file to be on a per instance basis to ease debugging.
    • Fixed centering issue on nutritition label (only appeared on mobile devices).
    • Cooking a goat cheese/bacon omelette from local ingredients tonight.
  • Sunday, January 6, 2013:
    • Leptonica and Tesseract successfully compiled and run. I need to scan nutrition labels from products on store shelves for use in lookups.
    • Work on an Apple iOS app to facilitate this site has begun.
    • Food Log begun.
    • Cooked a very nice pork loin roast with a pomegranate and balsamic glaze last night.
  • Sunday, October 7, 2012:
    • Fixed issues around duplicate derived measures for food foodItems.
    • Fixed issues around deleting measure from raw recipe box on Analyze Recipes screen.
  • Saturday, October 6, 2012:
    • I spent the past week in the mountains kayaking, hiking and programming.
    • The AI has been completely refactored into a HeuristicAnalyzer object.
    • The new AI object is 750% faster at analyzing a recipe than previous to today.
    • Very much work was done on the heuristics used to select recipe ingredient matches. Hit rate is HUGELY improved.
      • The way saved recipes are used as ingredients is fixed. Searches only against title.
      • T and t common measurement usage fixed.
      • Many, many proprietary additions to the heuristic analyzer.
  • Saturday, August 11, 2012:
    • I am writing this from the outer banks of North Carolina. Sweet!
    • There have been many, many deploys since my last notes here.
    • Yes, I know I broke the recipe analyzer and label entry. FIXED!
    • Newest Telerik controls deployed, licensed version.
    • Label entry may be complete. Testers still testing.
    • Next foodItems to implement:
      • Personal Food Log.
      • Look and Feel: Working with designer to move from a developer sandbox to a functioning public site.
      • Look and Feel: Enable site wide skinning with control overrides as needed.
  • Monday, June 25, 2012:
    • Happy Birthday, Pam!
    • Input label on Add Items From Label tab way smarter!
    • Myriad refactors refactored and bugs de-bugged.
  • Sunday, June 10, 2012:
    • Much more done!
    • See the new label on the add foodItems from label tab.
    • Wow! Still almost there!
  • Sunday, April 22, 2012:
    • Lot's more done!
    • Save and load recipes complete.
    • Label ready for extended micro-nutrient values.
    • Various bug fixes and optimizations, of course.
    • Next foodItems to implement:
      • Add foodItems to database from the nutrition label on a purchased foodItem.
      • Enable use of recipes and purchased foodItems in a recipe.
      • Add "Format Recipe" with directions, picture, cooking time, etc. and a "Print" function.
      • Add personal food log with reports.
    • Wow! Almost there!
  • Sunday, April 1, 2012:
    • Much has been done, though I have not been consistent updating these comments. Apologies for that.
    • Recipe save database is in place.
    • "Load Saved Recipes" tab is almost complete, but controls are not yet "wired" up. Take a look.
    • Telerik controls updated and re-integrated with the development environment.
    • Various bug fixes and optimizations.
  • Tuesday, January 24, 2012:
    • Today is my birthday.
    • So many fixes, refactors, and AI tuning, I will not describe today.
  • Saturday, January 7, 2012:
    • Added heuristics to sort and search algorithms. Food matching greatly improved.
    • Bug fix when switching between browse and analyze tab.
    • Database and tables for recipe "Save" implemented.
  • Thursday, December 29, 2011:
    • ALL implementation specific dependencies removed from NutritionDataCollection dll in preparation for move to MVC3.
    • TreeView data intializer refactored (Browse food tab). LINQ queries optimized. 400% increase in performance!
  • Sunday, December 18, 2011:
    • LINQ optimizations on nutrition info query, as suggested by S.R. Nice catch!
    • Bug fixes to nutrition label adder. Fixes values in recipe analyzer tab.
    • Better maintenence of common measure on browse tab when changing foods.
  • Tuesday, December 13, 2011:
    • Build Recipes tab activated:
      • This will link with the anlayzer on the next tab.
      • Nutrition label to be included.
      • Formatted print to be implemented.
      • Keep checking, I am working....
  • Saturday, December 10, 2011:
    • Analyze Recipes portioning (slice, cookie, serving, etc.) and number of servings per recipe now works.
  • Wednesday, December 7, 2011:
    • Fixed default portion size to first non-derived portion.
    • Working on portioning in recipe analyzer...
  • Wednesday, December 7, 2011:
    • Working on portioning in recipe analyzer...
  • Sunday, November 27, 2011:
    • The recipe analyzer has been debugged and appears robust. Of course, testing will tell.
    • Analyzer threads off each line to a task.
    • Dynamic controls created and maintained against the "raw" recipe.
    • Scoring algorithm/AI continues to add heuristics.
  • Saturday, October 8, 2011:
    • I am back. A trip to France and a new contracting opportunity consumed time.
    • The full cut and paste recipe analyzer with AI ingredient analyzer is done in a thick client prototype. I will add this over the next several weeks.
    • The look and feel is being revised by a web designer here in NC. Stay tuned.
    • Conversion to WCF to expose service, operation and data contracts under way.
    • It's good to be back!
  • Sunday, July 17, 2011:
    • Paging now makes sure the top row is selected via PreRender and PageIndexChanged events, eliminating an exception.
    • The measure (oz, egg, piece, etc.) now resets properly when the selected food changes, eliminating an exception.
    • The measure (oz, egg, piece, etc.) now persists intelligently as food selections change.
  • Saturday, July 16, 2011:
    • Search Foods is now much, much clearer and cleaner
  • Wednesday, June 29, 2011:
    • Viewstate now persisted on server, increasing performance.
    • Application and Session timeouts now handled with a re-direct to Home
    • Some Ajax update problems fixed