com

Surviving The World - classic comics


This comic was originally posted in 2017.

Thoughts from 6/6/2020: This comic originally ran with pretty straightforward commentary underneath: "White supremacists can go to hell. And any other monsters like them can go to hell as well. And may the rest of us never join them, actively or passively."

I never explicitly said it in STW and I should have, but Black Lives Matter.

When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.

This is the bare utter minimum that I can do and will do, but it's a start. Hopefully this will help make the title of this comic be a real-world existence for more people.




com

Surviving The World - classic comics


This comic was originally posted in 2017.

Thoughts from 6/7/2020: The flags at the bottom were for trans rights, given when this originally posted, but given the current Black Rights Matter protest, and JKR even further torpedoing her legacy yesterday with her transphobia (happy Pride, by the way), this comic seems like it meets the current moment well enough.

When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.

This is the bare utter minimum that I can do and will do, but it's a start. Hopefully this will help make the title of this comic be a real-world existence for more people.




com

Surviving The World - classic comics





These comics were originally posted in 2011, 2012, 2017, and 2018, respectively.

Thoughts from 6/10/2020: Sprite had to be put down today. We were insanely fortunate to have her as part of our family for so long - we had her since 2006 - but no 14-year-old cat lives forever. She was easily the greatest cat I've ever had, the cat that changed my entire perspective on her species. She used to come running if I called 'henchman!' so she would watch Red Sox games with me. She ate the 4 pet birds we had when she broke their cage open. She would put her cat toys away at night before climbing into bed. She used to let me use her body to erase the chalkboard. She knew she was the boss of the house but she was incredibly sweet. The only reason it took over 800 comics for her to show up on STW before becoming the first cat TA was that I couldn't sneak her into Cornell engineering buildings like I could the dog. I'm heartbroken today.

There are bigger crises at hand right now, and this loss is certainly not equivalent. But it's still a big loss to me.

Black Lives Matter / Coronavirus help: >When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.

This is the bare utter minimum that I can do and will do, but it's a start. Hopefully this will help make the title of this comic be a real-world existence for more people.




com

Surviving The World - classic comics


This comic was originally posted in 2010 for the repeal of Don't Ask Don't Tell.

Thoughts from 6/16/2020: Didn't expect that full win yesterday. Thought they would find a way to split the baby. I'll take every simple win they'll give us.

Black Lives Matter / Coronavirus help: >When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.

This is the bare utter minimum that I can do and will do, but it's a start. Hopefully this will help make the title of this comic be a real-world existence for more people.




com

Surviving The World - classic comics


This comic was originally posted in 2017.

Thoughts from 6/30/2020: There's a lot of pro-LGBTQ comics throughout STW, which was probably a sign to some extent that I was hiding a part of my queerness throughout the run of the comic, even if I didn't know that I was NB until a month or so after this specific comic came out, actually. I can regret the lost time but I don't think I'd be in the solid place I am now if I had come out earlier, so I try to keep that in mind (even if I often fail at doing so). Anyway, today is the last day of Pride Month for 2020 and to keep in mind the protests of the last month, there wouldn't be the degree of LGBTQ rights that there are now if it hadn't been for Black trans women like Marsha P. Johnson leading the way in the first place. So here's to those who fight for who they are and have the courage to exist despite the world trying to keep them in the shadows.

Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2009.

Thoughts from 7/1/2020: Halfway through the year and I'm sure those resolutions are going well, right? This year in particular ...

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2017.

Thoughts from 7/3/2020: The best part about this comic is that it is still true and we can just reflect on a different subset of society this time. For some reason, and I can't figure out why, it's been very hard for me to celebrate July 4th the last few years ...

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2017.

Thoughts from 7/4/2020: I don't think the strength of those morals have improved at all in the last few years, either.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2009.

Thoughts from 7/6/2020: Not to worry, third hands will just go away on their own. Nothing to worry about here.

I remember being particularly pleased with how elastic my face could be back in some of these comics. Alas, as time passes ...

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2016.

Thoughts from 7/19/2020: This one must have come to me in a fever dream. Anyway, this was from theSwede's and my 8th anniversary, and now it's the 12th. Hurray or something.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2011.

Thoughts from 12/23/2020: My kids haven't asked me yet because they still believe, but when they do, I'm absolutely going to be pushing this explanation, are you kidding?

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2016.

Thoughts from 12/24/2020: I remember being so insanely proud of this one for being clever. Most readers were super blah about it. So it goes.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2011.

Thoughts from 12/25/2020: If anything, it seems pretty likely that this turned out to be true for 2019. We always wondered what would happen, and the answer is apparently 2020?

Anyway, I wish you all a Merry Christmas and Happy Holidays, as best as they can possibly be.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2017.

Thoughts from 12/28/2020: This feels extremely true when the holidays line up with a pandemic as well.

The biggest transition that occurs over the run of STW wasn't the slow ravages of kids and students and time having their way with me, but the switch to near-constant wordplay as opposed to searching the internet for ideas to make comics about.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2014.

Thoughts from 12/29/2020: There are a few general comics that would have made for good book collections on their own, and the anatomy ones like this would have been a relatively good option.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2016.

Thoughts from 12/30/2020: This one is very weird and I may have had many rumballs by the time I made it. But this has been a weird year so why not run with it.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2009.

