pe

Raw Zucchini Chips: Super Easy Raw Food Recipe


Zucchini chips are an awesome/tasty alternative to convention chips, which have few nutrients and are laden with fat and salt. Not only that, but before I was raw, I always overlooked zucchini as a "buy and make it in bulk" vegetable. But, when zucchini is plentiful, this is the perfect recipe to use them up.

 

Zucchini season is best in mid summer, because it's a warm weather plant. Even so, zucchini can be found at most groceries through most of the year. Look for firm and glossy fruit with no marks or soft spots.


Simply wash the zucchini and then slice thinly. A mandolin would be the best choice of tool, but I did just fine with a chef's knife. If you want your zucchini chips to have lighter edges, then peel then first then slice.



Put the sliced zucchini in a lidded container and add the marinade. Shake well to coat.




Spread out in a single layer on lined dehydrator sheets. Dehydrate at around 145 degrees Fahrenheit for about an hour, then reduce the temperature to 120 and dehydrate for another 12 hours or so. Overnight is a good way to time it. They're done when all the moisture has been removed. They should be pretty crispy and only a little chewy. The full recipe is below.


Raw Zucchini Chips
one large batch ~ $7.10


ingredients
  • 8 cups thinly sliced zucchini rounds ($5.00)
  • 1/2 cup agave ($1.00)
  • 1/4 cup balsamic vinegar ($.40)
  • 1/4 olive oil ($.40)
  • 2 tablespoons dried oregano ($.05)
  • 2 tablespoons dried basil ($.05)
  • 2 tablespoons dried parsley ($.05)
  • 1 tablespoon garlic powder ($.05)
  • 1 tablespoon onion powder ($.05)
  • 1 teaspoon salt (or more to taste)
  • 1 teaspoon black pepper
  • 1 teaspoon crushed red pepper flakes ($.05) 
directions
  • Slice the zucchini, pat dry if needed, and place in a large, lidded container. 
  • In a small bowl, whisk together the remaining ingredients.
  • Pour over the sliced zucchini, cover, and shake (or just stir) until zucchini is evenly coated. 
  • Spread the zucchini on lined dehydrator sheets and dry at 145 degrees for about an hour and then at 120 for about another 12 hours or overnight (dehydrating time can vary), until crispy. 
  • Store leftovers in an airtight container and pop into dehydrator for a few minutes to crisp them up again if necessary. 







pe

Fruit Stew: Raw Food Recipe




Fruit Stew
serves 2 ~ $2.48 per serving


This is surprisingly filling. You can make this entirely fat free by simply omitting the olive oil, which is something I do on occasion. 

ingredients
  • 1 mango, cubed ($1.49)
  • 1 papaya, cubed ($.99)
  • 1 cucumber, chopped ($.69)
  • 2 tablespoons olive oil ($.20)
  • 1 teaspoon salt
  • 1 medium onion, finely chopped ($.05)
  • 1 red bell pepper, finely chopped ($.89)
  • 1 jalapeno, minced ($.20)
  • 2 tablespoons lime juice ($.45)
  • black pepper
  • red pepper flakes


directions
  1. In a food processor fitted with an "S blade, puree about a third of each of the mango, papaya, and cucumber and the olive oil and salt until very smooth. This is the stew base. 
  2. In a large bowl, add the remaining chopped mango, papaya, and cucumber, along with the onion, red bell pepper, and jalapeno. 
  3. Stir to mix. 
  4. Add the lime juice and stir again. 
  5. Serve with a bit of black pepper and a few crushed red pepper flakes.
  6. Most of the heat of a jalapeno is found in the seeds. I like this kind of spicy so I include most of the seeds from the jalapeno. If you prefer a bit more mild taste, just leave out most or all of the seeds.

 nutritional information       calories: 289      fat: 14 gr      carbs: 43 gr       protein: 3 gr






And want to know a few fun facts about fruit, too?








Hope you're all having a great spring! Say hello :)








pe

Chocolate Orange Smoothie: Raw Food Smoothie Recipe




Chocolate Orange Smoothie
serves 1 ~ $2.20 per serving 


You have to remind yourself this is good for you. It's so delicious it feels downright decadent. The hemp milk makes it super creamy and luscious.

ingredients
  • 1 orange, peeled and frozen ($.50)
  • 2 bananas, peeled, sliced, and frozen ($.40)
  • 1 cup hemp milk ($1.00)
  • 3 tablespoons cacao powder ($.30) 
  • 1/2 teaspoon orange extract
  • few drops stevia (optional)
  • pinch salt
  • 6 ice cubes
  • water for blending, if necessary

directions
  1. In a high speed blender, puree all ingredients until very smooth and creamy. 
  2. Add water if needed for ease of blender or if a thinner smoothie is desired. 

nutritional information:      calories: 339      fat: 14 gr      carbs: 43 gr       protein: 8 gr 




pe

Raw Food Recipe Menu: June 26th, 2016

 

 
Breakfast
Strawberry Flax Smoothie
serves 2 ~ $1.28 per serving
 
 
 
Just two tablespoons of flax seeds, weighing in at 95 calories, contains over 140% of the daily value of omega 3 fatty acids. These fatty acids can protect against diabetes, cardiovascular disease, and cancer, and also decrease inflammation. Because the nutrients in flax seeds are better absorbed when ground ~ and a lot more palatable! ~ I've used the ground seeds in this recipe.
ingredients
  • 2 bananas, frozen and sliced ($.50)
  • 1 cup frozen strawberries ($1.00)
  • 4 tablespoons flax seeds, ground ($.40)
  • 1 cup almond milk ($.45) 
  • a few almonds, chopped
directions
  • In a blender, combine all ingredients and puree until very smooth.
  • Garnish with a few chopped almonds, if desired.
nutritional information:      calories: 308      fat: 11 gr      carb: 55      protein: 7 gr    
 
 
 
 
 
Lunch
Squash and Cauliflower Soup
serves 2 ~ $1.75 per serving
This is a light but also filling lunch or snack and cauliflower is in season right now. It's pretty low in calories and not very expensive. I've been known to eat the whole batch, is what I'm saying! I like to add some cayenne and crushed red pepper flakes, but, as is true of most things in life, heat is optional ... add as much or little as you like. 
ingredients
  • 1 1/2 cup peeled and chopped zucchini and/or summer squash ($1.20)
  • 1 1/2 cup chopped cauliflower ($1.00)
  • 1 cup peeled and chopped apple ($1.00)
  • 1/4 cup olive oil, or any one of your favorite oils ($.20)
  • 1 tablespoon chopped onion ($.10)
  • 1 teaspoon garlic powder
  • 1/2 teaspoon cumin
  • 1/4 teaspoon cayenne powder
  • 1 teaspoon salt, or to taste
  • 1/2 teaspoon pepper, or to taste

directions
  • Place all ingredients in high powered blender and process for a minute or two until very smooth and creamy. 
  • Add a drizzle of your favorite oil and some crushed red pepper flakes.




 
nutritional information:      calories: 390          fat: 32 gr         carbs: 54        protein: 5  
 
 
 
 
 
 
 
 
Dinner
Spring Noodles
serves 2 ~ $1.98 per serving


  • 2 medium zucchini, noodled ($2.30)
  • 1 medium onion, chopped ($.05)
  • 1/2 lb baby snap peas ($.80)
  • 1 carrot, grated ($.10)
  • 2 tablespoons olive oil ($.20)
  • 2 tablespoons agave ($.20)
  • 2 tablespoons apple cider vinegar ($.20)
  • 2 cloves garlic, pressed ($.10)
  • 1/4 teaspoon salt
  • 1/4 teaspoon pepper
  • 1 teaspoon red pepper flakes
