----------------------------------------
     PicoGopher - Introduction
     October 22, 2022
    ----------------------------------------
     Written on my laptop
    ----------------------------------------
  
  
  When I first heard about Gopher, I wondered how small its
  footprint was. Can you run a Gopher server on a very old 
  computer? Well, of course yes, given the protocol's been
  around for 30 years... Can you run it on a very small one? 
  Again, yes: gopher.3564020356.org runs on a RasPi 2, and if
  you wander enough around the gopherspace you will easily 
  end up in a gopherhole served by a Raspberry Pi Zero.
  
  Now the question is: how much can we shrink our resources 
  while still having a working Gopher server? In this post 
  (actually series of posts, if I want anything to be shared in
  a reasonable time) I show how to run your own gopherhole from
  a Raspberry Pi Pico W. And given the platform it runs on, the
  service it provides, and above everything my utter lack of 
  imagination, I have given this project the quite obvious name
  of PicoGopher :-) 
  
  The reasons why I am doing this are various, and probably the 
  most honest answer I could give is that I am trying to keep 
  myself distracted while everything around me is in turmoil.
  There are, however, more serious ones too: on the one hand, 
  I would like to somehow give back to the small internet
  community, by enabling more people to self-host and share 
  their own content in a less expensive way; on the other hand, 
  in a moment where all the main Internet services are becoming
  more and more centralised, I would like to plant a few ideas
  for an even more distributed Internet instead, one where 
  servers themselves can physically be displaced and even move
  with their owners.
  
  Physically move? Yes, one of the advantages of a very small,
  low-power server is that you just need a few small batteries
  to bring it along with you... And if you want your server to
  be always on, you can keep the batteries charged with a
  relatively small solar panel. This is actually something I 
  have always dreamed about doing: leaving some digital traces
  hidden around in the physical world. Think e.g. geolocalised
  riddles, something similar to what Cory Doctorow describes
  as part of the Harajuky Fun Madness challenges in his novel
  called "Little Brother"[0] which by the way I suggest you to
  read if you haven't done already. 
  Thinking about other possible applications of a cheap, 
  self-contained server that can be brought around (or left 
  somewhere) is left as an exercise to the reader ;-). Just
  do not let your imagination be restricted by the specific
  application of a Gopher server: a Pico has enough to run
  Gemini or HTTP too, to act as a proxy or as a gateway, to
  periodically download stuff for you and serve it in anther
  format. Have fun with it and let me know what you did :-)
  
  
  ==== The Raspberry Pi Pico W ====
  
  For all the details about the Raspi Pico W, I will leave you
  to the official datasheet [1] and the "Everything about the
  Raspberry Pi Pico" page [2]. To summarise:
  
  - it is tiny (as in thumb-sized)
  - it is cheap (as in ~7GBP/EUR/USD)
  - it has onboard WiFi (that's what the "w" stands for)
  - it has 2MB of flash memory (enough to hold quite some text)
  - it is based on the RP2040 microcontroller, which is super
    common now and available on a plethora of devices (for 
    instance, I think the Arduino Nano 33 BLE [3] could be used
    for this project instead of the Pico with similar results)
  
  
  ==== Steps to build PicoGopher ====
  
  After getting very basic information about how to program a
  Pico (you'll find plenty of good material about it both on
  the official website and in the links I shared previously),
  the following step was to get an idea about what I could do
  in terms of networking (both WiFi and TCP). RasPi's datasheet
  website provides a document [4] which has everything one 
  needs to get started, including code examples on how to 
  connect to the WiFi and how to build a simple HTTP server.
  
  Following this documentation I managed to run my first mockup
  Gopher server, which serves one single working gophermap 
  after loading it from flash memory. This is of course a super
  simplified example, but enough for us to know that we can now
  power this little thingie, let it connect to a WiFi, and then
  open our favorite Gopher browser and point to it to see some
  contents. This is 80% of what we expect our project to do,
  done in (less than) 20% of the time!
  
  You can find the mockup code in the PicoGopher GitHub repo
  [5]. Again it is not a lot, but if I want to be able to share
  something without disappearing for too long I need to keep
  these posts short (yeah I could also write more concisely,
  but you'd miss all the fun ;-P). 
  In my next PicoGopher posts I will try to apply the 80/20
  rule again while following these steps (the crossed ones are
  completed already), so you know what to expect each time. 
  
  
  - [x] connect to the WiFi
  - [x] run a simple HTTP server
  - [x] run a mockup Gopher server
  - [x] load/save files
  - [ ] make the Gopher server not a mockup anymore:
    - [ ] translate gophermaps following gopher protocol
    - [ ] load any file from disk
  
    -> at this point, you have a running Gopher server!
  
  - [ ] make the server a bit more resilient
    - [ ] enable async
    - [ ] better understand power saving
  - [ ] set up the pico as an access point for geolocalised
        access
  
  - [ ] powering PicoGopher
  
   
  ==== References ====
  
[0] https://www.gutenberg.org/files/30142/30142-h/30142-h.htm
    (look for "wifi" to find the HFM riddle)
[1] https://datasheets.raspberrypi.com/picow/pico-w-datasheet.pdf
[2] https://picockpit.com/raspberry-pi/everything-about-the-raspberry-pi-pico/
[3] https://store-usa.arduino.cc/products/arduino-nano-33-ble
[4] https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf
[5] https://github.com/aittalam/PicoGopher