Thoughts from 12/31/2020: I continue to like Semisonic's "This Will Be My Year" as an ode to hoping the best for the new year, but Mac McCaughan's "Happy New Year (Prince Can't Die Again)" has been pretty appropriate for every year since it came out at the end of 2016.

I wish you and all of yours the best in the 2021. I sincerely hope that it comes to you and all of us. And I will put in the action that I can to help make sure we're not just relying on hope - and I ask you to do the same.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2014.

Thoughts from 1/1/2021: I really nailed that pose. Also, 2021 just looks weird.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

Surviving The World - classic comics


This comic was originally posted in 2009.

Thoughts from 1/4/2021: Westley, or as he was called here on the site, German, which is a joke that I'm still very proud of, passed away in 2018 but shows up every now and then on the internet because of this particular comic. The URL was removed from that image because of course it was, but it's weird seeing other people present your old dog off and on. I like this one in particular because it reminds me I snuck Westley into the chemical engineering building at Cornell for about 30 minutes just to make this comic and no one noticed that I'd done it. I'm not sure if I would have gotten in trouble or if the sight would have been so confusing that they wouldn't have known what to make of it.

Donate to Black Lives Matter / Coronavirus help: When STW ended, we made a book of the best 300 comics. You can buy the PDF of the book right now, and all sales are going to go to support Black Lives Matter, and foodbanks in need because of the coronavirus. And there's more. You can also buy all the videos ever made for STW, including many that were not openly shared, and all sales are also going to the same causes.




com

The Healing Process of Remorse and Self-Forgiveness * Wicca-Spirituality.com

 


Although often confused with guilt and shame, remorse is actually a much higher calibrating "emotion." It's the 21st Century alternative to feeling bad about yourself, and making others around you feel bad too.


It not only feels better and helps you move forward in your life, but it is healing for the Earth... and as we ride the 2012 Transition, Mother Earth needs all the help we can give her!


This article explains how it works, and why you are worthy of forgiveness.

 

Remorse is a method to heal yourself, and others, after making a mistake.


After all, anything that brings a feeling of remorse is a mistake -- just a mistake. Did you know that's the origin of the word "sin"? "Sin" was an archery term; it means missing the mark. That leaves a lot more possibility for positive growth, doesn't it!


So you don't need to berate yourself for eternity. There is nothing to berate yourself for if you didn't know any better, or if you did the best you could.


And I believe we always do the best we can, with what we have in the moment.


We're not perfect. Sometimes we do things we're not proud of. But, in the moment, that was undoubtedly the best that we could do.


Maybe you gave in to your meaner impulses. If you could have held yourself to a higher ideal in that moment, you would have done so. What would you have to gain, by not?


Maybe you didn't know how to do better. You can only work with what you know.


God does not expect you to know what you do not yet know!


For whatever reason -- fatigue, stress, anxiety, confusion, distraction, etc -- maybe you didn't do the best you hoped for. Maybe it wasn't as good as you could have done another day.


But you obviously did the best you could in that moment.


Why would anyone do less than that?


God doesn't need you to burn in hell for it, not even the hell of your own harsh thoughts. She only wants you to learn from the process, and to use it to grow. That's what remorse is all about.

 

There are four parts to the process of remorse.


The first part is a pang in your Heart. There is an energy there, call it an emotion if you like, that signals you are not happy with your actions.


From here, many people get derailed into guilt, instead of continuing the process of remorse.


The second part is the most important, the core of remorse...


You accept that you made a mistake. And you make an unemotional, practical assessment of your actions.


When your actions and choices don't live up to your ideals or ethics... you figure out how you could do better, discover what was moving in you (probably subconsciously) that caused that action, and -- here's the critical bit -- resolve to do better next time.

Remorse is calm and determined. Rather than destroying your self-respect, remorse enhances it. It provides you with the opportunity to grow, to live up to your ideals.


It recognises that within you there is a perfect being, capable of the best.


And that there is always another opportunity to try.


Contrast that with shame, which says that you are worthless and hopeless. There's just nowhere good to go, from there!


Remorse doesn't take the mistake personally. It sees an action as wrong, but not you as a person.


Remorse knows that people can't accurately, honestly be judged in terms of "wrong" and "bad."


The next step is always making amends. You must undo the error, to the best of your ability. And apologise, if it won't make things worse.


We must be clear -- this step has nothing to do with being forgiven by another person. Whether they forgive you or not is about them and their process, and is not about you.


To seek someone's forgiveness when they aren't ready to give it can be a further harm.


You fix the mistake if you can. That is the only purpose of this step.


Inherent in this process is self-forgiveness. You see a mistake, you acknowledge it, you figure out what went wrong, you fix it if you can, and you determine to not make that mistake again.


When you've done all that, forgiveness is a lot easier.


You can forgive yourself, because you know you aren't a bad person who intentionally did wrong... and because you are doing your best not to slip up that way in the future.


No one is perfect. No one is expected, by the Divine, not to make mistakes. On the contrary, that's often how we learn and grow.


That's all the Divine wants of you. Not perfection. But learning and growing from your slip-ups.


So you can accept that you did the best you were able to, at the time. And forgive yourself, for being human and humanly fallible.

 

