🧹  Winter Haikus &   🧹 
Emergency Spring Cleaning
═════════════════════════
 ❄  January 27, 2024  ❄

Forth Haiku
═══════════
β€’ Introduced in 2011
β€’ Small Programs in Forth
β€’ Colorful Pictures, Animations, Sounds
β€’ Pixel/Fragment Shader
β€’ Forth -> JavaScript -> WebGL
β€’ Anyone can post
β€’ Anyone can create a "Create a derived work"
β€’ Runs on the Web + Google AppEngine

https://forthsalon.appspot.com/

AppEngine
═════════
β€’ Launched in April 7, 2008
β€’ Initially Python
  - Later Go, Java, PHP, NodeJS, .NET, and Ruby
β€’ Designed to scale from tiny to millions
β€’ Free for tiny
β€’ Built-in Datastore, Account Handling,
  Memcache, Web Templates, Search API

Compatibility
═════════════
β€’ For several years, slow incremental change
  - Master/Slave Datastore to High Replication Datastore
    - forthsalon -> forthsalon-hrd
  - Changes to the python database library
  - User account handling deprecated
  - Used to seem the perfect place to put a dead hand

Compatibility...
════════════════
β€’ But then this January Python2 + old runtime deprecated
  - January 30, 2024 last day to push old version
  - Unclear how much longer old runtimes will work
  - Underpinnings clearly more VM-like
β€’ A bunch of changes required
  - Dependencies using pip
  - New datastore interface
  - No more Search API

Bigtable
════════
β€’ NoSQL + Eventual consistency
β€’ Indexed on (Row:string, Column:string, Time:int64)
β€’ Build your own structure, store protocol buffers
β€’ Atomic transactions at row level
β€’ Highly distributed + scalable

Cloud Datastore
═══════════════
β€’ Make this look more like SQL
β€’ Entities = Rows
β€’ Keys and Ancestors abstracting Bigtable row keys
β€’ Automatic indexes kept fields by default
β€’ Additional indexes added in index.yaml
β€’ Still eventual consistency
β€’ Transactions limited historically small number of
  "entity groups" (common ancestors)

class Haiku(ndb.Model):
  when = ndb.DateTimeProperty(auto_now_add=True)
  title = ndb.StringProperty()
  author = ndb.StringProperty()
  code = ndb.TextProperty()
  score = ndb.IntegerProperty()
  rank = ndb.FloatProperty(default=0.0)
  last_modified = ndb.DateTimeProperty(auto_now=True)
  parent = ndb.StringProperty(default='')
  parent_recorded = ndb.BooleanProperty(default=False)

Changes
═══════
β€’ Switched from Search API to searching
  for author / title prefix
β€’ Added dependencies explicitly
β€’ Adopted new Flask framework
β€’ Switched to new Datastore API library

❄ Winter Haikus ❄

QUESTIONS❓
    πŸ™
 Thank you!