* Headings #+title: Curious Musings #+options: num:3 toc:nil \n:nil #+OPTIONS: tex:t #+todo: TODO(t) CANCELLED(c) | WIP(w) PUBLISHED(p) #+hugo_base_dir: . #+hugo_auto_set_lastmod: %Y-%m-%d #+MACRO instagram @@html:@@html:@@https:@@https:@@//www.instagram.com/p/$1 :PROPERTIES: :EXPORT_HUGO_SECTION: :END: * Content ** Blog :@blog: :PROPERTIES: :EXPORT_HUGO_SECTION: Blog :EXPORT_FILE_NAME: :EXPORT_HUGO_PUBLISHDATE: <2023-10-09 MON 06:40:09> :END: *** Geek Stuff :geek: **** WIP The unnumbered habits of a questionably effective person :orgmode:emacs:100DaysToOffload:life: :PROPERTIES: :EXPORT_FILE_NAME: 2022-12-25 :EXPORT_HUGO_PUBLISHDATE: 2022-12-25 :END: This is two part rant on planning with (and without) Emacs Org Mode, shoved together into one post in much the same way as Lennon-McCartney songs were shoved together from musical scraps they had laying around. My Frankenstein post will probably have less impact and reach than "A Day In The Life", Yeah, Yeah, Yeah. #+hugo: more ***** Rants on org mode, humanity and Bruce ****** Org mode and planning These are reflections getting things done (not GTD). Or not getting things done. Or yak-shaving with Emacs and org-mode while pretending to get things done and really just enjoying the experience either way. Maybe that's what org mode is all about anyhow. Org mode is the best list making tool I've ever found. Org capture let's you capture thoughts, links, TODO items on the fly in the middle of whatever else you're doing and get back to them. You never miss anything. ****** But we're human But there are a couple problems. We're human, not AI-driven lisp code knocking off all the TODO items, and we're finite in terms of time, attention, focus, money, friends, skills, etc. The result is that org mode enables me to grow infinite lists of TODOs. The human brain is good at focusing on maybe 3 things at a time. The path to despair (long undone lists) is obvious. Sometimes I just give up on org mode lists and do things. ****** Bruce Long, Long, ago in a tech company far, far away (CompuServe, Columbus, Ohio) there were "how do we migrate off of DEC10 to compete with AOL wars". I knew Bruce McNaughton. Bruce moved on from there to be VP of MSN at Microsoft for a while. Arguably a "Highly Successful Person" (who I'm pretty sure does not use org mode, but does have ligit geek creds). I asked him once how he plans and memories (vague) are that he did not make lists (at the time Franklin Planners and then Franklin Planner software were all the rage). That image stuck with me. Just talk to people and do stuff. ****** Concluding Rant - It's about enjoying what you do + just the act of planning + maybe actually getting things done, maybe not + a sense of accomplishment (TODO -> DONE) - Software can be a tool, a focus, a shiny object or a distraction - Software can be tyrannical + Computers are good an infinite lists, humans aren't - I will die with a TODO list much larger than it is today. ***** My work planning regime with org mode That said, here's more-or-less how I plan my days at work. Home/personal stuff is similar, but a little less structured. ****** Morning Planning - What's in my head :: capture TODOs form the top of my journal (diaty.org) - Look at "inputs" :: look at calendar, email and slack in that order. - Look at existing porjects/plans :: Look at weekly plans, tasks, etc - Juggle all these and figure out what I'm going to try to do that day ****** During the day - Capture new stuff and move on :: Quickly capture new asks, TODOs (org-capture) and move. - Capture info :: capture info (links to HOWTOs, etc in the same file) - Keep a calendar open :: Keep a calendar window open so I don't miss thigns - Turn off all notificatons :: Turn off all email, slack, etc. notificatons and pop-iups so I can control my focus. - Check email, slack on my schedule :: Check in somewhat frequently with slack, email so people can get ahold of me in a somewhat timely fashon. If it's urgent, call or text. Voice calls seem to be a dying breed ("BR 549", "Pensylvania 6-5000") - Minimize yak shaving :: I tend to yak-shave a lot. Like writing this post. Watch it. ****** Organizing Time - Do "thinking work early" :: plan do do "thiking work" early in the day - Do "collaboration work mid-day" :: do 1:1s, collaboration mid-day - Do "meetings late-day" :: Push meetings, interrupts, etc late day ****** Where to store "TODOs" - one file :: I increasly just store TODOs, info , etc to one file (diary.org) which is a diary-like file organized under Year/Month/Day/ENTRY items. - project files :: I do have planning files for most projects with TODOs etc - agenda :: I do use org-agenda to get a roll-up agenda view, but more and more I'm just going with the inverse-stack, what's at the bottom of my diary.org and using mental prirotization. ***** Projects template And because this post is getting too long already, I'll make it longer. Here is the org project template that I've developed over the last decade or so. I still use it, but I'm moving more and more to capturing everything in diary.org/the journal and maybe linking out to these project files. A couple notes. "OODA" refers to the "[[https://www.oodaloop.com/the-ooda-loop-explained-the-real-story-about-the-ultimate-model-for-decision-making-in-competitive-environments/][OODA Loop]]". At times, its a useful paradigm for thinking about action, think Snoopy and the Red Barron: Snoopy _Observes_ the Red Barron, he _Orients_ himself, he _Decides_ to let the Red Barron live to fight another day, and the _Acts_ by disengaging the dogfight. "Cogita", "Fac", and "Dic" are Latin singular imperatives for "Think", "Act", "Speak". Another paradigm for thinking about actions. Figure out what you're doing, gather info, plan, then do stuff, then talk about it (blogs, reports, papers, meetings, sales...) #+begin_example org # #+options: ':nil *:t -:t ::t <:t H:3 \n:nil ^:nil arch:headline # #+options: author:t broken-links:nil c:nil creator:nil # #+options: d:(not "LOGBOOK") date:t e:t email:nil f:t inline:t num:2 # #+options: p:nil pri:nil prop:nil stat:t tags:t tasks:t tex:t # #+options: timestamp:t title:t toc:t todo:t |:t # #+title: PROJECT # #+date: <2022-12-25 Sun 07:50:58> # #+author: George Jones # #+email: ME @ SOMEWHERE # #+language: en # #+select_tags: export # #+exclude_tags: noexport # #+creator: Emacs 28.0.50 (Org mode 9.3.7) # This is a project to...(overview/intro)... # * PROJECT # ** PROJECT - Info :cogita:Ooda: # - Observe :: Gather Raw Information. # - Think (Cogita) :: Thoughts, Brainstorming, etc. # *** Info about the project # *** Links # - project directory :: file://~/home/private/FOO # + change this # + create directory # + keep project files here. # *** HOWTOs # - Links of HOWTO articles relevant to the project # ** PROJECT - Background # - Add any background info here (old files, plans, projects..) # ** PROJECT - Planning :cogita:oODa: # - Think :: Think about observations and info gathered # - Orient :: "Figure out which way is up" # - Decide :: Decide what your doing, which way to go. # *** Goals # *** Plans # ** PROJECT - Action Items :fac:oodA: # - Act/DO (Fac) :: Actions to take on info and plans # ** PROJECT - Meetings and Reports :dic: # - "After action reports" # - Tell people what happened. # - Have meetings, write reports, etc. (as needed) # ** PROJECT - Backlog #+end_example #40 of #100DaysToOffload take 2.1, https://100daystooffload.com/ of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** WIP It's Manjaro !!! :linux:100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2022-10-19 :EXPORT_HUGO_PUBLISHDATE: 2022-10-19: :END: #+hugo: more #+begin_example 2022-10-17:14:06:52: Installing and migrating to Manjaro 2022-10-17:14:29:04: pacman -Syu # update pacman 2022-10-17:14:30:06: sudo pacman -Syu # update pacman 2022-10-17:14:30:23: sudo pacman -S ed # install ed 2022-10-17:14:32:41: scp -v -r -p 192.168.0.10:~/stow . # copy stow files 2022-10-17:14:33:39: sudo pacman -S stow # instal stow 2022-10-17:14:47:04: # INFO - Arch runs zsh by default. Cool prompt stuff. Not quite bash 2022-10-17:14:59:24: sudo pacman -S emacs 2022-10-17:15:06:51: stow home.public.emacs.d/ 2022-10-17:15:07:49: # and emacs just worked tail /home/gmj/var/log/install.org! 2022-10-17:15:14:31: # INFO enable sshd on arch https://linuxhint.com/arch_linux_ssh_server/ 2022-10-17:15:26:12: TODO figure out the relationship between bash an zsh on arch. Looks like I'm really running zsh. 2022-10-17:15:26:31: TODO create a backup account 2022-10-17:17:29:28: DONE install all my stow files 2022-10-17:17:37:07: DONE install bind 2022-10-17:17:42:07: DONE installed mlocate 2022-10-18:05:51:17: DONE sudo pacman -S xclip 2022-10-19:06:21:54: TODO figure out how to start bash, not zsh 2022-10-19:06:22:18: IN-PROGRESS backing up ed to archive drive 2022-10-19:06:22:49: IN-PROGRESS copying /home/gmj/home/public /home/gmj/home/private /home/gmj/home/secret to mx 2022-10-19:06:23:21: DONE installed jupyter-notebook and pandas and matplotlib 2022-10-19:06:29:34: DONE sudo pacman -S hugo 2022-10-19:06:33:46: DONE sudo pacman -S community/speedtest-cli #+end_example #29 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED IPv6 Day :100DaysToOffload:Internet: :PROPERTIES: :EXPORT_FILE_NAME: 2022-02-11 :EXPORT_HUGO_PUBLISHDATE: 2022-02-11: :END: Today was the day I made the choice to live for an entire work-day on an IPv6-only network. And it worked. I've been watching this slow train comin' for 30 years. Now I'm holding my breath for [[https://en.wikipedia.org/wiki/Connectionless-mode_Network_Service][CNLP]] :-) #+hugo: more I consciously, actively spent an entire day (well, work day) on a hotspot that was serving up only v6. This has been 30 years coming. I was on the big-ip mailing list as far back as 1992 that was discussing how to get past the impending crisis in 32 big IPv4 addressing. That was when the Web was just about to happen and I think getting an allocation may have involved sending email to Jon Postel. [[https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing][CIDR]] was introduced in 1993. NAT, BGP and DHCP came long, and countless other engineering and social hacks kept things functioning (and killed the [[https://en.wikipedia.org/wiki/End-to-end_principle][end-to-end principal]]). I'm sure I've been using v6 in lots of places (my phone) without doing any setup or making any choice to enable it, but today was the day I "turn on" v6 explicitly and lived there for a day. And it worked. Ironically, one of the days tasks involved trying to identify and enumerate usage of v6 in some networks where it appears to have very little actual deployment. #6 of #100DaysToOffload take 2, https://100daystooffload.com/ **** PUBLISHED Tech companies I once admired :life:tech: :PROPERTIES: :EXPORT_FILE_NAME: 2021-12-23-companies-I-once-admired :EXPORT_HUGO_PUBLISHDATE: 2021-12-23 :END: #+begin_example The dream is over, what can I say? The dream is over, yesterday. John Lennon, 1970 #+end_example #+caption: "Past their sell-by date." by George Jones is licensed under CC BY 2.0, includes work by [[https://www.vecteezy.com/free-vector/nature][Nature Vectors by Vecteezy]] #+attr_html: :width 400px [[file:images/logosAndPerson.png]] #+begin_example Don't believe in Digital Equipment Corporation, Don't believe in Sun Microsystems, Don't believe in CompuServe, Don't believe in Perl, Don't believe in USENIX, Don't believe in SourceForge, Don't believe in GitHub, Don't believe in Facebook, Don't believe in Linked-in, Don't believe in Google, Don't believe in The SANS Institute, Don't believe in The Center for Internet Security, Don't believe in Google Plus, Don't believe in Twitter, Don't believe in Spotify, Don't believe in Wikipedia, ... I just believe in me, human beings and me. Me, 2021 #+end_example This is a list of tech companies I once admired. #+hugo: more ***** A tale of two tech companies I'll start with two examples. Writing at Christmas-time 2021, I'll categorize the two examples as "naughty and nice". The examples will provide "soft" examples of what attracts me to tech companies and what drives me away. Following that, I'll break it down more systematically (when, why...) ****** Wikipedia - naughty The catalyst for thinking about all this was the revelation that Wikipedia, an organization that is built on the backs of volunteers can't stop fund-raising (and lying in the process) even when flush with cash: https://www.theregister.com/2016/12/19/jimmy_wales_breaks_promise_more_chugging/ and is making plans to further monetize it's volunteers work. I'm looking for ways to stop using Wikipedia. How does it get to this point? ****** Wordpress - nice Wordpress came off the "naughty" list as I was writing this post when I came across this toot https://fosstodon.org/@markosaric/107495024812888717 which referenced [[https://www.protocol.com/matt-mullenweg][a good article on Matt Mullenweg ]] the CEO of Automattic, the company that runs WordPress.com: #+begin_quote "The cycle plays out the same in tech", he said. Take the internet: built as an open platform, eventually colonized by a handful of dictatorial players... "...But it also contains the seeds of its own demise." Users inevitably begin to feel hemmed in and controlled by the closed platforms, and yearn for open pastures. Then they go build something better. Something open. "People's natural desire for freedom starts to get more and more of the best and brightest in the world working on open, distributed, decentralized systems." #+end_quote ***** How you know the end is near for a company - The geeks who started it leave or are edged out by MBAs. - The founders, [[https://curious.galthub.com/blog/visionaries/][who had the vision leave]]. - Free services morph into something that's all about monitization. - Volunteers are exploited. - The arrival of the unwashed masses ... [[https://encyclopediadramatica.online/Eternal_September][eternal September]]. - Things are dumbed down. - You (the "customer") become the commodity, one of "the target audience" that the marketing people try to "reach" - When there are hoards of people earning six and seven figure salaries that had nothing to do with creating or maintaining the value. - Slogans like "Learn git and github without any code!" appear on sites that are all about code. - When you use the phrase "The market leader..." ***** Why do things go bad? - Greed, hubris, selfishness (in other words, human nature) - The problem of the commons - MBAs, marketing people and projects managers run the show. - Lies. - Loss of trust and good-will. - Loss of mission. "It's just a job." + The founders with the vision are either gone, no longer or charge or fail to communicate and sell the vision (Bezos did an excellent job of this with the "[[https://www.aboutamazon.com/about-us/leadership-principles][Amazon Leadership Principals]]") ***** So what? Where to go from here? ****** A day in the life (musically inspired metaphors) - Go hide out in a New York city townhouse, withdraw from public life, bake bread and raise your son until some deranged fan kills you? (see Lennon). Props to @emacsen for the creative re-use of the "Dream is over" motif that I stole https://emacsen.net/@emacsen/107405795056467815 - Existential nihilism or hedonism ("Whatever gets you through the night, it's all right, it's all right.") - Live your life, enjoy your family ("I'm just sitting here watching the wheels go round and round") ****** My current responses - Self hosting :: I'm self hosting on a raspberry pi. [[https://curious.galthub.com/][Blog]]. [[http://git.galthub.com/][Git]]. New domain name (galthub.com). Re-considering increased use of my 2001-era hand-edited HTML website: http://www.port111.com/george/. I took a year off blogging and stopped pushing any code, HOWTOs, etc to git. - Moving back to paid services :: I started my work life at Compu$erve. You paid for what you got. Then the web happened. The advertising business model migrated from print and broadcast to where the eyeballs had moved. And you stopped paying. But you became the product. Your privacy became a commodity or a joke. I'm increasingly reverting to seeing paid services as an "honest" alternative. I'm using paid email (fastmail, protonmail), VPN (proton), shared hosting (hurricane electric), domain names (namecheap) and may move to others, say, high quality professional journalism. It seems there really are no truly free (as in speech or beer) lunch or online services. - Paper :: For about 30 years I used the phrase "If it requires paper, it's the wrong interface". I'm backtracking on that. There are no marketing people, project managers, MBAs, data aggregators, or advertisers involved in my journal, and the threat models and data loss and protection paradigms are well understood. - Reconsideration :: In light of recent discoveries, and my exploration of the principals of why I move to/away from online services in this post, I'm reconsidering Wordpress. I may reconsider others. - Pobody's Nerfect :: We live in a messed up world. The Latin Poet Ovid said "In medio tutissimus ibis" (roughly, "you will go most safely in the middle."). While it may be possible to use only free software (and grow your own food), most people can't live there entirely. ****** If you've got the energy and the vision... The world is driven by individuals with vision. All hail [[https://stallman.org/saint.html][Saint IGNUcius]]. There would likely be no free software movement without him. Individuals change tech: Alan Turing, Ken Thompson, Donald Knuth, Steve Jobs, Bill Gates, Linus Torvalds, Jeff Bezos, etc. If you've got the energy, the vision and the talent, go change the world. Or just go tinker around, scratch your own itch and share the results. That's often how the world is changed. **** PUBLISHED Emacs enlightenment :emacs:life:philosophy: :PROPERTIES: :EXPORT_FILE_NAME: 2021-12-16-emacs-enlightenment :EXPORT_HUGO_PUBLISHDATE: 2021-12-16 :END: #+begin_quote "...It's also clear you have a achieved emacs enlightenment. The state where you see the whole world through the mind-bogglingly useful lens of emacs and org mode and fail to see (non judgmentally) why anything should exist outside that world. 'Om, Om, Om, M-x find-universe' :-)" #+end_quote #+hugo: more From [[https://fosstodon.org/@eludom/107456060382723164][a reply to a friend about his latest emacs 'wow' moment.]] #+caption: The Enlightened GNU #+caption: [[http://emacs.nu/wallpaper/gnu_wallpaper_4_1920.png]["Levitating GNU with Emacs source code" by Macduff is licensed under GPL 2.0]] #+attr_html: :width 400px [[file:images/gnus_up_small.png]] **** PUBLISHED Learn git and galthub without any marketing :blogging:geek:emacs:git:social:marketing: :PROPERTIES: :EXPORT_FILE_NAME: no-marketing :EXPORT_HUGO_PUBLISHDATE: 2021-12-04 :END: OK, so a year or so later I'm back online with both a self-hosted [[http://git.galthub.com/][git]] and [[https://curious.galthub.com/][blog]] presence. I had been using both github for code and github.io for my blog, but for various reasons I decided to stop putting content there. - Walled gardens go away :: Walled gardens go way whenever it stops suiting the bottom line of the company. All the form posts from CompuServe (my first employer) are gone AOL Instant Messenger messages (another employer) are gone. Myspace content is gone. Twitter, Facebook and Google have been caught regularly censoring and deleting material. Apple, Amazon (another employer) and Google (G+ anyone?) will be gone someday, and the user content they host that no longer suits their business needs will be gone before that. I've written at length aobut this here [[*40 years of walled gardens & open platforms: Part I][40 years of walled gardens & open platforms: Part I]] and here [[*40 years of walled gardens & open platforms: Part II][40 years of walled gardens & open platforms: Part II]] #+begin_quote Karl Voit nailed it :: https://karl-voit.at/2020/10/23/avoid-web-forums/ #+end_quote - "Learn git and github without any code!" :: Really? A site who's sole purpose is (was?) to allow programmers to share code puts a slogan on top of all it's pages /Learn git and github without any code/. Umm. No. Just no. It appears the marketing people at Microsoft totally own the tech-focused site they bought. The CEO left. They are apparently developing some non-standard tool (of course they are, it's Microsoft, "embrace and extend"") "the Github CLI" that they want you to use instead of, you know, standard git tools that they don't control. And somehow an inherently distributed source code control system is now centralizing all the worlds code. No. Just no. - My content, my way :: I just don't want wordpress or atlassian or microsoft to reformat my content, add advertising links, require people to login or to throw long legal click-throughs and cookie disclaimers in front of my public cogitations. - Using tools I like :: Emacs org mode is going to take me to my grave. I *like* using it. Using it is a hobby. It is therapeutic. There is a worldwide community built around emacs: https://emacsconf.org/2021/. I LIKE using Hugo. See [[*Publishing a blog on Github with Org and Hugo][Publishing a blog on Github with Org and Hugo]] (just ignore the github bits now). No need to use the mouse. - Learning/Geeking :: I /like/ learning how to do things, how modern-ish Internet stuff works. In the process of getting this back up, I've registered a new domain name (learning new record types, SEO, etc. in the process), discovered http://mysocket.io, brushed up on my apache and ansible skills, reinstalled my dead raspberry pie, and learned a good bit about configuring gitea More to come now that I can get it out in a way I feel good about. **** PUBLISHED Selfhosting a Hugo blog with mysocket.io :blogging:org:emacs:HOWTO: :PROPERTIES: :EXPORT_FILE_NAME: hugo-via-mysocket :EXPORT_HUGO_PUBLISHDATE: 2021-11-12 :END: ...that time when you realize your blog is hosted on a web site who's sole purpose is to support coding, and they plaster the motto #+begin_quote "Learn Git and Github without any code!" #+end_quote all over their site, and you realize that its been taken over by marketing clones ... and it's time to do your geekly exit stage left and self host on a raspberry pi or something... This is a HOWTO of the things I did to migrate my HUGO blog off github onto a self-hosted raspberry pi using mysocket.io. The original setup is described here [[*Publishing a blog on Github with Org and Hugo][Publishing a blog on Github with Org and Hugo]] #+hugo: more ***** Do normal development with local hugo server In =${HUGO_BASE_DIR} =gmj@ed blog [master] $ hugo server -v -D= browse to http//localhost:1313 to see updates in realtime. ***** Update config.toml In =${HUGO_BASE_DIR}/config.toml= update the following: #+begin_example # baseurl = "https://eludom.github.io/" baseurl = "https://curious.galthub.com/ #homepage = "eludom.github.io" homepage = "curious.galthub.com" #+end_example ***** run hugo to regenerate docs The =docs/= directory will be the root of your webserver #+begin_example gmj@ed blog [master] $ hugo Building sites … | EN -------------------+------ Pages | 210 Paginator pages | 0 Non-page files | 0 Static files | 78 Processed images | 0 Aliases | 0 Sitemaps | 1 Cleaned | 0 Total in 2718 ms gmj@ed blog [master] $ find . -mtime -^C gmj@ed blog [master] $ hugo server -v -D^C gmj@ed blog [master] $ find . -mtime -5 | head . ./.#curious.org ./curious.org ./docs/index.html ./docs/404.html ./docs/robots.txt ./docs/about/index.html ./docs/about/index.xml ./docs/sitemap.xml ./docs/tags/poetry/index.html ... #+end_example ***** TODO Copy the files to where the web server is (if needed) Which server... #+begin_example rsync -Cavz docs gmj@hangout:~/blog #+end_example ***** TODO Run local webserver Run a web server with the root pointed at the =docs/= directory #+begin_example $ cd ~/blog/docs/ $ python3 -m http.server 1313 #+end_example ***** TODO Set up tunnel Set up a tunnel =$ mysocketctl connect --port 1313 --name hugo test= ***** TODO Define CNAME ... ***** TODO Add the CNAME to the allowed domain names for the tunnel ... ***** DONE install apache on raspberry pi using asnible ***** TODO Make sure apache root is on USB thumb drive ***** TODO copy/rsync blog/docs to new apache root - cron? - Or use sshfs mounting from ed to hangout? ***** TODO redirect apache root to blog ***** TODO set up a new mysocket tunnel for blog/apache ***** TODO set up CNAME curious.galthub.com pointing at tunnel ******* Test it out curl http://curious.port111.com ******* Future ******** archive.org? ******** CDN ? **** PUBLISHED Fixing GNU bash associative array insert speed :programming:gnu:linux: :PROPERTIES: :EXPORT_FILE_NAME: 20200418 :EXPORT_HUGO_PUBLISHDATE: 2020-04-18: :END: Bash uses linear search to insert values in to associative arrays. This is all well and good for small numbers of keys. I was adding millions[fn:1]. I went poking around the bash source code today (2020-04-18) to confirm my suspicion and gauge the difficulty of adding an option to do something more sensible. In less than a day after I reported it, there is a patch https://lists.gnu.org/archive/html/bug-bash/2020-04/msg00114.html My timing code and pre and post patch timings are here: https://github.com/eludom/snippits/tree/master/bash/tests #+hugo: more Here the steps I took and where I might go if I get serious about fixing the problem: ***** Get the source code ****** Find it - find the homepage :: A quick bit of googling lead to the homepage http://savannah.gnu.org/projects/bash/ - use git :: For a minute it looked like GNU was still stuck in the bad old days of having to download a tarball and then apply a series of patches, but fortunately, it there is a git repo http://savannah.gnu.org/git/?group=bash ****** Download it #+begin_src bash :eval no git clone https://git.savannah.gnu.org/git/bash.git #+end_src ****** Build it Bash follows a time honored build convention #+begin_src bash :results output :eval no ./configure make #+end_src ****** Analyze it - I read the NEWS file for any indication that associative arrays has been worked on to speed up associative array insert/look-ups. No indication that they had. - I checked the git commit logs, which appear to be meaningful after Bash-4.4 patch 19. Nothing. - With judicious use of grep ("grep-find in Emacs") for "associative" and "hash_search" it turns out that associative array inserts (as all inserts) are done with use of the "hash_search" function in =hashlib.c= - has_insert() begins as follows: #+begin_src C /* Create an entry for STRING, in TABLE. If the entry already exists, then return it (unless the HASH_NOSRCH flag is set). */ BUCKET_CONTENTS * hash_insert (string, table, flags) char *string; HASH_TABLE *table; int flags; { BUCKET_CONTENTS *item; int bucket; unsigned int hv; if (table == 0) table = hash_create (0); item = (flags & HASH_NOSRCH) ? (BUCKET_CONTENTS *)NULL : hash_search (string, table, 0); #+end_src - and there it is, the linear search walking the list in =hash_search()= #+begin_src C /* Return a pointer to the hashed item. If the HASH_CREATE flag is passed, create a new hash table entry for STRING, otherwise return NULL. */ BUCKET_CONTENTS * hash_search (string, table, flags) const char *string; HASH_TABLE *table; int flags; { BUCKET_CONTENTS *list; int bucket; unsigned int hv; if (table == 0 || ((flags & HASH_CREATE) == 0 && HASH_ENTRIES (table) == 0)) return (BUCKET_CONTENTS *)NULL; bucket = HASH_BUCKET (string, table, hv); for (list = table->bucket_array ? table->bucket_array[bucket] : 0; list; list = list->next) { /* This is the comparison function */ if (hv == list->khash && STREQ (list->key, string)) { list->times_found++; return (list); } } #+end_src ***** Next steps ****** DONE Reach out to the maintainers see if they would even entertain the idea of a patch ****** CANCELED Look for appropriate in-memory hash insert/lookup functions - btrees ? ****** CANCELED Code it ****** CANCELED test it ****** CANCELED submit patch See https://lists.gnu.org/archive/html/bug-bash/2020-04/msg00114.html ***** Footnotes [fn:17] The Amiga was my first computer. I was the first person to port an Emacs editor to the Amiga, porting a version of what became "MicroEmacs" and mg to it and receiving a phone call from one of the core Amaga engineers at Commodore asking if they could use it after I posted to comp.sources.amiga [fn:7] ADS stands for "Attention Distraction Syndrome" [fn:1] yes, there are many better tools for this job, but not in the constrained environment where this had to run. **** PUBLISHED HOWTO: Using Pi-hole DNS to block ads. The struggle continues... :DNS:privacy:networking:HOWTO: :PROPERTIES: :EXPORT_FILE_NAME: 2020-05-01 :EXPORT_HUGO_PUBLISHDATE: 2020-05-01 :END: /This article is a work in progress. Updated: 2020-05-02. This is turning into a bit of a catch-up on the state of DNS for me./ Day 03 and 04 of #100DaysToOffload. ***** Intro # Thanks to Paul Vixie for the pointer to The war against ads continues. https://pi-hole.net/ looks like a reasonable, good, new?, open source entry in the war against ads. Get 'yer source/install for linux at https://github.com/pi-hole/pi-hole Per Paul Vixie #+begin_quote not even non-technical users need a "public DNS" to shield themselves from a lot of known-evil internet sites. check out @The_Pi_Hole or have your 12yo child or cousin install it. #+end_quote ..but I always make things harder. #+caption: pi-hole console after a few hours on my system #+name: pic:pi-hole.png [[file:images/pi-hole.png]] #+hugo: more ***** What - It's a local DNS server to block adds. ***** Why - Blocking ads is a moral good. - I've not done home network hacking for a while. - I'm moving into a bit of a more "don't track me" frame of mind. ***** When - Now, because I'm home more during corona-virus. ***** How - Set up local server. - First on a Linux laptop that (usually) does not go off the net. - Then maybe on an old pogoplug or laptop. ***** Install It Here's what I did to instlal - [ ] basic install :: On a Linux server, the *basic* install is simple: #+begin_example sudo bash basic-install.sh #+end_example - [ ] Static IP :: But you will want a Linux box with a static IP address. This may involve, e.g., convincing your wireless router to hand out a the same static IP to a static IP - [ ] Tell other systems to use this IP for DNS :: Again, probably configuring your wireless router to specify your local IP as the DNS server for DNS assignments via DHCP assignments. You could also do this by configuring the individual devices to use it. - [ ] Remember your admin password :: Make note of the admin password during install - [ ] hit the local admin web server :: Its a very nice. It will be at a something like http://192.168.86.230/admin/index.php. ***** Test It - [ ] Look something up by hand :: Use dig(1) or host(1). Note the =SERVER= in the response below that shows where the answer came from. If it's your IPS's DNS or Google, try again (something's not configured right). In my case 127.1 is right. #+begin_example $ dig www.uu.net ; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> www.uu.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54721 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;www.uu.net. IN A ;; ANSWER SECTION: www.uu.net. 299 IN CNAME global.mci.com. global.mci.com. 959 IN CNAME wac.C449.edgecastcdn.net. wac.C449.edgecastcdn.net. 3599 IN CNAME gp1.wac.v2cdn.net. gp1.wac.v2cdn.net. 3599 IN A 152.195.32.39 ;; Query time: 59 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Fri May 01 19:16:11 EDT 2020 ;; MSG SIZE rcvd: 146 #+end_example - [ ] Check the query logs via the UI to make sure your target domain showed. Be aware of caching. It may only show up the first time you query. - [ ] Go trolling for ads :: Find your favorite 90s-era web site, go hit it, and watch the counters - http://computershopper.com - http://www.yahoo.com - http://www.compuserve.com - http://www.aol.com - http://sears.com (get it while it lasts) - If the counters go crazy and you don't see the expected plethora of ads, you win. If not dig deeper. - If you are all-ready using ad-dblockers :: If you are already using ad-blockers or browsers such as Brave that block ads, you may have to test with something else (Firefox, Chrome, etc.) - Browser and other apps are getting cagey about using not using the system DNS, using DOH, and otherwise not acting like you expect them too. Editing =/etc/resolv.conf= is not the whole game anymore. ***** Tools you may want to use/learn/install - dig :: for making/testing queries by hand - [[https://www.wireshark.org/][Wireshark]] :: Use Wireshark to see what's going on on the wire, who you're talking to, etc. ***** The things you learn - pi-hole can apparently function as a DHCP server itself. - You can choose your upstream DNS servers from a list with options for IPv4, IPv6, DNSSEC/no DNSSEC, filtered/unfiltered. - Quad9 is one of the choices. It looks to be really useful for adding malware blocking to your domain. See https://www.quad9.net/faq/ for a useful bit of education. - The logs are at =/var/log/pihole.log= - Possibly use [[http://www.ranum.com/security/computer_security/papers/ai/][Marcus Ranums's principal of "Artificial Ignorance"]] to grep out the known and see what's left: #+begin_example $ cat pihole.log.1 | egrep -v microsoft.com\|google\|amazon\|in-addr\|linkedin\|dropbox\|facebook\|messenger\|ubuntu\|github\|brave\|basicattention\|yahoo\|disqus\|twitter\|akamai\ | sed 's/.*: //' | sort | uniq -c | sort -rn | head 334 reply min-api.cryptocompare.com is 334 reply ccc-api.cloudapp.net is 40.115.22.134 334 query[A] min-api.cryptocompare.com from 127.0.0.1 238 forwarded min-api.cryptocompare.com to 8.8.4.4 143 cached min-api.cryptocompare.com is 101 query[A] no-thanks.invalid.lan from 127.0.0.1 101 query[A] no-thanks.invalid from 127.0.0.1 101 forwarded min-api.cryptocompare.com to 8.8.8.8 100 reply hfq2h9152m63.statuspage.io is 100 query[A] rpt.cedexis.com from 127.0.0.1 #+end_example #+begin_example $ cat pihole.log.1 | egrep -v microsoft.com\|google\|amazon\|in-addr\|linkedin\|dropbox\|facebook\|messenger\|ubuntu\|github\|brave\|basicattention\|yahoo\|disqus\|twitter\|akamai\|compuserve\|aol | sed 's/.*: //' | sort | uniq -c | sort -rn | tail -20 1 cached imap.gmail.com is 2607:f8b0:400d:c0f::6d 1 cached imap.gmail.com is 2607:f8b0:400d:c07::6d 1 cached imap.gmail.com is 2607:f8b0:400d:c00::6d 1 cached imap.gmail.com is 2607:f8b0:4004:c08::6d 1 cached imap.gmail.com is 2607:f8b0:4004:c08::6c 1 cached imap.gmail.com is 172.253.63.109 1 cached imap.gmail.com is 172.253.63.108 1 cached hosts-file.net is 3.234.198.254 1 cached encrypted-tbn0.gstatic.com is 172.217.13.78 1 cached dig is NXDOMAIN 1 cached content-signature-2.cdn.mozilla.net is 1 cached beacons-handoff.gcp.gvt2.com is 172.217.15.99 1 cached beacons.gvt2.com is 172.217.13.227 1 cached beacons.gcp.gvt2.com is 1 cached beacons4.gvt2.com is 216.239.32.116 1 cached beacons2.gvt2.com is 216.239.38.117 1 cached beacons2.gvt2.com is 216.239.36.117 1 cached beacons2.gvt2.com is 216.239.34.117 1 cached beacons2.gvt2.com is 216.239.32.117 1 cached article.smartasset.com is #+end_example What is this stuff? ***** Tune it I'm not sure all the devices in the house are using the P-hole proxy. If they are, then they are showing up as the single device _gateway. I need to understand this and figure out if I can get other devices pulling wireless addresses via DHCP from the WAP to use the Pi-hole DNS directly. Stay tuned. ***** POST INCOMPLETE FROM HERE ***** Migrate ***** Burn in ***** Inflict it on others # **** Show and Tell # http://192.168.86.230/admin/index.php **** PUBLISHED "My Computer ?" :computers:windows:apple:cloud:ubuntu:linux: :PROPERTIES: :EXPORT_FILE_NAME: my-computer :EXPORT_HUGO_PUBLISHDATE: 2020-05-12 :END: The windows desktop has (had? I don't pay attention) icons labeled "My Computer". I always thought that was odd, or at least very often out of context as many (most?) instances of Windows ran on machines at people's jobs. They didn't own the computer. It was not "My Computer". Similarly, Apple has a long history of asserting they know what's best for other people and their computers. The last time I had to go to "The Apple Store" all I wanted was a power cable. I wanted the part, I wanted to pay, I wanted to get out. But, characteristically, the "experts" there (what does that say about their view of their customers) wanted to engage me, to "have a conversation", talk to me about warranties and if I qualified, they wanted to wast my time (more valuable than my money) on their agenda. Apple software is the same way. Not "My Computer". Then there is the cloud. "There is no cloud, there's just other people's computers." I've worked at AWS. I worked at CompuServe about 5 years into the information service days. Before that, it was a time-sharing company. "There is no isolated Project, Programmer Number environment with custom BASIC and FORTRAN Compilers, InfoPlex (email), and FILGE (FILe Generator and Editor) connected via X.25 PADs (VPNs back in the day), there's just CompuServe's DecSystem-10s." And then there is this glorious 3 or 4 year old laptop that I'm about to blow up, wiping the disk and reinstalling Ubuntu (switching to Kubntu, because, why not?). No change control. No production concerns (well, maybe a few, I'm putting out this blog post early in case it does not come back quickly). I have a long running game of naming my systems. This one's currently called ed (for the editor), octo (8 processors), mel (for "real programmers"). I think when I reinstall this time, I'll call it "MyComputer". **** PUBLISHED Publishing a blog on Github with Org and Hugo :blogging:org:emacs:HOWTO: :PROPERTIES: :EXPORT_FILE_NAME: hugo-org-github :EXPORT_HUGO_PUBLISHDATE: 2020-08-16 :END: If you ever thought to yourself, "Gee, Emacs Org mode is a great outlining and authoring tool, and I wish there were a powerful and simple way use it to publish static websites on github or in S3 buckets, I wish my blog could look as slick ast https://eludom.github.io/" your're in luck, All but the /simple/ part. Here are some of the references I used. Post 19 of #100DaysToOffload https://100daystooffload.com/ #+hugo: more ***** Potential ox-hugo sites to copy ****** The Art Of Not Asking Why I started by looking for sample web sites to copy by perusing the sites on this list https://ox-hugo.scripter.co/doc/examples/ I found the following - Site :: https://joshrollinswrites.com/ - Source :: https://github.com/jarss/TAONAW/tree/master Josh has been great in answering the odd question. His blog is interesting too !!! He accepts paypal... ***** General Info on Hugo, Ox-Hugo and github pages Then I did some reading (this is where the /not simple/ part comes in) on the following sites - hugo getting started :: https://gohugo.io/getting-started/quick-start/ - hosting a blog on github pages :: https://gohugo.io/hosting-and-deployment/hosting-on-github/ - github pages :: https://pages.github.com/ - HOWTO with Hugo and github pages :: https://medium.com/swlh/hosting-a-hugo-blog-on-github-pages-with-travis-ci-e74a1d686f10 - Org mode hugo exporter :: https://ox-hugo.scripter.co/ - I'll probably go here, but it seems like a bit much to start... - Maybe learn the un-automated way first? - About Hugo :: https://people.umass.edu/weikaichen/post/emacs-ox-hugo/ - About blogging with Hugo :: https://www.shanesveller.com/blog/2018/02/13/blogging-with-org-mode-and-ox-hugo/ ***** The results You're looking at the results: https://eludom.github.io/, this and other posts. It took a couple deep dives to understand it, but I think I more-or-less have it, and it is a very seamless integration wtih Org-Mode, which for some of us closes the deal even if there is pain involved ***** Bonus: Twitter cards And for bonus points I did reading on how to add twitter card support to ox-hugo bog posts, e.g., so you can write your post and have twitter or other sites (such as [[https://mastodon.social/about][Mastadon]]) that understand the format pull the title, intro and possibly an image to post in the web sit. ****** Twitter Cards: HOWTO, the short story Short version: if you drop =twitter_cards.html= in =layouts/partials/= of your blog, you then just write your blog, publish it, and past the URL into the https://cards-dev.twitter.com/validator to make sure it's going to work when posted ****** Twitter Cards: More than you ever wanted to know, the long story. - Twitter Cards :: https://sproutsocial.com/insights/twitter-cards/ - Twitter cards in ox-hugo :: https://ox-hugo.scripter.co/doc/org-toc/ - Twitter cards in Hugo :: https://gohugo.io/templates/internal/ - Twitter cards partials for Hugo :: https://gohugohq.com/partials/twitter-cards-partials-for-hugo/ - Ttitter card, ox-hugo discussion :: https://discourse.gohugo.io/t/solved-help-with-twitter-card-image/14067 - about hugo partials :: https://gohugo.io/templates/partials/ ***** How to publish: files, settings, process And, finally the gory details of actually publishing. These are raw/WIP notes, but mostly right. They actually publish this blog. ****** Important Files and Directories - /home/gmj/public/github/ox-hugo-blogs/blog/curious.org :: The one file to rule them all o This is the blog. All articles live in this one file as separate org trees. This is the "source". - HUGO_BASE_DIR=/home/gmj/public/github/ox-hugo-blogs/blog :: The root of my blog o This is the root/source for the blog. It gets pushed to git@github.com:eludom/blog.git (fetch) - =${HUGO_BASE_DIR}/content/= :: Where local content (markdown) goes, e.g. =content/posts/steve.md= - =${HUGO_BASE_DIR}/docs/= :: Where the content to publish (html) goes, ****** Settings and Organization ******* Set EXPORT_HUGO_SECTION In the .org file that is the blog, set EXPORT_HUGO_SECTION to be "Blog" (or in whichever section you want posts to land, default is "posts") This is inherited lower level headers in org so #+begin_example ,** Blog :PROPERTIES: :EXPORT_HUGO_SECTION: Blog :EXPORT_FILE_NAME: :EXPORT_HUGO_PUBLISHDATE: :END: #+end_example covers things in #+begin_example ,* Content ,** Blog ,*** Work Stuff ,*** PUBLISHED Choosy Programmers Choose GIF :Wilhite:CompuServe:GIF:History:Computers:Emacs:Programming: #+end_example ****** Processes ******* Drafting ******** TODO start hugo in root directory =hugo server -D= ******** TODO Edit curious.org Add an entry like this #+begin_example ,*** WIP Walled Gardens :PROPERTIES: :EXPORT_HUGO_SECTION: Blog :EXPORT_FILE_NAME: walled-gardens :EXPORT_HUGO_PUBLISHDATE: 2020-08-11 :END: This is a brain dump on something like 40 years experience with "social media" of various forms. #+end_example - EXPORT_HUGO_SECTION :: probably not needed if inherited from higher level headline - EXPORT_FILE_NAME :: The file name for this post. Could be date. - EXPORT_HUGO_PUBLISHDATE :: Set to the date this post should be "live". Can be used to schedule "future" posts. - IMPORTANT :: Posts with a status of TODO are drafts. WIP or PUBLISHED are "live" - EVEN MORE IMPORTANT :: /A valid Hugo post subtree is an Org subtree that has the EXPORT_FILE_NAME property set./ ox-hugo only exports valid subtrees to markdown. You can draft to your hearts content in subtrees that do not have EXPORT_FILE_NAME set (and maybe export the subtree to text or html to view) ******** TODO Save With point in the newly created or updated subtree, save the file. ******** TODO view at http://localhost:1313/ view the drafts http://localhost:1313/ View the result in your browser ******* Publishing ******** run hugo In the HUGO_BASE_DIR run =hugo=. The results will be written to "doc/". ******** push to github - I host on github.io. #+begin_example cd doc git add -A git commit -m"name of new post" git push #+end_example ******* make sure post is live, looks right - Go to site: https://eludom.github.io/ - It often takes a minute or so after push for things to show up on the web site. You might have to refresh ******* Add and push the source #+begin_example cd .. git status . git add [new files] git commit -m"name of new post" #+end_example - be sure not to add docs/, as that is pushed a a subtree. - possibly move the docs/ tree so that is not subsidiary to the root ***** Conclusion "I mean, why not just use blogger.com or Wordpress"? Been there done that. Companies come and go. I ought to know. I started my career working at CompuServe. The forums where apparently finally deleted on 2017. History was lost. There are issues of control. There are the issues of using tools I like, not the GUI or "download my app" du jour with tracking, ads, monetization, bloat and more. **** PUBLISHED HOWTO: =/bin/ed= by example :unix:100DaysToOffload:HOWTO: :PROPERTIES: :EXPORT_FILE_NAME: bin-ed :EXPORT_HUGO_PUBLISHDATE: 2020-08-28 :END: Below I *show* an editing session that uses basic =/bin/ed= commands. #+begin_quote ~/bin/ed~ is the standard Unix Editor #+end_quote ~ed~ was written round 1969. It's still here. ~grep~ comes from =/bin/ed=: =g/re/p= works as an ed command to search *g*lobally for a *re*gular expression and *p*rint the matching lines. ed commands will be familiar to users of ~sed~, as sed is the "stream editor" with a very similar set of commands. ed commands will be familiar to ~vi~ users. If you type ":" in vi, you get, basically, an ed prompt. You can type ed commands (see below) and they work. "vi" is the "visual interface" to ed (or one of it's successors). Though I am a die hard ~emacs~ user, often when I just want to do a quick edit or take some note I just fire up =/bin/ed= and go.... ***** A sample ~/bin/ed~ session... #+hugo: more #+begin_example gmj@ed tmp [master] $ ed -p: ed-HOWTO-blog.org # use ":" for the prompt, just like vi ed-HOWTO-blog.org: No such file or directory :# append some lines :a ,* Write a blog post about /bin/ed /bin/ed is "The standard Unix editor" ... since 1969 It was written by Richard Stallman ,* Show some basic ed commands - "a" :: append - "p" :: print - "s" :: substitute - "w" :: write - "q" :: quit - "." :: end input : :# Whoops, Stallman did not write ed :# go back to line 1 :1 ,* Write a blog post about /bin/ed :# make sure we are at line 1 :.= 1 :# find the mistake :/Stallman/ It was written by Richard Stallman :.= 3 :# its on line three :# fix it :s/Richard Stallman/Ken Thompson/ :# let's see the fix :p It was written by Ken Thompson :# let's see the start of the file to here :1,.p ,* Write a blog post about /bin/ed /bin/ed is "The standard Unix editor" ... since 1969 It was written by Ken Thompson :# OK, looks good, but one more change :p It was written by Ken Thompson :s/Ken Thompson/Ken Thompson or maybe Dennis Ritchie/p It was written by Ken Thompson or maybe Dennis Ritchie :# let's see the whole file now, it's short :1,$p ,* Write a blog post about /bin/ed /bin/ed is "The standard Unix editor" ... since 1969 It was written by Ken Thompson or maybe Dennis Ritchie ,* Show some basic ed commands - "a" :: append - "p" :: print - "s" :: substitute - "w" :: write - "q" :: quit - "." :: end input :# now lets grep (g/re/p) for lines that contain "ed" :g/ed/p ,* Write a blog post about /bin/ed /bin/ed is "The standard Unix editor" ... since 1969 ,* Show some basic ed commands :# ok, this looks good. write and quit :w 288 :q gmj@ed tmp [master] $ #+end_example Post 25 #100DaysToOffload https://100daystooffload.com/ **** PUBLISHED HOWTO: See *SOME* lines from a file :unix:100DaysToOffload:HOWTO: :PROPERTIES: :EXPORT_FILE_NAME: some :EXPORT_HUGO_PUBLISHDATE: 2020-09-01 :END: Sometimes you want to see the head of a file. Sometimes you want to see the tail. Sometimes you just want to see *some* lines from a file. The bash function below gives you *some* lines: #+begin_example gmj@ed bash [master] $ cat < lines.txt > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 11 > 12 > 13 > 14 > 15 > END gmj@ed bash [master] $ source some.t sh gmj@ed bash [master] $ gmj@ed bash [master] $ some -2 lines.txt 14 15 gmj@ed bash [master] $ some -2 lines.txt 9 10 gmj@ed bash [master] $ some -2 lines.txt 6 7 gmj@ed bash [master] $ cat some.sh #+end_example #+hugo: more #+begin_src bash function some { # Functon to print "some" lines of a file, like head or tail but, random start # # Usage: some [[-#] FILE] set -u; # be safe out there HOW_MANY=10 # Number of lines to print. Default. FILE="/dev/stdin" # default if [ "$#" -eq 0 ]; then : elif [ "$#" -eq 1 ]; then if [[ "$1" =~ -[0-9] ]]; then HOW_MANY=`echo "$1" | sed 's/^-//'` else FILE="$1" fi elif [ "$#" -eq 2 ]; then if [[ "$1" =~ -[0-9] ]]; then HOW_MANY=`echo "$1" | sed 's/^-//'` else echo "some: Usage: some [-# [FILE]]" return fi FILE="$2" fi # Count the lines to bound display LINES=`wc -l $FILE | sed -e 's/ .*//'` # pick a random starting line at least HOW_MANY back from the end FIRST=$((1 + RANDOM % (LINES - HOW_MANY + 1 ))) LAST=$((FIRST + HOW_MANY - 1)) # Let's see some lines ! awk "NR >= $FIRST && NR <= $LAST" $FILE } #+end_src Post 26 #100DaysToOffload https://100daystooffload.com/ **** PUBLISHED Source Code Distribution From Printouts to Github :unix:history:100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: sourcecode :EXPORT_HUGO_PUBLISHDATE: 2020-10-10 :END: Source code distribution has changed over the years. Today we all love (hate?) git, github and friends, but, believe it or not there were ways to distribute source code even before the Internet. In fact, this was the world in which the GNU Public License was created. Below are a few of the ways I've gotten/transferred source code through the years, in something like chronological order #+caption: Code on the Europython 2009 bag" by Thomas Guest is licensed with CC BY 2.0. To view a copy of this license, visit https://creativecommons.org/licenses/by/2.0/ #+name: pic:camera file:images/code.jpg Post 31 of #100DaysToOffload https://100daystooffload.com/ #+hugo: more - Print Outs :: Paper. Yes, paper. My first memories of source code (late 70s) include source listing of BASIC programs printed on ASR-33 Teletypes. I also have memories of a large stack of "green bar" printouts at home (again, c.a. 78 or 79) that I think where the printouts of Emacs (TECO emacs, the original, before GNU) that my brother probably brought home from Carnegie-Mellon where he went as an undergrad. - Paper Tape :: The ASR-33s had paper tape punches on the side. You could punch your programs onto tape and read them back in. It was 8-bit ASCII. At one point, I think my brother could read the ASCII by looking at the tape. - Cards :: Early in college (80, 81) I actually punched cards for a class or two. You could duplicate cards. No cheating on that programming assignment now ! - BYTE Magazine :: Gamers of yore bought BYTE Magazine (and others), in part to get the source code listings that they could then type in. - ACM, Knuth :: And of course there were textbooks such as Kunths (to this day unfinished) "The Art of Computer Programming" and ACM publications. Steve Wilhite used an algorithm published in ACM as part of GIF...of course anything printed was in the public domain, right? ... well, no. We were all still learning about and in some cases defining the legal status of software then, right along with GNU/FSF. - USENET News :: In the late 80s, MIT project Athena periodically posted the source code to X-Windows to the USENET news group comp.sources.x. If you were on a USENET site that "took a feed" of that newsgroup (usually over modems not faster than 9600baud), to get the latest source to X, you watched the news group (using readnews, rn or some other "newsreader" program), saved off the individual pieces from each post, reassembled and then extracted the code. The (large) distro was compressed and broken up into many pieces, and re-assembling them often involved the use of uudecode, shar, patch, tar, and programs to decompress (pretty sure gzip was not a thing yet). Of course, you had to grab them before your news site expired the articles (spool space was limited, and space was shared with rec.humor.funny and other essential news groups). Heaven help you if you missed one piece. No bit-torrent for you to find the missing pieces. You got one shot from one source in a limited time window. - UUCP :: UUCP being "unix to unix copy", you could literally issue a copy command of source known to live on a remote system something like #+begin_example uucp cbosgd!/archive/hdb-uucp.tar.gz hdb-uucp.tar.gz #+end_example with multi-hop paths being possible...if you knew the topology (pathalias !) and the filenames. - mag tape :: Then there was the time I was in Boston (visiting Encore computer?). I took a blank 9-track tape, arranged to stop by MIT, was given a personal tour of the labs, show the locked room where the all-important KDC (forerunner of Microsoft's domain controllers) was kept, and got a copy of the latest Athena source (X, Kerberos, Hesiod, etc.) dumped to tape. This was getting software, the easy way. - DECUS tapes :: Tapes were a thing for quite a while. early on users of DEC computers created and distributed "decus tapes", which were user-contributed collections of software. If the VAX/VMS bulletin board system I created in FORTRAN-77 around 1983 exists anywhere in the world, it's probably in the archive of DECUS tapes. This is one example of collections of user-generated software that grew into the software archives we came to know later. I think the IBM SHARE user group had similar collections. The programs (games, etc) distributed with BSD Unix formed another set. [[https://en.wikipedia.org/wiki/DistroWatch][DistroWatch]] is one web site in this vein today. - Floppies :: With the advent of the PC (early, mid 80s) floppies became a thing. I purchased a copy of the Mark Williams C compiler for DOS just to get the public-domain source to MicroEmacs which I then ported to the Amiga. Of course, with floppies came boot sector viruses and the security wars were on. Later issues of BYTE sometimes shipped with floppies of source so you didn't have to type it in. - Email :: Yes, you could always use tar, shar(1), uuencode(1) and friends to email source code. Email has been a workhorse for something like 40 years, not just for communication but as the file transfer method of last (first?) resort. - CompuServe (and other) Forums :: I ran ("SYSOPed" the CompuServe Unix Forum for a few years. I think we/I may have invented the file suffix ".tgz" to stand for "gzip tar" archive (because the forums could not deal with multiple suffixes, as in .tar.gz). We had source code available for download. The Forums were just CompuServe's version of the local dial-up BBS and many other similar message/download systems. - FTP :: As Internet connectivity started becoming common (at least in universities, government and some larger corporations), a number of "well known" FTP sites where created (often at well connected UUCP sites) that collected and offered source downloads. UUNET and WUSTL (Washington Univerity at St. Louis) being some of the larger ones (there is still a version of FTP server software, wu-ftp available for Linux) - Source Code Control Systems :: As Internet connectivity became a thing, source code control systems such as cvs, svn, mercurial and friends started being used on local networks and it became possible to use them over the Internet. They also solved a lot of the collaboration, version control and release management issues that are important for projects of any size. - SourceForge :: Sourceforge gets honorable mention as a precursor to github and friends. In the early 2000s it hosted many open source projects. I initially hosted NCAT there which became the Center for Internet Security's Router Audit Tool. - "My name is Legion, for we are many" :: Git is a good thing. Really. Today we have github, gitlab, dropbox and thousands of other options for getting and sharing source code, some of which even work reasonably well. The world has changed. It really is a better place. No more trolling the USENET News feed spool. No more trips to MIT, tape in hand. No more hoping ftp.uu.net has the latest version. Go forth and hack. **** PUBLISHED All we are saying, is give init.el a chance :100DaysToOffload:emacs: :PROPERTIES: :EXPORT_FILE_NAME: init-el-for-world-peace :EXPORT_HUGO_PUBLISHDATE: 2020-11-11 :END: On this Armistice Day, 2020, commemorating the end of "The war to end all wars" 119 years ago, I reflect that if the whole world were busy fiddling with their emacs configs there would be no more war. Well... so the treaty of Versailles and the League of Nations did not work out as planned...so maybe we look for community in the small instead. There is community that has grown out of research labs in Boston (a city notable for its contribution to the birth of other well known communities). Some of the well known members of the community that I am acquainted with include a Chinese programmer living in Palo Alto, a philosophy major in France, an Astronomy professor in the Netherlands, a programmer in New Zealand, a Fin living in the United states and a Filipina mother of a 4 year old living in Canada and of course it's founder, still in Boston. All we are saying, is give =init.el= a chance. Post 36 of #100DaysToOffload https://100daystooffload.com/ **** PUBLISHED Of Typewriters, Scribe, LaTeX, Org mode, Hugo and Paper :history:blogging:emacs:100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: typewriters :EXPORT_HUGO_PUBLISHDATE: 2020-12-06 :END: ***** What is this and why was it written? This is my personal history of putting words-on-page-or-screen-or-blog-entry covering the period from the late 1970s to present (2020-12-05). It was written (partially) at the request of [[https://helpdeskheadesk.net/about/][JTR]] from whom I borrowed a Hugo blog theme. Thanks JTR. I was writing a post where I wanted to include the $\TeX$ symbol in the post, which is perfectly possible in emacs org mode where $\TeX$ and $\LaTeX$ are first class citizens, but it wasn't working. The blog exports to markdown via the [[https://ox-hugo.scripter.co/][ox-hugo]] Org exporter back end (lost yet?) which [[https://gohugo.io/][Hugo]] then translates to HTML which can then be previewed locally with Hugo's own web server and then pushed to the live site, in my case, this site using git push. I pinged JTR who, it turns out had little experience with $\LaTeX$ and so was not able to help. Along the way, he asked me #+begin_quote Is there more you can tell me about use case for it? In other words, can I get you to vent some more about this, it's interesting. #+end_quote #+hugo: more So here is some venting. I can always vent. And, in case you were wondering, the solution is to put #+begin_src html #+end_src at the bottom of =layout/partials/head.html= before ~~ in the modified [[https://themes.gohugo.io/hyde-hyde/][Hugo hyde theme]] I borrowed from JTR. ***** Some History #+begin_quote Marley was dead, to begin with... #+end_quote No. No. No. #+begin_quote It was a dark and stormy night... #+end_quote Wrong. OK, how about this: ***** Dad - Typewriters #+begin_quote In high school I wrote out my paper assignments by hand and then my Dad typed them for me, at least until I took typing and got up to 30wpm. White-out can be your friend :-) #+end_quote Better. #+begin_quote As high school progressed I and my friends started using the HP-2000E in the computer lab on [[https://en.wikipedia.org/wiki/Teletype_Model_33][ASR 33 Teletypes]] (=/dev/tty= anyone?) that printed your input and the computers responses on a role of paper. We may have printed a few stories or other prose, but mostly it was BASIC listings. Towards the end of high school, I remember eyeing the school secretary's IBM Selectric typewriter because we knew it could be converted to a printer...(Apple II's were all the rage then ...) #+end_quote ***** Brian Reid - Scribe So, [[https://en.wikipedia.org/wiki/Scribe_(markup_language)][Scribe]]. So in the late 70's at Carnegie-Mellon, Brian Reid stepped into the long tradition of Computer Science geeks scratching their own itch, developing one of the first mark-up languages that allowed the author to describe a document structurally (chapters, paragraph, et cetera.), and to target different output devices (text, laser printer, etc.), and to externalize styles, presaging the later CSS style sheets. Reid killed several birds with one stone. Scribe was the subject of his PhD Thesis, it formatted his PhD thesis (and many others for a few years), and was sold to Unilogic sparking the first software copyright problems between CMU and students, wining Reid the ACM Grace Hopper Award, and, of course, criticism from Richard Stallman[fn:11] for not making it available for free...some people :-) I wound up using Scribe on the Ohio State DECsystem-20 and then being the SCRIBE administrator for the department of Mechanical Engineering for a year or two. As I had access to then-world-class formatting and typesetting facilities, Dad was no longer typing my papers :-) ***** Donald Knuth - [[https://en.wikipedia.org/wiki/TeX][TeX]] Meanwhile, on the other side of the country (on a dark and stormy night?), [[https://en.wikipedia.org/wiki/Donald_Knuth][Donald Knuth]] was (and still is) engaged in writing his foundational series of Computer Science textbooks, /The Art of Computer Programming/ [fn:10]. But he was not happy with the appearance of the typesetting from his publisher, so, being Donald Knuth, he set out to write his own formatting and type-setting program c.a. 1978. The result was $\TeX$. Along with [[https://en.wikipedia.org/wiki/TeX][TeX]] he developed Metafont, a language for describing fonts from which we get the Computer Modern fonts. The current $\TeX$ release is 3.14159265. Each subsequent release adds a digit of $\pi$. Metafont is at 2.7182818 and approaching /e/ with each release. I installed the Pascal based TeX82 on the DEC10's at CompuServe sometime around 1986. ***** Donald Knuth - Literate Programming Not content with having won the Turning award in 1974 (4 years prior), with creating a typesetting system that is used to this day for a large fraction of academic publishing, alongside $\TeX$ he came up with the concept of [[https://en.wikipedia.org/wiki/Literate_programming][Literate Programming]], the basic idea of which is you are writing a program both for humans and machines. The language was called WEB[fn:9]. The basic process is to run "weave" to generate output for humans (say, a volume of the /The Art of Computer Programming/) and to run "tangle" to generate output (code) for machines. We see elements of this today in Jupyter and Zeppelin notebooks, and for those of the Emacs-Org-mode faith, as the mix of [[https://orgmode.org/][Org Mode]] and [[https://orgmode.org/worg/org-contrib/babel/intro.html][Org Babel]]. See the paper by Domnick, Shculte etc on reproducible research: https://www.jstatsoft.org/article/view/v046i03 Org directly supports a form "tangle" today. ***** Guy Steele - the 1 degree of separation Guy Steele who later went on to have a lot to do with Java (and standardizing C) seems to have been the 1-degree-of-separation point for Emacs, TeX, and possibly SCRIBE. As recently as https://emacsconf.org/2020/, Stallman credits Steele with helping invent Emacs. Per Wikipedia, Steele spent the summer of 78 at Stanford and later implemented a back-end for TeX at MIT. By 1980 or so (per my wife who knew him there) he was at CMU and Tartan Labs as Reid was finishing off SCRIBE and his thesis. The Stanford-Berkeley-MIT-CMU crowed was (is?) a small world. James Gosling (Java, [[https://en.wikipedia.org/wiki/Gosling_Emacs][GosMacs]] 1981) was also kicking around CMU before moving off to Sun. ***** Leslie Lamport - Latex So, $\TeX$ was cool and all, but it was very low level, and in some ways difficult to work with. People had seen SCRIBE. So at some point in the mid-80s, as SCRIBE was on its way to proprietary-software-oblivion, [[https://en.wikipedia.org/wiki/Leslie_Lamport][Leslie Lamport]] created $\LaTeX$. $\LaTeX$ is, from my point of view, a set of SCRIBE-like macros on top of $\TeX$. Very useful. And because creators gonna create....along the way Lamport and Oren Patashink created [[https://en.wikipedia.org/wiki/BibTeX][BibTeX]] which is to this day one of the most common ways to keep a list of bibliographic references that can be cited in your papers. If you're curious what all this looks like, I keep my resume in .tex format[fn:13]. You can see it here http://www.port111.com/george/resume/ along with the .bib file for citations and .tex input. ***** Bill Gates and the nameless corporate droids[fn:12] - WYSIAYG Editors What You See Is All You Get (WYSIAYG) also known as What You See Is What You Get (WISIWYG) editors let you move pixels around on the screen and print exactly what you see. With no training at all in printing, typesetting, aesthetics, or design you can make wildly inconsistent and incoherent decisions about the visual appearance of your document, in fact, you (and your boss and your marketing department) can focus on that from the start to the exclusion of stringing together coherent thoughts. I'm pretty sure SCRIBE and $\LaTeX$ form the basis of my antipathy to the WYSIWIG editors that started to come along (mass market). When writing documents you should think first about what you are saying, the structure of your document, your arguments and your story line before you worry (if all) about making a font just the right size and color so you can make your power point. Formatting should be the afterthought, and no more than choosing the right style sheet. Brian Reed got that right. ***** Sir "Almost not appearing in this blog post" - RUNOFF and nroff A couple honorable mentions that I did in fact use a good bit along the way are [[https://en.wikipedia.org/wiki/TYPSET_and_RUNOFF][DEC RUNOFF]] (DEC 10s, VMS) and [[https://en.wikipedia.org/wiki/Nroff][nroff]] (unix). nroff comes in handy when you want to write man(1) pages. ***** Tim Berners-Lee - The Web There was a time before the web. There were things written and published before the web. But since the early 90s it's been the 800-pound gorilla in the living room. There were other hyptertext systems before it. Apple's HyperCard. The GNU/Emacs info system. There was, in fact, a whole academic conference on hypertext systems at which early versions of HTML/HTTP were scorned. But NCSA Mosaic happened, Netscape happened ([[https://en.wikipedia.org/wiki/Marc_Andreessen][Marc Andreessen]]). The NCSA, Netscape and Apache servers happened. For various reasons, the World Wide Web took off in ways that gopher never did and [[https://gemini.circumlunar.space/][Gemini]] probably never will. Stodgy XML editors were rebranded as exciting new HTML editors. I attended the 2nd International Conference on Mosaic and the Web, met Berners-Lee, and implemented a never-released web browser that worked through CompuServe's WinCIM which would have allowed dial-up users without an IP stack such as SLIP or PPP (most users at that time) to access the web. But marketing people. They were not sure this web thing was going to catch on.... ***** Carsten Dominick - Org Mode - "Your Life in Plain Text" Your blog post is text. Your email it text. Your slack (IRC) messages are text. Your documents are text. Your calendar and agenda are text. Your shopping lists are text. You TODO lists are text. Musical scores are texts. Poems are text. ASCII art is text. Source code is text. Data is text (json). The web is text (once you strip out all the graphics, videos, java and javascript...) At different levels YOU are text. Your DNA sequence is a text. The story of your life is a text. There was a period in the late 90s and early 2000s where Emacs (the text editor) kind of went into a lull. Then two things happened: package managers (ELPA, MELPA, basically "apps" for emacs) and org mode. Org mode is a game changer. It's going to take me to my grave or senility where I forget the meta-alt-control-shift-escape sequences needed to make the magic happen, whichever comes first. People are learning an arcane 44-year old editor just to use org mode (and the growing list of packages being built in/with round it). Org started as a simple text outline tool. It enabled Abraham Lincoln to write a short, pithy, and memorable speech: #+begin_src org ,* Hook Four score and seven years ago our fathers - brought forth on this continent, a new nation, o conceived in Liberty, o and dedicated to the proposition + that all men are created equal. ,** Body Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure... ,*** Conclusion ...that government of the people, by the people, for the people, shall not perish from the earth. #+end_src OK, maybe not. Carsten Dominick, the creator of Org, is an academic (Astronomy professor), he built in support for $\LaTeX$ from the beginning. To use $\LaTeX$ in Org, you simply write latex and math equations exactly as you would for "normal" $\LaTeX$. If the back-end exporter (e.g. the $\LaTeX$ exporter or the HTML exporter) support $\LaTeX$, you just get your nicely formatted output for free \begin{multline*} p(x) = x^8+x^7+x^6+x^5 \end{multline*} Org documents can be easily exported to text (of course), $\LaTeX$, HTML, .ODF (Microsoft Word compatible) and scores of others. Same input. 2 or 3 keystrokes. Different output. Org naively supports TODO lists, outlines, agendas, planning (GTD and similar systems), note taking/knowledge capture, contact management, calendaring, spreadsheet-like calculations, literate programming and the list goes on. Same basic interface. Same commands. Not a mouse-over, click or graphical interface in sight (unless you want it) Just text, all the way down. And since it's just text, it can be handled with source code management tools (git) and of course your favorite text editor. There are mobile clients ([[https://github.com/orgzly/orgzly-android][see Orgzly]]) so you can simply push org text files to your phone with Dropbox or Syncthing and use them for TODO lists, quick note taking and journal entries, shopping lists, contact management, schedules, etc. Oh, and ASCII art is a thing... #+CAPTION: Text Colored Glasses #+BEGIN_EXAMPLE / \ "I'll see you on __ /\ / / the text side / \ / \ / of the moon" / / -------R------/ \ _/_____ _______ / -------G-----/ --\-----W------- / \ / \ / \/ -------B----/ \ | Org | | Mode | / \ \_______/ \_______/ ------------- #+END_EXAMPLE ***** Johnny Cash - "I've seen 'em come and go, and I've seen 'em die.." - CompuServe - Prodigy - BIX - GEnie - AIM - AOL - MySpace - Google+ - [[https://killedbygoogle.com/][Killed By Google]] My father spent 25 years working for the Ohio Historical Society running the microfilm department. A lot of that time was spent preserving the last remaining copies of 19th and 20th newspapers that somebody found in Aunt Millie's attic at her estate sale. Save for that, the daily history of Findlay, Cadiz, Yellow Springs, Lima and Barberton would have been completely lost. He was preserving important texts. He was preserving, in some cases, the only record of people's lives. People's lives matter. I began my professional career at CompuServe. CompuServe had vibrant forums where there was lots of interaction, growth and history made. All with text exchanges. A couple years ago, most of that history was flushed because "there was no business case for preserving it." Companies come and go. They should not be trusted to preserve important texts or to decide which texts are important. Today Facebook and Twitter are censoring content. How long will they be in business? When will they dump text you care about? Karl Voit has spelled this out very well in a blog post: [[https://karl-voit.at/2020/10/23/avoid-web-forums/][Don't Contribute Anything Relevant in Web Forums Like Reddit]] I am systematically moving my texts off "Big Internet". Facebook went (mostly in 2016, completely in 2020). I've stopped posting to Twitter. Dropbox is gone. Github (which hosts this blog) is next. Google in progress. I helped create this world, but it's time for a course correction. Centralization and mediation of human interaction by organizations with nothing but a advertising-driven profit motive[fn:14] is a problem. We need to move to systems that put people first. Having recently joined the Mastadon community Fosstodon that focuses on Free and Open Source Software, I believe we are living in an incredible time where the tools we need for a federated, decentralized, ad-free, people-centric world are being created...all without even jumping on the crypto-currency bandwagon :-). There are extant/emerging solutions for authoring, messaging, social networking, distributed source code control and many more. Herein lies another long post, but to me this "feels" very like the early days of GNU and Linux. ***** Steve Francia - Hugo One last entry in the things-I-have-used-to-write lineup. The Hugo static web site generator is bringing you this blog. The production of this blog combines many of the technologies and processes already discussed: - org mode :: The actual source for this blog is a "normal" emacs org mode buffer which is exported via the ox-hugo backend - $\LaTeX$ :: The ox-hugo exporter deals seamlessly with almost all org features, including $\LaTeX$[fn:15], footnotes, /emphasis/, etc. - Web :: Once the markdown is produced, Hugo does what it does. It uses style sheets, templates, themes etc to render the blog as HTML served up via a local web server for texting and to be pushed to the "live" web serer for production. - Focus on the content :: And all of this is in the "don't worry what it looks like, just focus on the content" mode. With 4 keystrokes I exported a copy of this post to =.ODT= format so my son could review it in word. A different 4 keystokes exports to text or HTML. I let the back-ends "do the right thing" to make it "look good" in the target format. - git :: Once the results are satisfactory, they are "pushed to production" via =git push=. Problems? Need to back out? It's git. Multiple authors? It's git. I described this process in way too much detail already elsewhere in my blog post on [[https://eludom.github.io/blog/hugo-org-github/][publishing a blog on Github with Org and Hugo]]. ***** George Jones - OK, but did George actually write anything worth reading? You've read this far on a long blog post :-) I may have written some things, well, a lot of things. You can decide if they are worth reading. - [[https://tools.ietf.org/html/rfc3871][https://tools.ietf.org/html/rfc3871]] :: RFC3871 was a starry-eyed attempt at getting large network equipment vendors to, you know, stop using telnet (with plain-text passwords in the clear) for management of inconsequential computers like the routers that make up the Internet backbone. It used yet another cool text formatting tool, [[https://xml2rfc.tools.ietf.org/][xml2rfc]]. In my opinion we lost the war, e.g. getting security features in important devices ... and well ... IOT devices are here now, many using the same least-cost TCP/IP stacks that are full of the same problems, see https://en.wikipedia.org/wiki/Ripple20 and not up-gradable. It looks like the [[https://tools.ietf.org/wg/opsec/charters][IETF OPSEC Working Group]] that that document spawned is still going, pumping out documents, and, I'm sure, in the words of Marshall Rose, there have been "[[http://www.faqs.org/rfcs/rfc3160.html][Many fine lunches and dinners]]" - Links to a few pubs, talks, papers, etc :: Because 20 year old index.html files never die http://www.port111.com/george/#pubs ***** Back to paper I used to have a saying: #+begin_quote If it requires paper, it's the wrong interface. #+end_quote I'm backtracking on that. I journal, on paper, most mornings. I'm finding that there is a level of creativity, spontaneity and a kind of catharsis that happens when putting things on paper. I make non-linear connections that would never be made at a keyboard. I'm not sure what that's saying. Stay open? Be willing to re-consider things you've discarded? There will be no follows. No likes. No re-shares. No chance of going viral. But its where I find my thoughts. Things have come full circle. ***** Final thoughts I hope this has been at least an in interesting read. I hope it has provided at least some idea of where we are and how we got here in terms of technology for putting thoughts on "paper". ***** And now, a word from our sponsor... \begin{array}{*{20}c} {x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}} & {{\rm{when}}} & {ax^2 + bx + c = 0} \\ \end{array} ***** Footnotes [fn:9] And, yes, Tim Berners-Lee was in academic circles then and could not have helped knowing about Knuth's WEB ... score naming the Word Wide Web as a side effect of a side effect for Knuth? [fn:10] Knuth's /The Art Of Computer Programming/ is available on github. I'm not going to provide a link because when I went there and tried to view the site it crashed my browser and nearly froze my computer. My guess is Knuth just did something that was perfectly sensible from a theoretical view (maybe creating a 50 gig PDF), but which mere software chokes on. Computer Science classic texts as DOS attacks? Another unintended side effect. I wonder if [[https://attack.mitre.org/][MITRE ATT&CK]] has mapped that threat yet? [fn:11] This was several years before the start of the GNU project. [fn:12] "Bill Gates and the Nameless Corporate Droids" sounds like a fine name for a band, right up there with "The Dead Kennedys" [fn:13] Actually, it's in in an .org format with custom elisp code that implements cpp style ifdef logic for producing different output for the short resume, the long resume, linkedin, etc. off the same source, that creates latex on export which is then run through tex and friends to produce a pdf, but shhh. Pay no attention to that man behind the curtain. [fn:14] Oppressive governments and various other not-so-friendly motivations fall here as well. [fn:15] once the =layout/partials/head.html= was fixed Posts 39, 40 and 41 of #100DaysToOffload https://100daystooffload.com/. This one was a production. It counts for 3. **** PUBLISHED .bashrc as literate programming :howto:emacs:100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: bashrc :EXPORT_HUGO_PUBLISHDATE: 2020-12-05 :END: ***** Knuth gets annoyed at his publishers, $\TeX$ is born. Back in the late 70s Donald Knuth who was (and still is) publishing a seminal series of Computer Science text books got annoyed at the typesetting, layouts and font choices he was being presented by publishers. So he did what any self-respecting hacker who happened to be Donald Knuth would do: he created his own typesetting system called $\TeX$ which (along with $\LaTeX$ which borrowed heavily from SCRIBE) is something of a standard to this day in academic publishing. Because, you know, why is it unreasonable to expect publishers to render simple equations, right? \begin{multline*} \vec{E}_{\mathrm{tot}}= q\cdot k_{b}\cdot \dfrac{r}{r^3} \left\lgroup \frac{\hat{r}-\left(\dfrac{d}{2\cdot r}\right)\hat{d}} {\biggl(1+\left(\dfrac{d}{2\cdot r}\right)^2- \left(\dfrac{d}{r}\right)\hat{r}\cdot\hat{d}\cdot\cos(\theta) \biggr)^{3/2}} \right. \\ \left. {}- \frac{\hat{r}+\left(\dfrac{d}{2\cdot r}\right)\hat{d}} {\biggl(1+\left(\dfrac{d}{2\cdot r}\right)^2+ \left(\dfrac{d}{r}\right)\cdot\hat{r}\cdot\hat{d}\cdot\cos(\theta) \biggr)^{3/2}} \right\rgroup \end{multline*} #+begin_center https://tex.stackexchange.com/questions/371644/how-to-write-this-long-equation #+end_center But wait, there's more. #+hugo: more ***** Literate Programming In addition to writing his own typesetting system, he came up with the concept of /Literate Programming/ at the same time. The basic idea is that you write for humans to read (e.g. text books) with a side-effect of outputting code (for machines to execute). It is the ultimate in software documentation. The code and the description are an integrated whole with different processes, "tangle", to produce code and "weave"[fn:8], to produce output for humans I've been influenced by the concept of /Literate Programming/ ever since I installed the original TeX (and LaTex) on CompuServe's DEC10s. ***** The children of tangle and weave - Org, Babel, Jupyter and Zepplin Fast forward a few decades. Carsten Dominick creates org mode for Emacs to organize, well, everything which, of course, has a back end to output .tex files. Eric Schulte then has the bright ideas of creating org-babel, which allows small (or not so small) blocks of code to be imbedded in org files and executed with their output becoming part of the document. Literate programming, here were are, again....oh, and it's a tool for doing reproducible scientific research as well where the data, code, descriptions of experiments and results/conclusions are all one document: https://www.jstatsoft.org/article/view/v046i03 Jupyter and Zeppelin notebooks provide similar functionality today for Python, Spark, Scala and the data science community, but Knuth was there 40 years ago. ***** George gets annoyed at a complicated .bashrc, .bashrc.org is born Which brings me to my own humble annoyances which are not likely to change the course of science or academic publishing... As a nearly lifelong emacs user I am mildly annoyed any time I have to do something that can't be done in emacs in general, and have been particularly annoyed at the growing complexity of my =.bashrc= file which could not be organize and documented in org mode....until now. ***** EmacsConf 2020 talk: README Driven Design A talk at EmacsConf 2020 reminded me that Org mode can be used directly for literate programming. Test Driven Design (TDD) had been a concept for a while: write your tests first, once your code passes, you're done. Find a bug, write a new test, code until it passes. "README Driven Design" continues in the same vein. Often programmers will wait to the end to write their documentation, install notes, user guide etc. What this talk advocates is to use literate programming and to /start/ the README.org, which, given Org babel, could be the whole application, including TDD scripts. See. Emacs does subsume all, did you notice how TDD just got swallowed up without missing a step? See the blog post summarizing the talk at [[http://adamard.com/literate_programming.html][http://adamard.com/literate_programming.html]] ***** 1 - My .bashrc as literate programming What follows are three different versions of my (457 line) =.bashrc= file. The first is the version for-human-consumption, complete with comments, descriptions, useful font highlighting and actual text blocked out. In Knuth's terms, this is the "weave" output. The second is the .bashrc that actually gets executed by bash. This is the "tangle" output. The last is the org mode source from which both preceding versions used as input. ****** 1.1 - My .bashrc - weave output for humans Here is the human-readable .bashrc file with comments, etc. ******* About this .bashrc file ******** Intro This is George Jones' .bashrc file as an literate programming file in emacs org mode using babel blocks. ******** To generate the actual .bashrc This .bashrc.org file must be processed to generate the actual .bashrc It can be processed interactively to generate .bashrc via org-babel-tangle-file or from the command line as #+begin_example emacs --batch --eval "(require 'org)" --eval '(org-babel-tangle-file ".bashrc.org")' #+end_example Permanent changes must be made to the .org version, as the actual .bashrc will be overwritten when the .org version is "compiled" ******** Debugging In most bash files I do #+begin_example set -e set -u #+end_example but there are problems setting it in .bashrc. An error then causes you to exit the shell entirely (not what you want), and there are several constructs that cause warnings due to undefined variables (these can/probably should be fixd) Set #+begin_example export DEBUG=1 #+end_example to enable debugging output from the debug helper function. ******* The actual executable .bashrc ******** Helper functions I define a few syslog-ish helper functions to print warnings, errors, etc. #+begin_src shell :tangle .bashrc :noweb no-export #PROG=`basename "$0" | tr -d '\n'` # normal setting PROG="bashrc" # setting for bashrc due to errors function info() { echo ${PROG}\: info: "$@" 1>&2; } function warn() { echo ${PROG}\: warning: "$@" 1>&2; } function error() { echo ${PROG}\: error: "$@" 1>&2; } function debug() { [[ -v DEBUG ]] && echo ${PROG}\: debug: "$@" 1>&2 || true ; } function die() { echo ${PROG}\: fatal: "$@" 1>&2 && exit 1; } #+end_src ******** Set a reasonable default prompt Here I set a reasonable default prompt that includes timestamp, username, host and current directory: #+begin_src shell :tangle .bashrc :noweb no-export export PS1="\# [\t] \u@\h \W/ $ " #+end_src ******** Misc aliases Define various aliases that I use #+begin_src shell :tangle .bashrc :noweb no-export alias rm=' rm -i' alias ag=' alias | grep -i' alias eg=' printenv | grep -i' alias hg=' history | grep -i' alias ht=' history | tail' alias fpg=' find . -print | egrep -i' alias egi=' egrep -i' alias psg=' /bin/ps -auxww | grep' alias p8=' ping -c 3 8.8.8.8' # make sure routing works alias pp=' ping -c 3 port111.com' # make sure dns and routing work alias locate='locate -r' #+end_src ******** cd commands that use/print the directory stack These aliases support pushd/popd/dirs like functionality while listing one directory per line I like to keep a "stack" of directories so I can work on one thing then "pop" back to where I was. =pushd= an =popd= support this, and =dirs= lists the directories, but I prefer to have them listed one per line. #+begin_src shell :tangle .bashrc :noweb no-export function dirl() { # "DIR"ectory "L"ist directory stack, one per line # Usage: dirl for d in `dirs`; do echo $d; done } function dirc() { # "DIR"ectory "C"onnect - connect to directory and list stack # Usage: dirc [DIR pushd ${1:-"$HOME"} > /dev/null dirl } function dirp () { # "DIR"ectory "P"op - pop N entries off the directory stack # Usage: dirp [N] # # OLD: # alias dirp='popd > /dev/null && dirl' for i in `seq ${1:-"1"}`; do debug "dirl: popd. i is $i" popd > /dev/null; done dirl } alias cd=pushd #+end_src ******** Misc functions #+begin_src shell :tangle .bashrc :noweb no-export function gf() { # grep-find: grep for patterins in files via find # # Usage: gf patterns [files [days]] # # Examples: # gf findMeAnywhere # gf findMeInTextFiles '*.txt' # gf findMeInTextFiles .txt # gf BEGIN\|END .org 30 local files="" local days="365" set -o noglob # First arg is pattern(s) for egrep if [ -z ${1+x} ]; then echo 'gf needs string(s) to search for ' 1>&2 info "Usage: gf patterns [files [days]]" return 1 fi # Second arg (if present) is files for find. No globbing, so "*.txt" OK if [ ! -z ${2+x} ]; then if [[ "$2" =~ ^\. ]]; then # Special case: treat ".foo" as "*.foo" # Avoids needing to quote on command line files="-name *$2" else files="-name ${2}" fi fi # $3 (if present) is find -mtime arg, default 365 if [ ! -z ${3+x} ]; then days="${3}" fi # set -x find . -type f -mtime -${days} $files -exec egrep --color -H -i "${1}" \{\} \; # set +x set +o noglob } #+end_src ******** Bash history functions and settings #+begin_src shell :tangle .bashrc :noweb no-export # Preserve history across sesssions # # http://unix.stackexchange.com/questions/1288/preserve-bash-history-in-multiple-terminal-windows # export HISTCONTROL=ignoredups:erasedups # no duplicate entries export HISTSIZE=100000 # big big history export HISTFILESIZE=100000 # big big history shopt -s histappend # append to history, don't overwrite it # Save and reload the history after each command finishes export PROMPT_COMMAND="history -a; history -c; history -r;" function hgt() { # hgt == "history grep (for arg) tail" #echo "Histroy Grep tail" if [ -z ${1+x} ]; then echo 'hgt needs an argument' 1>&2 return 1 fi history | grep -i "$1" | tail return 0 } #+end_src ******** Set the hostnane, timezone and local Set HOSTNAME if ~/etc/hostname exists #+begin_src shell :tangle .bashrc :noweb no-export if [ -e ${HOME}/etc/hostname ]; then export HOSTNAME=`cat ${HOME}/etc/hostname` elif [ -e /etc/hostname ]; then export HOSTNAME=`cat /etc/hostname` else export HOSTNAME="unknown" fi # Set timezone if ~/bin/tz.sh exists # NEW, if neeeed? # # https://linuxize.com/post/how-to-set-or-change-timezone-in-linux/ # # OLD: # # if [ -e ~/bin/tz.sh ]; then # echo Setting timezone. # source ~/bin/tz.sh # should be in ~/rc.local # fi # STILL NEEDED? # # Set local for numeric output LOCAL=`locale -a | grep -i en_us | head -1` if [[ "$LOCAL" != "" ]]; then export LC_NUMERIC="$LOCAL"; fi #+end_src ******** Set up ssh agent Add keys by hand if needed via #+begin_example ssh-add ~/.ssh/id_* #+end_example #+begin_src shell :tangle .bashrc :noweb no-export if [ -e ~/bin/sshagent ]; then source ~/bin/sshagent fi #+end_src ******** Copy stdin to clipboard #+begin_src shell :tangle .bashrc :noweb no-export if [[ "$OSTYPE" == "linux-gnu"* ]]; then alias 2clip='xclip -selection c' alias 3clip='printf %s "$(cat /dev/stdin)" | xclip -selection c' # no final \n elif [[ "$OSTYPE" == "darwin"* ]]; then alias 2clip='pbcopy' fi #+end_src ******** Path functions These path* functions add and remove elements to PATH. They insure that entries are unique. They allow you to place a path first or last in the order (e.g. so that =~/bin= comes before =/usr/local/bin=) #+begin_src shell :tangle .bashrc :noweb no-export pathrm() { # remove an item from the path if [ -d "$1" ]; then removeThis="`echo $1 | sed -e 's#/#\\\/#'g`" newPath=`echo $PATH | awk -v RS=: -v ORS=: "/$removeThis/ {next} {print}" | sed 's/[ :]*$//g'` export PATH=$newPath fi } pathlast() { # add path to the end if not there if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then export PATH="${PATH:+"$PATH:"}$1" fi } pathfirst() { # add path to the front if not there if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then export PATH="$1:${PATH}" fi } path() { # show path echo $PATH } # show path, one entry per line alias pathcat="echo $PATH | sed 's/:/\n/g'" # Be sure we have a few specific paths if they exist pathlast $HOME/bin pathlast /usr/local/bin pathlast /opt/bin #+end_src ******** source ~/rc.local/*.sh to do non-general bash setup Execute any .sh files in ~/rc.local/*.sh This allows me to split out setup for aliases and commands that only get used on certian systems or in certian contexts (git, go, mail, blog..) #+begin_src shell :tangle .bashrc :noweb no-export if [ -d ${HOME}/rc.local ]; then for rcfile in $(find ${HOME}/rc.local -name \*.sh); do debug running localrc ${rcfile} source ${rcfile} done fi #+end_src ******** Invoking emacs #+begin_src shell :tangle .bashrc :noweb no-export alias emacs='setsid emacs' # from http://stuff-things.net/2014/12/16/working-with-emacsclient/ if [ -z "$SSH_CONNECTION" ]; then export EMACSCLIENT=emacsclient alias ec="$EMACSCLIENT -c -n" export EDITOR="$EMACSCLIENT -c" export ALTERNATE_EDITOR="" else export EDITOR=$(type -P emacs || type -P ed) fi export VISUAL=$EDITOR #+end_src ******** ls aliases #+begin_src shell :tangle .bashrc :noweb no-export # coloring for ls functions if [[ "$OSTYPE" == "linux-gnu" ]]; then color="--color"; else color="" fi BIN_LS=/bin/ls alias ls=' ls '$color' -a' # Long List Reverse Tail function llrt() { ls -lrt $color ${*:-}; } # Long List Time function llt() { ls -lt $color ${*:-}; } # Long List Time, More function lltm() { ls -lt $color ${*:-} | more; } # Long List Time, Less function lltl() { ls -alt $color ${*:-} | more; } # Long List Time, Head function llth() { ls -lt $color ${*:-} | head; } # Long List Time, Tail function lltt() { ls -alt $color ${*:-} | tail; } # List Sort Size function lss() { ls -a1s $color ${*:-} | sort -n; } # List Sort Size Reverse function lssr() { ls -a1s $color ${*:-} | sort -nr; } #+end_src ******** Aliases for viewing the newest file in a directoy #+begin_src shell :tangle .bashrc :noweb no-export function nf () { # list the newest file in the current directory NF=`find ${1:-.} -maxdepth 1 -type f -print0 | xargs -0 ls -1t | head -1;`; echo ${NF:-/dev/null} | sed "s/ /\\\ /g" } # new file tail file function nftf { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs tail -f ; } # new file tail function nft { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs tail ; } # new file head function nfh { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs head ; } # new file less function nfl { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs less ; } # new file cat function nfc { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs cat ; } # new file ls function nfls { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs ls -A1t ; } # new file ls -l function nflsl { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs ls -Atl ; } #+end_src ******** viewing files Notes on setting up file/mime type associations can be found at https://unix.stackexchange.com/questions/77136/xdg-open-default-applications-behavior So, to make emacs (what else?) the default for MIME type =text/plain= ... #+begin_example locate -r 'emacs.*\.desktop' xdg-mime default emacs.desktop text/plain #+end_example #+begin_src shell :tangle .bashrc :noweb no-export if [[ ! -z "`which xdg-open`" ]]; then alias open='xdg-open '; fi #+end_src ******** All done #+begin_src shell :tangle .bashrc :noweb no-export touch $HOME/.bashrc-ran debug ".bashrc done" #+end_src ****** 1.2 - My .bashrc - tangle output for computers Here is the actual .bashrc file for bash(1) to consume #+begin_src bash :eval no #PROG=`basename "$0" | tr -d '\n'` # normal setting PROG="bashrc" # setting for bashrc due to errors function info() { echo ${PROG}\: info: "$@" 1>&2; } function warn() { echo ${PROG}\: warning: "$@" 1>&2; } function error() { echo ${PROG}\: error: "$@" 1>&2; } function debug() { [[ -v DEBUG ]] && echo ${PROG}\: debug: "$@" 1>&2 || true ; } function die() { echo ${PROG}\: fatal: "$@" 1>&2 && exit 1; } export PS1="\# [\t] \u@\h \W/ $ " alias rm=' rm -i' alias ag=' alias | grep -i' alias eg=' printenv | grep -i' alias hg=' history | grep -i' alias ht=' history | tail' alias fpg=' find . -print | egrep -i' alias egi=' egrep -i' alias psg=' /bin/ps -auxww | grep' alias p8=' ping -c 3 8.8.8.8' # make sure routing works alias pp=' ping -c 3 port111.com' # make sure dns and routing work alias locate='locate -r' function dirl() { # "DIR"ectory "L"ist directory stack, one per line # Usage: dirl for d in `dirs`; do echo $d; done } function dirc() { # "DIR"ectory "C"onnect - connect to directory and list stack # Usage: dirc [DIR pushd ${1:-"$HOME"} > /dev/null dirl } function dirp () { # "DIR"ectory "P"op - pop N entries off the directory stack # Usage: dirp [N] # # OLD: # alias dirp='popd > /dev/null && dirl' for i in `seq ${1:-"1"}`; do debug "dirl: popd. i is $i" popd > /dev/null; done dirl } alias cd=pushd function gf() { # grep-find: grep for patterins in files via find # # Usage: gf patterns [files [days]] # # Examples: # gf findMeAnywhere # gf findMeInTextFiles '*.txt' # gf findMeInTextFiles .txt # gf BEGIN\|END .org 30 local files="" local days="365" set -o noglob # First arg is pattern(s) for egrep if [ -z ${1+x} ]; then echo 'gf needs string(s) to search for ' 1>&2 info "Usage: gf patterns [files [days]]" return 1 fi # Second arg (if present) is files for find. No globbing, so "*.txt" OK if [ ! -z ${2+x} ]; then if [[ "$2" =~ ^\. ]]; then # Special case: treat ".foo" as "*.foo" # Avoids needing to quote on command line files="-name *$2" else files="-name ${2}" fi fi # $3 (if present) is find -mtime arg, default 365 if [ ! -z ${3+x} ]; then days="${3}" fi # set -x find . -type f -mtime -${days} $files -exec egrep --color -H -i "${1}" \{\} \; # set +x set +o noglob } # Preserve history across sesssions # # http://unix.stackexchange.com/questions/1288/preserve-bash-history-in-multiple-terminal-windows # export HISTCONTROL=ignoredups:erasedups # no duplicate entries export HISTSIZE=100000 # big big history export HISTFILESIZE=100000 # big big history shopt -s histappend # append to history, don't overwrite it # Save and reload the history after each command finishes export PROMPT_COMMAND="history -a; history -c; history -r;" function hgt() { # hgt == "history grep (for arg) tail" #echo "Histroy Grep tail" if [ -z ${1+x} ]; then echo 'hgt needs an argument' 1>&2 return 1 fi history | grep -i "$1" | tail return 0 } if [ -e ${HOME}/etc/hostname ]; then export HOSTNAME=`cat ${HOME}/etc/hostname` elif [ -e /etc/hostname ]; then export HOSTNAME=`cat /etc/hostname` else export HOSTNAME="unknown" fi # Set timezone if ~/bin/tz.sh exists # NEW, if neeeed? # # https://linuxize.com/post/how-to-set-or-change-timezone-in-linux/ # # OLD: # # if [ -e ~/bin/tz.sh ]; then # echo Setting timezone. # source ~/bin/tz.sh # should be in ~/rc.local # fi # STILL NEEDED? # # Set local for numeric output LOCAL=`locale -a | grep -i en_us | head -1` if [[ "$LOCAL" != "" ]]; then export LC_NUMERIC="$LOCAL"; fi if [ -e ~/bin/sshagent ]; then source ~/bin/sshagent fi if [[ "$OSTYPE" == "linux-gnu"* ]]; then alias 2clip='xclip -selection c' alias 3clip='printf %s "$(cat /dev/stdin)" | xclip -selection c' # no final \n elif [[ "$OSTYPE" == "darwin"* ]]; then alias 2clip='pbcopy' fi pathrm() { # remove an item from the path if [ -d "$1" ]; then removeThis="`echo $1 | sed -e 's#/#\\\/#'g`" newPath=`echo $PATH | awk -v RS=: -v ORS=: "/$removeThis/ {next} {print}" | sed 's/[ :]*$//g'` export PATH=$newPath fi } pathlast() { # add path to the end if not there if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then export PATH="${PATH:+"$PATH:"}$1" fi } pathfirst() { # add path to the front if not there if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then export PATH="$1:${PATH}" fi } path() { # show path echo $PATH } # show path, one entry per line alias pathcat="echo $PATH | sed 's/:/\n/g'" # Be sure we have a few specific paths if they exist pathlast $HOME/bin pathlast /usr/local/bin pathlast /opt/bin if [ -d ${HOME}/rc.local ]; then for rcfile in $(find ${HOME}/rc.local -name \*.sh); do debug running localrc ${rcfile} source ${rcfile} done fi alias emacs='setsid emacs' # from http://stuff-things.net/2014/12/16/working-with-emacsclient/ if [ -z "$SSH_CONNECTION" ]; then export EMACSCLIENT=emacsclient alias ec="$EMACSCLIENT -c -n" export EDITOR="$EMACSCLIENT -c" export ALTERNATE_EDITOR="" else export EDITOR=$(type -P emacs || type -P ed) fi export VISUAL=$EDITOR # coloring for ls functions if [[ "$OSTYPE" == "linux-gnu" ]]; then color="--color"; else color="" fi BIN_LS=/bin/ls alias ls=' ls '$color' -a' # Long List Reverse Tail function llrt() { ls -lrt $color ${*:-}; } # Long List Time function llt() { ls -lt $color ${*:-}; } # Long List Time, More function lltm() { ls -lt $color ${*:-} | more; } # Long List Time, Less function lltl() { ls -alt $color ${*:-} | more; } # Long List Time, Head function llth() { ls -lt $color ${*:-} | head; } # Long List Time, Tail function lltt() { ls -alt $color ${*:-} | tail; } # List Sort Size function lss() { ls -a1s $color ${*:-} | sort -n; } # List Sort Size Reverse function lssr() { ls -a1s $color ${*:-} | sort -nr; } function nf () { # list the newest file in the current directory NF=`find ${1:-.} -maxdepth 1 -type f -print0 | xargs -0 ls -1t | head -1;`; echo ${NF:-/dev/null} | sed "s/ /\\\ /g" } # new file tail file function nftf { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs tail -f ; } # new file tail function nft { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs tail ; } # new file head function nfh { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs head ; } # new file less function nfl { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs less ; } # new file cat function nfc { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs cat ; } # new file ls function nfls { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs ls -A1t ; } # new file ls -l function nflsl { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs ls -Atl ; } if [[ ! -z "`which xdg-open`" ]]; then alias open='xdg-open '; fi touch $HOME/.bashrc-ran debug ".bashrc done" #+end_src ****** 1.3 - My .bashrc - The org mode source file Here is the .bash.org input file #+begin_src org ,#+title: .bashrc ,#+date: <2020-12-06 03:13:07 Sunday> ,#+author: George M Jones ,#+email: gmj@pobox.com ,#+options: ':nil *:t -:t ::t <:t H:3 \n:nil ^:nil arch:headline ,#+options: author:t broken-links:nil c:nil creator:nil ,#+options: d:(not "LOGBOOK") date:t e:t email:nil f:t inline:t num:2 ,#+options: p:nil pri:nil prop:nil stat:t tags:t tasks:t tex:t ,#+options: timestamp:t title:t toc:t todo:t |:t ,#+language: en ,#+select_tags: export ,#+exclude_tags: noexport ,#+creator: Emacs 28.0.50 (Org mode 9.4) ,* About this .bashrc file ,** Intro This is George Jones' .bashrc file as an literate programming file in emacs org mode using babel blocks. ,** To generate the actual .bashrc This .bashrc.org file must be processed to generate the actual .bashrc It can be processed interactively to generate .bashrc via org-babel-tangle-file or from the command line as ,#+begin_example emacs --batch --eval "(require 'org)" --eval '(org-babel-tangle-file ".bashrc.org")' ,#+end_example Permanent changes must be made to the .org version, as the actual .bashrc will be overwritten when the .org version is "compiled" ,** Debugging In most bash files I do ,#+begin_example set -e set -u ,#+end_example but there are problems setting it in .bashrc. An error then causes you to exit the shell entirely (not what you want), and there are several constructs that cause warnings due to undefined variables (these can/probably should be fixd) Set ,#+begin_example export DEBUG=1 ,#+end_example to enable debugging output from the debug helper function. ,* The actual executable .bashrc ,** Helper functions I define a few syslog-ish helper functions to print warnings, errors, etc. ,#+begin_src shell :tangle .bashrc :noweb no-export #PROG=`basename "$0" | tr -d '\n'` # normal setting PROG="bashrc" # setting for bashrc due to errors function info() { echo ${PROG}\: info: "$@" 1>&2; } function warn() { echo ${PROG}\: warning: "$@" 1>&2; } function error() { echo ${PROG}\: error: "$@" 1>&2; } function debug() { [[ -v DEBUG ]] && echo ${PROG}\: debug: "$@" 1>&2 || true ; } function die() { echo ${PROG}\: fatal: "$@" 1>&2 && exit 1; } ,#+end_src ,** Set a reasonable default prompt Here I set a reasonable default prompt that includes timestamp, username, host and current directory: ,#+begin_src shell :tangle .bashrc :noweb no-export export PS1="\# [\t] \u@\h \W/ $ " ,#+end_src ,** Misc aliases Define various aliases that I use ,#+begin_src shell :tangle .bashrc :noweb no-export alias rm=' rm -i' alias ag=' alias | grep -i' alias eg=' printenv | grep -i' alias hg=' history | grep -i' alias ht=' history | tail' alias fpg=' find . -print | egrep -i' alias egi=' egrep -i' alias psg=' /bin/ps -auxww | grep' alias p8=' ping -c 3 8.8.8.8' # make sure routing works alias pp=' ping -c 3 port111.com' # make sure dns and routing work alias locate='locate -r' ,#+end_src ,** cd commands that use/print the directory stack These aliases support pushd/popd/dirs like functionality while listing one directory per line I like to keep a "stack" of directories so I can work on one thing then "pop" back to where I was. =pushd= an =popd= support this, and =dirs= lists the directories, but I prefer to have them listed one per line. ,#+begin_src shell :tangle .bashrc :noweb no-export function dirl() { # "DIR"ectory "L"ist directory stack, one per line # Usage: dirl for d in `dirs`; do echo $d; done } function dirc() { # "DIR"ectory "C"onnect - connect to directory and list stack # Usage: dirc [DIR pushd ${1:-"$HOME"} > /dev/null dirl } function dirp () { # "DIR"ectory "P"op - pop N entries off the directory stack # Usage: dirp [N] # # OLD: # alias dirp='popd > /dev/null && dirl' for i in `seq ${1:-"1"}`; do debug "dirl: popd. i is $i" popd > /dev/null; done dirl } alias cd=pushd ,#+end_src ,** Misc functions ,#+begin_src shell :tangle .bashrc :noweb no-export function gf() { # grep-find: grep for patterins in files via find # # Usage: gf patterns [files [days]] # # Examples: # gf findMeAnywhere # gf findMeInTextFiles '*.txt' # gf findMeInTextFiles .txt # gf BEGIN\|END .org 30 local files="" local days="365" set -o noglob # First arg is pattern(s) for egrep if [ -z ${1+x} ]; then echo 'gf needs string(s) to search for ' 1>&2 info "Usage: gf patterns [files [days]]" return 1 fi # Second arg (if present) is files for find. No globbing, so "*.txt" OK if [ ! -z ${2+x} ]; then if [[ "$2" =~ ^\. ]]; then # Special case: treat ".foo" as "*.foo" # Avoids needing to quote on command line files="-name *$2" else files="-name ${2}" fi fi # $3 (if present) is find -mtime arg, default 365 if [ ! -z ${3+x} ]; then days="${3}" fi # set -x find . -type f -mtime -${days} $files -exec egrep --color -H -i "${1}" \{\} \; # set +x set +o noglob } ,#+end_src ,** Bash history functions and settings ,#+begin_src shell :tangle .bashrc :noweb no-export # Preserve history across sesssions # # http://unix.stackexchange.com/questions/1288/preserve-bash-history-in-multiple-terminal-windows # export HISTCONTROL=ignoredups:erasedups # no duplicate entries export HISTSIZE=100000 # big big history export HISTFILESIZE=100000 # big big history shopt -s histappend # append to history, don't overwrite it # Save and reload the history after each command finishes export PROMPT_COMMAND="history -a; history -c; history -r;" function hgt() { # hgt == "history grep (for arg) tail" #echo "Histroy Grep tail" if [ -z ${1+x} ]; then echo 'hgt needs an argument' 1>&2 return 1 fi history | grep -i "$1" | tail return 0 } ,#+end_src ,** Set the hostnane, timezone and local Set HOSTNAME if ~/etc/hostname exists ,#+begin_src shell :tangle .bashrc :noweb no-export if [ -e ${HOME}/etc/hostname ]; then export HOSTNAME=`cat ${HOME}/etc/hostname` elif [ -e /etc/hostname ]; then export HOSTNAME=`cat /etc/hostname` else export HOSTNAME="unknown" fi # Set timezone if ~/bin/tz.sh exists # NEW, if neeeed? # # https://linuxize.com/post/how-to-set-or-change-timezone-in-linux/ # # OLD: # # if [ -e ~/bin/tz.sh ]; then # echo Setting timezone. # source ~/bin/tz.sh # should be in ~/rc.local # fi # STILL NEEDED? # # Set local for numeric output LOCAL=`locale -a | grep -i en_us | head -1` if [[ "$LOCAL" != "" ]]; then export LC_NUMERIC="$LOCAL"; fi ,#+end_src ,** Set up ssh agent Add keys by hand if needed via ,#+begin_example ssh-add ~/.ssh/id_* ,#+end_example ,#+begin_src shell :tangle .bashrc :noweb no-export if [ -e ~/bin/sshagent ]; then source ~/bin/sshagent fi ,#+end_src ,** Copy stdin to clipboard ,#+begin_src shell :tangle .bashrc :noweb no-export if [[ "$OSTYPE" == "linux-gnu"* ]]; then alias 2clip='xclip -selection c' alias 3clip='printf %s "$(cat /dev/stdin)" | xclip -selection c' # no final \n elif [[ "$OSTYPE" == "darwin"* ]]; then alias 2clip='pbcopy' fi ,#+end_src ,** Path functions These path* functions add and remove elements to PATH. They insure that entries are unique. They allow you to place a path first or last in the order (e.g. so that =~/bin= comes before =/usr/local/bin=) ,#+begin_src shell :tangle .bashrc :noweb no-export pathrm() { # remove an item from the path if [ -d "$1" ]; then removeThis="`echo $1 | sed -e 's#/#\\\/#'g`" newPath=`echo $PATH | awk -v RS=: -v ORS=: "/$removeThis/ {next} {print}" | sed 's/[ :]*$//g'` export PATH=$newPath fi } pathlast() { # add path to the end if not there if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then export PATH="${PATH:+"$PATH:"}$1" fi } pathfirst() { # add path to the front if not there if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then export PATH="$1:${PATH}" fi } path() { # show path echo $PATH } # show path, one entry per line alias pathcat="echo $PATH | sed 's/:/\n/g'" # Be sure we have a few specific paths if they exist pathlast $HOME/bin pathlast /usr/local/bin pathlast /opt/bin ,#+end_src ,** source ~/rc.local/*.sh to do non-general bash setup Execute any .sh files in ~/rc.local/*.sh This allows me to split out setup for aliases and commands that only get used on certian systems or in certian contexts (git, go, mail, blog..) ,#+begin_src shell :tangle .bashrc :noweb no-export if [ -d ${HOME}/rc.local ]; then for rcfile in $(find ${HOME}/rc.local -name \*.sh); do debug running localrc ${rcfile} source ${rcfile} done fi ,#+end_src ,** Invoking emacs ,#+begin_src shell :tangle .bashrc :noweb no-export alias emacs='setsid emacs' # from http://stuff-things.net/2014/12/16/working-with-emacsclient/ if [ -z "$SSH_CONNECTION" ]; then export EMACSCLIENT=emacsclient alias ec="$EMACSCLIENT -c -n" export EDITOR="$EMACSCLIENT -c" export ALTERNATE_EDITOR="" else export EDITOR=$(type -P emacs || type -P ed) fi export VISUAL=$EDITOR ,#+end_src ,** ls aliases ,#+begin_src shell :tangle .bashrc :noweb no-export # coloring for ls functions if [[ "$OSTYPE" == "linux-gnu" ]]; then color="--color"; else color="" fi BIN_LS=/bin/ls alias ls=' ls '$color' -a' # Long List Reverse Tail function llrt() { ls -lrt $color ${*:-}; } # Long List Time function llt() { ls -lt $color ${*:-}; } # Long List Time, More function lltm() { ls -lt $color ${*:-} | more; } # Long List Time, Less function lltl() { ls -alt $color ${*:-} | more; } # Long List Time, Head function llth() { ls -lt $color ${*:-} | head; } # Long List Time, Tail function lltt() { ls -alt $color ${*:-} | tail; } # List Sort Size function lss() { ls -a1s $color ${*:-} | sort -n; } # List Sort Size Reverse function lssr() { ls -a1s $color ${*:-} | sort -nr; } ,#+end_src ,** Aliases for viewing the newest file in a directoy ,#+begin_src shell :tangle .bashrc :noweb no-export function nf () { # list the newest file in the current directory NF=`find ${1:-.} -maxdepth 1 -type f -print0 | xargs -0 ls -1t | head -1;`; echo ${NF:-/dev/null} | sed "s/ /\\\ /g" } # new file tail file function nftf { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs tail -f ; } # new file tail function nft { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs tail ; } # new file head function nfh { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs head ; } # new file less function nfl { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs less ; } # new file cat function nfc { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs cat ; } # new file ls function nfls { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs ls -A1t ; } # new file ls -l function nflsl { NF=`nf ${1:-.}`; debug NF $NF; echo "$NF" | xargs ls -Atl ; } ,#+end_src ,** viewing files Notes on setting up file/mime type associations can be found at https://unix.stackexchange.com/questions/77136/xdg-open-default-applications-behavior So, to make emacs (what else?) the default for MIME type =text/plain= ... ,#+begin_example locate -r 'emacs.*\.desktop' xdg-mime default emacs.desktop text/plain ,#+end_example ,#+begin_src shell :tangle .bashrc :noweb no-export if [[ ! -z "`which xdg-open`" ]]; then alias open='xdg-open '; fi ,#+end_src ,** All done ,#+begin_src shell :tangle .bashrc :noweb no-export touch $HOME/.bashrc-ran debug ".bashrc done" ,#+end_src #+end_src Congratulations for reading this far. Go forth and write literate programs. Posts 38 of #100DaysToOffload https://100daystooffload.com/. ***** Footnotes [fn:8]This was about 10 years before the world wide web ... maybe Berners-Lee got some inspiration on the name from Knuth? Or Sir Walter Scott: "‘Oh what a tangled web we weave/When first we practice to deceive" **** PUBLISHED To self host or not to self host, that is the question? :100DaysToOffload:blogging:life: :PROPERTIES: :EXPORT_FILE_NAME: 2022-03-22 :EXPORT_HUGO_PUBLISHDATE: 2022-03-22: :END: Shelving the self hosting for a while. Just gonna push the static blog up to my 20 year old Hurricane Electric shell account. [[https://www.namecheap.com/support/knowledgebase/article.aspx/384/2237/what-is-url-redirect-and-how-does-it-work/][URL redirection]] is a marvelous thing. This is not your fathers CNAME record. #+hugo: more After my raspberry pi died (when I unplugged it from the new UPS that was supposed to keep it up), and I manifestly failed for 2 weeks to allocate the time to rebuild it, I decided to let other people run the system and network. While it's fun/retro to go back to doing all my own systems admin, networking and security work on top of a day job that has me on a vertical learning curve with systems, networking, security, databases, programming etc at the end of the day, literally at the end of the day, I just don't have it in me to sit in front of a computer and do more computer stuff. So I will let the nice people at Hurricane Electric with whom I've had an a shell account for ~20 years run the system, the web server and the network (they are really good at that). Every time I send mail to support@he.net I get what seems like a genuinely interested geek replying. Division of labor. What a concept. I've got other things in life that need attention and time now (and some world events that are sucking up attention) #17 of #100DaysToOffload take 2, https://100daystooffload.com/ **** PUBLISHED EmacsConf 2022 - Day 1 :100DaysToOffload:emacs: :PROPERTIES: :EXPORT_FILE_NAME: 2022-12-03 :EXPORT_HUGO_PUBLISHDATE: 2022-12-03: :END: So, day 1 of [[https://emacsconf.org/2022/][EmacsConf 2022]] is in the books. Another eclectic mash up of everything from the "[[https://github.com/ag91/emacs-buddy][Emacs Buddy Initiative]]" to a geeky dive on how to [[https://emacsconf.org/2022/talks/jupyter/][Edit live Jupyter notebook cells with Emacs]] (no, really, I like editing everything in browser text boxes ... not!) to a serious proposal for a new economic model for software: [[https://emacsconf.org/2022/talks/maint/][Maintaining the Maintainers: Attribution as an Economic Model for Open Source]] #+hugo: more Thanks to the organizers (Sacha Chua and friends) the conference came off almost without a glitch, run entirely on open source software (Big Blue Button, IRC, etc.). Notepads, live Q&A, pre-recorded talks, most of them already up, captioned with transcripts, for free. Things I'm probably going to look into as a result of this are the [[https://emacsconf.org/2022/talks/treesitter/][Tree-sitter beyond syntax highlighting]] for syntax-aware editing of python, bash, etc., the logistics of [[https://emacsconf.org/2022/talks/meetups/][Attending and organizing Emacs meetups]] (who knew there were people using Org mode tables to analyze real-estate deals, tracking and visualizing health data, or envisioning GNUS as the core of a system to replace Microsoft, Apple and Google ?), and hooking Emacs to edit text boxes (think code in Jupyter Notebooks, huge SQL blocks in BigQuery web console, JIRA and Confluence forms, etc.) Looking forward to day 2. #37 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** WIP Thanks Sacha ! :100DaysToOffload:emacs: :PROPERTIES: :EXPORT_FILE_NAME: 2023-12-09 :EXPORT_HUGO_PUBLISHDATE: 2023-12-09: :END: #+BEGIN_EXPORT html
Ode to emacsconf 2023