If you get stuck in guilt, look for the underlying shame. Shame is like Velcro to guilt. It tells you that you deserve to feel terrible guilt, that you are not worthy of forgiveness or compassion or kindness.


But shame LIES.


You are worthy of forgiveness, because you are not a flawed person.You are Divinity tasting life as a mortal individual -- nothing else.


It doesn't matter what your family or coworkers or boss thinks of you. It doesn't matter how you've been treated by others -- that's nothing to do with YOU, that's all about the (human) blindness of others.


You are infinitely worthy and loveable!


And when others can't see that it's only because they haven't realised that they are infinitely worthy and loveable. When people get tied down, in their minds, into one little frail animal body and one small human life, all kinds of such misconceptions arise!


But it's not the truth.


The truth is that you are eternal -- learning and growing and polishing yourself on challenge after challenge, life after life.


The soul that is truly you is infinitely worthy and Divine. The body and mind you think of as you are only a costume that put on for a while, and then point aside, to go home for dinner and a bath, a good rest, to get up and come play again.


So how do you as a mere mortal forgive yourself?


The same way you forgive anyone... With compassion for your human frailty: you really are doing our best with what you have. With perspective: understanding that this life is a playground and schoolroom, and not the life-or-death struggle it seems. With determination to not make the same mistake again.


With Bright Blessings,




com

Creality K2 Plus Combo ready to rock the multicolor 3D printing landscape

NEWS – The color-capable K2 Plus has been a hot topic, since Creality, a world-leading 3D printer brand, heralded it in the spring of 2024. “Your dreams in color come true” as the K2 Plus x CFS Combo hits the shelve on November 11. Unifying multicolor, speed, intelligence, and a 350mm cubed format in one, […]




com

Comfier towel and blanket warmer review – keeps you toasty

REVIEW – When we lived in Europe, our home had a heated towel bar in the bathroom. It seemed like such a decadent little thing, but as fall turns to winter I recall just how nice it was to step out of the shower and reach for a warm towel. When the Comfier towel and […]




com

THE SPELLSHOP comes out today!!!

I am over-the-moon excited to share with you that today is the book birthday for my newest book, THE SPELLSHOP! It's a cozy fantasy about a rogue librarian and her best friend, a sentient spider plant, who take on the low-stakes market of illegal spellmaking and the high-risk business of starting over. And it's for anyone who is looking for a slice of joy, a bit of comfort, or just a deep breath.


I wrote this book to feel like a warm hug. Or like drinking hot chocolate. Or like eating really good raspberry jam. Or a cinnamon roll, with hot chocolate and maybe some raspberry jam on the side...

We've all been through a lot over the past few years, and I wrote THE SPELLSHOP for anyone who wants to escape into a world filled with kindness and enchantment.


Thank you to everyone at Macmillan/Tor/Bramble for bringing this book to life and gracing it with Lulu Chen's beautiful cover art and such lovely lavender sprayed edges!

If you'd like to learn more about the book or read the first chapter, please visit my website: http://www.sarahbethdurst.com/Spellshop.htm

I'm also going on book tour starting today, and I'm so excited!! If you'd like to join me at any of my tour stops, I'd love to see you! For details, see the Events page of my website.

Happy reading!!!




com

San Diego Comic-Con 2024 Schedule

Very excited for San Diego Comic-Con!!! Here's my full schedule. Hope to see you there!




com

San Diego Comic-Con 2024 Photos

 Had an amazing time at San Diego Comic-Con!!! 























com

Board Game Review: Lost Cities Roll & Write (A Comparison to the Original Lost Cities)

I really love the card game Lost Cities, designed by Reiner Knizia. When my husband Christopher and I were first getting to know each other, we used to meet up at Starbucks sometimes and play games. Lost Cities was one of our frequent picks. It’s a head to head, two player game in which both players are trying to outscore each other by laying down ascending runs of card suits on a small board between the two of them. There’s a theme laid over the mechanism (completing expeditions in the lost world) but it’s basically pasted on and so that is the last we will speak of it. So there we were, newly in love, eyeing each other across the table, smiling and flirting, and doing our best to beat one another at Lost Cities. It was awesome. And now, with the roll & write genre having made an impressive rebound a few years ago (let’s not forget the mechanism has actually been around since the 50s with Yatzee), Knizia has ported his award winning game Lost Cities  into this format, releasing Lost Cities Roll & Write  in 2021. 

You can play the new Lost Cities  with up to 5 players, but in an ode to our romantic beginnings, Christopher and I played it exclusively with one another in successive matches.  The components are compact, lacking the pretty illustrations of the original game, and few in number – the rule book, a scorepad, three pentagonal trapezohedron dice (that’s 10 sided dice for the uninitiated), and three 6 sided custom dice with color suit symbols. Oh, and some pencils. That’s it. We could have played on an even smaller Starbucks table if we had this back in our dating days.

The cards from the original game (wager cards and numbered cards 2 to 10, in five different suits) have been translated into dice roll results. On each turn, one player rolls all the dice and chooses one of the six sided dice to represent the suit and one of the ten sided dice to represent the number. A zero on the number die can represent either zero (mimicking the wager card from the original game which serves as a multiplier for the total score in the selected suit) or ten (mimicking the highest card in each suit).

