an Strangelings bonus post! By thebloggess.com Published On :: Fri, 17 Apr 2020 17:35:40 +0000 Hello, and welcome to one of two Fantastic Strangelings Book Club discussions for this month! “What is the Fantastic Strangelings Book Club and how can I join?” Just click here, sweet baby angel face. This discussion though is about a … Continue reading → Full Article bloggess book club
an Welcome to the quicksand. By thebloggess.com Published On :: Mon, 20 Apr 2020 19:56:29 +0000 I’m not sure if it’s depression or just life catching up but I’ve been having a lot of quicksand days. Those times when you feel like you’re moving in slow-motion and things that should take 10 minutes for a normal … Continue reading → Full Article Random Crap
an Can I rise to the occasion? By livinggraciously.wordpress.com Published On :: Thu, 04 Jan 2018 12:59:24 +0000 We started going to a personal trainer at the end of the summer, and it’s been really good–building strength, getting healthier. But the one thing that she badgered me about was bread. “You have to stop eating bread! Gluten is terrible for you. It’s what’s making your knees hurt. It’s causing inflammation in your finger […] Full Article Baking Cooking Uncategorized
an Get up, get up and get down By livinggraciously.wordpress.com Published On :: Wed, 10 Jan 2018 12:41:55 +0000 I work from home, and the marvelous company for which I work gave me a VariDesk standing desk. I can adjust it to either a standing position or a sitting position, and I do so multiple times per day. Sitting now being the thing that’s going to kill us, I try to make sure I […] Full Article Uncategorized
an Appliance hell By livinggraciously.wordpress.com Published On :: Mon, 12 Feb 2018 05:27:41 +0000 My washer and dryer failing me is a nightmare I don’t want to visit. You see, my current set came with the house 17 years ago, and were already 5 years old. The one set of appliances I’ve never bought is a washer and dryer–I’ve always purchased houses where they’d been left behind by the […] Full Article House and home Quilting
an DATE and Switch By nonadventures.com Published On :: Mon, 05 Aug 2019 08:00:00 +0000 Full Article Wonderella
an Atlanta August 2007 1/23 By mychemicalromance-daily.dreamwidth.org Published On :: Sun, 02 Feb 2020 21:00:36 GMT Full Article tour: 2007 project revolution *performances band: group band: gerard 2007
an Atlanta August 2007 2/23 By mychemicalromance-daily.dreamwidth.org Published On :: Mon, 03 Feb 2020 21:07:21 GMT Full Article tour: 2007 project revolution band: bob band: frank: naked arms & shoulders band: gerard 2007 band: group band: frank crew: matt cortez *performances
an Atlanta August 2007 3/23 By mychemicalromance-daily.dreamwidth.org Published On :: Tue, 04 Feb 2020 20:50:19 GMT Full Article band: frank: naked arms & shoulders *performances tour: 2007 project revolution band: frank 2007 band: gerard
an Atlanta August 2007 4/23 By mychemicalromance-daily.dreamwidth.org Published On :: Wed, 05 Feb 2020 20:51:35 GMT Full Article tour: 2007 project revolution band: frank: naked arms & shoulders band: frank: tattoos *performances band: frank band: gerard 2007
an Atlanta August 2007 5/23 By mychemicalromance-daily.dreamwidth.org Published On :: Thu, 06 Feb 2020 21:14:14 GMT Full Article 2007 band: group band: gerard band: frank *performances band: frank: naked arms & shoulders tour: 2007 project revolution
an Atlanta August 2007 6/23 By mychemicalromance-daily.dreamwidth.org Published On :: Fri, 07 Feb 2020 21:19:06 GMT Full Article *performances band: frank: naked arms & shoulders tour: 2007 project revolution band: bob band: gerard 2007 band: frank
an Atlanta August 2007 7/23 By mychemicalromance-daily.dreamwidth.org Published On :: Sat, 08 Feb 2020 21:04:17 GMT Full Article band: gerard 2007 band: frank *hires tour: 2007 project revolution *performances band: frank: naked arms & shoulders
an Atlanta August 2007 8/23 By mychemicalromance-daily.dreamwidth.org Published On :: Sun, 09 Feb 2020 20:49:59 GMT Full Article tour: 2007 project revolution band: ray *performances band: gerard 2007
an Atlanta August 2007 9/23 By mychemicalromance-daily.dreamwidth.org Published On :: Mon, 10 Feb 2020 21:19:18 GMT Full Article tour: 2007 project revolution *performances band: frank: naked arms & shoulders band: group band: gerard 2007 band: frank
an Atlanta August 2007 10/23 By mychemicalromance-daily.dreamwidth.org Published On :: Tue, 11 Feb 2020 20:36:06 GMT Full Article band: frank: naked arms & shoulders *performances tour: 2007 project revolution band: bob band: frank 2007 band: gerard
an Atlanta August 2007 11/23 By mychemicalromance-daily.dreamwidth.org Published On :: Wed, 12 Feb 2020 20:00:55 GMT Full Article band: bob tour: 2007 project revolution band: frank: naked arms & shoulders *performances band: frank 2007 band: group
an Atlanta August 2007 12/23 By mychemicalromance-daily.dreamwidth.org Published On :: Thu, 13 Feb 2020 20:58:48 GMT Full Article tour: 2007 project revolution *performances band: frank: naked arms & shoulders 2007 band: frank
an Atlanta August 2007 13/23 By mychemicalromance-daily.dreamwidth.org Published On :: Fri, 14 Feb 2020 21:25:45 GMT Full Article *performances tour: 2007 project revolution 2007 band: gerard
an Atlanta August 2007 14/23 By mychemicalromance-daily.dreamwidth.org Published On :: Sat, 15 Feb 2020 21:11:41 GMT Full Article *performances 2007 band: gerard band: frank band: frank: naked arms & shoulders band: frank: tattoos tour: 2007 project revolution *hires
an Atlanta August 2007 15/23 By mychemicalromance-daily.dreamwidth.org Published On :: Sun, 16 Feb 2020 20:58:33 GMT Full Article *hires tour: 2007 project revolution band: frank: tattoos band: frank: naked arms & shoulders band: group 2007 band: gerard band: frank *performances
an Atlanta August 2007 16/23 By mychemicalromance-daily.dreamwidth.org Published On :: Mon, 17 Feb 2020 20:36:12 GMT Full Article band: frank: naked arms & shoulders band: frank: tattoos tour: 2007 project revolution *hires *performances band: frank band: group band: gerard 2007
an Atlanta August 2007 17/23 By mychemicalromance-daily.dreamwidth.org Published On :: Tue, 18 Feb 2020 21:21:36 GMT Full Article *performances band: frank: naked arms & shoulders band: bob tour: 2007 project revolution band: gerard band: group 2007
an Atlanta August 2007 18/23 By mychemicalromance-daily.dreamwidth.org Published On :: Wed, 19 Feb 2020 21:05:44 GMT Full Article tour: 2007 project revolution *performances band: group band: gerard 2007
an Atlanta August 2007 19/23 By mychemicalromance-daily.dreamwidth.org Published On :: Thu, 20 Feb 2020 20:51:41 GMT Full Article *performances tour: 2007 project revolution 2007 band: gerard
an Atlanta August 2007 20/23 By mychemicalromance-daily.dreamwidth.org Published On :: Fri, 21 Feb 2020 20:15:04 GMT Full Article tour: 2007 project revolution band: frank: naked arms & shoulders *performances band: frank 2007 band: gerard
an Atlanta August 2007 21/23 By mychemicalromance-daily.dreamwidth.org Published On :: Sat, 22 Feb 2020 20:29:13 GMT Full Article *performances band: frank band: gerard 2007 band: frank: tattoos band: frank: naked arms & shoulders tour: 2007 project revolution *hires
an Atlanta August 2007 22/23 By mychemicalromance-daily.dreamwidth.org Published On :: Sun, 23 Feb 2020 21:03:49 GMT Full Article band: frank band: gerard 2007 band: ray *performances *hires tour: 2007 project revolution band: frank: tattoos band: frank: naked arms & shoulders
an Atlanta August 2007 23/23 By mychemicalromance-daily.dreamwidth.org Published On :: Mon, 24 Feb 2020 21:39:05 GMT Full Article tour: 2007 project revolution band: frank: naked arms & shoulders *hires band: ray *performances band: frank band: gerard 2007
an Leo Zovic: Places, Peeps And Plagues By langnostic.inaimathi.ca Published On :: Sun, 26 Apr 2020 02:44:30 GMT (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)) Full Article
an Timofei Shatrov: Previewing images in and out of SLIME REPL By readevalprint.tumblr.com Published On :: Sun, 03 May 2020 10:40:15 GMT As any Common Lisp coder knows, a REPL is an incredibly useful tool. It can be used not just for development, but for running all sorts of tasks. Personally, I don't bother making my Lisp tools into executable scripts and just run them directly from SLIME. As such, any operation that requires leaving the REPL is quite inconvenient. For me, one such operation was viewing image files, for example in conjunction with my match-client:match tool. So lately I've been researching various methods to incorporate this functionality into the normal REPL workflow. Below, I present 3 methods that can be used to achieve this. Open in external program This one's easy. When you want to view a file, launch an external process with your favorite image viewer. On Windows a shell command consisting of the image filename would launch the associated application, on Linux it's necessary to provide the name of the image viewer. (defvar *image-app* nil) ;; set it to '("eog") or something (defun view-file-native (file) (let ((ns (uiop:native-namestring file))) (uiop:launch-program (if *image-app* (append *image-app* (list ns)) (uiop:escape-shell-token ns))))) Note that uiop:launch-program is used instead of uiop:run-program. The difference is that launch- is non-blocking - you can continue to work in your REPL while the image is displayed, whereas run- will not return until you close the image viewer. Also note that when the first argument to run/launch-program is a string, it is not escaped, so I have to do it manually. And if the first argument is a list, it must be a program and a list of its arguments, so merely using (list ns) wouldn’t work on Windows. Inline image in REPL The disadvantage of the previous method is that the external program might steal focus, appear on top of your REPL and disrupt your workflow. And it's well known that Emacs can do everything, including viewing images, so why not use that? In fact, SLIME has a plugin specifically for displaying images in REPL, slime-media. However it’s difficult to find any information on how to use it. Eventually I figured out that SWANK (SLIME’s CL backend) needs to send an event :write-image with appropriate arguments and slime-media's handler will display it right in the REPL. The easiest way is to just send the file path. The second argument is the resulting image's string value. If you copy-paste (sorry, "kill-yank") it in the repl, it would act just like if you typed this string. (swank::send-to-emacs '(:write-image "/path/to/test.png" "test")) You can even send raw image data using this method. I don't have anything on hand to generate raw image data so here's some code that reads from a file, converts it to a base64 string and sends it over SWANK. (with-open-file (in "/path/to/test.png" :direction :input :element-type '(unsigned-byte 8)) (let* ((arr (make-array (file-length in) :element-type '(unsigned-byte 8))) (b64 (progn (read-sequence arr in) (cl-base64:usb8-array-to-base64-string arr)))) (swank::send-to-emacs `(:write-image ((:data ,b64 :type swank-io-package::png)) "12345")))) Note that the first argument to :write-image must be a list with a single element, which is itself a plist containing :data and :type keys. :data must be a base64-encoded raw image data. :type must be a symbol in swank-io-package. It’s not exactly convenient, so if you’re going to use this functionality a helper function/macro might be necessary. Image in a SLIME popup buffer Inline images are not always convenient. They can’t be resized, and will take up as much space as is necessary to display them. Meanwhile EMACS itself has a built-in image viewer (image-mode) which can fit images to width or height of a buffer. And SLIME has a concept of a “popup buffer” which is for example used by macroexpander (C-c C-m) to display the result of a macro expansion in a separate window. Interestingly, slime-media.el defines an event :popup-buffer but it seems impossible to trigger it from SWANK. It is however a useful code reference for how to create the popup buffer in ELisp. This time we won’t bother with “events” and just straight up execute some ELisp code using swank::eval-in-emacs. However by default, this feature is disabled on Emacs-side, so you’ll have to set Emacs variable slime-enable-evaluate-in-emacs to t in order for this method to work. Also Emacs must be compiled with ImageMagick for the resizing functionality to work. Anyway, the code to view file in the popup buffer looks like this: (defun view-file-slime (file &key (bufname "*image-viewer*")) (let ((ns (namestring file))) (swank::eval-in-emacs `(progn (slime-with-popup-buffer (,bufname :connection t :package t) (insert-image (create-image ,ns)) (image-mode) (setf buffer-file-name ,ns) (not-modified) (image-toggle-display-image)) ;; try to resize the image after the buffer is displayed (with-current-buffer ,bufname (image-toggle-display-image)))))) )) Arriving to this solution has required reading image-mode’s source code to understand what exactly makes image-mode behave just like if the image file was opened in Emacs via C-x C-f. First off, image-mode can be a major and a minor mode - and the minor mode is not nearly as useful. slime-with-popup-buffer has a :mode keyword argument but it would cause image-mode to be set before the image is inserted, and it will be a minor mode in this case! Therefore (image-mode) must be called after insert-image. Next, the buffer must satisfy several conditions in order to get image data from the filename and not from the buffer itself. Technically it shouldn’t be necessary, but I couldn’t get auto resizing to work when data-p is true. So I set buffer-file-name to image’s filename and set not-modified flag on. Next, image-toggle-display-image is called to possibly resize the image according to image-mode settings. It's called outside of slime-with-popup-buffer for the following reason: the buffer might not yet be visible and have any specific dimensions assigned to it, and therefore resizing will do nothing. Here’s an example of how calling this function looks in Emacs. The position of the popup buffer depends on whether the original Emacs window is wide enough or not. I think it looks better when it’s divided vertically. Use M-x image-transform-fit-to-height or M-x image-transform-fit-to-width to set up the auto-resizing method (it gets remembered for future images). Unfortunately there’s no way to fit both height and width, at least with vanilla Emacs. I prefer fit-to-width because in case the image is too tall, it is possible to scroll the image vertically with M-PgDn and M-PgUp from the other buffer. Unlike other image-mode buffers, this buffer supports a shortcut q to close itself, as well as various SLIME shortcuts, for example C-c C-z to return to the REPL. That's it for now, hope you enjoyed this overview and if you happen to know a better way to display images in Emacs, I would be interested to hear about it. Full Article
an Nicolas Hafner: Creative Block - May Kandria Update By reader.tymoon.eu Published On :: Sun, 03 May 2020 16:31:18 GMT It's a new month, and that usually means I'm supposed to write a monthly update on the progress with Kandria. Thinking about that though made me feel very depressed because I realised that I hadn't really done anything at all for the game, all of April. I can blame however much I want of that on the quarantine and university stress, or whatever else, but it won't change the fact that there has not been much progress on any front. While I have been slacking a lot, it's not like I haven't been working at all - plenty of time has gone into Courier, after all. When I had this realisation yesterday, I tried my best to push myself to work on the game any way I could, but I failed to find anything that I could actually convince myself to do. That isn't to say that there aren't things to do; god forbid there's a tonne of things! Tuning combat, drawing animations, writing the UI, fixing dialogue, starting on enemy AI, optimising performance - just to name a few. And yet, despite the breadth and depth of things to do, there was absolutely nothing that looked appealing to me. This kind of feeling is nothing new to me. It's a creative block, and happens more often that I'd like to admit. It's also why I often don't like to start long running projects, because I'm afraid of a creative block that would ruin it. The worst part about the creative block is that there's no remedy for it. You just get stuck in a rut, and it sucks a whole lot for a completely unpredictable amount of time. Often what I end up doing, whether consciously so or not, is switching to another project and just working on that. So far that project has been Courier, but that's at its end and I'm also starting to feel burnt out on it, too. I don't have any other projects queued up that I'd like to tackle, or new ideas on what to do at the moment, so I'm just... stuck. I suppose the right thing to do in this situation is to take it easy and not fret too much over it, since that's often one of the many factors causing the block. I've never been good at actually doing that, though. Maybe I should try to take a break from programming in general? I don't know. You may be wondering why I'm writing this all to begin with. Well, partly I feel like I promised to do monthly and weekly updates, and I really hate to break that promise without notice. Another part is that I just feel like I owe you the discretion to tell you what's going on with me. I'm very thankful for the email replies and general responses I've gotten for Kandria so far, I really am! Because of that genuine interest, I feel all the more pressured not to disappoint. Since I have nothing to show though, I thought the only proper course of action is to just be open and direct about it. So I'll just say it again: aside from updating the public demo, no progress has been made at all. Maybe it would help me to have a more open discussion about this topic in general, instead of just it being me telling you that I'm in a bad place. So please, let me know: have you been in similar situations before? What helped you deal with them? Is there something in Kandria I could try to focus on that you, personally, would like to see? You can reach me at shinmera@tymoon.eu. Full Article
an Marco Antoniotti: New version of HEΛP By within-parens.blogspot.com Published On :: Sun, 03 May 2020 21:44:00 GMT After ELS 2020 I got some time to get back and do some hacking on Common Lisp. The first result is a new version of HEΛP that fixes some bugs and is in general much more robust on both Un*x and Windows platforms. One outstanding issue is the reliance of the library on READ, which does cause some problems when reading pure source code. On a next iteration I may use Eclector, which is a drop-in replacement for READ with finer control on error handling. In any case, if you need HEΛP to document your program, just follow the link. (cheers) Full Article
an Marco Antoniotti: Digging CLAST By within-parens.blogspot.com Published On :: Tue, 05 May 2020 14:22:00 GMT Again, after ELS 2020, I went back to double check the actual status of some of my libraries (after an embarrassing nag by Marco Heisig :) who caught me sleeping). I updated the documentation of CLAST, and checked that its current status is ok; the only change I had to make was to conform to the latest ASDF expectations for test systems. Of course, you may find many more bugs. CLAST is a library that produces abstract syntax trees munging Common Lisp sources. To do so, it relies on CLtL2 environments, which, as we all know, are in a sorry state in many implementations. Yet, CLAST is usable, at least for people who are ... CLAZY enough to use it. (cheers) Full Article
an Leo Zovic: Zippers And Clj By langnostic.inaimathi.ca Published On :: Fri, 08 May 2020 18:49:52 GMT 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 ClojureSeriously.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-zipperThe 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 HousekeepingThat 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. 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.↩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.↩"First", not "only". You can probably make educated guesses about which other ones I think you should learn.↩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.↩ Full Article
an Native Plants From Etsy By maryannemohanraj.com Published On :: Thu, 07 May 2020 11:17:42 +0000 So, I ordered a bunch of native plants on Etsy, and they were WAY cheaper than they are in stores around here. They came as chunks of root, essentially. It only occurred to me after I ordered to worry about why they were so cheap — is it possible they’re being illegally harvested from woodlands? … Continue reading "Native Plants From Etsy" Full Article Serendib Garden
an my year in cities and towns, 2019 By www.jessamyn.com Published On :: Sat, 04 Jan 2020 04:15:13 +0000 Really serious about staying out of airplanes now. Two airplane trips this year. A low key summer not feeling terrific. Lots of time doing more local stuff and not regretting it at all. Here is the short list of places. Four states. Stars indicate multiple visits to the exact same place. Past years: 2018, 2017, […] Full Article Uncategorized cities data guestrooms me travel wrapup
an Old Man Yells At Cloud (Marvel edition) By mightygodking.com Published On :: Wed, 09 Oct 2019 01:51:38 +0000 So Martin Scorsese said that the Marvel movies are “not cinema” and the internet kind of blew up because it is inherently polarizing, and the possibility that Scorsese is both one of our most talented living directors and also wrong about this particular subject is not particularly fun discourse for a lot of people on […] Full Article Comics Flicks General Nerd Crap
an Bushnell Wingman GPS Speaker By uncrate.com Published On :: Fri, 08 May 2020 10:00:01 -0500 Full Article Audio & Speakers
an Assembly Coffee Roasters Rwanda Bumbogo Coffee By uncrate.com Published On :: Fri, 08 May 2020 16:00:44 -0500 Full Article Coffee
an Location manager By fun-movie-trivia.blogspot.com Published On :: Fri, 14 Sep 2012 01:44:00 +0000 Full Article Filmmaking Terms
an Japan cinema By fun-movie-trivia.blogspot.com Published On :: Sun, 16 Sep 2012 02:30:00 +0000 Full Article World Cinema
an Frankenstein By fun-movie-trivia.blogspot.com Published On :: Wed, 13 Nov 2013 15:29:00 +0000 Full Article 90s Movies Film Adaptations
an A Clockwork Orange By fun-movie-trivia.blogspot.com Published On :: Wed, 13 Nov 2013 18:28:00 +0000 Full Article 70s Movies Film Adaptations
an Ombudsman office renamed to Ombuds By oto-usa.org Published On :: Mon, 02 Dec 2019 04:36:41 +0000 The office formerly known as the U.S. Grand Lodge Ombudsman has been renamed to Ombuds. The purpose of this office remains as described on the U.S.G.L. Government Contacts page: The office of the U.S. Grand Lodge Ombuds serves as an official liaison between the general membership of O.T.O. within the United States and the various … Continue reading Full Article Actions
an Spring 2020 gatherings cancelled By oto-usa.org Published On :: Tue, 03 Mar 2020 19:23:50 +0000 Out of an abundance of caution regarding the developing COVID-19 situation, U.S. Grand Lodge has decided to cancel its scheduled national gatherings this spring, specifically Advanced Initiator Training, Kaaba Colloquium, and the Electoral College meeting. The Electoral College meeting will be held online according to standard Electoral College procedures. For more information regarding COVID-19, please … Continue reading Full Article Events
an Support your local body during the COVID-19 pandemic By oto-usa.org Published On :: Fri, 13 Mar 2020 00:18:48 +0000 Event cancellations at local bodies due to COVID-19 will reduce revenue, but not rent and other fixed expenses. Many local bodies already operate on extremely tight margins and struggle to pay their bills even during normal times. All members are encouraged to continue to financially support their local bodies, even if there are no events … Continue reading Full Article Policy
an A message from the Grand Master on pandemic response By oto-usa.org Published On :: Mon, 16 Mar 2020 17:46:11 +0000 The Grand Master Sabazius has provided some useful information and advice to O.T.O. members about how to respond to the COVID-19 pandemic. Full Article Policy
an standing there By www.marriedtothesea.com Published On :: Thu, 15 Aug 2019 04:00:00 EDT Today on Married To The Sea: standing thereThe Worst Things For Sale is Drew's blog. It updates every day. Subscribe to the Worst Things For Sale RSS! Full Article autogen_comic
an you cant leave now By www.marriedtothesea.com Published On :: Thu, 29 Aug 2019 04:00:00 EDT Today on Married To The Sea: you cant leave nowThe Worst Things For Sale is Drew's blog. It updates every day. Subscribe to the Worst Things For Sale RSS! Full Article autogen_comic