All the world’s a text,
And all the men and women merely editors;
They have their reads and their writes,
And Emacs in its time plays many parts...
With apologies to William Shakespeare and actual odes.
#+END_EXPORT #+caption: "2015-02-02 Making a virtual Emacs conference happen -- index card #emacs #organizing-people #conference #planning #questions" by sachac is licensed under CC BY 2.0. To view a copy of this license, visit https://creativecommons.org/licenses/by/2.0/?ref=openverse. #+attr_html: :width 600px [[file:images/emacsconf2015.png]] #+hugo: more Emacs is a tangent to life. We use Emacs around the edges of life. It's adjacent to everything we do: our work, our finances, our art, and, oh yea, our code too. Our life is text. Emacs is a text editor. Emacs itself is text. We edit Emacs with Emacs. "All the world's a text...." Emacs gives us a (false?) sense of control. It's shiny object. Using it turns parts of our lives into encounters mediated by a shiny object. Or maybe it just leads us down rabbit-holes when we should be paying the bills. Emacs is a community. A worldwide diapora of isolated geeks. It is a form of existential self expression. It can be cathartic. We share all this once a year at https://emacsconf.org/ emacsconf, thanks to [[https://sachachua.com/blog/][Sacha Chua]] and friends. Thanks, Sacha. "Now wait, how was I planing to tweak that capture template? ...." #51 of #100DaysToOffload take 3.1, https://100daystooffload.com/ **** TODO Palo Alto Firewalls - Eating dogfood - Purchase - Console setup - Factory reset - Network mapping - Configs + CLI + XML + GUI - License - Network set up easily, but ... objects, etc + enter https://github.com/PaloAltoNetworks/iron-skillet *** Cybersecurity :cybersecurity:secuity:privacy:perspective: **** PUBLISHED We've got to do better than this :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2024-01-25 :EXPORT_HUGO_PUBLISHDATE: 2024-01-25: :END: We've got to do better than this ... https://haveibeenpwned.com/ Not sure what the answer(s) is(are). Decentralization? Required 2FA? Returning to the offline world? #+hugo: more Several of my accounts were in the list multiple times. And then, our friends at the credit bureau lost it all 6 years ago, https://en.wikipedia.org/wiki/2017_Equifax_data_breach, and a large US federal agency that does backgournd clearance investigations a few years before that and Snowden a few years before that (and at the moment Congress does seems uninterested in FISA reform). Life goes on? We all seem to be conditioned to thinking that this is normal and OK. #56 of #100DaysToOffload take 3.1, https://100daystooffload.com/ **** PUBLISHED Privacy Technology :privacy:security:perspective: :PROPERTIES: :EXPORT_FILE_NAME: 2021-12-18-privacy :EXPORT_HUGO_PUBLISHDATE: 2021-12-18 :END: These are a few perspectives on privacy prompted by initial thoughts on the [[https://www.usenix.org/conference/pepr22/call-for-participation][Usenix PEPR '22 Call for Participation]]. I may or may not flesh this out as a submission. If I do, it might take a totally different form, this being a first reaction. #+caption: "Privacy Technology for the 21st Centry" by George Jones is licensed under CC BY 2.0 #+attr_html: :width 400px [[file:images/pencil_and_paper.jpeg]] #+hugo: more First, here are some work experiences that inform my perspective. Professional life began for me at CompuServe in 1985. In many ways CompuServe invented the online world. Long stories there, told elsewhere. The long strange trip has taken me through work with Usenet, UUNET, the IETF, SANS & The Center for Internet Security, the IETF, MITRE, CMU=/=CERT, AOL, Amazon=/=AWS, and currently Palo Alto Networks. Security and privacy have been a large part of my life for 25 years. My personal response to questions of privacy has been to go backwards. I journal. On paper. Google has no idea. I quit Facebook in 2016 when it got political. I actually deleted the account (along with Spotify) a couple years ago after I sent a Facebook messenger note to my son saying that in childhood I loved Julie Andrews music and Spotify, without my input, started playing Julie Andrews. I've stopped posting content on most large commercial platforms over concerns about monetization, aggregation and corporate self-interest driving what they do with it. I currently self-host my blog and git repo on a raspberry pi. I share publicly what I want to share. The rest is not online. It's in my head or on paper. To be sure I use some of the current tools available to /try/ to preserve some online privacy: Signal, Proton Mail, Tor, VPNs, etc. and while I laud academic, commercial and governmental efforts to improve privacy, I think we need to begin by admitting that the problems are not technical. They are social. They are human. **** PUBLISHED Thoughts on the OODA loop and falling out of a canoe :outdoors:SOC:OODA: :PROPERTIES: :EXPORT_FILE_NAME: ooda-loop-and-getting-wet :EXPORT_HUGO_PUBLISHDATE: 2020-05-26 :END: # Tim, Jono, Leigh In my never ending quest for synthesis, this post combines thoughts on [[https://en.wikipedia.org/wiki/OODA_loop][the OODA loop]] and falling out of a canoe twice this weekend in rapids on the Shenandoah river. There is a connection. Maybe. If you want to see the full trip report, pictures, etc. go here [[https://eludom.github.io/blog/get-wet/][Things that fall in the river get wet]]. If you're interested in how this relates to the OODA loop or, better, if you have experience/thoughts on applying the OODA loop to operational cybersecurity settings, read on (and comment !) #+caption: On the river during calm between crisis events #+attr_html: :width 400px #+attr_latex: :width 400px #+attr_odt: :scale 0.5 [[file:./images/paddling.jpg]] #+hugo: more ***** The OODA Loop [[https://en.wikipedia.org/wiki/OODA_loop][The OODA loop]] is a concept cybersecurity has borrowed from the US Air Force. "OODA" stands for "Observe, Orient, Decide, Act". The OODA loop began as a very fighter-pilot-centric view of a problem space. I always think of Snoopy and the Red Barron. Snoopy *observes* the Red Barron at a distance, *orients* his Sopwith-Camel towards the Red Barron, *decides* to fire, and then *acts* by firing-away. Then repeat the OODA loop. *Observe*: what was the effect of your action (the Red Barron went down in flames, or you missed and now he's on your tail)... ***** The OODA Loop and falling out of a canoe The OODA loop parallels my decision making process in the rapids this weekend. In one of our two crisis events I *observed* the other canoe flip in the rapids ahead. I *oriented* my canoe towards shore. I *decided* to grab a tree root to buy time to sit and contemplate options. I *acted* by grabbing the tree root. We flipped due to the strong current. REPEAT. I *observed* that we were in the water 10 or 20 yards (9 to 18 meters) from the start of the rapids. I *oriented* myself towards shore. I *decided* to swim to shore at all costs (loosing the canoe and all our gear) rather than float the rapids in life jackets. I *acted* by swimming to shore. REPEAT. I *observed* that we were safe on shore without our boat, gear or friends. I *oriented* myself downstream. I *decided* to walk in search of boat, gear and friends. I *acted* by walking... ***** Where does the OODA loop work well? The OODA loop seems to be a good model for rapidly changing situations where the personal stakes to the actor are high, the actor is receiving relevant information in a timely fashion and has the ability to decide on appropriate action and execute in a very short timescale. There were elements of this in Bill Cheswick's classic [[https://www.cheswick.com/ches/papers/berferd.pdf][An Evening with Berferd]] and Cliff Stoll's [[https://en.wikipedia.org/wiki/The_Cuckoo%27s_Egg][The Cuckoo's Egg]], but I am wondering how many of these conditions apply, to, say the modern SOC? ***** Does the OODA loop work in SOCs? How do the characteristics of crisis situations such has that described above or a fighter pilot in dogfight map to the modern SOC? Does a SOC have a rapidly changing situation? Probably. Are there personal stakes for the actor (analyst)? It depends. Is it just "work my shift and go home after the hand-off"? Are the actors (analysts) receiving relevant information in a timely fashion? Or are they waiting for a weeks-long (months-long?) approval process for the ingest of needed data, the provisioning of enough storage and compute power to run the queries they need? Are they empowered to take action in a short timescale? Or are there three levels of management approval needed and reports to be written before any action can taken? Can they take machines offline, implement blocks, etc? Even if it impacts production? Can they observe, orient, decide and act, or is it time to put your feet up, hope for the best and float through the rapids? Your thoughts? Experiences? Days 17 of #100DaysToOffload https://100daystooffload.com/ **** PUBLISHED Bear attacks, no-win situations and cybersecurity :bears: :PROPERTIES: :EXPORT_FILE_NAME: cybersecurity-and-bears :EXPORT_HUGO_PUBLISHDATE: 2020-03-19: :END: I spend a good amount of time hiking in Shenandoah National Park and surrounding areas. I've seen quite a few #bears and I've followed one down the trail. I've been growled at by a mother bear when I unknowingly came between her and her cubs. This is going somewhere related to #cybersecurity. I promise. You can't outrun a bear. Climbing a tree won't help. If a bear actually decides to attack you, the odds are not in your favor, but fortunately they almost never attack. The old joke goes "I don't have to outrun the bear, I just have to outrun you" because, presumably the bear will catch your slower partner, stop, and not bother you when you both decide to run for it in violation of bear encounter best practices. This hints at any number of cybersecurity principals: - Know your threat model. - Know and follow best practices. - Don't let fear (or adrenaline) dictate your response. - Know and practice situationally appropriate responses (Grizzlies: if attacked play dead. Black Bear: if attacked fight for your life) - Be prepared (bear spray, first aid kit) - Practice deterrence (make noise, travel in groups) - Prevention costs less than recovery. By far. - And, of course, make sure the other guy is an easier target. Run faster if you run. Apply patches, have good backups (Hello, ransomware !), have layers of defense, decoys, monitoring, DLP, practice threat hunting, etc. For a decade or so, I've been reflecting on the fact that defensive cybersecurity is a loosing igame. The red team (attackers) always win. I don't like no-win situations. There's a lesson here: - Don't feed the bears :: They become habituated to humans, loose their inhibition, become a nuisance and sometimes have to be relocated or killed. Nobody wins. OK, not that lesson. Lessons like: - Follow best practices :: Following best practices CAN help avoid problems. Not following best practices WILL invite problems. - Have an incident response plan :: If you see a bad thing happening, if it is coming straight for you, what do you do? - Line up the right resources :: Do you know how to triage wounds? Do you have a cell phone? Are you in range of cell towers? If not, do you have a SPOT to call for help? Where is the nearest hospital? Are you prepared to shelter in place if need be? - It's not just you :: Feeding the bears or failing to store food properly might result in perfectly good backcountry shelters being torn down. And here we are, 20 or so years after it became clear that that allowing spoofed packets out of your network enables #DDoS #attacks and we *still* do not have widespread adoption of reverse path forwarding checks. *Please* stop spoofed packets at your border ! So it maybe true that few people win in the face of an actual attack, but, it turns out, there are still good reasons to play the game. ***** For Further Reading - Numbers of bear attacks :: In North America, only 2-5 people are killed annually by bears: https://www.thealaskalife.com/outdoors/bear-attacks-statistic/ vs (Worldwide) 10 killed by sharks, 50,000 by snakes and 725,000 by mosquitos. https://www.statista.com/chart/2203/the-worlds-deadliest-animals/ - U.S. Forrest Service :: "Be bear aware" https://www.fs.usda.gov/visit/know-before-you-go/bears - Internet safety 101 :: "Internet safety 101: 15 tips to keep your kids and family safe online" https://us.norton.com/internetsecurity-kids-safety-stop-stressing-10-internet-safety-rules-to-help-keep-your-family-safe-online.html. Sure they want to sell you antivirus software, but this is generally good advice. - Ultimate Guide to Cybersecurity :: "Your Ultimate Guide to Cybersecurity: At Home, at Work, and on the Go." https://www.ibtimes.com/your-ultimate-guide-cybersecurity-home-work-go-2818655. A little more in depth. - CIS Critical Controls :: "The Center for Internet Security (CIS) Critical Security Controls" - https://www.cisecurity.org/controls/cis-controls-implementation-groups/ More in depth. For enterprises. **** PUBLISHED "​Reproducible security analytics?" :org:emacs: :PROPERTIES: :EXPORT_FILE_NAME: reproducable-security-analytics :EXPORT_HUGO_PUBLISHDATE: 2020-02-25: :END: I'm looking for repositories of "reproducible security analytics". As an addict of [[https://www.gnu.org/software/emacs/][Emacs]] [[https://orgmode.org/][Org mode]], one of the papers that got me started thinking along these lines was [[https://www.jstatsoft.org/article/view/v046i03/v46i03.pdf][A Multi-Language Computing Environment for Literate Programming and Reproducible Research]]. I realize for most of the rest of the world this vision is now realized more in things like Jupyter and Zeppelin notebooks. Your loss :-) One thing that looks promising is [[https://car.mitre.org/][mitre's cyber analytics repository]]. Another is [[https://github.com/hunters-forge/mordor][Hunters Forge/Mordor]] I'd be interested in pointers to more. **** PUBLISHED What is that thing on the Internet, and is it bad? :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: things-on-the-internet :EXPORT_HUGO_PUBLISHDATE: 2020-09-19 :END: #+begin_ABSTRACT When talking about Internet assets we often confuse "What is it?", "Is it bad?" and "What should I do about it?". This write-up intends to show why it is important to keep those questions and answers to them separate. #+end_ABSTRACT #+caption: [[https://images.squarespace-cdn.com/content/v1/547e053ae4b04768d95052b5/1449545907243-AHKE1H7G260OO4WJ9L3C/ke17ZwdGBToddI8pDm48kA4OTh10Ye8gZQM8UPYYQJFZw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZUJFbgE-7XRK3dMEBRBhUpxpL5WijoIxxArGLpk2nP4rt_mQiHA3qkdw2IvdSifHurtFUlA4zHqOnDqw0hNJllc/image-asset.jpeg?format=750w][The Shape of the Elephant]] #+name: pic:elephant file:images/elephant.jpeg Post 27 of #100DaysToOffload https://100daystooffload.com/ #+hugo: more ***** Questions to ask When identifying Internet-based assets, there are a series of basic questions[fn:6] that need to answered: - What is it? - How do I know? - How certain am I? - Is it "bad"? - depends on who you are - depends on time - What can I do about it? ***** An Example: Web servers serving pages with flash One example can be used to illustrate the point: web servers serving content with Adobe Flash (https://en.wikipedia.org/wiki/Adobe_Flash). Flash is an older web technology that has known security vulnerabilities, is deprecated (Adobe to stop supporting it on 12/31/2020) and has been replace by HTML5. Let's classify it using the questions above, assuming we have scanned a web site and pulled back the HTML body of the main page via an HTTP GET request: - What is it? :: A web server serving pages with flash. - How do I know? :: We see files with =.swf= extensions embedded in javascript returned as part of the web page, e.g. #+begin_example var swfpath="/e/data/images/pixviewer.swf #+end_example - How certain am I? :: Your signatures may vary. There are other strings you can look for such as: #+begin_example application/x-shockwave-flash #+end_example #+begin_example http://www.macromedia.com/go/getflashplayer #+end_example You might start with a google search for #+begin_example intext:http://www.macromedia.com/go/getflashplayer #+end_example It's just a question of how much time you want to put into developing the signature. For some things (HTML) there is a lot of ambiguity. For others (TCP, HTTP, SNMP, SSH...) the protocol will not work if the transactions are not well defined. Identification of less well defined protocols is ad hoc based on heuristics. Identification of well defined protocols is more certain. See below. - Is it "bad"? It depends. :: Once we've answered the "what is it" question, you can begin to address the "is it bad" question and possibly it's corollary "how bad is it?" (not addressed here). Lets return to our flash example. It turns out Chinese web sites are a large current (2020-09-17) source of flash on the web. A security products vendor also uses a lot of flash on their login page. - *'Is it bad?' depends on who you are* 1. Chinese government? Maybe you WANT people to download vulnerable software to enhance your ability to monitor citizens activity. 2. Chinese human rights activist? You probably don't want known vulnerable software on your computer. 3. Security vendor? Forcing your security minded customers to download and run known vulnerable software as part of logging into your security web site is, at best, bad form. - *'Is it bad?' "Is it bad" "depends on time* When did vulnerabilities in the product become widely known (e.g. a CVE published)? When was "proof of concept" exploit code available? When are/were patches/upgrades available? ... - *'Is it bad?' depends on where you are* Are you at work on a laptop supplied by your employer who has a policy against accessing web sites that use flash? Are you at home or in a lab doing web vulnerability research on a "throwaway" machine... - What can I do about it? :: Lastly, and probably most importantly, the question is "What can I do about it?". Are there steps I can/should take to fix things that are "bad"? Patch? Upgrade? Choose a different security vendor...? ***** Keep each issue separate, think about them independently It is important to keep the answers to these questions separate. For instance saying "write some software to find bad things on web servers" presupposes a common definition of "bad", which, as we've seen above can be highly contextual. It would be far better to keep them separate. For instance, define a taxonomy (see below) to say "what is this"? Then separately devise ways to answer the "is it bad" question for separate environments (countries, organizations, individuals ...) ***** Taxonomies, Ontologies and ASCII Art, Oh My !!! The outline above lists the basic questions. It is possible that there will be a need for a deeper dive/more complete classification. For instance, revisiting *what is it?* for the web server with flash, we might come up with this taxonomy: #+begin_example + open port WELL DEFINED, CERTAIN IDENTIFICATION + tcp + tls ^ + web server | + microsoft | + iis | + 7.3 | + services | + flash v + frameworks + dotnet LESS DEFINED, LESS CERTAIN IDENTIFICATION #+end_example Taxonomies help in classifying, understanding and communicating about things, for instance taxonomies (and Latin names) have been used in Biology for hundreds of years. More recently, the cybersecurity world started standardizing vulnerability naming as CVE. ***** Conclusion When thinking about Internet assets, writing software to detect and classify/fingerprint assets and deciding what to call "bad", keep the preceding questions in mind and try to keep the questions separate. ***** Disclaimer The opinions expressed here are mine, and not those of my employer. In fact, they may not even be mine. I may have changed my mind. I may have grown beyond a particular opinion. I may be trolling you. I may be engaging in Socratic dialog to tear down your beliefs. I may be tearing down my own beliefs. γνῶθι σεαυτόν! ***** Footnotes [fn:6] Note that these are not randomly chosen questions. They map fairly directly to some of the basic questions of epistemology, morals and ethics. *** Privacy :privacy: **** PUBLISHED Privacy: what is it and why do we care? ... :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: privacy-intro :EXPORT_HUGO_PUBLISHDATE: 2020-09-24 :END: In this world where Big Internet firms track you to sell you stuff (and to sell YOU), big Government tracks you because, well, they can, and where I found myself on a motion activated camera when backpacking alone in the "backcountry" in an attempt to "get away from it all", I've spend some time thinking about privacy. Life is short. I could spend a lot of time registering domain names, managing certificates, running my own mail server, de-googling, convincing my friends and family to use nifty new security and privacy apps, and generally fighting the privacy fight as an individual against entire well-funded industries and governments. Or I could just live my life secure in the knowledge that Google and Amazon know what I'm thinking of purchasing even before I do. This is the first in what will probably be a series of blog posts exploring the following (current outline): #+begin_example ,**** TODO Privacy: Motion activated cameras strapped to trees in the woods? ,**** TODO Privacy: An attainable end state? A lost cause? ,**** TODO Privacy: A path to making a living via bureaucracy? ,**** TODO Privacy: Something to rant about ... with words. ,**** TODO Privacy: Rage against the machine ... with code? ,**** TODO Privacy: Hiding out on the digital frontier? ,**** TODO Privacy: A process, an ideal, one part of life? #+end_example Stay tuned. Post 28 of #100DaysToOffload https://100daystooffload.com/ **** PUBLISHED Privacy: Motion activated cameras in the woods? :100DaysToOffload:hiking: :PROPERTIES: :EXPORT_FILE_NAME: privacy-cameras :EXPORT_HUGO_PUBLISHDATE: 2020-09-26 :END: I recently went backpacking on the Appalachian Trail in Massachusetts. One of the reasons I go out is to "get away", to go "off the grid", to enjoy nature and get away from adds, trackers, social media, etc. But a funny thing happened at my last campsite. There was a camera strapped to a tree taking my picture every time I put my food in or out of the "bear box". The sign on the camera, in addition to asking us not disturb the camera (duct tape, anyone ?) assured us that they were only using the images to track bear activity at the campsite and the images would be destroyed after being used for their intended purpose. Right. They would not be fed to facial recognition software, and the results would not be passed to law enforcement. Right. #+caption: [[https://live.staticflickr.com/8163/7670889680_2ef260ab0f_b.jpg]["Caméra de vidéo-surveillance" by zigazou76 is licensed under CC BY 2.0]] #+name: pic:camera file:images/camera.jpg #+hugo: more In addition to that, many hikers now use the "[[https://atlasguides.com/?cn-reloaded=1][Guthook]]" app to track their progress, find distance to water, etc. It has social media-like features that let you leave messages to help other hikers like "there is a good stealth campsite at this stream...". And such comments suggesting helpful, but sometimes over the official line actions, which are absolutely not being monitored by park officials (looking at you Smokies, Baxter) and others concerned with keeping everyone strictly in line with the mountains of rules made by people sitting at desks who have NOT just hiked 8 to 12 hours a day for days on end and have no appreciation of or sympathy for realities in the field. Mind you, I'm all for [[https://en.wikipedia.org/wiki/Leave_No_Trace][Leave No Trace]], minimizing impact, ensuring that others have the same opportunities I crave to enjoy nature, not killing cute little animals out of sheer cruelty, etc, but... #+caption: foo [[https://www.songfacts.com/lyrics/five-man-electrical-band/signs][Signs]] #+begin_src "Signs, signs, everywhere there's signs, blocking out the scenery, blowing my mind, saying 'Do this, don't do that' Can't you read the signs?" Signs, The Five Man Electrical Band https://www.songfacts.com/lyrics/five-man-electrical-band/signs #+end_src The point is that our information-obsessed, always-connected, bureaucratic society will not even leave you alone, even in the woods. Thoreau, Muir, Audubon: meet the panopticon. Post 29 of #100DaysToOffload https://100daystooffload.com/ **** PUBLISHED Privacy: The view from 1987 and Antiquity - or why I'm deleting Google,Facebook and Twitter :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: privacy-1987 :EXPORT_HUGO_PUBLISHDATE: 2020-10-04 :END: ***** "A History of Private Life" #+begin_quote There is, I think, an urgent need to protect the essence of individuality from headlong technological progress. For unless we are careful, individual men and women may soon be reduced to little more than numbers in immense and terrifying data bank. Georges Duby, Forward to /A History of Private Life/, 1987 #+end_quote I'm in the process of deleting Facebook, Twitter and Google from my life. I think Duby et al. were on to something a little ahead of their time. #+caption: [[https://www.thriftbooks.com/w/a-history-of-private-life-from-pagan-rome-to-byzantium_arthur-goldhammer_philippe-aris/288055/item/2915263/?mkwid=%7cdc&pcrid=448915190769&pkw=&pmt=&slid=&plc=&pgrid=104754618896&ptaid=pla-926048762119#idiq=2915263&edition=2266565][A History of Private Life]] #+name: pic:privateLife file:images/private_life.jpg Post 30 of #100DaysToOffload https://100daystooffload.com/ #+hugo: more ***** What's bothering me It takes a lot of work to change your email provider of 15 years. You loose contacts when you ditch Facebook (that guy I've not seen since 3rd grade..). Twitter is, well, a thing. Just ask the President ('nuf said ?) So why go the trouble? What is it about privacy that gets me and so many people spun up to the point that we will spend time fighting what is almost certainly a loosing battle against Big Brother, Big Internet and Big Advertising? There are many reasons, but I think they all center around what it means to be human: - We want to be left alone sometimes - We want space to be ourselves - We want our thoughts to be our thoughts (and we want to have them before the machine learning algorithms that are tracking us have them) - We want the freedom to think, act, feel, love and hate ("[[https://en.wikipedia.org/wiki/Catullus_85][Odi et amo]] ...") as we see fit, at least inside our own heads - We want to be able to work out life for ourselves - We want space to think, to grow, to make mistakes and correct them, or even to be free to persist in our chosen errors and delusions. "To err is human..." Something about using the current set of "free" Big Internet offerings where, "If you're not paying for it you ARE the product" violates the space we so desperately need. ***** Back to the big thinkers Enough of my ramblings. Back to the deep thinkers who put together the encyclopedic /A History of Private Life/ in 1987 without (gasp) Google or anything better than a IBM-PC running DOS... #+begin_quote ...at all times and in all places a clear commonsensical distinction has been made the public --- that which is open to the community and subject to the authority of its magistrates --- and the private. In other words, a clearly defined realm is set aside for that part of existence for which /every language has a word equivalent to "private"/, a zone of immunity to which we may fall back or retreat, a place where we may set aside arms and armor needed in the public place, relax, take our ease, and lie about unshielded...this is the place where the family thrives, the realm of domesticity; it is also the realm of secrecy. The private realm contains our most precious possessions, which belong only to ourselves, which concern nobody else, and which may not be divulged... Georges Duby, Forward to /A History of Private Life/, 1987 #+end_quote Is he right? Do /you/ have the space you need to "protect the essence of individuality from headlong technological progress"? *** History :history: **** PUBLISHED Black Lives Matter ... the 1852 version. :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2022-10-07 :EXPORT_HUGO_PUBLISHDATE: 2022-10-07: :END: So, I'm listening to [[https://en.wikipedia.org/wiki/Uncle_Tom's_Cabin][Uncle Tom's Cabin]] on Audible. How long until it gets canceled for use of the "N" word? Looks like Paypal might try to charge me $2500 for reading something they don't approve of https://marginalrevolution.com/marginalrevolution/2022/10/the-2500-fine-read-it-and-weep.html. I've canceled Paypal. But that said, read it (while you can?). If you can get past contemporary hangups about the "wrong" words being used you will find one of the most powerful statements in all of human history that "Black Lives Matter". Stowe visited Lincoln in the White House in 1862, and there is a possible apocryphal quote by Lincoln that goes "So this is the little lady who started this great war." My family hid runaway slaves (14 miles north of the Ohio river) and fought in the Union army. One of them was a student at Lane Seminary in Cincinnati (just across the Ohio ) where Stow's father, Lyman Beecher taught ... where a series of student debates over Aboliton attended by Stow caused riots. The student body withdrew en masse to Oberlin college. This book provides context and a backdrop for what drove them to disobey the law (the Fugitive Slave Act) and take up arms. That's history. While I'm proud of what they did, I claim no virtue for their actions. The question for me now, as it was for them then, is how do I treat my fellow human beings today. I have my relative's hand-written notes (1830s) from "Dr. Beecher's Lectures on Theology" in my closet. Maybe that's up next on the reading list to better understand what drove them... #28 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED The lesson of history :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2022-03-03 :EXPORT_HUGO_PUBLISHDATE: 2022-03-03: :END: I think the lesson of history is that we don't learn from the lessons of history. #+hugo: more #16 of #100DaysToOffload take 2, https://100daystooffload.com/ **** PUBLISHED George Washington Slept Here :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2022-02-27 :EXPORT_HUGO_PUBLISHDATE: 2022-02-27: :END: Hiking yesterday in the Shenandoah Valley I discovered that I was on part of "Morgans Road", which is a road George Washington had built into the hills to allow his army to retreat from the British in case things got really bad. "George Washington /Planned/ To Sleep Here If Things Got Really Bad". That was enough at the time of the bicentennial (1976) to put up /another/ George Washington marker. This includes a longish list of Washington sites I've run across, including a couple with family connections. #+caption: [[http://curious.galthub.com/ox-hugo/ForumRomanarumNocte.jpg]["George Washington Planned To Sleep Here" by George Jones]] is licenced under [[http://creativecommons.org/licenses/by-sa/4.0/][CC SA 4.0]] #+attr_html: :width 400px file:images/Morgans2.jpg #+hugo: more I've lived in northern Virgina for almost 20 years. 250 years later, there is still a mythos, and in some cases still oral tradition about George Washington everywhere you go from his home at Mount Vernon to Bunker Hill in Boston. Some of the most visible reminders (aside from Washington, DC and the Washington Monument) are all the "George Washington [did X] Here" signs. The myth may be larger than life. The story about young George Washington saying "I can not tell a lie" when he cut down is father's cherry tree is probably a fabrication. But there was a core of truth, a real man behind the legends that inspired those who knew him and the generations that followed. Living in northern Virginia, you can hardly step outside without running into some "George Washington [did X] Here" memorial. Here is a top-of-the-head list of things I've run into in the past few years: - Neavil's Ordinary :: [[https://auburnva.fandom.com/wiki/Neavil%E2%80%99s_Ordinary][Neavil's Ordinary]] (inn) is a few miles from my house. George Washington (and George Fairfax of Fairfax County fame) spent a night there on they way to survey land in the Shenandoah Valley. - Washington, VA :: Washington himself surveyed and laid out the town of [[https://washingtonva.gov/history2/][Washington "The First of them All" Virginia]], the county seat of Rappahannock County. - A farm in New Jersey :: Backpacking on the Appalachian Trail in New Jersey I spent a night camped behind the barn of a family that has owned the land since the revolution. They have an oral tradition that Washington came through and spent a night in the old farm house. - Winchester, VA :: There is a [[https://winchesterhistory.org/george-washingtons-office/]["Washington's Headquarters" site in Winchester, VA.]] - Longfellow House, Cambridge, MA :: Then there is the house in Cambridge, MA (across the green from Harvard) that served as [[https://www.nps.gov/long/index.htm][Washington's headquarters]] during the siege of Boston and later as the [[https://www.nps.gov/long/index.htm][home of the poet Henry Wadsworth Longfellow]]. This one starts to get personal, as I am a cousin of some sort to Longfellow. We both go back to John Alden on the Mayflower. See Longfellow's "The Courtship of Miles Standish". - [[https://en.wikipedia.org/wiki/Fort_Capon][Fort Enochs/Fort Capon]] :: This one is very personal. Turns out Washington commissioned my Great,Great,Great,Great,Great grandfather [[https://talesofafamily.blog/henry-enoch-1710-1784/][Lt. Colonel Henry Enochs]] to build a fort on his land during the French and Indian war. Of course, Washington did the land survey. In the 20 years we's spent living in Virginia driving back to Ohio regularly, we developed a route that goes through Bloomery, West Virginia which winds up cutting right past the sight of the fort (now unmarked on a bluff in a field). It is next to an old one-lane bridge. We did this before we knew of the fort or the family connection. I guess my ancestral lands were calling me home. In reality, much of my family kept moving west to Ohio, where Washington owned land. They were among [[https://www.simonandschuster.com/books/The-Pioneers/David-McCullough/9781501168703][the first settlers of Marietta, Ohio]], the first town in the Northwest Territory and the seat of ... Washingotn county. - Bacon Fort :: Two weeks ago, on the way home from another hike I came across a marker for "[[https://readtheplaque.com/plaque/bacon-fort][Bacon Fort]]", another "Ordinary" and former frontier fort at which Washington stopped. - Mount Vernon :: And then there is Washington's home of Mt. Vernon where he and wife Martha are buried. It is a private foundation and admission is free to people named "George" on his birthday. There is a harpsichord in the house that at least one 12 year old keyboard prodigy was allowed to play a few years back. This Mount Vernon is not to be confused with the town of Mount Vernon, Ohio which my high school played in football. - Culpepper, VA :: A young Washington live in Culpeppr, VA a little south of where I live and joined the Masonic lodge there. Nice men from the Masons can be found at his grave from time to time honoring their brother and (a few years back) handing out coins to children with Washington's image. - The National Road/Braddock's Road :: Then there was the time Washington and Braddock went to what is now Pittsburgh to try to dislodge the french at [[https://en.wikipedia.org/wiki/Fort_Duquesne][Fort Duquesne]]. Braddock wound up dead, [[https://www.nps.gov/places/braddock-s-grave.htm][buried under the road]] and Washington wound up hastily building [[https://www.nps.gov/fone/index.htm][Fort Necessity]] and signing surrender documents in French that he did not understand. And the French and Indian wars were off and running... - Other Washington sites :: Over the years I've been to other sites associated with Washington: Valley Forge, [[https://www.mountvernon.org/library/digitalhistory/digital-encyclopedia/article/crossing-of-the-delaware/][The crossing of the Delaware]], Independence Hall (Philadelphia ) New York, Yorktown. The man got around Colonial America (see [[http://daybyday.gwpapers.org/][The George Washington Day By Day project]]) To be fair there is, of course, another side to the "Settlement" story some of which is told by John Ruth in his book [[https://www.amazon.com/This-Very-Ground-Crooked-Affair/dp/1680270192][This Very Ground, This Crooked Affair]]. After seven generations, Ruth's family can no longer afford to live on land they got directly from William Penn near Philadelphia. Penn, was "granted" all of Pennsylvania by the King of England despite the fact that there were already many people living there who had been there thousands of years... But that said, man or myth, Washington was an inspiring character. He had flaws (don't we all?). I can not tell a lie. I think the take-home for me is to figure out what praiseworthy qualities Washington (or his myth) embodied and to at least /try/ to add those qualities to my own life. #13 of #100DaysToOffload take 2, https://100daystooffload.com/ *** Current Events :news:philosophy:history: **** PUBLISHED Be kind to your call center friends :100DaysToOffload:life: :PROPERTIES: :EXPORT_FILE_NAME: 2024-03-02 :EXPORT_HUGO_PUBLISHDATE: 2024-03-02: :END: I'm going to subvert the system and try to connect with humans I talk to in call centers as humans ... at least until they are all replaced by AI. #+caption: [[https://www.mentalfloss.com/article/72844/13-fascinating-facts-about-brazil]["No good deed unpunished, from Brazil"]] courtesy of MENTAL FLOSS may be copyrighted. #+attr_html: :width 200px [[file:images/brazil.gif]] #+hugo: more My life has taken a turn where it looks like I will be talk to lots of customer service people on the phone: medical stuff, tax stuff, insurance stuff. Oh joy. It's no fun for me, but even less fun for them. They are likely working an 8-5 job (at best), dealing with angry frustrated people for low pay, having their calls recorded by "the man", fed to AI for analysis, graded on how quickly they get people off the phone, with often no knowledge of the big picture, and no empowerment (or encouragement) to actually understand and solve problems that are not on their call script....generally a bad place to be. I'm going to try to subvert the system with each call. My goal (beyond getting insurance bills corrected, etc) will be to connect with the human on the line. To get their name, to read their mood, to connect on some human topic, likely small. Some will likely be annoyed or threatened by anything that takes them off script or out of their role or adds 3 seconds to their measured time on phone per call, but I think it's important to acknowledge the humans in the system when we do manage to get past the AI chatbots. I/they may be rewarded with Winston Smith (1984)/Sam Lowry (Brazil) torture in the end (or just having the system refuse to fucntion in mindless fashion), but I think the small act of humane rebellion will be it's own reward. #57 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED Mark Twain quote on cryptocurrency (via ChatGPT) :100DaysToOffload:geek:latin: :PROPERTIES: :EXPORT_FILE_NAME: 2022-12-10 :EXPORT_HUGO_PUBLISHDATE: 2022-12-10: :END: #+begin_example make up a mak twain quote about crypocurrency #+end_example #+begin_quote Here is a possible quote that Mark Twain might have said about cryptocurrency: “The only thing more elusive than the value of cryptocurrency is the person who invented it. They must be a master of misdirection, for they have managed to convince the world that a string of numbers and letters has worth.” #+end_quote A poem about Pete Rose? A LATIN poem about Pete Rose? A bash script to search files and contents? Advice on investing beat the market and inflation? How to pack for a week long backpacking trip? #+hugo: more We used to say of computer programs "Garbage in, garbage out" ... but ChatGPT seems to be getting a little better than that, probably not close to passing the Turing test, but at the very least amusing. I think grading of high school assignments just became a lot harder... #+begin_example write a poem about pete rose #+end_example #+begin_verse Pete Rose was a baseball great, A player without compare, With a bat in his hand and a smile on his face, He could hit a ball anywhere. His hits record will never be beat, And his passion for the game was clear, But his fall from grace was a tragic defeat, And his legacy forever tarnished, I fear. But still, I can't help but admire The way he played the game, With speed and skill and all his heart, He left it all on the field and never gave up the fight. So here's to you, Pete Rose, A baseball legend in your own right, Though your mistakes may never be forgotten, Your place in history is secure, at least tonight. #+end_verse But wait, there's more. #+begin_example write a latin poem about pete rose #+end_example #+begin_verse Pete Rose, ludus magnus, Non comparari potest, Bat cum manu et risus facie, Posset pila ubique ferire. Record eius numquam vincetur, Et amor eius pro ludo patet, Sed casus eius tristis est, Et memoria eius semper maculata timeo. Sed tamen admirari non possum Modo ludebat, Velocitate et peritia et tota corde, Semper certabat et numquam desistebat. Ergo tibi, Pete Rose, Legenda ludi tua propria, Licet errores tui numquam obliviscantur, Locum tuum in historia tutum est, saltem hac nocte. #+end_verse #+begin_example write me a bash script that searches for files by partial name that contain a certain regex #+end_example Here is a Bash script that searches for files with a partial name that match a specified regular expression and prints their names to the terminal: Copy code #+begin_src bash #!/bin/bash # Prompt the user for the search term and regular expression read -p "Enter the partial file name to search for: " search_term read -p "Enter the regular expression to match: " regex # Search for files with the specified name and matching regular expression results=$(find . -name "*$search_term*" -exec grep -l "$regex" {} +) # Print the names of each file that was found while read -r file; do echo "$file" done <<< "$results" #+end_src This script uses the find command to search for files with the specified partial name and grep to match the regular expression. The -l option for grep is used to print only the names of the files that match, rather than their contents. The read command is used to prompt the user for input and to iterate over the search results. To use this script, save it to a file (e.g. search.sh), make it executable with chmod +x search.sh, and run it with ./search.sh. You can specify the partial file name and regular expression to search for when prompted. #+begin_example how do I invest to beat the market and inflation #+end_example #+begin_quote To invest in order to beat the market and inflation, you can follow these steps: Identify your financial goals and the time frame in which you want to achieve them. This will help you determine the right investment strategy for your situation. Create a diversified portfolio that includes a mix of stocks, bonds, and other investments. This will help reduce the risk of your investments and increase the chances of achieving your financial goals. Research different investments and compare their potential returns, risks, and fees. Look for investments that have a track record of outperforming the market and have the potential to protect against inflation. Consider consulting with a financial advisor who can provide expert advice on investing and help you create a personalized investment plan. Regularly monitor your investments and make adjustments as needed. This may include rebalancing your portfolio to maintain the right mix of investments, selling underperforming investments, and buying new investments that align with your financial goals. By following these steps and being disciplined in your approach to investing, you can increase the chances of beating the market and protecting against inflation. However, it is important to keep in mind that there are no guarantees in investing, and the value of your investments can go up or down. It is always a good idea to carefully consider the risks and consult with a financial advisor before making any investment decisions. #+end_quote #+begin_example what backpacking gear should I get rid of when hiking for a week or more #+end_example #+begin_quote When backpacking for a week or more, it is important to carefully consider the gear you take with you. To save weight and space, you may want to consider getting rid of the following items: Extra clothing: Take only the essentials, such as a few layers for different weather conditions and a waterproof jacket. Avoid taking duplicate items or clothing that you are unlikely to wear. Heavy or bulky items: Look for lightweight and compact alternatives to your gear, such as a backpacking stove, sleeping pad, and tent. Non-essential items: Consider leaving behind items that are not necessary for your trip, such as a camp chair, extra gadgets, or luxury items. Expired or unnecessary items: Get rid of any food, medication, or first-aid supplies that are expired or that you are unlikely to use. Overall, the key is to pack only the essentials and to prioritize lightweight and compact gear. By doing so, you can save weight and space and make your backpacking trip more enjoyable. #+end_quote #+begin_example make up a mak twain quote about crypocurrency #+end_example Here is a possible quote that Mark Twain might have said about cryptocurrency: #+begin_quote "The only thing more elusive than the value of cryptocurrency is the person who invented it. They must be a master of misdirection, for they have managed to convince the world that a string of numbers and letters has worth." #+end_quote #39 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED Peace be with you :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2022-03-05 :EXPORT_HUGO_PUBLISHDATE: 2022-03-05: :END: I've been listening to the [[https://www.gutenberg.org/ebooks/author/998][Meditations of Marcus Aurelius]], the stoic Roman emperor. The stoic philosopher Epictetus, who was an older contemporary of Marcus Aurelius said #+begin_src Never say about anything, I have lost it, but only I have given it back. #+end_src It might lower my blood pressure if I could get my mind around that. #+hugo: more It's all to easy to get upset when people wrong you, or when dictators invade a neighboring country, killing thousands of people and destroy the country for seemingly unknowable and unjustified reasons. In the meditations, the point is often made that the only thing you really have is this moment in time and your ability to control your reactions. You do not "have" or control the past, the future, events, people, money, etc. It's a sophisticated version of what parents often tell their children "Don't worry about what your brother is doing, pay attention to what you're doing". Martin Luther (not King Jr.) put a Christian spin on the idea: #+begin_example I have held many things in my hands, and I have lost them all; but whatever I have placed in God's hands, that I still possess. #+end_example The world is not fair. It is not just. And I control almost none of it, aside from my own assessment of what is "fair", what is "just", and how I react to it. I've caused myself a lot of trouble over the years by they way I asses things and how I've reacted. I wish you peace. #18 of #100DaysToOffload take 2, https://100daystooffload.com/ **** PUBLISHED When goods don’t cross borders, soldiers will :PROPERTIES: :EXPORT_FILE_NAME: 2022-02-28 :EXPORT_HUGO_PUBLISHDATE: 2022-02-28: :END: [[https://fee.org/resources/if-goods-dont-cross-borders/][When goods don’t cross borders, soldiers will]]. That is all. #+hugo: more #14 of #100DaysToOffload take 2, https://100daystooffload.com/ **** PUBLISHED Who 'ya gonna trust? CNN, Podcasts, ChatGPT... :100DaysToOffload:life:geek:AI: :PROPERTIES: :EXPORT_FILE_NAME: 2023-05-14 :EXPORT_HUGO_PUBLISHDATE: 2023-05-14: :END: On my [[https://fosstodon.org/@saluki/110354524960932474"][Mastadon feed]] this week, the question was asked #+begin_quote "Why have #podcasts become so popular in the last few years? What's changed?" #+end_quote I think there are a lot of answers... #+caption: [[https://FOO.COM/BAR/BAZ.JPG][ChatGPT rendering of "Make an image of Dorothy Gale of Kanasas riding a bucking bronco with the wicked witch flying on her broom in the background and a tornado behind that" by ChatGPT and George Jones is licensed under ????]] #+attr_html: :width 200px [[file:images/dorothy.png]] #+hugo: more My answers include #+begin_quote No need for the overhead or editorial control of older media forms. Lower production and distribution costs. A wide range of presenters and topics. #+end_quote I think there's going to be another HUGE reason to tune unto long-form talking-heads/analysis style podcasts: You can be pretty sure (at last for a while) that the people talking are people, not, e.g. ChatGPT spitting out articles. If you want to hear what PEOPLE are saying and thinking, for the time being podcasts are it. When we get to the point that AI generation of TV anchors and White House press secretaries is common place, we will have arrived at an existential crisis of trust in all mass-market delivered content. At that point, your best bet will be to have live, in-person, one-on-one interactions with real people. And, come to think of it, in any event, talking to people more might not be such a bad idea. #49 of #100DaysToOffload take 2.1, https://100daystooffload.com/ *** Work :work:retirement: **** WIP Changing the world, one side project at a time :100DaysToOffload:compuserve:history: :PROPERTIES: :EXPORT_FILE_NAME: 2023-12-22 :EXPORT_HUGO_PUBLISHDATE: 2023-12-22: :END: It is somehow fitting that the day I retire, the state of Ohio chose to unveil an historical marker outside the former headquarters of my first employer, CompuServe. I guess I'm history :-) #+caption: [[https://FOO.COM/BAR/BAZ.JPG]["CompuServe Historical Marker"]] #+attr_html: :width 400px file:images/cs_history_marker.gif I started in June of 1985, and, looking back, what was going on there was world changing: the first commercial email, the first online banking, the first online shopping, the first electronic news wire feed, the first song released exclusively online (Arrowsmith 1994), online chat (CB), OS and compiler development, VPNs (X.25 !), data over cable in '82 ... In the course of my career, it turns out that many of the things that mattered wound up coming out of individual side projects, not grand corporate visions. #+hugo: more ***** Side projects ****** The Eternal September, sorry. One of my earliest lasting contributions resulted from a side project that I put my good friend [[https://www.linkedin.com/in/karlkleinpaste/][karl kleinpaste]], up to: creating the first Compuserve =<->= Internet mail gateway as a skunk-works project while we were both working at Ohio State Computer Science. Karl followed up with a USENET =<->= CompuServe gateway, which was soon copied by AOL leading to the [[https://en.wiktionary.org/wiki/Eternal_September][eternal september]] Sorry. Eternal September seems to be about to repeat it self with facebook's "threads" [[https://techcrunch.com/2023/12/14/mastodon-founder-touts-threads-federation-saying-it-makes-his-x-rival-a-far-more-attractive-option/][implementing a gateway to Mastadon]]. ****** The Web Browser that never was Then there was this web browser I wrote at CompuServe that would have let the masses access the WWW before most people had even dial-up Internet. But the corporate powers-that-be we're not sure this web thing was going to catch on, so it was never released. Vision !!! It depended on a graphics library and the WinCIM interface developed by [[http://curious.galthub.com/blog/2022-03-24/][Steve Wilhite]] (of GIF fame) ****** The editor that created Linux In early CompuServe days, Wilhite and I did a little collaborative coding to to improve [[https://en.wikipedia.org/wiki/MicroEMACS][MicroEmacs]], I posted the source code to the Usenet group comp.sources.amiga and it took on a life of it's own thanks to Daniel Laurence, first being called MicroGNUEmacs until RMS himself objected to the use of "GNU" in the name. [[https://github.com/torvalds/uemacs][Linus Torvalds (he of Linux fame) maintains a verison of MicroEmacs.]] And [[https://sachachua.com/blog/2013/03/emacs-chat-carsten-dominik/][Carsten Dominik]], creator of [[https://orgmode.org/][Org Mode ("Your life in plain text")]] was an early user and was influenced by it. Org Mode is central to most parts of my life today. What goes around, comes around. ****** SANS, IETF, Flocon, the White House Along the way I wrote [[http://port111.com/george/talks/Jones-2002-SANS.pdf][The Router Audit Tool (RAT)]]. Offshoots of this work fed indirectly (via XCCDF) into the creation of STIX and TAXII. [[https://www.linkedin.com/in/john-n-stewart/][John Stewart]], the venture capitalist and former CISO and VP of Cisco and [[https://www.linkedin.com/in/neal-ziring-779890a9/][Neil Ziring]], tech director at NSA, contributed code to the project while I was leading it. Alan Paller of SANS convinced me to release it through the [[https://www.cisecurity.org/][Center for Internet Security]] as one of their benchmark tools. RAT started as a side project at UUNET. Also at UUNET I started what became RFC3871: https://www.rfc-editor.org/rfc/rfc3871. The IETF OpSec working group continues to this day as an offshoot ("Many fine lunches"?). This was a side project that spanned UUNET and MITRE. While at CERT (CERT/CC at Carnegie-Mellon, the original CERT, not US-CERT) I had the opportunity to chair https://www.flocon.org/ twice. This was something of a side project for the organization, but one that got resources (my time). Also at CERT I had the opportunity to provide netflow analysis training to the White House SOC. ****** Side projects at Palo Alto At Expanse/Palo Alto I spent a lot of time staring at Internet scan data, trying to figure out what vulnerable devices were presenting themselves to us (and hackers). An irony here being that 15 years earlier we thought scanning was always bad, and there were PhD theses around how to detect it. [[https://www.linkedin.com/in/mpcollins/][Mike Collins]] [[https://gitlab.com/mcollins_at_isi/acknowledged_scanners][is still cataloging scan traffic]] (give it up Mike, Internet traffic IS scan traffic :-)) After Palo Alto acquired Expanse, I spent a fair bit of time understanding the vast array security-related data available for analysis in other parts of the company. In my judgment, Palo Alto may have the best overall collection of data for analyzing and addressing security threats, second, possibly, only to AWS. They actively work to use these data sources to protect customers, see [[https://www.paloaltonetworks.com/blog/2014/10/web-security-tips-pan-db-works/][PanDB]], for instance. I presented on my findings at an annual internal meeting of researchers. A side project. As part of that effort I met [[https://www.linkedin.com/in/janos-szurdi-b40b3598/][Janos Szurdi]] and collaborated with him and other AMAZING researchers in that division, mostly on informal projects such as an internal "Hackathon", my role mostly being to advise on the use of Expanse datasets. The result can be seen in [[https://janos.szurdi.com/blog/stockpiled-detector/][Janos' blog post about detecting stockpiled domains]] At this year's internal research meeting [[https://www.linkedin.com/in/tim-hofmockel-a31437100/][Tim Hofmockel]] and I explored further applications of combining data sources to support security analysis to solve our customers challenges. Such meetings are side projects for everyone, but the in-person interactions that happen there are what gets the creative and collaborative juices flowing and are often the source of further outside-the-box projects. I think that's why I like them, and why companies fund them. There is a possible patent coming out of some side efforts (this would be the first of my career). ***** The Amazon Leadership Principals There is one set of corporate mumbo-jumbo I actually believe in: the [[https://www.aboutamazon.com/about-us/leadership-principles][Amazon Leadership Principals]]. They stick with you. They form a way of thinking about the world and getting things done: Dive Deep, Learn and Be Curious, Bias for Action, Earn Trust, Disagree and Commit, Deliver Results. It's said that some Amazonians have to try hard to turn them off with family. I think one of the reason those struck such a cord with me is that I saw them modeled 10 years before Amazon was founded at an early, impressionable period in my carrer. You could not have found a better description of Steve Wilhite (but one would have to add laconic, curmudgeonly, self-assured, stubborn and a few other adjectives) I'm holding my Amazon stock despite Andy Jassey now being in charge and the FTC going on an anti-trust fishing expedition. The company is solid. And the leadership principals and customer obsession are a large part of it. ***** People matter. Yes, you have to have corporate vision statements to keep investors happy and make HR VPs think they are relevant, but so often what matters are the side projects, the accidents, and things that fly under the radar. I have it from Wilhite (30+ years ago) that the first DEC10 was delivered to CompuServe by mistake. It was then the computing arm of Goden United Life Insurnace Compay. They had ordered a smaller machine from Digital Equiptment Corporation. When the DEC10 arrived, they kept it, eventually started selling extra cycles as time-sharing (Cloud Computing, 1975), built a packet switched network, c.a. 1972 (take that ARPANet), started the first online service, c.a. 1979, and much of the world as we know it today was born. Shortly thereafter, Dan Piskur had to invent "Cybersecurity" /ab initio/. Wilhite left Ohio State during the 1970 riots to go do fun work on a big computer at a startup down the road. He never finished his degree. Too much to do. Things worked out. I think I can say the same. People matter. Individuals matter. Side projects matter (again, see [[http://curious.galthub.com/blog/steve/][Wilhite and GIF]].). So make your strategic plans, track things in your kan-ban boards, have project managers run your agile sprints, but remember #+begin_quote "Life is what happens to you while you're busy making other plans" --- John Lennon, 1980 in "Beautiful Boy" #+end_quote #52 of #100DaysToOffload take 3.1, https://100daystooffload.com/ **** PUBLISHED What matters in work? :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2023-12-06 :EXPORT_HUGO_PUBLISHDATE: 2023-12-02: :END: The chart below is a mental framework I've used to evaluate my work situation over the span of may career. The goal is to move as far up the pyramid as you can. Being at the top (interesting )is really a first or zeroth world problem. Insert discussion of human flourishing/εὐδαιμονία here. If you're failing at a lower level, the upper layers really don't matter. #+caption: [[http://git.galthub.com:3000/gmj/home.public.art/src/master/home/public/art/maslow2023.png][Maslow's Heirarchy of Jobs ]]© 2023 George M. Jones, is is made available under the terms of the [[https://creativecommons.org/licenses/by/4.0/][CC BY 4.0]] #+attr_html: :width 600px file:/home/gmj/home/public/art/maslow2023.png #50 of #100DaysToOffload take 3.1, https://100daystooffload.com/ **** WIP Successful? :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2022-12-26 :EXPORT_HUGO_PUBLISHDATE: 2022-12-26 :END: In http://curious.galthub.com/blog/2022-12-25/ I said #+begin_quote Bruce moved on from there to be VP of MSN at Microsoft for a while. Arguably a "Highly Successful Person" #+end_quote Which, of course, begs (assumes, cedes) the question: #+begin_quote What is success? #+end_quote Bruce embraced the management track. I've fairly consistently and actively dodged it, ironically after Bruce promoted me to my first supervisory role ... managing the development of a web-page creation tool for CompuServe's "MySpace"-like web page publishing system ... from there I took a hard career turn into the security world focusing on Internet security, routers, linux/unix, etc. For me, that's been a resounding success. Just no direct reports, budgets or Microsoft Windows, which were anti-goals for me. I've focused on front-line, hands-on doing. #41 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED Can I get the job done by doing nothing? :100DaysToOffload:GTD: :PROPERTIES: :EXPORT_FILE_NAME: 2022-04-22 :EXPORT_HUGO_PUBLISHDATE: 2022-04-22: :END: Over the years you pick up useful ideas from people. One of the most useful "project management" ideas I've ever encountered is #+begin_quote /Can I get the job done by doing nothing?/ #+end_quote Use the code you already have. Use existing slide decks. Time is scarce. Don't waste it creating something new when something you already have will do the job. Don't spend hours getting a slide deck to %100 perfection when what you really need to do is talk over some ideas and the existing material is sufficient to spark conversation. Thanks to Russell Leighton (then) at AWS for the mind-boggling obvious idea. #26 of #100DaysToOffload take 2, https://100daystooffload.com/ **** PUBLISHED Career counseling should not take itself too seriously. :100DaysToOffload:life: :PROPERTIES: :EXPORT_FILE_NAME: 2022-02-03-O2 :EXPORT_HUGO_PUBLISHDATE: 2022-02-03: :END: These are some musings I sent to a friend who is a career counselor at a local community college. Short version: I'm pretty sure I could not have planned my current career in "IT" and "Cybersecurity" when neither of those terms even existed until well into my career. #+hugo: more In my journal this morning I wound up writing about 8 pages on "how did I get here" towards the end of what has arguably been as mostly successful career in IT cybersecurity. Except that neither the words "IT" nor "cybersecurity" existed until well into my career. One of my conclusions is that it would have been impossible to plan my career. It might be possible to plan careers in fields where technology does not change, where personal connectoms don't matter, and where being in the right place at that right time dont matter. In my case, those (and, well, providence and an aversion to lying, management and marketing) were the drivers. Pretty sure career counseling as a field needs to not take itself too seriously. We had a long exchange where she made some cogent points in defense of her profession. Sometimes I stake out a possibly-extreme position as a way of starting conversations. I may expand on that conversation in future posts. #2 of #100DaysToOffload take 2, https://100daystooffload.com/. **** PUBLISHED Finding needles in the marketingstack :truth:marketing: :PROPERTIES: :EXPORT_FILE_NAME: 2021-12-15-truth-in-internet :EXPORT_HUGO_PUBLISHDATE: 2021-12-15 :END: At work I do a lot of research around finding and understanding the capabilities of things connected to the Internet. I find that often checking Wikipedia and/or searching for the product excluding the vendor website gets to the real information fastest, e.g. https://duckduckgo.com/?q=vmware+tanzu+-vmware.com+-www.vmware.com **** PUBLISHED "​I'm passionate about..."​ :Latin:humanity:work: :PROPERTIES: :EXPORT_FILE_NAME: Im-passionate about :EXPORT_HUGO_PUBLISHDATE: 2020-03-09: :END: "I'm passionate about..." I've always hated that phrase. Because I thought it was fake. I thought it was trendy. I've reflexively reacted against trendy things for decades. Pet Rocks, Disco, TED talks, cryptocurrency... But I am coming to see what the phrase is getting at. And I think I like it. In a work world where human beings are called "resources", where intelligent, creative, inquisitive, motivated people are subjected to management practices derived from 19th century steel mills and automotive assembly line production, the phrase "I'm passionate about..." is (can be) an attempt to re-assert humanity. I've just finished reading [[https://www.amazon.com/Long-Live-Latin-Pleasures-Language/dp/0374284520#ace-8881249860][Long Live Latin: The Pleasures of a Useless Language]] . For no good reason. Again and again, it raises the question of what it means to be human: to be joyful, spontaneous, creative, inquisitive, fulfilled, to discover, to appreciate beauty, music, art, language, and poetry (yes, I have a liberal arts degree) I guess if I had to say what I'm passionate about, it's about being human and treating other people as humans. To put a professional spin on it "I am passionate about collaborating with technical people to find creative solutions to important problems." Go learn a useless language. Climb a mountain and enjoy the view. Spend time playing games with your family. Be human. Be passionate. Carpe diem. **** PUBLISHED Choosy Programmers Choose GIF :Wilhite:CompuServe:GIF:History:Computers:Emacs:Programming: :PROPERTIES: :EXPORT_FILE_NAME: steve :EXPORT_HUGO_PUBLISHDATE: 2020-04-30 :END: [[https://en.wikipedia.org/wiki/Steve_Wilhite][Steve Wilhite]] is the most prolific programmer I've ever known. He's mostly remembered for creating [[https://en.wikipedia.org/wiki/gif][GIF]] but he spent 30 years writing piles of amazing software which helped set the stage for the Web. #+caption: CompuServe XF4 Fortran Manual #+name: pic:XF4MAN file:images/cs/XF4MAN.gif Day 02 of #100DaysToOffload. #+hugo: more Steve worked at CompuServe (and successors) from 1970 to 2001. I was fortunate enough to start my career working with/for him. My view of his programming output comes largely from 1985-1995. I'm sure there was much more that I missed. ***** Things Steve Wrote Steve ran the languages and tools group when I arrived. /He had just/ /given up on writing at DEC10 ADA compiler/[fn:2] (Steve is still writing ADA software), was just beginning to embrace PCs as "real computers" worthy of his attention, had written a FORTRAN compiler, a BASIC compiler and associated run-time systems, and a run-time library for BLISS called BTOOLS. These were partially in support of CompuServe's pre-information-service time-sharing services supported by a homegrown packet-switched networking. "Cloud computing" in the 1970s :-) I worked on BTOOLS, SKIMAN (Single Key Index Access Manager), a B-Tree library Steve had created. There was a full-fledged database system written in there somewhere I think. There were ports and hacks to various tools such as FINE (Fine Is Not Emacs), a C compiler, DEC Runoff, laser printer support, source code control systems, etc. On top of that, Steve created the HMI (Host Micro Interface) protocol that rode on top of [[https://en.wikipedia.org/wiki/b_protocol][CompuServe "B-Protocol"]] to allow API driven interactions with the information service (the alternative being text/command line interfaces). This was all in an environment where 9600baud modems were considered "fast". Compression, incremental display, etc. were paramount. He later used that as the substrate for [[https://en.wikipedia.org/wiki/compuserve_information_manager][WinCim]], the graphical interface to the information service that he created which kept the company going for a while in the face of the likes of AOL. Somewhere in there, there was a graphics library and enough pieces that I was able to write a web browser that worked inside WinCim, that would have allowed CompuServe users without an Internet connection (most everyone then) to browse the web. Marketing did not want to release my web browser. *Sigh*. Later on (after my time) Steve as pulled into major projects to support the back end processing for H&R Blocks's TaxCut program when online tax-filing was a new thing. /He was also pulled into the WOW project/ /which was supposed to be the AOL killer when it became apparent that/ /CompuServe needed an AOL killer./[fn:3] One of those projects succeeded. Single-handed technical virtuosity could not fix the one that didn't. And there was this little side project called GIF. ***** Things that got out ****** GIF Be careful what you do and say. It's often the incidentals that you are remembered for. The kind (or unkind) words. The side projects. In the world of the mid 80s there were IBM PCs, Apple Macs (classic), Amigas, Atari-STs, CoCos, and yes, Apple-IIs and Commodor-68s. The information service was moving beyond a text-based, menu-driven system (I like curses and termcap as much as the next guy, but hey..). People wanted to share pictures, display online-shopping catalogs, weather maps, etc. There were no/few good portable graphics formats. So Steve wrote one. GIF. Then the web happened. The web wanted portable images too. GIF worked. So the early web adopted it. There was the kerfuffle over the LZW compression algorithm it used resulting in the creation of the PNG format, but, hey, who in 1987 would ever think that an algorithm published in ACM might not be free. OK, [[https://en.wikipedia.org/wiki/richard_stallman][Stallman]], but who else :-). And now there are Giffy's in slack that I turn off because I hate dancing bears. Thank-you Steve. ***** MicroEmacs/mg display hacks And then there are the [[https://www.emacswiki.org/emacs/MicroEmacs][MiroEmacs]] display hacks. When the Amiga came out Steve convinced me to buy one (it was that or the AtariST, he had and was hacking on both). But there was no Emacs. Somehow (Steve?) I became aware that the source to MicroEmacs was included on with the disks to Mark Williams C compiler for the PC. So I bought the C compiler, ported the source to the Amiga (all it needed was character I/O drivers to work in the native ANSI/VT-100 terminal) and gave the source to Steve, who, I think, hacked/improved the screen update logic. I then posted the source to the USENET group comp.sources.amiga. It took off from there (thanks to Daniel Lawerence). It's rumored that Linus Torvalds uses a version of the code to this day. ***** CompuServe: Groundbreaking events, great teams and amazing individuals. At the recent (2019-10-19) CompuServe 50th Anniversary reunion I was reminded of the revolutionary things that happened there: the first commercial email, the first online banking, the first online shopping, the first electronic news wire feed, the first song released exclusively online (Arrowsmith 1994), online chat (CB), OS and compiler development, VPNs (X.25 !), data over cable in 82....and Dan Piskur inventing what we know today as much of standard online security, incident response and "cyber"/law enforcement collaboration, all before the Internet. Of course it all took the efforts of many people and groups: the network software team (packet switching c.a. 1972, take that DARPA), the "monitor group" (TOPS-10 OS development), MicroComputer Software (terminal emulators forever !), large systems software (billing et. al.), and of course the genius of the founders (John Goltz) and the vision of Jeff Wilkins (CEO 1970-1985). There's a lot to be said for being in the right place at the right time, and for having a team, but many things do not happen without the essential contributions of amazing individuals. Thanks Steve. #+caption: It all started... #+name: pic:shirt file:images/cs/compuserveshirt.gif ***** Footnotes [fn:2] Steve corrected me. There were never actually plans to write an Ada compiler. But I was unaware of the XBASIC compiler. So 3 compilers in all. [fn:3] Steve informs me he was NOT pulled into the WOW project. Maybe the outcome would have been better if he had... [fn:1] yes, there are many better tools for this job, but not in the constrained environment where this had to run. **** PUBLISHED Adding uncertainty in uncertain times :life:work:startups:GTD: :PROPERTIES: :EXPORT_FILE_NAME: 2020-06-30 :EXPORT_HUGO_PUBLISHDATE: 2020-06-30 :END: So, when life turns uncertain you have two choices. Cling to things that seem to add stability and certainty, i.e. try to "stay safe", or embrace the uncertainty, live now, carpe diem, and do things would seem to be fulfilling now. I'm choosing the latter. At 58, in the middle of a pandemic and social unrest, I'm moving to a startup. The following are notes from a friend who has been playing the silicon valley startup game for a few decades. These are notes-to-self and anybody else who cares from that conversation: - Map out the architecture of the org/org structure (official) vs. what is actually working - Whats the (people) API: theory, practice? - Find "they guy who built it, knows everything" - What is the aspirational architecture vs. what's really built? - Find "the guy" who has it all in his head, maybe stuff that has not made it to paper. Whiteboard it, write it up. - Most places don't do that - Look at reality vs. getting stuck in "my teams perspective" - Use systems thinking to figure it all out - Find the "old salts" who know where the bodies are buried, not "official channels" - "First 90 Days", book - "An elegant puzzle", book - #1 lesson for all startups: "IT'S ALL ABOUT HOW MUCH CASH YOU HAVE IN THE BANK" - If company is healthy, CFO knows burn rate, want's whole company to be thinking about it - Health check: how aware are people of cash position? - Build vs. buy - Bailing wire and duct tape? - WATCH BURN RATE, WATCH REVENUE - Valuable people: people who understand tech and that you have to be a functioning business, i.e. you need more $ revenue than you are spending - People should be excited about growth - Watch out for scaling company before projected/actual growth in revenue - Biz/finance folks should be excited about you being interested in finances. Defensiveness is a warning sign. You WANT people who care about $. People share what they are interested in - Working remote, COVID - open door policy? - Ask admin assistant "Can I get 1/2 hour on X's calendar"? - Have/ask leading questions - Dig into current, next challenges - Demonstrate that you are thoughtful and someone who wants to make things work - Most important: GET THINGS DONE - reward/appreciated if you are seen as someone who wants to make things work, shape product - not "staying in my lane" - culture to pass things on, figure out where the holes are, fill them - Each team should have onboarding guide - Whoever was last onboarded updates it - if not, as ?Mentor? to get it - You should have a mentor - there should be a doc that includes "what IT didn't tell you - "When I build systems, I try to build something with good [benefits?] but light filling" (e.g. don't over-engineer) - Two bad extremes: - Try to build something that works now, don't "boil the ocean" - Pure agile people...constant refinement, incrementalism. - e.g. you know you need a memory managers. Start with an interface. - People. There are always "a few of 'those' people", hard to work with, disrupt everything. Stay away. **** PUBLISHED Disclaimer :philosophy:humor:100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: disclaimer :EXPORT_HUGO_PUBLISHDATE: 2020-08-19 :END: The opinions expressed in this =[FOO]= are mine, and not those of my employer. In fact, they may not even be mine. I may have changed my mind. I may have grown beyond a particular opinion. I may be trolling you. I may be engaging in Socratic dialog to tear down your beliefs. I may be tearing down my own beliefs. γνῶθι σεαυτόν! # Post 21 of #100DaysToOffload https://100daystooffload.com/ *** Life :life: **** WIP Digging through layers of obfuscation :100DaysToOffload:retirement: :PROPERTIES: :EXPORT_FILE_NAME: 2024-01-20 :EXPORT_HUGO_PUBLISHDATE: 2024-01-20: :END: This is a story about the similarity between finding good information to identify vulnerable devices on the Internet and finding the info one needs to sign up for US health care. Hint: in one of these domains it's possible to find facts. In the other there is a shifting maze of marketing, laws, partisan media coverage, and bureaucracies who's goal is to profit from making it impossible to find facts and make decisions on your own. #+hugo: more In my last job at Palo Alto Networks/Cortex Expanse (https://www.paloaltonetworks.com/cortex/cortex-xpanse), one of the things I did was dig through data that we generated by scanning the entire Internet regularly to identify devices and applications on the Internet so that we could inform our customers what potential attackers saw to allow them to fix it. One thing I learned pretty quickly was that you had to get past marketing and sales info to find useful information. A first step was usually to search and exclude the companie's web site (ususally mostly marketing material) from the results. Someitmes I went looking for technical manuals and installation guides, the "rubber meets the road" reality for making things work "Open up these firewall ports....". Acquisuitions (company name changes) and product name changes (a favorite pass-time of marketing departments) where another source of confusion. I generally found that the older the info was (tech startup's first engineer-written product description) was often the best source of infomation ... the longer the marketing people had their hands on it, the fuzzier and more confusing things got. Once you see "The market leader in..." it's time to move on. The acutal information content will approach zero. I tell you that story to tell you this one. Having just retired, I'm looking at health care, both ACA (ObamaCare) and Medicare for myself and may family. It turns out the same marketing obfuscation applies here, and I've not yet figured out how to filter out the mis-information. But wait, there's more. In this space we're dealing with a political football (healtcare) where the laws and regulaitons change every year, where there is highly partisan coverage of the topic, and where mistakenly giving out your phone number can result in 30 robocalls a day for a week. I'm not sure I will be able to find digestable spin-free sources of truth in the health care space. There are too many vested interests with a stake in keeping things confusing allowing them to posture to appear to be "the solution". It's not about healthcare. It's about votes, maintaining bureaucracies, keeping things complicated so you need to pay people to help you and in general siphoning off as much money as possible at every step. I pay a physician friend directly, out-of-pocket, no insurance for basic primary care. I get what I pay for, no more, no less, with none of the obfuscation or competing interests, no office manager or staff to deal with, no claims to file, no stupid one-size-fits-all policies that are actually a hazard to my health. And I get good informatoion, unfiltered. #55 of #100DaysToOffload take 3.1, https://100daystooffload.com/ **** WIP "I ain't no Senators son, no !" :100DaysToOffload:retirement: :PROPERTIES: :EXPORT_FILE_NAME: 2024-01-08 :EXPORT_HUGO_PUBLISHDATE: 2024-01-08: :END: Warning. First-world baby-boomer problem described here: #+begin_example So, I'm stitting here on the group-W bench, I'm just sitting here... #+end_example OK. Really. Not trying to get out of the Viet Nam draft, just having another surreal interaction with the US Federal government 50 years later along the lines of: #+begin_example Some folks are born silver spoon in hand Ah, they really help themselves But when the tax man comes to the door Lord, the house look a rummage sale, oh yeah John Fogerty/Credence Clearwater Revival https://www.azlyrics.com/lyrics/catpower/fortunateson.html #+end_example #+hugo: more I retired last month. As a result of a lot of luck and about 38 years hard work, I have more money now than at any other point in my life, and thanks to the Obamacare (ACA) rules and the way my finances are structured I have strong incentives to arrange things so that I have very little "income" this year. In fact, I'm flirting with having so little income that I would qualify for Medicaid and be at or near the federal poverty level. So, yeah, I'm trying to make the house (1040) look like a "rummage sale" all for benefit of the taxman. And it's all legal and right there on the the government web sites, just a twisted bunch of incentives. It's just surreal. #+begin_example There's one for you, nineteen for me, should five percent appear to small, be thankful I don't take it all, 'case I'm the taxman George Harrison, the nascient neo-con #+end_example #53 of #100DaysToOffload take 3.1, https://100daystooffload.com/ **** WIP Congress, Big Pharma and Kickbacks, Oh My !!! :PROPERTIES: :EXPORT_FILE_NAME: 2023-12-30 :EXPORT_HUGO_PUBLISHDATE: 2023-12-30: :END: GoodRX may save my son $3,500 or more on his prescription meds. This is a large fraction of the income he's earning on his first job. Congress exempted "Big Phrama" from kickback rules in the 90s, the result seems to be that prices signals are allowed to work in the market to the benefit of people who would otherwise be made poor buying medicine they need at artificially high prices. #+hugo: more I was wondering how GoodRx gets such deep discounts. From: https://www.dallasnews.com/news/watchdog/2022/02/24/dear-watchdog-how-does-goodrx-knock-down-the-price-so-steeply-for-many-drugs-at-the-pharmacy/ #+begin_quote GoodRx says it earns money when a customer uses her or his GoodRx code to make a purchase. Even more money is made when the consumer becomes a repeat customer. To be clear on this, when you use a GoodRx code, a PBM receives a portion of that. GoodRx then receives a percentage or a fixed payment from the PBM for directing the customer to that PBM's pricing and the pharmacy, the company explains. In other industries, these payments could be called illegal kickbacks. But in the early 1990s, Congress exempted drug companies' rebates from federal anti-kickback laws. The thinking was that the payments could serve as a negotiating tool, according to /Consumer Reports/. #+end_quote Reason has a series of podcats that shows how federal government myopia of a different sort (tariffs) cause baby-food shortages https://reason.com/podcasts/nice-things/ #54 of #100DaysToOffload take 3.1, https://100daystooffload.com/ **** PUBLISHED Count Your Blessings :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2023-02-09 :EXPORT_HUGO_PUBLISHDATE: 2023-02-09: :END: Do something radical. #+begin_quote Count your blessings, name them one by one #+end_quote Literally. Do it. Write them down. Meditate on all the good stuff in your life. Maybe even give thanks. https://hymnary.org/text/when_upon_lifes_billows_you_are_tempest (the fact that this follows yesterdays "[[http://curious.galthub.com/blog/2023-02-07/][Making Lists]]" musing is just coincidental ... he asserts ... our maybe it's the positive application) #47 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED Making lists :emacs:100DaysToOffload:orgmode: :PROPERTIES: :EXPORT_FILE_NAME: 2023-02-07 :EXPORT_HUGO_PUBLISHDATE: 2023-02-07: :END: Dad made lists. Lots of them. I have Emacs org mode. Making lists is part of the story I tell myself about how I'm working on the right things and getting them done. #+hugo: more Dad was an incurable list maker. He had to-do lists from Mom. He wrote detailed instructions (a list) of how to set up the camper. He posted lists of the date that each of my brothers and me would start paying for their own gas for the car and the milage rate. When he used computers he decided to save everything on USB drives. There was (is) a list indexing those USB drives. There were multiple phone lists updated regularly. There were (are) song lists in the harmonica case. I have [[https://orgmode.org/][Emacs Org Mode]] ("Your life in plain text"), the penultimate list making software. The lists I make on computers bear only tangential relationship to what I do. They are never done. In fact, computers make it all to easy to make lists of more things than I could every do. So, why? The fantasy is that when I make lists, they are organized, complete, logical, right, drive all that I do (and don't do) and that I'm more effective, accomplish more and am happier as a result. Or maybe I just need the illusion of order. The reality is, I do what I do. I am time bounded. Lists grow to infinity. Lists are there more to make me feel good than to drive actual behavior, so that I can tell myself (and others) that I am ORGanized. Lists are there for psychological reasons. They are there because I like making lists. It's enjoyment of the process and the illusions about what they help me accomplish, not, for the most part, because I get more done (but I /think/ I do...no, really....) True, it is better to have a plan than no plan. "If you aim at nothing, you will hit it every time." Got it. But, in reality, lists are part of the story I tell myself about how I'm working on the right things and getting them done. Now, #+begin_quote =M-x org-agenda= #+end_quote what am I doing today? ... #46 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED Try writing more, you'll worry less :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2023-02-04 :EXPORT_HUGO_PUBLISHDATE: 2023-02-04: :END: The past couple weeks, I've intentionally cut the phone out my morning routine. I was already writing a daily journal (on paper), about a page or two a day. I've always found that to be cathartic, as well as a good way to organize my thoughts and do some day-to-day planning. Now I'm writing two daily journals. #+hugo: more The second journal is an attempt to capture family history and oral tradition. A lot of history, artifacts and stories have landed on me after 150 or 200 years. I'm "getting them out" in a semi-organized manner, using what I know of peoples financial circumstances as writing prompts. There will probably be online versions later, but I find the process of writing on paper leads to much more creativity at the start. Which leads me back to the start of this post. You can start you day doom-scrolling, filling your head with sound bites, stories of political (and other) apocalypses, or you can use the time to create, reflect and plan before spending the time you are given this day. Your choice. (turns out this is version 2 of my previous post...) #45 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED mornings without the phone (regaining my mind) :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2023-01-29 :EXPORT_HUGO_PUBLISHDATE: 2023-01-29: :END: Believe it or not, you will be OK if you don't use your "smart"-phone to look up everything the minute you think of it, if you don't have it by your bed at night and you don't turn it on for a few hours. You might even regain a less-addicted, more thoughtful "smart"-you. #+hugo: more For the past few days I've been going "Cold Turkey" on using the "smart" phone as part of my morning routine: checking news, listening to podcasts, checking email, looking up things I'm curious about, etc. It feels like I'm getting my own mind back. I have spasms of "I have to look this up", but I really don't need to. They quickly pass, and I'm OK without knowing why the Crickets were not with Buddy Holly when his plane went down. Sometimes you want to maintain control of your own stream-of-consciousness. Sure, it might be free association of ideas, knowledge and experiences that are already bouncing around in your skull. But they are YOUR thoughts. Not some advertising-induced, attention grabbing graphic-heavy distractions that some web-designer or marketing person decided you needed to see to drive "engagement" with whatever their schtick is. It's OK not to know. Get your own mind back. Break your addiction to the smart phone, for at least part of the day. The first version of this was written in a paper journal with a pencil. #44 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** Death, Taxes, and Job :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2023-01-11 :EXPORT_HUGO_PUBLISHDATE: 2023-01-11: :END: Today I'm going to pay my taxes, work on updating my living will and health care power of attorney, telling others when I want doctors to pull the plug if I can't make that decision myself. Death and taxes. You can't live with them, and they get you in the end. When discussing death, taxes, and "I know I'm right, why is all this bad stuff happening to me?", there's no better place to turn than Job... # #+caption: [[https://FOO.COM/BAR/BAZ.JPG]["Name of work" by WHO is licensed under cc by 2.0]] # #+attr_html: :width 200px # # [[file:images/BAZ.JPG]] #+hugo: more Job is the oldest book in the bible. It pre-dates Rome, it pre-dates Abraham Lincoln, Isaac Newton, Jacob Astor, Joseph Stalin, and Benjamin Netanyahu :-). It pre-dates the Christian faith and Jesus' birth by hundreds of years. For those who may not be familiar, Job is a story of suffering. Unjust suffering. Short version: Behind the scenes (Job never learns this) Satan makes a bet with God that Job (God's "righteous servant") will curse God if God lets Satan take away his money, family, and health. God takes the bet. Job's children die. His livestock is stolen. He skin breaks out in boils. His wife and his friends blame him and tell him it's all his own fault. Some friends. His loving wife summarizes "Job, do you still hold to your integrity? (claim it's not your fault) Curse God and Die !" Fortunately for us (and germain to the topic of my living willing/advanced medical diretive), Job did not live in 21st Century Canada, was not counseled to kill himself to keep the governments health care expenses down, but instead endured (seemingly) pointless suffering, wrestling with the question "Why?", and as a result we have one of the greatest works of literature in human history that has inspired theological and philosophical debate and great art for millennia. "Curse God and Die ?" Let's hear from Job. #+begin_quote For I know that my redeemer liveth, and that he shall stand at the latter day upon the earth: And though after my skin worms destroy this body, yet in my flesh shall I see God: Whom I shall see for myself, and mine eyes shall behold, and not another; Job 19:25-27 #+end_quote I can not read those words without hearing the setting in Handel's Messiah. The phrase #+begin_quote Yet in my flesh shall I see God #+end_quote is likely going on my tombstone. It is an expression of the hope of resurrection and eternal life. Seeing those words on a tombstone would probably make Job happy (Job happy?), because, immediately before that he said: #+begin_quote Oh that my words were now written! oh that they were printed in a book! That they were graven with an iron pen and lead in the rock for ever! Job 19:23-24 #+end_quote But in context, he's referring to his long-running instance that he is innocent, that his actions and thoughts are right, and that no-one (God included) can question that. Sound like any people or current cultural movements you know? The book ends with God asking Job a series of unanswerable questions. Job finally admits he may not have the whole picture and that maybe it's time to be humble and admit his limitations, frailty, mortality and, yes, the possibility of his own moral failings when faced with an Eternal, Omnipotent, Infinite, Just and Merciful Creator. May I do the same. Oh, and to those who may decide to pull the plug on me or not, yeah, the answers are often not clear. Sometimes suffering has a purpose. Do what you think is best at the time and leave the rest to God. It's all any of us can do. #43 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** PUBLISHED Generation P :100DaysToOffload: :PROPERTIES: :EXPORT_FILE_NAME: 2023-01-08 :EXPORT_HUGO_PUBLISHDATE: 2023-01-08: :END: I think I'm a member of "Gen-P", the "[[https://en.wikipedia.org/wiki/Peter_Pan_(1953_film)][Peter Pan]]" generation who grew up in the shadow of the 1953 Disney production that touted the idea that we never have to grow up. #+caption: [[https://FOO.COM/BAR/BAZ.JPG]["Boat off Jeckyll Island" by George Jones is licensed under CC BY 2.0]] #+attr_html: :width 400px [[file:images/boat.jpeg]] #+hugo: more A friend who's a few years older than me recently related trials she is having caring for elderly parents. Nine years ago, my father moved to be near us. For the last 5 years of his life I spent time providing help to a very independent-minded person who rarely admitted he needed my help. This included an incident where I had to take the car keys from someone for whom driving was a right of passage into adulthood. It was not pretty. Somewhere in the late fifties or early sixties (when I as born), I think the old notions of independence that were common in the 30s, WWII, and my parents generation and earlier went out the window. They lived in a much harsher world, and understood that fact. Farming. The depression. WWII. The bomb. There was nowhere near the economic prosperity that came in the decades after. There was nowhere near as much social safety net as there is today. Shades of Archie Bunker's "[[https://youtu.be/0d8FTPv955I][Those Were The Days]]" are now drifting through my head" ... it's time to stop this line of thought. Then came Peter Pan. "[[https://genius.com/Don-mclean-american-pie-lyrics][A Generation Lost In Space]]". I look in the mirror and sometimes wonder who that old man is. When addressed as "Mr. Jones", I wonder who they'r talking to? To hear my daughter-in-law call me "Dad", seems very strange. But life moves on. The lost boys and Wendy do, in fact grow up. Back to my friend who's caring for her parents. Enjoy the seasons of life. If you're in a position to help someone (kids, older parents), be glad about it. Life can be rough. Pre-"Boomers" seem to have gotten that more than me. Almost in spite of my self, I've learned that some of the deepest meaning in life comes in stepping up to deal with adversity. Have fun in never-never land. I don't think I'm coming. # I've never liked the terms "Generation-FOO". It seems like the only # use of the terms is to generate class envy, and I'm neither a fan of # class or envy. #42 of #100DaysToOffload take 2.1, https://100daystooffload.com/ **** WIP Why do we hack? :100DaysToOffload:emacs: :PROPERTIES: :EXPORT_FILE_NAME: 2022-12-04 :EXPORT_HUGO_PUBLISHDATE: 2022-12-04: :END: Why do we hack? Because we enjoy it? Because we want others to use our work? Because we get paid? #+caption: [[https://FOO.COM/BAR/BAZ.JPG]["Teco Emacs on TOPS20" by George M. Jones is licensed under CC BY 2.0]] #+attr_html: :width 600px [[file:images/emacs.png]] #+hugo: more Once again [[https://emacsconf.org/][EmacsConf]] went to fountainhead of free software and gave us a chance to hear from and interact with [[https://en.wikipedia.org/wiki/Richard_Stallman][rms]]. People in the public eye often get on (or get put on) a soapbox repeating the same lines. Stallman even chose to open by playing an 8 year old [[https://youtu.be/Ag1AKIl_2GM][TED talk he did extolling software freedom]]. Certainly not new, but once in a while it's refreshing to return to primary sources rather than news or other mediated views. This talk and the Q&A was a view straight into the heart, soul and source of the Free Software movement. I asked two questions on the webpad which Stallman answered. In both cases I was trying to get past the repeated soapbox points to what makes the person underneath tick. Despite the utter profusion of tools built around the ecosystem he created over the past 40 years (just look at the [[https://emacsconf.org/2022/talks/][program of EmacsConf]] and the [[https://elpa.gnu.org/packages/][contents of the *LPA]] archives), several of his comments lead me to believe he still views emacs as "just an editor", so to clarify I asked: #+begin_quote Q: What do you use emacs for beyond editing? A: I use it for reading and writing email; this is what I do most of the day. (Sings) "I've been answering my email, all the g**-d***** day / .. / ox-hugo export -> .md in =content/= - .md in =content/=, =images/= and =static/= -> hugo -> .html in =docs/= - .html files in =docs/= -> rsync -> web server public html directory ***** DONE [3/3] Action Items ****** DONE [7/7]Testing and figuring out what to chang ******* DONE Clone the JTR current template #+begin_example git clone https://gitlab.com/taonaw/taonaw #+end_example ******* DONE Set up new capture template #+begin_example (setq org-capture-templates (quote ( ... ("h" "hugo blog" entry (file "~/blog/drafts.org") "*** TODO %^{title} :PROPERTIES: :EXPORT_FILE_NAME: %(format-time-string \"%Y-%m-%d\") :EXPORT_HUGO_PUBLISHDATE: %(format-time-string \"%Y-%m-%d\"): :END: The short story .. ,#+caption: [[https://FOO.COM/BAR/BAZ.JPG][\"Name of work\" by WHO is licensed under cc by 2.0]] ,#+attr_html: :width 200px [[file:images/BAZ.JPG]] ,#+hugo: more The long story... " ) #+end_example ******* DONE Update config.toml #+begin_example diff --git a/config.toml b/config.toml index f9089c30..abc6cd5c 100644 --- a/config.toml +++ b/config.toml @@ -1,17 +1,17 @@ enableRobotsTXT = true canonifyURLs = true -baseurl = "https://helpdeskheadesk.net/" +baseurl = "http://curious.galthub.com/" publishDir = "docs" languageCode = "en-us" -title = "The Art of Not Asking Why" +title = "Curious Musings" # themesDir = "themes" # theme = "hyde" -disqusShortname = "taonaw" +#disqusShortname = "curious" footnoteReturnLinkContents = "[^ back]" [author] - name = "JTR" - homepage = "helpdeskheadesk.net" + name = "George Jones" + homepage = "curious.galthub.com" # If Porting existing theme [original] @@ -20,7 +20,7 @@ footnoteReturnLinkContents = "[^ back]" repo = "https://www.github.com/mdo/hyde" [params] - description = "A Blog by JTR: Tech, Life, and the Stuff in Between." + description = "A Blog by George Jones: Musings on life, computers, security, etc.." # themeColor = "theme-base-0a" [paginator] #+end_example ******* DONE Update the sidebar #+begin_example diff --git a/layouts/partials/sidebar.html b/layouts/partials/sidebar.html index 6700d4d7..06ab109f 100644 --- a/layouts/partials/sidebar.html +++ b/layouts/partials/sidebar.html @@ -17,6 +17,9 @@ {{ range .Site.Menus.main -}}
  • {{ .Name }}
  • {{- end }} + +

    All Posts ►

    + #+end_example ******* DONE Delete most of JTR' content - Just delete the stuff you don't want in content/ - Beware of browser caches with old tags (refresh) ******* DONE [6/6] Remove/replace JTR' custom artwork with Thinker ******** DONE stop JTRs image from loadiing Comment out in =/static/css/hyde.css=, both =/* background-image: url("/taonaw_logo.png"); */= twice #+begin_example George Jones :emacs: :orgmode: @eludom @jrss Having trouble figuring out where to remove your custom graphic from the sidebar. Thought maybe favicon.png but I can't figure out where to remove it? JTR :emacs:☕ @jrss@mastodon.technology @eludom taonaw_logo.png and title-logo.png in static I believe. George Jones :emacs: :orgmode: @eludom @jrss OK. Killed it (comment) in .css. SOMEONE (browser, hugo server, ...) was caching the image and refused to let go even after I renamed the files. #+end_example ******** DONE add "thinker" at bottom of "about" in sidebar - Add immage =static/thinker.png= - Update the sidebar #+begin_example