In place of the tableau built up on a central board, each player tracks the progress of wager and number cards they’ve collected for each suit in color coded columns on their individual score sheet. Wager cards have been transformed into little circular boxes to be marked off from a suit column when rolled, while the numbered cards from the original game have expanded to include the number 1 and are recorded as numbers written manually in the square boxes running up each column. Whereas in the original game, only cards higher than the last card played in a suit were permitted to be played on subsequent turns by the same player, in Lost Cities Roll & Write, numbers that are higher than or equal to the last number recorded for a suit may be written into the column after future dice rolls. Expanding beyond the concepts from the original game, Knizia has included artifact icons on select spaces in each column and when those spaces are filled by a player, they may fill in one of the jars in the artifact column. Likewise, he’s included arrow icons on select spaces and when those spaces are filled by a player, they may fill in the next box in one of their suit columns with the number from the previous box in the column – note that it does not have to be the same column in which the arrow was filled.  There’s also a column for filling in dice shapes to represent rolls where a player could not or did not want to use any of the dice results. The latter column is particularly tricky to manage effectively, as it provides a similar point progression as the rest of the columns (negative scores for the first 3 boxes filled and then positive score for the rest) up until the last box in the column. If you color in that box, your score for the dice shapes column drops from 70 to 0. The bonus points awarded in the original game (20 points for laying down at least 8 cards in a suit) have been implemented in Lost Cities Roll & Write  for each column (including the artifact and dice shape columns) as a 20 point bonus to the player who is the first to fill in 7 boxes in the column on the scorepad. The roll & write game ends when either both players have filled in the dice shapes column completely or all eight columns have passed the bonus point marker. In our experience, the completed dice shapes column is a much more common trigger.

I’ve played a ton of roll & write games over the past few years. Some are instant objects of adoration, while others are infuriating piles of poo (I’m looking at you Imperial Settlers R&W). Lost Cities Roll & Write is fantastic; a great addition to the genre. Knizia did an excellent job of translating the feel of the original game into the new mechanism. The iconography is clean and easy to read and the game can be taught and played in less than a half hour. And of course, it takes up very little table real estate, making it perfect for travel or tight spaces (when traveling as a passenger, simply roll the dice into the box cover). If you twisted my arm and forced me to choose between Lost Cities or Lost Cities Roll & Write, I’d be forced to pick the original, but only because of the lovely artwork on the cards and the sentimental value I have attached to the game after my love and I played it in our early days. But who would go around doing such arm twisting? Nobody. Therefore, with a retail price point under $15 for each of these, unless you’re down to your last $15, I recommend you pick up both. Play the card game with someone you love when you have a little more table space. Play the roll & write anywhere, with up to four additional friends. 

-------------------------------------------------

Publisher: Kosmos
Players: 2-5 (We played with 2)
Actual Playing Time (vs the guideline on the box): about 20 minutes per game
Game type: roll & write, dice rolling

Rating:

Rating scale:
OUI: I would play this game again; this game is ok. I probably would not buy this game myself but I would play it with those who own it and if someone gave it to me I would keep it.
OUI OUI: I would play this game again; this game is good. I would buy this game.
OUI OUI OUI: I LOVE THIS GAME. I MUST HAVE THIS GAME.
NON: I would not play this game again. I would return this game or give it away if it was given to me.



  • board game reviews
  • dice rolling games
  • Kosmos
  • roll and write

com

Come see me on book tour!

My 25th novel, The Downloaded, is now available for pre-order in both print and ebook editions, and I’ll be touring across Canada starting next month to promote its release. Here are my May 2024 book-launch events: all are free and open to everyone, and books will be for sale (or bring your own copies and get them signed): Calgary Public […]




com

Ken and Robin Talk About Stuff: You May Be Competent

In the latest episode of their tightly-wrapped podcast, Ken and Robin talk vampire firewalling, the espionage of Jan van Eyck, weird war mummies, and the Quasi War.




com

The Complete America’s Great Trails Act

American Hiking Society constantly monitors legislation that could enhance or protect the hiking experience. A new bill, HR 1912 - the Complete America’s Great Trails Act - has the potential to significantly benefit some of the most spectacular trails in America. This proposed legislation would grant a tax credit to private landowners who provide conservation easements to certified National Scenic Trails – resulting in a low-cost incentive for willing landowners to donate easements that would increase trail connectivity. This means that private landowners have a new incentive to allow hikers to pass through their property, and trails get a guaranteed corridor that protects the connectivity and continuity of the hiking experience for years to come!

American Hiking supports HR 1912 and applauds Rep. Connolly (D-VA) and Rep. Lummis (R-WY) for introducing this forward-thinking legislation. We also applaud Rep. Blumenauer (D-OR) and Rep. Bono-Mack (R-CA), co-chairs of the Congressional Trails Caucus, and Reps. Kind (D-WI), Massa (D-NY), McMahon (D-NY), Lance (R-NJ), Polis (D-Co), Boccieri (D-OH), Pierluisi (D-RC-PR), for their original co-sponsorship of this important legislation.

American Hiking advocates for changes in policies that provide our partners with as many tools as possible to protect and manage our nation’s great trails. Thus, we work closely with regional and local organizations that protect, maintain and promote the various elements of America’s National Trails System. We also partner with Congress and the federal land management agencies charged with managing and administering our trail resources.