noodled verb: to improvise, experiment, or think creatively; to make or devise freely as an exercise or experiment
 
I used to think breaded and fried was the only way to eat zucchini. Now, I'm totally into raw zucchini noodles. They're so easy to make and have a wonderful but mild flavor of their own, so they work well with just about everything. 
Make noodles out the zucchini with a spiralizer, grater, or with a vegetable peeler. Toss the noodles together with the whole snap peas, chopped onion, and grated carrot. In a small cup, whisk together the oil, agave, vinegar, garlic, salt, pepper, and red pepper flakes. Toss with the noodles until coated. 
These can be served as is, or marinated for an hour or so, or gently dehydrated for a bit.

 
nutritional information:      calories: 343      fat: 14 gr      carbs: 46 gr      protein: 10 gr
 
 
 
 
 
 Dessert
Lemon Poppy Seed Ice Cream with Strawberry Sauce
serves 2 ~ $1.10 per serving




ingredients
  • 4 bananas, sliced and frozen ($.60)
  • juice and zest of one lemon ($.69)
  • 1 tablespoon poppy seeds ($.30)
  • 1 cup strawberries ($.45)
  • 1 tablespoon agave ($.10)
  • 2 tablespoons chopped walnuts ($.15)
  • pinch salt

Banana ice cream is wonderful.  And it's amazingly simple to make with just a food processor.

The strawberry sauce should be made first and set aside. In a bullet type blender, puree the strawberries and agave until very smooth.

In a food processor fitted with an "S" blade, process the frozen bananas and lemon juice and zest until creamy like soft serve ice cream. It can take a bit of prodding and scraping to get the bananas going in the food processor, but it's worth it. Once creamy, add the poppy seeds and give a whir or two to incorporate.

Serve with the strawberry sauce and walnuts. 
 
nutritional information:       calories: 345      fat: 6 gr      carbs: 77 gr      protein: 5 gr
 
 
 
Total cost for the day: $6.11
total calories: 1,386
total fat: 63 gr
total carb: 232 gr
total protein: 27 gr
 




pe

Raw Food Recipe Menu: July 4, 2016





 
Happy, happy 4th!! I hope you're enjoying your holiday with lots of good food, friends, family, and good times. The 4th, to most people, represents "freedom" and "independence." What would you like to be free or independent of this summer or this year? Now? 

  
Breakfast 
Strawberry Blue Concrete
serves 2 ~ $1.45 per serving



  • 3 bananas, sliced and frozen ($.60)
  • 1 1/2 cups strawberries, frozen ($1.69)
  • 1/2 cup blueberries, frozen ($.60)
  • stevia and/or agave, to taste

A "concrete" is a very thick shake ... thick enough to have to eat it with a spoon. And this is a fun and tasty breakfast or treat for anyone.

In a food processor fitted with an "S" blade, process the frozen bananas until creamy. Add water as needed until the mixture is a thick, soft serve ice cream consistency. Add about half the frozen strawberries and process again until smooth. Add a couple droppers of stevia and/or agave, until you like the level of sweetness. You may not need any sweetener at all if you use very ripe bananas.

Spoon out and set aside about half the mixture. Then, add more frozen strawberries to what remains, and process again until smooth. Spoon out and set aside about half of this mixture, as well. Finally, add the frozen blueberries to what is left and process again until smooth.

Layer the different mixtures in a glass. And don't forget a spoon!


nutritional information:      calories: 262      fat: 1 gr      carbs: 65 gr      protein: 3 gr


Lunch
Strawberry Cauliflower Salad
serves 2 ~ $2.75 per serving



This salad is a bit on the sweet side and I've even had it for breakfast. The nutrition in here is just off the charts, especially with the cauliflower rounding it out. Lots of vitamin C, vitamin K, etc. A few chopped almonds on top would be nice, too. That's usually how I eat this, but must have forgotten them for the photos!

ingredients, salad
  • 6 cups romaine lettuce, chopped ($1.20)
  • 2 cups sliced strawberries ($2.00)
  • 1 1/2 cups chopped cauliflower ($1.00)
  • 1 small white onion ($.10)

ingredients, dressing
  • 1 cup strawberries ($1.00)
  • 1 tablespoon chopped onion
  • 1 teaspoon chopped garlic
  • 1/4 cup balsamic vinegar ($.20)
  • 1 teaspoon dried basil or 1 tablespoon fresh
  • 1 teaspoon dried oregano or 1 tablespoon fresh
  • 3 tablespoons agave
  • 3 tablespoons olive oil
  • 2 droppers stevia
  • 1 teaspoon salt, or to taste
  • 1/2 teaspoon pepper, or to taste

directions
  • Arrange the salad ingredients on a plate.
  • In a blender, puree the dressing ingredients until very smooth.
  • Add cracked black pepper and salt to taste.




nutritional information:       calories: 257       carbs: 35       fat: 21       protein: 10



Dinner
Blueberry Salad
serves 2 ~ $2.00 per serving



ingredients
  • 1 cup blueberries, dried ($1.00)
  • 1 head romaine ($1.29)
  • handful kale ($.50)
  • 1 medium onion, divided
  • 1/2 cup blueberries, fresh ($.50) 
  • 2 tablespoons olive oil ($.20)
  • 2 tablespoons coconut nectar or other liquid sweetener ($.40)
  • 1 tablespoon apple cider vinegar ($.10)
  • salt and pepper to taste

Blueberries dry to a wonderful raisin like texture, becoming sweeter and even more flavorful. Care must be taken to not over dry them as they get too hard. Just put a cup of blueberries in the dehydrator for several hours until dry but still chewy.

The salad is just a simple one of romaine, a bit of kale, chopped onions, and dried blueberries. Reserve a tablespoon of chopped onion to go into the dressing.

The dressing is made with the onion, a half cup of fresh blueberries, the olive oil, coconut nectar, and vinegar. Puree all ingredients in a blender until smooth. This works best with a bullet type blender. Most blenders have a blade assembly that's compatible with canning jars. Just unscrew the blade assembly from the carafe and attach to a small mouth canning jar. The pint jars are perfect for small jobs like this.

 Also, a larger batch of dressing can be made, just double or triple the recipe. Store in the refrigerator for up to a week.

 


nutritional information:       calories: 289       fat: 14 gr       carbs: 42 gr       protein: 4 gr




Dessert
Blueberry Fool
serves 4 ~ $.62 per serving

ingredients
  • 1 cup nuts (cashews) ($1.00)
  • 2 ripe bananas ($.30)
  • juice of 1 lemon ($.69)
  • pinch of salt
  • 1/2 cup water for blending, as needed
  • 4 ounces blueberries, frozen and thawed ($.50)

  • whole blueberries
  • walnuts
  • agave

I was looking for ways to cut some of the fat in regular nut yogurt and decided to use ripe bananas and nuts in about equal amounts. This worked out wonderfully and as a bonus, eliminated the need for more sweetener.

A "fool" is basically a yogurt dish layered parfait style. Greek yogurt, which is very thick, is traditionally used. This yogurt isn't that thick as I've made it here, but could easily be thickened by draining some of the liquid through cheesecloth. 

In a blender, puree the bananas until very smooth. Add the nuts (I used cashews) and lemon juice and about a half cup water for blending. Puree on high for several minutes, until smooth and creamy. Refrigerate for at least a few hours. It will thicken quite a bit as it chills.