American Hiking has championed the protection and enhancement of America’s National Trails System since our founding in 1976. Our National Trails System consists of more than 7,000 authorized miles of National Scenic Trails, more than 36,000 miles of National Historic Trail routes, and more than 1,000 registered National Recreation Trails.

Take Action to urge your Representative to co-sponsor HR 1912.

Read the full text of HR 1912, and read the Dear Colleague Letter being circulated by Reps. Connolly and Lummis.





com

Streaks of fire are about to take over Australian skies during the Leonid meteor shower. Here’s how to see them - nbnnews.com.au

  1. Streaks of fire are about to take over Australian skies during the Leonid meteor shower. Here’s how to see them  nbnnews.com.au
  2. The Northern Taurid meteor shower could produce fireballs. Here’s how to watch  CNN
  3. Northern Taurid meteor shower hits peak activity this week: When and where to watch  USA TODAY
  4. Leonid Meteor Shower May Put on a Surprise Show This Week  ScienceAlert
  5. Starwatch: Leonid meteor shower returns to skies in November  The Guardian





com

Overcoming Objections

Telephone Fundraising would be much easier if everyone you called said yes, but in the real world, nine out of ten people on a campaign may reject you outright. The key to converting a small percentage of those no's to yes's is understanding why the donor is saying no to you. some of the more common objections and the ways to get beyond them are listed below.


Donor has no time to take a call. In x


More to come later....




com

Cognition, culture, … and communication?

An interesting recent review article (Wooster et al., "Animal cognition and culture mediate predator–prey interactions", Trends in Ecology & Evolution 2024) argues for bridging the academic silos of "predator-prey ecology" and "animal cognition and culture": Abstract: Predator–prey ecology and the study of animal cognition and culture have emerged as independent disciplines. Research combining these disciplines […]




com

Does Jupiter protect Earth from asteroids and comets?

Jupiter has often been thought to protect the inner Solar System from asteroids and comets, but new research has shown that the giant planet may actually increase the risk of an impact.




com

How to spot Comet Tsuchinshan-Atlas

Catch this once-in-a-lifetime comet over the next few days.




com

Scott L. Burson: Comparison: FSet vs. Sycamore

[BULLETIN: Quicklisp now has the latest version of FSet.]

Sycamore, primarily by Neil Dantam, is a functional collections library that is built around the same weight-balanced binary tree data structure (with leaf vectors) that FSet uses.  While the README on that page comments briefly on the differences between Sycamore and FSet, I don't feel that it does FSet justice.  Here is my analysis.

Dantam claims that his library is 30% to 50% faster than FSet on common operations.  While I haven't done comprehensive micro-benchmarking, a couple of quick tests indicates that this claim is plausible.  A look through the internals of the implementation confirms that it is clean and tight, and I must commend him.  There may be some techniques in here that I could usefully borrow.

Most of the performance difference is necessitated by two design choices that were made differently in the two libraries.  One of these Dantam mentions in his comparison: FSet's use of a single, global ordering relation implemented as a CLOS generic function, vs. Sycamore's more standard choice of requiring a comparison function to be supplied when a collection is created.  The other one he doesn't mention: the fact that FSet supports a notion of equivalent-but-unequal values, which are values that are incomparable — there's no way, or at least no obvious way, to say which is less than the other, and yet we want to treat them as unequal.  The simplest example is the integer 1 and the single-float 1.0, which have equal numerical values (and cl:= returns true on them), but which are nonetheless not eql.  (I have a previous blog post that goes into a lot more detail about equality and comparison.)  Since Sycamore expects the user-supplied comparison function to return an integer that is negative, zero, or positive to indicate the ordering of its arguments, there's no encoding for the equivalent-but-unequal case, nor is there any of the code that would be required to handle that case.

Both of these decisions were driven by my goal for the FSet project.  I didn't just want to provide a functional collections library that could be called occasionally when one had a specific need for such a data structure.  My ambition was much grander: to make functional collections into a reasonable default choice for the vast majority of programming situations.  I wanted FSet users (including, of course, myself) to be able to use functional collections freely, with very little extra effort or thought.  While Lisp by itself reaches a little bit in this direction — lists can certainly be used functionally — lists used as functional collections run into severe time complexity problems as those collections get large.  I wanted the FSet collections to be as convenient and well-supported as lists, but without the time complexity issues.

— Or rather, I wanted them to be even more convenient than lists.  Before writing FSet, I had spent years working in a little-known proprietary language called Refine, which happened to be implemented on top of Common Lisp, so it was not unusual to switch between the two languages.  And I had noticed something.  In contrast to CL, with its several different predefined equality predicates and with its functions that take :test arguments to specify which one to use, Refine has a single notiion of equality.  The value space is cleanly divided between immutable types, which are compared by value — along with numbers, these include strings, sets, maps, and seqs — and mutable objects, which are always compared by identity.  And it worked!  I found I did not miss the ability to specify an equality predicate when performing an operation such as "union".  It was just never needed.  Get equality right at the language level, and the problem goes away.

Although FSet's compare generic function isn't just for equality — it also defines an ordering that is used by the binary trees — I thought it would probably turn out to be the case that a single global ordering, implemented as a generic function and therefore extensible, would be fine the vast majority of the time.  I think experience has borne this out.  And just as you can mix types in Lisp lists — say, numbers and symbols — without further thought, so you can have any combination of types in an FSet set, effortlessly.  (A project I'm currently working on actually takes considerable advantage of this capability.)

As for supporting equivalent-but-unequal values, this desideratum flows directly from the principle of least astonishment.  While it might not be too surprising for a set or map implementation to fail distinguish the integer 1 from the float 1.0, it certainly would be very surprising, and almost certainly a source of bugs in a compiler that used it, for it to fail to distinguish two uninterned symbols with the same name.  (I saw a macro expansion recently that contained two distinct symbols that both printed as #:NEW.  It happens.)  A compiler using Sycamore for a map on symbols would have to supply a comparison function that accounted for this; it couldn't just compare the package name and symbol name.  (You'd have to do something like keep a weak hash table mapping symbols to integers, assigned in the order in which the comparison function encountered them.  It's doable, but FSet protects you from this madness.)

Along with those deep semantic design choices, I've spent a lot of time on developing a wide and featureful API for FSet (an effort that's ongoing).  FSet has many features that Sycamore lacks, including:

  • seqs, a binary-tree sequence implementation that holds arbitrary Lisp objects (Sycamore ropes hold only characters, which is certainly an important special case, but why restrict ourselves?)
  • default values for maps and seqs (the value to return when the key is outside the domain is associated with the collection, not supplied at the call site; this turns out to be a significant convenience)
  • generic functions that operate on both lists and FSet collections, to shadow the CL builtins
  • the powerful map-union and map-intersection operations (I'll blog about these in the future)
  • more ways to iterate over the collections (the FSet tutorial has a good summary, about 3/4 of the way down)
  • speaking of the tutorial, FSet has lots more documentation

Let me digress slightly to give an example of how FSet makes programming more elegant and convenient.  Joe Marshall just put up a blog post comparing Go(lang) with Common Lisp, which is worth a read on its own; I'm just going to grab a code snippet from there to show a little bit of what programming with FSet is like.  Here's Joe's code:

 (defun collate (items &key (key #'identity) (test #'eql) (merger (merge-adjoin #'eql)) (default nil))
   (let ((table (make-hash-table :test test)))
     (dolist (item items table)
       (let ((k (funcall key item)))
         (setf (gethash k table) (funcall merger (gethash k table default) item))))))

 (defun merge-adjoin (test)
   (lambda (collection item)
     (adjoin item collection :test test)))

And here's what I would write using FSet:

 (defun collate (items &key (key #'identity))
   (let ((result (map :default (set))))
     (dolist (item items result)
       (includef (@ result (funcall key item)) item))))

(Well, I would probably move result outside the dolist form to make it clearer what the return value is, but let's go with Joe's stylistic choice here.)

For those who haven't used FSet: the form (map :default (set)) creates a map whose default is the empty set, meaning that lookups on that map will return the empty set if the key is not in the map.  This saves the includef form from having to handle that possibility.

My version makes assumptions, it's true, about how you want to collect the items with a given key; it doesn't give you other choices.  It could, but what would be the point?  It's already using a general set with better time complexity than lists, and saving you from having to write anything like merge-adjoin.  The extensible global equivalence relation means you're not going to need to supply a :test either.

I think the FSet-enhanced code is cleaner, more elegant, and therefore clearer than the plain-CL version.  Don't you agree?  Maybe you wouldn't say it's a huge improvement, okay, but it's a small example; in a larger codebase, I would argue, these small improvements add up.

* * * * *

To summarize: if you just want a library you can call in a few places for specific purposes, Sycamore might work better for you (but think hard if you're writing a comparator for symbols).  FSet can certainly be used that way, but it can be much more.  If you want to see one way in which Common Lisp can be made into a better language, without giving up anything that we love about it, I urge you to give FSet a try.

FSet has changed the way I write Lisp programs.  — an FSet user

(UPDATE: the magnitude of the performance difference between FSet and Sycamore surprised me, and inspired me to do some profiling of FSet.  It turned out that I could get a 20% speedup on one micro-benchmark simply by adding some inline declarations.  Mea culpa, mea culpa, mea maxima culpa; I should have done this years ago.   With that change, the generic function overhead appears to be the only significant cause of the remaining ~20% performance difference.  I tried creating a Sycamore set using a thin wrapper around fset:compare, and the resulting performance was very similar to that of FSet with its new inlines.)




com

vindarel: Running my 4th Common Lisp script in production© - you can do it too

Last week I finished a new service written in Common Lisp. It now runs in production© every mornings, and it expands the set of services I offer to clients.

It’s the 4th service of this kind that I developed: - they are not big - but have to be done nonetheless, and the quicker the better (they each amount to 1k to 2k lines of Lisp code), - they are not part of a super advanced domain that requires Common Lisp superpowers - I am the one who benefits from CL during development, - I could have written them in Python - and conversely nothing prevented me from writing them in Common Lisp.

So here lies the goal of this post: illustrate that you don’t need to need a super difficult problem to use Common Lisp. This has been asked many times, directly to me or on social media :)

At the same time, I want to encourage you to write a little something about how you use Common Lisp in the real world. Sharing creates emulation. Do it! If you don’t have a blog you can simply write in a new GitHub repository or in a Gist and come share on /r/lisp. We don’t care. Thanks <3

We’ll briefly see what my scripts do, what libraries I use, how I deploy them, what I did along the way.

Needless to say that I dogfooded my CIEL (beta) meta-library and scripting tool for all those projects.

Table of Contents

Scripts n°4 and 2 - shaping and sending data - when you can write Lisp on the side

My latest script needs to read data from a DB, format what’s necessary according to specifications, and send the result by SFTP.

In this case I read a DB that I own, created by a software that I develop and host. So I could have developed this script in the software itself, right? I could have, but I would have been tied to the main project’s versioning scheme, quirks, and deployment. I rather had to write this script on the side. And since it can be done on the side, it can be done in Common Lisp.

I have to extract products and their data (price, VAT...), aggregate the numbers for each day, write this to a file, according to a specification.

To read the DB, I used cl-dbi. I didn’t format the SQL with SxQL this time like in my web apps (where I use the Mito light ORM), but I wrote SQL directly. I’m spoiled by the Django ORM (which has its idiosyncrasies and shortcomings), so I double checked the different kinds of JOINs and all went well.

I had to group rows by some properties, so it was a great time to use serapeum:assort. I left you an example here: https://dev.to/vindarel/common-lisps-group-by-is-serapeumassort-32ma

Dates have to be handled in different formats. I used local-time of course, and I still greatly appreciate its lispy formatter syntax:

(defun date-yymmddhhnnss (&optional date stream)
  (local-time:format-timestring stream
                                (or date (local-time:now))
                                :format
                                '((:year 4)
                                  (:month 2)
                                  (:day 2)
                                  (:hour 2)
                                  (:min 2)
                                  (:sec 2)
                                  )))

the 2 in (:month 2) is to ensure the month is written with 2 digits.

Once the file is written, I have to send it to a SFTP server, with the client’s codes.

I wrote a profile class to encapsulate the client’s data as well as some functions to read the credentials from either environment variables, the file system, or a lisp variable. I had a top-level profile object for ease of testing, but I made sure that my functions formatting or sending data required a profile parameter.

(defun send-stock (profile &key date) ...)
(defun write-stock (profile filename) ...)

Still nothing surprising, but it’s tempting to only use global parameters for a one-off script. Except the program grows and you pay the mess later.

SFTP

To send the result through SFTP, I had to make a choice. The SFTP command line doesn’t make it possible to give a password as argument (or via an environment variable, etc). So I use lftp (in Debian repositories) that allows to do that. In the end, we format a command like this:

lftp sftp://user:****@host  -e "CD I/; put local-file.name; bye"

You can format the command string and run it with uiop:run-program: no problem, but I took the opportunity to release another utility:

First, you create a profile object. This one-liner reads the credentials from a lispy file:

(defvar profile (make-profile-from-plist (uiop:read-file-form "CREDS.lisp-expr"))

then you define the commands you’ll want to run:

(defvar command (put :cd "I/" :local-filename "data.csv"))
;; #<PUT cd: "I/", filename: "data.csv" {1007153883}>

and finally you call the run method on a profile and a command. Tada.

Deploying

Build a binary the classic way (it’s all on the Cookbook), send it to your server, run it.

(during a testing phase I have deployed “as a script”, from sources, which is a bit quicker to pull changes and try again on the server)

Set up a CRON job.

No Python virtual env to activate in the CRON environment...

Add command line arguments the easy way or with the library of your choice (I like Clingon).

Script n°2 and simple FTP

My script #2 at the time was similar and simpler. I extract the same products but only take their quantities, and I assemble lines like

EXTRACTION STOCK DU 11/04/2008
....978202019116600010000001387
....978270730656200040000000991

For this service, we have to send the file to a simple FTP server.

We have a pure Lisp library for FTP (and not SFTP) which works very well, cl-ftp.

It’s a typical example of an old library that didn’t receive any update in years and so that looks abandoned, that has seldom documentation but whose usage is easy to infer, and that does its job as requested.

For example we do this to send a file:

(ftp:with-ftp-connection (conn :hostname hostname
                                   :username username
                                   :password password
                                   :passive-ftp-p t)
      (ftp:store-file conn local-filename filename))

I left you notes about cl-ftp and my SFTP wrapper here:

Scripts n°3 and n°1 - specialized web apps

A recent web app that I’m testing with a couple clients extends an existing stock management system.

This one also was done in order to avoid a Python monolith. I still needed additions in the Python main software, but this little app can be independent and grow on its own. The app maintains its state and communicates it with a REST API.

 

It gives a web interface to their clients (so my clients’ clients, but not all of them, only the institutional) so that they can:

  • search for products
  • add them in shopping carts
  • validate the cart, which sends the data to the main software and notifies the owner, who will work on them.

The peculiarities of this app are that:

  • there is no user login, we use unique URLs with UUIDs in the form: http://command.client.com/admin-E9DFOO82-R2D2-007/list?id=1
  • I need a bit of file persistence but I didn’t want the rigidity of a database so I am using the clache library. Here also, not a great activity, but it works©. I persist lists and hash-tables. Now that the needs grow and the original scope doesn’t cut it any more, I wonder how long I’ll survive without a DB. Only for its short SQL queries VS lisp code to filter data.

I deploy a self-contained binary: code + html templates in the same binary (+ the implementation, the web server, the debugger...), with Systemd.

I wrote more on how to ship a standalone binary with templates and static assets with Djula templates here:

I can connect to the running app with a Swank server to check and set parameters, which is super helpful and harmless.

It is possible to reload the whole app from within itself and I did it with no hiccups for a couple years, but it isn’t necessary the most reliable, easiest to set up and fastest method. You can do it, but nobody forces you to do this because you are running CL in production. You can use the industry’s boring and best practices too. Common Lisp doesn’t inforce a “big ball of mud” approach. Develop locally, use Git, use a CI, deploy a binary...

Every thing that I learned I documented it along the way in the Cookbook ;)

Another app that I’ll mention but about which I also wrote earlier is my first web app. This one is open-source. It still runs :)

 

In this project I had my friend and colleague contribute five lines of Lisp code to add a theme switcher in the backend that would help him do the frontend. He had never written a line of Lisp before. Of course, he did so by looking at my existing code to learn the existing functions at hand, and he could do it because the project was easy to install and run.

(defun get-template(template &optional (theme *theme*))
  "Loads template from the base templates directory or from the given theme templates directory if it exists."
  (if (and (str:non-blank-string-p theme)
           (probe-file (asdf:system-relative-pathname "abstock" (str:concat "src/templates/themes/" theme "/" template))))
      ;; then
      (str:concat "themes/" theme "/" template)
      ;; else :D
      template))

He had to annotate the if branches :] This passed the code review.

Lasting words

The 5th script/app is already on the way, and the next ones are awaiting that I open their .docx specification files. This one was a bit harder but the Lisp side was done sucessfully with the efficient collaboration of another freelance lisper (Kevin to not name him).

All those tasks (read a DB, transform data...) are very mundane.

They are everywhere. They don’t always need supercharged web framework or integrations.

You have plenty of opportunities to make yourself a favor, and use Common Lisp in the wild. Not counting the super-advanced domains where Lisp excels at ;)


Links

I have done some preliminary Common Lisp exploration prior to this course but had a lot of questions regarding practical use and development workflows. This course was amazing for this! I learned a lot of useful techniques for actually writing the code in Emacs, as well as conversational explanations of concepts that had previously confused me in text-heavy resources. Please keep up the good work and continue with this line of topics, it is well worth the price! [Preston, October of 2024]




com

ALL SOULS NIGHT Complete! In One Easy-to-Read Location!

.


This year's Halloween story, written on leaves and serialized daily on my blog, one sentence at a time, is done. Every day in October, I added to it, it reached its last words on Halloween.

Funny thing, though. In conversations with two different friends, I learned that neither of them had realized it was a story. They each thought I was just posting random sentences written on leaves. One of them is an artist, and thinks primarily in visual terms, so I thought at first that was a misunderstanding curious to her. The other, however, is a well-known writer and, what's more important, quite a good one. I have no idea what's going on there.

Long story short, at my behest, my son Sean, put all the photos up on Imgur, subtitled. So, if you didn't realize that they told a story... Or if, somehow, you weren't able to hold all the sentences in your head until the story was complete... Now you can find out what was going on. (The stone angels mark the ends of paragraphs.)

You can find it by clicking on the link here.


*




com

welcome to the magical lair

Today on Married To The Sea: welcome to the magical lair


This RSS feed is brought to you by Drew and Natalie's podcast Garbage Brain University. Our new series Everything Is Real explores the world of cryptids, aliens, quantum physics, the occult, and more. If you use this RSS feed, please consider supporting us by becoming a patron. Patronage includes membership to our private Discord server and other bonus material non-patrons never see!





com

Donegal captain on comeback trail

Donegal captain Michael Murphy hopes he will be fit to play in next month's Ulster championship preliminary round tie against Cavan.




com

Deion Sanders compares Shedeur and Travis’ chemistry to Michael Irvin and Troy Aikman | Speak

Deion Sanders talks about the strong chemistry between Shedeur Sanders and Travis Hunter, comparing it to the connection Michael Irvin had with Troy Aikman during their playing days.







com

12 Comics That Put Gender Discrimination Into Perspective





com

Internet Reacts To Trump's Comments About Injecting Disinfectant To Cure COVID-19

The internet is reacting to comments made by Donald Trump during a COVID-19-related press briefing held yesterday. Trump claimed that the virus could be treated by bringing "light inside the body" or injecting a disinfectant. Thankfully medical professionals were quick to denounce these claims, and people on the internet have since been creating some excellent memes on the matter. 

This should go without saying, but please don't inject yourself with disinfectant, y'all.




com

Trump's 'Exploding Trees' Comment Has Memers Trolling Like Crazy

As wildfires continue to ravage the West Coast, President Trump has been quick to dismiss climate change as one of the root causes, stating that countries in Europe like Austria don't suffer from wildfires because Europeans live in "forest cities" that are "managed better" yet are "more explosive" than the trees in California.

We're not entirely sure what any of that means, and apparently neither do memers, so please enjoy the following memes about "forest cities" in Austria.