To make the "fool," take half the yogurt and puree with a handful of blueberries. In each serving bowl, put a spoon of regular yogurt and another of blueberry yogurt, add a few whole blueberries to the top. Garnish with a couple chopped walnuts and a drizzle of agave, if desired.


nutritional information:       calories: 268      fat: 38 gr      carbs: 24 gr      protein: 5 gr






Total cost for the day: $6.82
total calories: 1,076
total fat: 72 gr
total carb: 166 gr
total protein: 21 gr
That's a little light on calories, but it's also kind of light on the cost so if you're still hungry have a big slice of lemon cherry cheesecake!


Lemon Cherry Cheesecake
serves 8 - $1.50 per serving

 This cheesecake recipe is from my Spring Raw book, available over there on the side. It's a refreshing dessert that tastes great anytime, but also goes over well at get togethers and holidays

crust
  • 1 cup almonds ($2.00) 
  • 1 cup dates ($2.00)
  • pinch salt

filling
  • 2 cups almonds, soaked and (optionally) blanched ($4.00)
  • 1/4 cup lemon juice ($.40)
  • 1/2 cup agave ($1.60)
  • 1 teaspoon vanilla
  • pinch salt
  • 1/2 cup water for blending

topping
  • 1/2cup cherries ($.40)
  • 1/2 cup dates ($1.00)
  • 2 tablespoons lemon juice ($.40)
  • 1/4 cup whole cherries ($.20)


In a food processor fitted with an “S: blade, process the almonds until coarsely ground. Add the dates and process until the mixture sticks together. Press into the bottom and up the sides of an eight inch springform pan.


For the filling, in a food processor fitted with an “S: blade, process the soaked almonds until finely ground. Add the lemon juice, agave, vanilla, and salt and process, using additional water as necessary. Pour into the prepared crust and smooth. Cover and freeze until firm

In a bullet type blender, process the cherries, dates, and lemon juice until very smooth. Stir in the whole cherries and spread over the top of the frozen pie. Cover and freeze again until firm.

To serve, remove from freezer about twenty minutes beforehand and allow the pie to thaw slightly before cutting and serving.


nutritional information:       calories: 343       fat: 21 gr       carb: 30 gr       protein: 6 gr 




pe

Lime in the Coconut Tarts: Raw Food Dessert Recipe


Lime in the Coconut Tarts
8 tarts ~ $1.11 per serving




These are just insanely good and great for summer. I really don't think there's a conventional dessert that could be any better tasting than these. I used paper cupcake cups and a cupcake pan ... the paper lined pans seemed to make just about perfect sized tarts. They certainly didn't last long in these parts, although theoretically they can be covered and frozen for up to a week.

A note about the dehydrated bananas ... these need to be just dehydrated enough to take some of the moisture out but not hard. I dehydrated my gently for about 6 hours and that seemed to work out well.


ingredients
  • 6 dates ($3.00)
  • 1/2 cup walnuts ($.50)
  • 1/2 cup finely shredded coconut ($1.00)
  • 2 tablespoons coconut oil
  • 2 tablespoons agave
  • pinch salt
  • 2 avocados ($1.49)
  • 3 bananas, dehydrated ($.45)
  • 4 limes, juice and zest ($2.00)
  • 4 tablespoons agave ($.40)

directions
  1. Make the crusts first. In a food processor with the "S" blade, process the dates until mush. 
  2. Add the coconut, coconut oil, agave, and salt and process until it begins to clump. 
  3. Last, add the walnuts and process until the walnuts are fully incorporated and the mixture sticks together.
  4. Divide the crust mixture evenly into and press into the bottom and sides of eight paper lined cupcake cups. 
  5. Put in the freezer for about a half hour, until firm.
  6. For the filling, in the food processor with the "S" blade, process the avocados, bananas, lime juice and zest, and agave. It takes a minute or two, but this will become velvety smooth and the consistency of thick pudding.
  7. Spoon the filling into the tart crusts and chill well before serving.














    pe

    My SIGBOVIK 2020 papers, lovingly aged one month

    Well, April felt simultaneously short and long! I should have just posted these at the beginning of the month, my SIGBOVIK papers from 2020:

    Is this the longest chess game? is another needless chess paper, here trying to figure out the longest possible legal game. There are several rules that make sure games can't go on forever, and some surprisingly subtle details/ambiguity to those rules. The whole game is of course included in the paper (17697 moves), but I was far from being the largest waste of space in this year's proceedings, as one provocateur had a paper with 150 pages of citations. Mathieu made a 5-hour video of the chess game I computed for his companion blog post.

    What is the best game console? A market-based approach is a silly idea taken too far. It was a year in the making (mostly waiting) and didn't quite turn out the way I was expecting due to world events, but that's part of the "fun" I guess!

    Conditional Move For Shell Script Acceleration was another collaboration with Jim (mostly his doing, but I like to lather on an additional patina of absurdity).

    This month I have mostly been trying to keep sane and healthy during the shelter-in-place order. It's been harder than usual to find the energy to be creative, but I have had some spurts. I basically only leave the house to run (not going anywhere near other people). But I have been doing that pretty regularly, so between that and the prohibition against going out to bars and ice cream, I'd say I'm currently in the best I have been in ~6 years. Yesterday I claimed some course records for some Strava segments in my neighborhood! I also finished up Doom: Eternal, which was good but you pretty much already know what it's like and I'm playing Animal Crossing and haven't yet gotten sick of that. The timing for the release of that latter game couldn't have been more perfect, huh? Sometimes I need something with a little challenge, so I just started Nuclear Throne. I'm liking it but not sure if I have decided whether it's good enough to invest the time in to win (I almost always play games to the end but these randomized roguelikes demand a certain kind of potentially infinite investment. Like I never did beat the last boss in Wizard of Legend, and even in Dead Cells, which I loved, I had to settle for some modest personal criteria for "winning.") Any other recs? Could use a good Metroidvania perhaps?




    pe

    Мексиканская авиакомпания полностью перешла на Sukhoi SuperJet 100

    Мексиканская авиакомпания InterJet полностью перешла на использование только российских самолетов Sukhoi SuperJet 100 (SSJ-100). По мнению руководства InterJet, SSJ-100 идеально подходят для перевозок в условиях пандемии коронавируса. В настоящее время российские самолеты обслуживают шесть оставшихся маршрутов.




    pe

    Magically PERNICIOUS




    pe

    Leo Zovic: Places, Peeps And Plagues

    (in-package #:cl-pestilence)
    
    ;;   This is _not_ a simulation. It's just a game. And any resemblance
    ;; to any world, real or imaginary, is entirely coincidental.
    
    ;;   You can copy/paste this post in its entirety into a Common Lisp
    ;; REPL and play around with it if you like. I'm documenting it where
    ;; possible, but it's just a small toy to poke at for the moment.
    
    ;;   I've been thinking a lot about asymmetric multiplayer games and
    ;; <gestures wildly to world at large> all this.
    ;; I'm not actively _trying_ to model it accurately, but it's probably
    ;; obvious what's been consuming my thoughts lately.
    
    ;;   Let's get right into this. I'll explain as I go, and tie a few things
    ;; together neatly at the end. I hope. Regardless, there will absolutely
    ;; be a repo sometime fairly soon.
    
    ;; A place can be tagged arbitrarily, and can contain occupants.
    ;; They also collect points.
    
    (defclass place ()
      ((tags :initarg :tags :initform nil :accessor tags)
       (occupants :initarg :occupants :initform nil :accessor occupants)
       (points :initform 0 :accessor points)))
    
    (defun place? (thing)
      (eq (find-class 'place) (class-of thing)))
    
    (defun place (&key tags occupants)
      (make-instance 'place :tags tags :occupants occupants))
    
    (defun gen-place ()
      (let ((tag (pick '(:apartment-building :house :cottage
    		     :office-building :factory :store
    		     :cafe :lounge :theater))))
        (place :tags (list tag))))
    
    (defmethod details ((place place))
      (format nil "====================~%~a {~{~a~}}~%~{  ~a~^~%~}~%"
    	  (first (tags place))
    	  (rest (tags place))
    	  (mapcar #'details (occupants place))))
    
    (defmethod show ((place place))
      (format nil "~20@a ~5a [~{~a~}]~%"
    	  (first (tags place)) (points place)
    	  (mapcar #'show (occupants place))))
    
    ;; A peep goes places.
    ;; They have
    ;;  - their daily routine (a list of places to visit)
    ;;  - their todo (the part of their routine they still need to do;
    ;;                they are currently at the first place in this list)
    ;;  - their health (a number from 0 to 100)
    ;;  - a list of plagues
    ;; Finally, they _also_ collect points.
    
    (defclass peep ()
      ((routine :initarg :routine :initform (list) :accessor routine)
       (todo :initarg :todo :initform nil :accessor todo)
       (health :initarg :health :initform 100 :accessor health)
       (plagues :initform nil :accessor plagues)
       (points :initform 0 :accessor points)))
    
    (defun peep? (thing)
      (eq (find-class 'peep) (class-of thing)))
    
    (defun peep (&key places)
      (make-instance 'peep :routine places :todo places))
    
    (defun health->string (health)
      (cond ((>= health 90) "@")
    	((>= health 80) "0")
    	((>= health 70) "O")
    	((>= health 50) "o")
    	((>= health 30) ":")
    	((>= health 1)  ".")
    	(t "☠")))
    
    (defmethod details ((peep peep))
      (format nil "[~a ~3d [~{ ~a~^ ->~}]]"
    	  (health->string (health peep)) (health peep)
    	  (mapcar
    	   (lambda (place) (first (tags place)))
    	   (routine peep))))
    
    (defmethod show ((peep peep)) (health->string (health peep)))
    
    ;; A world is a list of places, occupied by peeps. The world we start
    ;; peeps in also determines their routine.
    
    (defun gen-world (&key (num-places 20) (num-peeps 100))
      (let ((places (loop repeat num-places collect (gen-place))))
        (loop repeat num-peeps
           do (let* ((routine (loop repeat 5 collect (pick places)))
    		 (peep (peep :places routine)))
    	    (push peep (occupants (first routine)))))
        places))
    
    (defmethod details ((world list))
      (format nil "~%~{~a~}~%" (mapcar #'details world)))
    
    (defmethod show ((world list))
      (format nil "~%~{~a~}~%" (mapcar #'show world)))
    
    (defmethod all-peeps ((world list))
      (loop for place in world append (all-peeps place)))
    
    (defmethod all-peeps ((place place))
      (loop for o in (occupants place) if (peep? o) collect o))
    
    ;; `tick!`ing a world means moving every peep through their routine once.
    ;;   We `tick!` each peep, then `tick!` each place until all the peeps are
    ;; done. Then we reset their routines.
    ;; You can think of this as a turn in the game.
    
    (defmethod tick! ((world list))
      (let ((peeps (all-peeps world)))
        (loop while peeps
           do (setf peeps
    		(loop for p = (pop peeps) while p
    		   for res = (tick! p)
    		   if res collect res))
           do (mapc #'tick! world)
           do (format t "~a" (show world)))
        (loop for p in (all-peeps world)
           do (setf (todo p) (routine p))))
      world)
    
    ;; Don't worry about the details of how to `tick!` peeps or places yet.
    
    ;;   Ok, here's where it gets a bit darker. Although we _did_
    ;; foreshadow this in the definition of `peep`. And also in the title
    ;; of the accompanying blog post.
    
    ;; A plague is another living thing.
    ;; It has
    ;;  - a host (a peep that it's infecting)
    ;;  - a signature (a token representing its lineage and strain)
    ;;  - health (how well it's doing inside its host)
    ;;  - virulence (how likely it is to spread to another host)
    ;;  - efficiency (how efficient they are at feeding)
    ;;  - reproduce (a function that returns a new instance to push into a new host)
    ;;  - and a strategy (a function, possibly closed, that takes
    ;;    itself and its host peep and mutates)
    
    ;; Plagues do not collect points; they score differently.
    
    (defclass plague ()
      ((host :initarg :host :initform nil :accessor host)
       (signature :initarg :host :initform "SIG" :accessor signature)
       (health :initarg :health :initform 10 :accessor health)
       (virulence :initarg :virulence :initform 10 :accessor virulence)
       (efficiency :initarg :efficiency :initform 0.2 :accessor efficiency)
       (reproduce
        :initarg :reproduce
        :initform
        #'plague
        :reader reproduce)
       (strategy
        :initarg :strategy
        :initform
        (lambda (plague peep)
          (feed! plague peep 30))
        :reader strategy)))
    
    (defun plague ()
      (make-instance 'plague))
    
    ;; Plagues can `feed!` on peeps or plagues. To feed means to
    ;; take away some of the targets' health and add some to your own.
    
    (defmethod feed! ((self plague) (peep peep) (amount integer))
      (decf (health peep) amount)
      (incf (health self) (* (efficiency self) amount)))
    
    (defmethod feed! ((self plague) (plague plague) (amount integer))
      (decf (health plague) amount)
      (incf (health self) (* (efficiency self) amount)))
    
    ;; Plagues can also `infect!` peeps by `reproduce`ing into them.
    
    (defmethod infect! ((self plague) (peep peep))
      (unless (infected-by? self peep)
        (let ((child (funcall (reproduce self))))
          (setf (host child) peep)
          (push child (plagues peep)))))
    
    (defmethod infected-by? ((self plague) (peep peep))
      (member (signature self) (mapcar #'signature (plagues peep))
    	  :test #'string=))
    
    ;;  `tick!`ing a plague causes it to weaken and also carry out its strategy.
    ;; This models the background effect of the immune system of its host.
    
    (defmethod tick! ((plague plague))
      (decf (health plague) 1)
      (funcall (strategy plague) plague (host plague))
      plague)
    
    ;;  `tick!`ing a peep means moving them to their next place, and also
    ;; `tick!`ing any plagues they may have contracted. Also, peeps are
    ;; resilient; they heal a small amount each time they tick (to a
    ;; maximum of 100).
    ;;  If a peep dies, they no longer move. And their plagues probably
    ;; won't do well. Peeps like to go places. They score points for each
    ;; place they go to.
    
    (defun dead? (thing) (>= 0 (health thing)))
    
    (defmethod tick! ((peep peep))
      (unless (dead? peep)
        (let ((location (pop (todo peep))))
          (incf (points peep))
          (setf (occupants location) (remove peep (occupants location)))
          (push peep (occupants (or (first (todo peep)) (first (routine peep)))))
          (setf (health peep) (min 100 (+ 5 (health peep))))
          (mapc #'tick! (plagues peep))
          (unless (empty? (todo peep))
    	peep))))
    
    ;; `tick!`ing a place causes it to score for each `peep` present. And it causes
    ;; any `plague`s on present `peep`s to try to `infect!` other nearby peeps.
    ;; Places also lose points for each dead peep they contain.
    
    (defmethod tick! ((place place))
      (incf (points place) (length (occupants place)))
      (loop for peep in (all-peeps place)
         if (dead? peep)
         do (decf (points place) 2)
         else do (loop for plague in (plagues peep)
    		do (loop for victim in (remove peep (all-peeps place))
    		      if (>= (virulence plague) (random 100))
    		      do (infect! plague victim))))
      place)
    
    ;;  So, now we've got the basic framework of the game in place. There are three
    ;; players in this game: places, peeps and plagues.
    ;;   A plague player automatically loses if they are completely cured, and
    ;; automatically wins if they manage to kill everyone. That's fairly simple.
    ;;   A place player wins if they manage to cure the plague. They automatically
    ;; lose if all the peeps die. Also, fairly simple.
    ;;   A peep player is trying to survive. If they manage to make it some numer
    ;; of turns before dying, then we have to score the game instead of declaring
    ;; an outright winner regardless of game state.
    
    ;;   A peep player's score is the total number of points plus remaining health
    ;; on all of their peeps, minus the number of active plagues on said peeps.
    ;;   A plague player's score is the total number of health of their plagues,
    ;; with a multiplier equal to the number of places fully infected by
    ;; their plague.
    ;;   A place player's score is the total number of points in their places.
    
    (defun score (world)
      (list :peep (let ((score 0))
    		(loop for p in (all-peeps world)
    		   unless (dead? p)
    		     do (incf score (+ (health p) (points p)))
    		   do (decf score (length (plagues p))))
    		score)
    	:place (let ((score 0))
    		 (loop for p in world
    		    do (incf score (points p)))
    		 score)
    	:plague (let ((score 0))
    		  (loop for victim in (all-peeps world)
    		     do (loop for p in (plaguesvictim)
    			   do (incf score (max 0 (health p)))))
    		  (loop for target in world
    		     if (every
    			 (lambda (victim)
    			   (not (empty? (plagues victim))))
    			 (all-peeps target))
    		     do (setf score (* 2  score)))
    		  score)))
    
    ;;   I think that's all I've got for now. This is definitely an idea I want
    ;; to run with. At the moment, it's just a tiny, in-repl proof-of-concept,
    ;; and not particularly fun, but I'm going to try developing it further with an
    ;; eye towards turning it into an actual web game playable from this site.
    
    ;; As always, I'll let you know how it goes.
    
    (defun pick (lst)
      (nth (random (length lst)) lst))
    
    (defun empty? (lst)
      (null lst))
    




    pe

    Leo Zovic: Zippers And Clj

    So recently, I had to use zippers at work. Specifically, the Clojure implementation. There were some close-to-arbitrary transformations I needed to do with some close-to-arbitrary trees and it turned out that zippers were more efficient than the alternatives1.

    Using them this way, combined with the general state of the world and my free time, finally tipped me into doing some more Common Lisp development. Before, I go any further, let me be clear about something.

    I Like Clojure

    Seriously.

    Its logo is up top in the language bar, I was one of the inaugural members of the Toronto Clojure User Group, I recommend it as a first lisp you should learn, and have for about six years now. I'm also painfully aware of the shortcomings of Common Lisp, and make no excuses for them.

    However.

    • I don't like the JVM. It's slow as balls, its' deployment options are less than ideal for my purposes, its' error system is at best useless, and Clojure without it is unlikely.
    • Clojurescript build incompatiblities are, if anything, worse2.
    • I don't like the underlying licensing decisions.

    These are deep reasons to stay away. They're not the sort of thing I can paper over with a library or two. Fixing them would mean a superhuman amount of work poured into the underlying technical and social infrastructure, and I'm not into it. I wouldn't be into it even if the community was interested in heading that way, and near as I can tell, they're not particularly.

    Whether or not I think you should learn Clojure as your first3 lisp, it definitely wasn't my first lisp. The more uniform, mostly-better-thought-out interface, lack of historical baggage and functional data structures are not enough to pull me all the way over.

    It is enough for me to start plotting a smash-and-grab of as much of the stuff I like as I can carry. Which is exactly what clj represents. As of this writing, it defines and exports exactly four symbols: if-let, when-let, -> and ->>. This is a tiny beginning of the list, and I fully plan to put something more substantial together using cl-hamt, named-readtables, test-utils and possibly optima. Stay tuned to that repo if you're interested, but it's not the focus today.

    cl-zipper

    The thing that percipitated this thought was having used the Clojure Zipper implementation. So, obviously, this is something I want next time I need to manipulate trees in Common Lisp. The paper is here, and unless you have a terminal phobia of datastructures4, you should go read it. It's six pages, they're light, and one of them taken up by the intro and references.

    The operations defined in the paper are left, right, up, down, insert_right, insert_left, insert_down and delete. There's a few conveniences defined for the Clojure version, and I've implemented some of my own stuff too. Lets go through the main file in almost-literate style.

    First up, we have constructors.

    (defstruct path
      (left) (path) (right))
    
    (defstruct loc
      (node)
      (path)
    
      (fn-branch?)
      (fn-children)
      (fn-make-node))
    
    ;;;;;;;;;; Constructors
    (defun zipper (branch? children make-node root)
      (make-loc
       :node root
       :fn-branch? branch? :fn-children children :fn-make-node make-node))
    
    (defmethod make-zipper ((thing list))
      (zipper #'listp #'identity (lambda (node children) (declare (ignore node)) children) thing))
    
    (defun make-node (zipper children)
      (funcall (loc-fn-make-node zipper) zipper children))
    

    You can see influence from both clojure.zip and the paper here. I'm taking the lead from the paper by explicitly separating the path triple our from the loc definition. However, I'm not explicitly defining my own type tree the way that Huet does. Instead, I'm going to be dealing with assorted lisp trees. These could be implemented as lists, vectors, hashes, or any number of other formats. I'm going to implement a few type-distpatching built-ins, including the make-zipper list method above, but the basic zipper function just needs to take an interface as input in the form of branch?, children and make-node arguments. This is the same solution that the Clojure implementation went with, and I see no reason to go a different way. The only material difference is that theirs uses the Clojure metadata system, while I explicitly define slots in the loc structure.

    Now that we can construct, we need to be able to select.

    ;;;;;;;;;; Selectors
    (defun branch? (zipper) (funcall (loc-fn-branch? zipper) (loc-node zipper)))
    (defun children (zipper)
      (funcall
       (loc-fn-children zipper)
       (loc-node zipper)))
    (defun node (zipper) (loc-node zipper))
    (defun path (zipper) (loc-path zipper))
    
    (defun lefts (zipper)
      (when (loc-path zipper)
        (reverse (path-left (loc-path zipper)))))
    
    (defun rights (zipper)
      (when (loc-path zipper)
        (path-right (loc-path zipper))))
    

    The basic navigation is four functions; down, up, left and right

    ;;;;;;;;;; Navigation
    ;;;;;;;;;;;;;;; Basic navigation
    (defun down (zipper)
      (when (children zipper)
        (let ((fresh (copy-loc zipper)))
          (setf (loc-node fresh) (first (children zipper))
    	    (loc-path fresh)
    	    (make-path
    	     :left nil
    	     :path (loc-path zipper)
    	     :right (rest (children zipper))))
          fresh)))
    
    (defun up (zipper)
      (when (path zipper)
        (let ((fresh (copy-loc zipper)))
          (setf (loc-node fresh)
    	    (make-node
    	     zipper (append
    		     (reverse (path-left (path zipper)))
    		     (cons (loc-node zipper)
    			   (path-right (path zipper)))))
    	    (loc-path fresh) (path-path (path zipper)))
          fresh)))
    
    (defun left (zipper)
      (when (and (path zipper) (path-left (path zipper)))
        (let ((fresh (copy-loc zipper)))
          (setf (loc-node fresh) (first (path-left (path zipper)))
    	    (loc-path fresh)
    	    (make-path
    	     :left (rest (path-left (path zipper)))
    	     :path (path-path (path zipper))
    	     :right (cons (loc-node zipper) (path-right (path zipper)))))
          fresh)))
    
    (defun right (zipper)
      (when (and (path zipper) (path-right (path zipper)))
        (let ((fresh (copy-loc zipper)))
          (setf (loc-node fresh) (first (path-right (path zipper)))
    	    (loc-path fresh)
    	    (make-path
    	     :left (cons (loc-node zipper) (path-left (path zipper)))
    	     :path (path-path (path zipper))
    	     :right (rest (path-right (path zipper)))))
          fresh)))
    

    The main difference between this and the paper is that I've chosen nil as my Top representation, which lets me pull the trick of using when to check for the presence of a path, and its' non-Top-ness at the same time.

    The bad news is that since Common Lisp doesn't have pervasive functional data structures, I have to explicitly copy locs while moving through a tree. The good news is that the copy is fairly light weight. Effectively, I'm copying out a set of 5 pointers, and could get that down to 3 by defining an intermediate struct.

    Hm.

    Which I probably should do. Note to self.

    Out of those, we get three compound navigation functions. With more probably coming soon. Specifically, I found find useful for the work I did. It's easily externally definable, but would be even easier to bundle along. The ones I've already implemented are root, leftmost and rightmost.

    ;;;;;;;;;;;;;;; Compound navigation
    (defun root (zipper)
      (if-let (z (while zipper #'up))
        (node z)))
    
    (defun leftmost (zipper) (while zipper #'left))
    
    (defun rightmost (zipper) (while zipper #'right))
    
    Each of these involve an intermediate call to while. Which isn't a generic macro; it's a function defined in util.lisp
    ...
    (defun until (zipper f)
      (let ((z zipper))
        (loop for next = (funcall f z) while next
           when next do (setf z next))
        z))
    ...
    
    As you can see, all it does is repeatedly call a given function on a zipper and return the last non-nil loc result. That's loc, not node, so this doesn't run into the usual Common Lisp conflict of "Did you fail to find a thing, or find the element nil?".

    That's the traversals done. Next up, we've got modification, without which this library is fairly useless. The basics are replace, delete and the insert/child twins.

    ;;;;;;;;;; Modification
    (defun replace (zipper node)
      (let ((fresh (copy-loc zipper)))
        (setf (loc-node fresh) node)
        fresh))
    
    (defun delete (zipper)
      (when (path zipper)
        (let ((fresh (copy-loc zipper))
    	  (fresh-path (copy-path (loc-path zipper))))
          (cond ((rights zipper)
    	     (setf (loc-node fresh) (pop (path-right fresh-path))
    		   (loc-path fresh) fresh-path))
    	    ((lefts zipper)
    	     (setf (loc-node fresh) (pop (path-left fresh-path))
    		   (loc-path fresh) fresh-path))
    	    (t (setf (loc-path fresh) (path-path fresh-path))))
          fresh)))
    
    (defun insert-child (zipper node)
      (replace
       zipper
       (make-node
        zipper
        (cond ((not (branch? zipper))
    	   (list node (node zipper)))
    	  ((children zipper)
    	   (cons node (children zipper)))
    	  (t (list node))))))
    
    (defun append-child (zipper node)
      (replace
       zipper
       (make-node
        zipper
        (cond ((not (branch? zipper))
    	   (list (node zipper) node))
    	  ((children zipper)
    	   (append (children zipper) (list node)))
    	  (t (list node))))))
    
    (defun insert-left (zipper node)
      (let ((fresh (copy-loc zipper))
    	(fresh-path (copy-path (loc-path zipper))))
        (push node (path-left fresh-path))
        (setf (loc-path fresh) fresh-path)
        fresh))
    
    (defun insert-right (zipper node)
      (let ((fresh (copy-loc zipper))
    	(fresh-path (copy-path (loc-path zipper))))
        (push node (path-right fresh-path))
        (setf (loc-path fresh) fresh-path)
        fresh))
    

    The paper defines an insert_down function. It fails on a Leaf node, and otherwise inserts a singleton branch at the given location. The insert/append child functions above also insert nodes at a lower level at the current loc. They give you a choice about whether to insert the new node as the leftmost or rightmost child, and additionally succeed on Leaf nodes by including the leaf value as a child of the new branch.

    There are, thus far, three compound modification functions; edit, splice-left and splice-right.

    (defun edit (zipper f &rest args)
      (replace zipper (apply f (node zipper) args)))
    
    (defun splice-left (zipper node-list)
      (reduce #'insert-left node-list :initial-value zipper))
    
    (defun splice-right (zipper node-list)
      (reduce #'insert-right (reverse node-list) :initial-value zipper))
    

    edit takes a function instead of a new node, and replaces the node at loc with the result of running that function on the existing node. The splice-* twins are fairly self-explanatory; they're like insert-left/insert-right, but work on multiple nodes rather than single ones.

    I haven't yet implemented next, prev and remove because these might relate to the different representation of the traversal end? state. The reason for this seems to be that next/prev/remove assume a depth-first traversal. The reason I'm being weasely here is that I haven't thought about it hard enough to be sure that the end? marker is really necessary. It also seems odd to privilege depth-first over breadth-first traversals; ideally, I think you'd want to be able to support either. Possibly interchangeably.

    Minor Housekeeping

    That wraps it up for this edition. My immediate intention is to do more work on the cl-zipper and clj libraries, as well as that game I mentioned last time. Ideally, I'd like to up my blogging output too. Probably not to the same volume as I had at my peak, but it was definitely helpful to keep some sort of written journal around for a while. The current state of the world is, hopefully, going to make it easy for me to get more programming time in. All things considered, I'd count that as a win.

    1. Although admittedly, it does require me to explain the concept of zippers to a few other people for maintenance purposes. So ironically, this adds complexity despite being much more technically elegant than other options.
    2. There's a reason that langnostic.js is a raw JS file, rather than compiled from clojurescript source, and that reason is like 90% that the compilation process is nontrivial to set up.
    3. "First", not "only". You can probably make educated guesses about which other ones I think you should learn.
    4. In which case, why are you here? This blog could kill you accidentally with an errant click or two. You should probably just go do something else.




    pe

    Bushnell Wingman GPS Speaker



    • Audio & Speakers

    pe

    1964 Porsche 904 Carrera GTS Coupe





    pe

    Registration open for USGL Lover Triad Convocation

    A convocation of the Lover Triad of United States Grand Lodge will be held in Cleveland, Ohio, August 14-16 2020. Registration for the convocation is now open. See this site for more information.















    pe

    Incident At Price Chopper

    He’s standing in the dead middle of the meat section at Price Chopper screaming “HOW CAN THERE NOT BE ANY FUCKING STEAK?”  Someone comes out bearing chicken from behind the steel clad gates of the backroom where they cut meat and stage the cases. “Hey, you got any steak back there?” “Steak? No sir. None.” […]




    pe

    [review + recipe] On Wings of Words by Jennifer Berne and Becca Stadtlander

      Each bird, bee, blossom, butterfly — was a source of joy and wonder for young Emily Dickinson. In this beautiful new picture book biography, aptly illustrated with a butterfly motif, we witness her singular metamorphosis from a keenly observant child into one of the most original and innovative poets in American literature. On Wings … Continue reading [review + recipe] On Wings of Words by Jennifer Berne and Becca Stadtlander




    pe

    cookie jar capers

    “A balanced diet is a cookie in each hand.” ~ Barbara Johnson   Did YOU take the cookies from the cookie jar? Who, me? Yes, you! Couldn’t be. Then, who?   Can’t fool me. I see crumbs on your face. ???? Don’t blame you, though. A cookie, at any time of day, always makes things … Continue reading cookie jar capers




    pe

    The possibilites for a disabled person to enjoy Malta

    Disabled people shall not visit Malta if they intend to see the islands and not just stay in their hotels. There is almost nothing done in Malta to help disabled people. The pavements mostly lack ramps and are far too high. The new buses are a little bit better than the old classical ones but not enough improvements have been made. When entering or leaving a bus, persons in wheelchairs cannot manage themselves but have to rely on helpful fellow passengers due to the fact that the bus is too high up from the street. That could be helped if the buses stop close to the pavements, but very often they stop one or two meters from the very high pavement.
    The old classical type of bus no longer in use
    There are very few shops with ramps, a fact that makes it almost impossible to visit shops if you are sitting in a wheelchair.
    The pavements are, with very few exceptions, in a condition that makes it impossible to go by a wheelchair. The main exceptions in the Gzira, Sliema and S:t Julian’s area beeing, of course, The Strand and Tower Road as well as George Borg Oliver Road. In Marsaskala, Marsaxlokk and other towns by the sea with many tourists, there are also roads that are suitable for disabled people. BUT, how to get there?




    pe

    Malta - a Lilliput state with potentates separated from and above the people?


    Memorial plaque
    Memorial plaque
    Malta is the smallest country among EU member states. It has only about 400000 inhabitants and the area is only 312 square kilometers. The Maltese people are very proud of their country and are very right to be so. During WW II the Maltese people were very courageous and it was then the Maltese people was rewarded S: t George’s cross 1942 by the king of England, which cross since 1943 is a symbol on the Maltese flag. The president of the United States of America, Franklin D. Roosevelt, has expressed his gratitude to the Maltese people, which can be seen on a memorial plaque on the wall of the predidential palace in Valletta. 
    However, the majority of Maltese do not seem to travel a lot and therefore are rather ignorant about other countries. Malta is just a rock in the Mediterranean, but, of course, historically an important rock. Yet, you can hear Maltese people quite seriously say that Malta is the most beautiful country in the world. Of course, what is beautiful is a very subjective. Still, very few people, but the Maltese, would say that Malta is the most beautiful country in the world. I have also heard that the Maltese wines as well as its vegetables are the best in the world! There might be a few countries which would like to contest that. Maybe it is beacuse of this ignorance that the Maltese people accept the behaviour of their potentates.

    The government, backed by its loudspeaker, The Times, does everything to give the impression to the Maltese people that Malta has an important role to play in EU and in the rest of the world. If prime minister Gonzi for instance travels to some conference abroad, the articles in The Times have headlines giving the impression that the other prime ministers were there just to listen to Mr. Gonzi. Malta also has a Head of State, a President with his own flag and a car with a special license plate. His wife is called Malta's first lady! Even the The Commissioner of Police has his own flag as well as the Archbishop. The corruption is widely spread. But there is of course a reason for all these cars and flags and mumbo jumbo; the government wants to give the people the impression that Malta has a bigger role to play in EU and in the world than it really has and therefore one also must have men in formal high positions with attributes. One must remember that Malta, although a sovereign state, is not bigger than a middlesized european town and ought to be be governed more in accordance with that and not like United States of America..



    Archbishops BMW license plate
    Gozo bishops Toyota license plate
    The catholic faith is state religion in Malta. The archbishop as well as the bishop of Gozo has company cars, the latter a smaller one than the BMW that is archbishop Cremona's company car. Do not for a moment think that these cars have ordinary license plates. No way, they have plates of a silvery material in the shape of a bishop’s miter. If you do not believe me, look at the pictures. And, of course, the archbishop has a more expensive car than the Gozo bishop (The Observer wonders what Jesus would think of that!).To a foreigner from a more secular state this looks really ridiculous. Of course also the prime minister’s car have special plates. As far as the Head of the State, the President, is concerned, it is more understandable. He is, after all, a symbol. If the president and the prime minister want to attend a mass in Valletta they travel by these cars about 200 meters to the church. This is just window dressing. One could argue that they travel by car for security reasons; no way, anyone could go close to these potentates. All this is also a part of implementing the belief in people that Malta and its potentates are very important, separated from and above the people. They act like royalties more than the royalties in the Netherlands, Belgium and Sweden.

    President Abela's car and flag
    To a foreigner all these attributes are kind of sweet and touching, except for the corruption. Malta is a Lilliput with its attributes similar to those in operettas. This is sweet, but, of course,  fulfills a not so honorable cause, namely to keep the people in a feeling that Malta is something it is not.




    pe

    Making buildings higher and thus destroy their appearance

    Terrible building on Tower Ro
    Terrible example on Tower Road
    Beautiful building on Tower Road
    Villa Aurora on Tower Road
    As a foreigner I sometimes wonder how it is possible that some buildings in, for instance, Sliema have had floors built-on in a completely different style than the existing house. On Tower Road there are several terrible examples. Before one start such development one must get permission from the authorities, I suppose that the authority in such case is MEPA. Either there are no rules in what way you can change a building’s appearance or, someone, apart from the owner and the developer, have had some odd interest in granting permission despite the rules. One can only hope that this destruction of buildings does not in the future affect Villa Aurora or the other lovely buildings on Tower Road that not yet have been in the hands of irresponsible developers and, if there are rules, civil servants with a private agenda. However, there are good examples of buildings where the developer has tried to build the extra floors in a style that are more consistent with the older part of the building




    pe

    What should we protect, living people or dead?


    Once more, one can read the most fantastic true stories in The Times. AlphaIn today's edition of The Times one is told that a group of M`garr residents are complaining about a proposed extension to a fireworks factory because of the damage an explosion would do. Fair enough, of course one should worry about what damage an explosion would do. But what is it the group worries about? The living people in the neighborhood? No, this is Christian Malta; the worries are not concerning the living people but the dead. This despite the fact that several people are statistically expected to die this year because of fireworks explosions. The Observer is well aware of the fact that many Maltese regard the eternal life as the real life, but is this group not going too far? A named couple says that an explosion could disturb the graves of loved ones. The Observer is well aware that continuing this article would probably be considered blasphemy. Presumably this is a criminal offense in Maltese law so The Observer rests his case.




    pe

    The Maltese people, warm and kind

    The entrance

    San Anton Garden
    Yesterday, The Observer with family went to Balzan. After some shopping we wanted to sit down and eat the lunch we had brought with us, preferable in a park. We asked a Maltese lady standing outside Smart, the big department store, if she could recommend a place where we could have our lunch. She told us that there is a lovely garden in Balzan, San Anton, but that it would be too complicated to explain the way to this garden. Instead she told us that she would gladly drive us there and so she did! This is not the first time we have been so well taken care of by Maltese people. The kindness of the Maltese people is one of the things that makes life so much easier on this little tiny island. San Anton in Balzan is really worth a visit with wonderful flowers and many other plants as well as birds!





    pe

    The Little Typer

    A new introductory book about dependent types, involving some familiar names:

    The Little Typer

    by Daniel P. Friedman and David Thrane Christiansen.

    Foreword by Robert Harper.

    Afterword by Conor McBride.

    An introduction to dependent types, demonstrating the most beautiful aspects, one step at a time.

    A program's type describes its behavior. Dependent types are a first-class part of a language, and are much more powerful than other kinds of types; using just one language for types and programs allows program descriptions to be as powerful as the programs they describe. The Little Typer explains dependent types, beginning with a very small language that looks very much like Scheme and extending it to cover both programming with dependent types and using dependent types for mathematical reasoning. Readers should be familiar with the basics of a Lisp-like programming language, as presented in the first four chapters of The Little Schemer.

    The first five chapters of The Little Typer provide the needed tools to understand dependent types; the remaining chapters use these tools to build a bridge between mathematics and programming. Readers will learn that tools they know from programming—pairs, lists, functions, and recursion—can also capture patterns of reasoning. The Little Typer does not attempt to teach either practical programming skills or a fully rigorous approach to types. Instead, it demonstrates the most beautiful aspects as simply as possible, one step at a time.




    pe

    Histogram: You have to know the past to understand the present by Tomas Petricek

    Histogram: You have to know the past to understand the present by Tomas Petricek, University of Kent

    Programs are created through a variety of interactions. A programmer might write some code, run it interactively to check whether it works, use copy and paste, apply a refactoring or choose an item from an auto-complete list. Programming research often forgets about these and represents programs as the resulting text. Consequently, thinking about such interactions is often out of scope. This essay shifts focus from programs to a more interesting question of programming.

    We represent programs as lists of interactions such as triggering an auto-complete and choosing an option, declaring a value, introducing a variable or evaluating a piece of code. We explore a number of consequences of this way of thinking about programs. First, if we create functions by writing concrete code using a sample input and applying a refactoring, we do not lose the sample input and can use it later for debugging. Second, if we treat executing code interactively as an interaction and store the results, we can later use this information to give more precise suggestions in auto-complete. Third, by moving away from a textual representation, we can display the same program as text, but also in a view inspired by spreadsheets. Fourth, we can let programmers create programs by directly interacting with live previews as those interactions can be recorded and as a part of program history.

    We discuss the key ideas through examples in a simple programming environment for data exploration. Our focus in this essay is more on principles than on providing fine tuned user experience. We keep our environment more explicit, especially when this reveals what is happening behind the scenes. We aim to show that seeing programs as lists of interactions is a powerful change of perspective that can help us build better programming systems with novel features that make programming easier and more accessible. The data exploration environment in this interactive essay may not yet be that, but it gives a glimpse of the future.




    pe

    Turnstile+: Dependent Type Systems as Macros

    In 2017, a team from Northeastern University released Turnstile, a framework for implementing propositionally typed languages in Racket; cf. naasking's story Type Systems as Macros. The system was really nice because it allowed type systems to be expressed in a manner similar to the way theoretical PL researchers would in a paper, and because it hooked into Racket's clean compiler backend.

    Now Stephen Chang, one of that team, together with new coauthors Michael Ballantyne, Usamilo Turner and William Bowman, have released a rewrite that they call Turnstile+, together with a POPL article, Dependent Type Systems as Macros. From that article's introduction:

    Turnstile+ represents a major research leap over its predecessor. Specifically, we solve the major challenges necessary to implement dependent types and their accompanying DSLs and extensions (which Turnstile could not support), while retaining the original abilities of Turnstile. For example, one considerable obstacle was the separation between the macro expansion phase and a program’s runtime phase. Since dependently typed languages may evaluate expressions while type checking, checking dependent types with macros requires new macrology design patterns and abstractions for interleaving expansion, type checking, and evaluation. The following summarizes our key innovations.

    • Turnstile+ demands a radically different API for implementing a language’s types. It must be straightforward yet expressive enough to represent a range of constructs from base types, to binding forms like Π-types, to datatype definition forms for indexed inductive type families.
    • Turnstile+ includes an API for defining type-level computation, which we dub normalization by macro expansion. A programmer writes a reduction rule using syntax resembling familiar on-paper notation, and Turnstile+ generates a macro definition that performs the reduction during macro expansion. This allows easily implementing modular type-level evaluation.
    • Turnstile+’s new type API adds a generic type operation interface, enabling modular implementation of features such as error messages, pattern matching, and resugaring. This is particularly important for implementing tools like tactic systems that inspect intermediate type-checking steps and construct partial terms.
    • Turnstile+’s core type checking infrastructure requires an overhaul, specifically with first-class type environments, in order to accommodate features like dependent binding structures of the shape[x:τ]...,i.e., telescopes [de Bruijn 1991; McBride 2000].
    • Relatedly, Turnstile+’s inference-rule syntax is extended so that operations over telescopes, or premises with references to telescopes, operate as folds instead of as maps

    The code is available at https://github.com/stchang/macrotypes.












    pe

    Speed paint challenge ACW

     I gave myself a challenge tonight of seeing how quick I could paint some ACW soldiers to a standard I’d be happy to game with. I started off with a black under coat and added single colours to block out the uniform. I forced myself to just use one coat colour ( Foundry Union uniform B), I found later this can be dry-brushed with earth brown and this acts as a highlight. The soldiers are rough and ready campaign guys, so mud and dust was added to them.

    Also, I love the fact that the varnish is as hard as nails and will protect them from knocks and scrapes. My last lot, because of the number of them, I just matte varnished without any gloss or floor varnish underneath. This didn’t sit well with me and I’m a lot happier knowing this lot have been dipped.




     As with the ECW lot, the flesh is the only paint I allowed myself to use two colours on. It made such a difference it was a ‘no brainer’. Skin tone under Army Painter needs two colours I think, as sometimes without, it can loose something and the men appear a little lifeless.


     Well after the quick blocking in and weathering I gave them a brush with the Army Painter strong tone. The results were very pleasing, a lot better than the photos do justice really.

    For the American Civil War you need a lot of men unless of course you are using skirmishing rules. This I think has to be the route for me now with all of of my big projects, the results are quick and still pleasing. It’s also nice to force yourself into new ways of working which helps keep the hobby fresh and rewarding. I think that is a good word to use for the Dip, rewarding. Seeing those bags of figures in draws get a lick of paint on them and become units and thus, usable.

     We’ll have to see how they turn out when they’re matte varnished
    This lot must have taken me an hour maybe a bit less. The brown tone works well on these guys but should be even better on the soft greys and browns of the Confederate army.




    • American Civil War
    • Dip

    pe

    A reminder: How to stimulate the appetite of a medical leech

    The 1996 Ig Nobel Prize for biology was awarded to Anders Barheim and Hogne Sandvik of the University of Bergen, Norway, for their tasty and tasteful report, “Effect of Ale, Garlic, and Soured Cream on the Appetite of Leeches.” Recently, Bradley Allff, writing in Atlas Obscura, looked at the role medical leeches sometimes play in medicine in the USA. […]




    pe

    The automatic diaper-changing machine is now in development

    BabyWasher, the automatic dirty-diaper-changing invention, honored by the 2019 Ig Nobel Prize for engineering, now has a name, and is now undergoing intense development. You can follow the progress by visiting the inventor’s new web site, BabyWashers.com.




    pe

    Perils of topic modeling

    Today's xkcd illustrates why topic modeling can be tricky, for people as well as for machines: The mouseover title: "As the 'exotic animals in homemade aprons hosting baking shows' YouTube craze reached its peak in March 2020, Andrew Cuomo announced he was replacing the Statue of Liberty with a bronze pangolin in a chef's hat." […]



    • Linguistics in the comics