free software resistance

 the cost of computing freedom is eternal vigilance

### most-of-the-website-went-up-during-september-and-october *originally posted:* nov 2024 just to clarify, by "most" i mean that quite a lot of this website was already here. the recent additions should outweigh that by count and by size. on september 3rd, many files meant to become part of this website began edits and uploads. this started with archives dating back to 2010 through 2014, though fewer than two dozen files date back that far. this was done manually and took the better part of a week- the actual work done was more casual and likely took less than 8 hours total. there were closer to 150 or more files from 2015, which were selected from an even larger collection- weeding out many that were either duplicates, near duplicates or simply unnecessary. some automation was used, but no workflow was established enough to create a program to do all the work. throughout the month of october and the project itself, automation was limited to a few ploc and the use of she, an editor that can run shell commands: => 2024/she15.py processing the year of 2015 was done meticulously and care was taken throughout the project, but 2015 is when most of fig was written and special attention was paid to the files from this year. no timeframe was established for completing the project, and putting 2015 online began around september 8th continuing through the 30th. at this point it was assumed that each year would take about a month, though the number of files was already being estimated for each year and not every year was the same. if each year took a month, the project could be expected to complete around august of next year- this was tolerable, but not preferable. if each year took 20 days, it would be complete around may- though we already know that 2024 was caught up with before november of the same year, once the process gained enough streamlining and momentum. the goal of this page is summary, there is no need to document every step taken. it was never entirely automated, as that would have only led to doubting and obsessing over the results. in fact, i wrote a few programs to check the work partly because not every file was uploaded. the goal was always to have every file that matters from these years online- ive wanted to do this for years and spent many months weeding through and deleting dupes, organising and restructuring incredibly messy file trees, my filesystem (many backups, much duplication across well over a dozen inexpensive machines since 2015) was a jungle. i can quickly pipe simple tools ive made to group files by name, date, size or hashsum- then i can even sort the resulting groups of possible duplicates by size. im not a data hoarder who saves literally everything, im a minimalist who set out to reduce tens of thousands of files to a few thousand. but thats work. fortunately, working with this sort of thing is fun for me. if i did it all by hand i would have grown bored with it years ago. a lot of the little tools ive made were done in an hour or two to help me with some part of this broader project. many of the files you see here are experiments in file management- ive created shells, utils and extensive bash "one-liners" like this one: ``` for c in .1 .2 .3 .4 .5 .6 .7 .8 .9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ; do t=$(echo "Oct $c" | tr "." " ") ; for each in 99 24 ; do echo ; for mon in Aug Sep Oct Nov Dec ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ./mkgem.fig.py | sed "s/[1234567890][1234567890]:[1234567890][1234567890]:[1234567890][1234567890]\ //" | grep "$t" ; echo ; done ``` the bulk of which is just the line that did half of the heavy lifting in october: ``` for each in 99 24 ; do echo ; for mon in Aug Sep Oct Nov Dec ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ./mkgem.fig.py | sed "s/[1234567890][1234567890]:[1234567890][1234567890]:[1234567890][1234567890]\ //" ``` and the outer loop of that is redundant- because the line itself is meant to spit out gemlinks for each file by year, with space between each month and year. instead of taking the time to rewrite it (ive used this since 2023 at the latest) i just tweaked it to the very related task at hand. this part: ``` for c in .1 .2 .3 .4 .5 .6 .7 .8 .9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ; do t=$(echo "Oct" $c" | tr "." " ") # [...] | grep "$t" ``` was a quick hack to let me isolate files from a month at once, with days sorted instead of just months like it usually does. mkgem.fig is a quick, very simple tool written in my own programming language, if im using a shell script for something its to save time because some tasks are incredibly easy to compose with ksh. ksh is really simple and relatively predictable, i dont miss trying to coddle the absurdly sophisticated expectations of the bash shell and sometimes the gnu tools- though it might work with that too, and often does. because ive done all this, if i want to show you one of the craziest bash scripts i ever wrote, i can just do a quick search: ``` find . | grep shlogo ./2017/bashlogo ./2017/bashlogo.html ./2018/bashlogo.png ``` i just ran that from the editor im writing this page in- and then i just create gemlinks to the code and screencap like so: ``` => 2017/bashlogo.html => 2018/bashlogo.png 2018/bashlogo.png ``` => 2017/bashlogo.html => 2018/bashlogo.png 2018/bashlogo.png i didnt open another program, i didnt go looking for the file, i just typed a few things and barely formatted the results, then went back to what i was doing. i wrote that thing 7 years ago, and created the html page three weeks ago along with hundreds of others, but it barely took seconds to retrieve. i realise this is the point of computing, but many of our more convenient abstractions are less streamlined than this. i could have opened a term window and done similar- sometimes i do- but for most of the command line tasks i perform, its easier to just do them at the cursor of whatever im editing. the editor is not bloated or slow, so it doesnt require more patience than when i open xterm. oh yeah, ive used more sophisticated term windows than xterm- this editor is practically one of them. though since both xterm and this editor can be opened and closed very quickly, and are very responsive, they dont require as much of my patience as term windows that might look nicer. im not knocking looks, by the way. i still dont like bloated applications. and if youre going to talk about timesaving features, i get that- im talking about those too. since this provides a sample of what the editor shell is like, the following text from september shows only some of what i did with the editor to organise files and information about them to create the well over a hundred pages that went up that month: ``` cd jan seek mar mkdir mar seek mar for each in 14 15 ; do echo ; for mon in Feb Apr ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ../mkgem.fig.py => 2015/rfig.fig __521 May 27 rfig.fig => 2015/pink.fig ___40 May 25 pink.fig => 2015/ascii.fig ___34 May 24 ascii.fig => 2015/pix.fig ___84 May 19 pix.fig => 2015/pf.py __166 May 19 pf.py => 2015/demo2.fig ___24 May 18 demo2.fig => 2015/20f.fig __419 May 17 20f.fig => 2015/h.fig ___81 May 16 h.fig => 2015/figp 37855 May 14 figp => 2015/sl.fig __147 May 05 sl.fig => 2015/logo.fig _2190 May 05 logo.fig => 2015/tacc.fig __258 May 03 tacc.fig => 2015/heh.fig ___39 May 02 heh.fig => 2015/diagram.fig _1290 May 02 diagram.fig => 2015/date.fig __189 May 02 date.fig => 2015/2fig.zip 17592 May 02 2fig.zip replace |\n => 2015/rfig.fig __521 May 27 rfig.fig => 2015/pink.fig ___40 May 25 pink.fig => 2015/ascii.fig ___34 May 24 ascii.fig => 2015/pix.fig ___84 May 19 pix.fig => 2015/pf.py __166 May 19 pf.py => 2015/demo2.fig ___24 May 18 demo2.fig => 2015/20f.fig __419 May 17 20f.fig => 2015/h.fig ___81 May 16 h.fig => 2015/figp 37855 May 14 figp => 2015/sl.fig __147 May 05 sl.fig => 2015/logo.fig _2190 May 05 logo.fig => 2015/tacc.fig __258 May 03 tacc.fig => 2015/heh.fig ___39 May 02 heh.fig => 2015/diagram.fig _1290 May 02 diagram.fig => 2015/date.fig __189 May 02 date.fig => 2015/2fig.zip 17592 May 02 2fig.zip seek 2015/ replace 2015/| 2015/rfig.fig 2015/pink.fig 2015/ascii.fig 2015/pix.fig 2015/pf.py 2015/demo2.fig 2015/20f.fig 2015/h.fig 2015/figp 2015/sl.fig 2015/logo.fig 2015/tacc.fig 2015/heh.fig 2015/diagram.fig 2015/date.fig for each in rfig.fig pink.fig ascii.fig pix.fig pf.py demo2.fig 20f.fig h.fig figp sl.fig logo.fig tacc.fig heh.fig diagram.fig date.fig ; do echo she $each.html ; done she rfig.fig.html ls | wc 28 28 302 30 30 318 she pink.fig.html she ascii.fig.html she pix.fig.html she pf.py.html find .. | grep fig17 for each in 14 15 ; do echo ; for mon in Sep Oct ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ../mkgem.fig.py replace => ./|=> 2015/ seek htm => 2015/nor.fig.html ___94 Oct 09 nor.fig => 2015/maths.py.html _1657 Oct 09 maths.py => 2015/fige.py.html _1639 Oct 09 fige.py => 2015/kite.fig.html _2041 Oct 02 kite.fig => 2015/fig26.py.html 46865 Oct 02 fig26.py ls | grep html fig19.html fig26.py.html fig27.html fige.py.html kite.fig.html maths.py.html nor.fig.html step0.fig.html uni.py.html ls | grep htm | cat -n 1 fig19.html 2 fig26.py.html 3 fig27.html 4 fige.py.html 5 kite.fig.html 6 maths.py.html 7 nor.fig.html 8 step0.fig.html 9 uni.py.html cat maths.py | sort | uniq > maths.txt diff maths.txt fige.txt 19a20 > ky = knot.getch() 46 176 1192 fige.txt 63 244 1639 fige.py wc maths.py 106 241 1657 maths.py mv kite2.fig.html kite.fig.html find .. | grep kite | grep fig ../oct/kite.fig.html ../oct/kite.fig => 2015/tr.fig __198 Aug 31 tr.fig => 2015/fig23.py 43747 Aug 30 fig23.py => 2015/rc.fig __108 Aug 27 rc.fig => 2015/pset.fig ___48 Aug 27 pset.fig => 2015/zp.fig ___93 Aug 18 zp.fig => 2015/meh.fig ___57 Aug 14 meh.fig => 2015/hw.fig ___96 Aug 11 hw.fig => 2015/command.fig __127 Aug 03 command.fig => 2015/fig22.py 42723 Aug 02 fig22.py for each in command.fig fig22.py fig23.py fish.fig for.fig hw.fig jac.fig meh.fig pset.fig rc.fig tr.fig zp.fig ; do she $each ; done for each in command.fig fig22.py fig23.py fish.fig hw.fig jac.fig meh.fig pset.fig rc.fig tr.fig zp.fig ; do cat top.html $each b.html > $each.html ; echo she $each.html ; done she command.fig.html she fig22.py.html she fig23.py.html she hw.fig.html => ./func2.fig.html __161 Jul 31 ./func2.fig => ./for.fig.html ___37 Jul 26 ./for.fig => ./fig21.py.html 42580 Jul 25 ./fig21.py => ./az.fig.html __103 Jul 23 ./az.fig => ./math.fig.html ___86 Jul 16 ./math.fig => ./topwr.fig.html ___18 Jul 14 ./topwr.fig => ./string.fig.html ___44 Jul 14 ./string.fig => ./efp.fig.html __173 Jul 14 ./efp.fig => ./file.fig.html __581 Jul 09 ./file.fig => ./ffile.fig.html ___71 Jul 09 ./ffile.fig => ./for4.fig.html ___82 Jul 06 ./for4.fig => ./fig20.py.html 41553 Jul 02 ./fig20.py for each in az.fig cw efp.fig ffile.fig fig20.py fig21.py figin.py file.fig for.fig for4.fig func2.fig lin.fig math.fig string.fig topwr.fig ; do cat top.html $each b.html > $each.html ; echo she $each.html ; done she az.fig.html 1083 5251 37855 figp 1083 5251 37855 total 1152 5470 39383 figp 1152 5470 39383 total find ../.. | grep fig17 wc ../../fig/fig17.py 1083 5251 37855 sha256 ../../fig/fig17.py | grep 3b35936e56937d7353fb2dfc40b29151675c7a3e0b079b04414d28ad6bdfa635 SHA256 (../../fig/fig17.py) = 3b35936e56937d7353fb2dfc40b29151675c7a3e0b079b04414d28ad6bdfa635 ls | xargs wc 31 131 419 20f.fig 3 10 34 ascii.fig 9 38 189 date.fig 0 4 24 demo2.fig 37 164 1290 diagram.fig 1083 5251 37855 figp 7 20 81 h.fig 3 8 39 heh.fig 67 188 2190 logo.fig 5 26 166 pf.py 2 7 40 pink.fig 6 21 84 pix.fig 19 101 521 rfig.fig 4 22 147 sl.fig 15 54 258 tacc.fig => ./demo2.fig 24 May 18 18:55:22 2015 ./demo2.fig => ./figp 37855 May 14 16:32:43 2015 ./figp => ./logo.fig 2190 May 5 00:48:39 2015 ./logo.fig => ./pf.py 166 May 19 05:21:07 2015 ./pf.py => ./tacc.fig 258 May 3 08:38:00 2015 ./tacc.fig => ./1/diagram.fig 1290 May 2 19:33:35 2015 ./1/diagram.fig => ./1/fff.fig 680 May 23 03:23:39 2015 ./1/fff.fig => ./sl.fig 147 May 5 00:27:50 2015 ./sl.fig => ./pix.fig 84 May 19 02:13:44 2015 ./pix.fig => ./pink.fig 40 May 25 03:04:20 2015 ./pink.fig => ./2fig.zip 17592 May 2 07:54:38 2015 ./2fig.zip => ./h.fig 81 May 16 21:52:43 2015 ./h.fig => ./4fig.zip 17711 May 16 21:56:28 2015 ./4fig.zip => ./rfig.fig 521 May 27 12:04:28 2015 ./rfig.fig => ./ascii.fig 34 May 24 06:42:51 2015 ./ascii.fig => ./20f.fig 419 May 17 21:29:30 2015 ./20f.fig => ./date.fig 189 May 2 06:59:04 2015 ./date.fig => ./heh.fig 39 May 2 13:35:46 2015 ./heh.fig find . | grep date.fig mv ./1-point-7/date.fig . => ./vl.fig __104 Apr 25 ./vl.fig => ./t.fig ___75 Apr 25 ./t.fig => ./lm.fig ___70 Apr 24 ./lm.fig => ./left.fig ___59 Apr 21 ./left.fig => ./btime.fig _1355 Apr 21 ./btime.fig => ./r.fig ___24 Apr 21 ./r.fig => ./line.fig ___49 Apr 14 ./line.fig => ./zr.fig ___20 Apr 04 ./zr.fig => ./fig16.py 39872 Apr 04 ./fig16.py => ./nstr.fig __131 Apr 04 ./nstr.fig for each in allfig.fig bt.fig btime.fig da.fig fig16.py fn.py funcs.fig hello.fig hs.py inc.fig left.fig line.fig lm.fig nstr.fig r.fig str.fig t.fig vl.fig wc.fig zr.fig ; do cat top.html $each b.html > $each.html ; echo $each.html ; done for each in $(ls | grep htm) ; do she $each ; done & btime.fig.html fig16.py.html fn.py.html funcs.fig.html hello.fig.html inc.fig.html left.fig.html line.fig.html lm.fig.html nstr.fig.html 1 ./1-point-7/da.fig 2 ./1/lm.fig 3 ./2/r.fig 4 ./allfig.fig 5 ./bt.fig 6 ./btime.fig 7 ./fn.py 8 ./funcs.fig 9 ./hello.fig 10 ./hs.py 11 ./inc.fig 12 ./left.fig 13 ./line.fig diff -w ./2/hl.fig ./hl.fig 8c8 < h get hh mid col 1 val --- > h get hh mid col 1 val #### these indents can be removed, aren't needed mv hlc.fig hld.fig she hld.fig find . | grep fig.py mv ef.fig l.fig lf.fig uf.fig ff.fig feb mv fff.fig leaf 1/pal.fig ld.fig 2/hl.fig feb mv diff.txt comp stdfig 6fig 8fig feb find . -type f | xargs ls -l | grep Feb replace Mar|\nMar find . -type f | xargs ls -l | grep Sep | grep -v 2015 find . -type f | xargs ls -l | grep "Mar" replace 2015 | => ./v.fig 382 Mar 25 10:09:41 ./v.fig => ./ge.fig 41 Mar 16 12:53:11 ./ge.fig => ./cn.fig 142 Mar 5 17:58:40 ./cn.fig => ./efig2.fig 212 Mar 30 20:35:44 ./efig2.fig => ./p1 1285 Mar 1 06:13:03 ./p1 => ./1/count.fig 157 Mar 19 17:31:34 ./1/count.fig => ./1/mint.fig 442 Mar 19 16:47:01 ./1/mint.fig => ./1/wheel.fig 2535 Mar 5 17:59:52 ./1/wheel.fig => ./p3.fig 673 Mar 1 07:04:09 ./p3.fig => ./2/f.fig 335 Mar 5 03:05:48 ./2/f.fig replace =>./|=> 2015/ => 2015/stu.fig.html ___57 Mar 30 stu.fig => 2015/st.fig.html ___56 Mar 30 st.fig => 2015/efig2.fig.html __212 Mar 30 efig2.fig => 2015/efig1.fig.html __115 Mar 30 efig1.fig => 2015/v.fig.html __382 Mar 25 v.fig for each in 10.fig cb.fig cn.fig count.fig efig1.fig efig2.fig efig2.py f.fig fco.fig fig13.py fr.fig ge.fig mint.fig p1 p3.fig prs.fig prs2.fig rs.fig st.fig stu.fig v.fig vvv.fig wheel.fig ; do cat top.html $each b.html > $each.html ; echo $each.html ; done Mar 30 ./stu.fig Mar 30 ./st.fig Mar 30 ./efig2.py Mar 30 ./efig2.fig Mar 30 ./efig1.fig Mar 27 ./4/10.fig Mar 25 ./v.fig Mar 24 ./rs.fig Mar 20 ./cb.fig Mar 19 ./1/mint.fig replace ./jan/| replace 2015 | sort find . | rev | sort | rev |cat -n find ../.. | grep fig11 ../../fig/fig11.py 2c2 < textmode --- > #textmode 55c55 < p 32 chr locate 21 1 colortext 7 print --- > p 32 chr locate 21 1 colortext 7 print \ No newline at end of file 1 5 23 ./ef.fig 1 11 58 ./l.fig 6 23 87 ./lf.fig 7 25 143 ./uf.fig 12 47 154 ./ff.fig 35 133 677 ./fff.fig 40 93 1762 ./leaf 49 198 1284 ./1/pal.fig 54 302 1586 ./ld.fig 55 302 1586 ./2/hl.fig ./2/hl.fig ./hl.fig ./l.fig ./hlc.fig ./10fig cd 2015 ls apr mkdir may jan: cannot stat 'jan' (No such file or directory) p=apr 2015/hello.fig 2015/line.fig 2015/wc.fig 2015/fn.py 2015/zr.fig 2015/hs.py 2015/allfig.fig 2015/bt.fig 2015/str.fig 2015/btime.fig 2015/funcs.fig 2015/1/lm.fig 2015/1/t.fig 2015/2/nstr.fig 2015/2/r.fig 2015/1fig.zip 2015/left.fig p=may 2015/nstr.fig 2015/demo2.fig 2015/figp 2015/logo.fig 2015/pf.py 2015/tacc.fig 2015/1/fff.fig 2015/1/prs.fig 2015/1/f.fig 2015/sl.fig 2015/3/fig.fig 2015/pix.fig 2015/pink.fig 2015/2fig.zip 2015/h.fig 2015/4fig.zip 2015/rfig.fig 2015/ascii.fig 2015/20f.fig 2015/1-point-7/date.fig 2015/heh.fig cat ./2/for.fig for x (1, 5, 1) z = x : print() next for each in 14 15 ; do echo ; for mon in Aug Sep ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ../mkgem.fig.py => 2015/sf.fig _1967 Sep 25 sf.fig => 2015/cir.fig __936 Sep 25 cir.fig => 2015/ci.fig __593 Sep 25 ci.fig => 2015/rh.txt 11140 Sep 21 rh.txt => 2015/rh 11256 Sep 21 rh => 2015/callsub.fig ___87 Sep 17 callsub.fig => 2015/swap.fig ___81 Sep 16 swap.fig => 2015/sub.fig ___85 Sep 16 sub.fig => 2015/funcp.fig ___77 Sep 16 funcp.fig => 2015/swe.fig ___42 Sep 12 swe.fig for each in callsub.fig ci.fig cir.fig fname.fig funcp.fig rh rh.txt sf.fig sub.fig swap.fig swe.fig ; do cat top.html $each b.html > $each.html ; echo she $each.html ; done she callsub.fig.html she ci.fig.html she cir.fig.html she fname.fig.html seek /ppppppppp|/cw|/f.fig|/fig.htm|/fig.py|/fig.zip|/fig273|/fig30|/figp3|/for.fig|/index.html|/kite2.fig|/prs.fig|/rfig.txt|/test.fig|/wheel.fig for each in 14 15 ; do echo ; for mon in Oct Nov ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ../mkgem.fig.py sync wc ./???????.txt 1354 5982 50809 ./0source.txt 2313 6280 44617 cat ../top.html | sed "s/jan 2015/nov 2015/" | sed "s/???.py/$each/" > top.html ; cat top.html $each b.html > $each.html echo $(ls -l .. | grep Nov | cut -b 45-) echo $( for each in 0source.txt 5fig arrstr.fig cat.fig crtolf.fig dec.fig defdef.fig dt.fig fig.fig.py fig.py fig25 figp3 figpp figs.py figsub.fig figt_.htm.html figtr findfig.fig forloop.fig found int.fig kite2.fig lft.fig p01 p4.fig p4.fig.py rfig.txt si.fig tre.fig tru.fig ; do cat ../top.html | sed "s/jan 2015/nov 2015/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done echo for each in fig28.py mint.fig fig27.py ; do cat ../top.html | sed "s/jan 2015/nov 2015/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done she apr2015.txt & => ./cat.fig.html __427 Nov 25 ./cat.fig => ./tru.fig.html __235 Nov 24 ./tru.fig => ./tre.fig.html __680 Nov 24 ./tre.fig for each in 14 15 ; do echo ; for mon in Nov Dec ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ../mkgem.fig.py for each in arrlen.fig arrname.fig dircmp.fig dircmpsrc.fig fig fig1 fig273 fig30 figp.fig fl.fig fp.fig func.fig name.fig name.fig.save z2.fig ; do cat ../top.html | sed "s/jan 2015/dec 2015/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done sha256 fig SHA256 (fig) = 69563138634e2b4d7b10a1212402ffe7d49f02b9693f9660702f0c2e92fb3bec find ../.. | grep fig29 diff fig ../../neoc/fig/fig29.py | she & she fig1.html find . -type f | xargs grep "triangular game" | cut -b -40 => 2015/fl.fig ___86 Dec 22 ./fl.fig => 2015/fig30 51777 Dec 22 ./fig30 => 2015/fig273 46403 Dec 22 ./fig273 => 2015/arrname.fig _1205 Dec 22 ./arrname.fig => 2015/dircmpsrc.fig __714 Dec 16 ./dircmpsrc.fig => 2015/dircmp.fig __661 Dec 16 ./dircmp.fig => 2015/name.fig.save __195 Dec 10 ./name.fig.save => 2015/fig1 _6551 Dec 10 ./fig1 => 2015/name.fig __299 Dec 7 ./name.fig => 2015/fig29.html 88896 Dec 7 ./fig29.html => 2015/fp.fig _1558 Dec 5 ./fp.fig => 2015/arrlen.fig __181 Dec 5 ./arrlen.fig => 2015/z2.fig __208 Dec 2 ./z2.fig => 2015/func.fig ___78 Dec 2 ./func.fig => 2015/figp.fig __283 Dec 2 ./figp.fig => 2015/fig 50907 Dec 2 ./fig ``` apart from the fact that i didnt include all the text from that page, text works differently from the editor than it does from the shell- instead of running history, you can run "seek" (like egrep "text|more text" without regexes, case insensitive) on the buffer itself, instead of moving up to see previous commands, you can just go back to the line with the keyboard or mouse and run it again. instead of command substitution or line editing, you can edit the output of a command and then make the next shell command from that. im not saying a more traditional shell isnt more powerful in some ways, only that this is powerful and flexible in its own way. instead of editing history, you can just select and delete lines that you dont want to run again so they dont get distracting. or you can move to another section of the page (up or down) and work there instead of just using the next line. you may see output that started at january and dropped down to december, or you may see work that processes january then moves up to do february and moves up again to do march. but 2015 laid the foundation for work done on other years: ``` echo for each in fig28.py mint.fig fig27.py ; do cat ../top.html | sed "s/jan 2015/nov 2015/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done ``` this would typically process the files for a month, which sometimes had a few files and sometimes had one or two dozen- it would add a top file template, edit the line to change the date, append a bottom template, then output the name of the resulting file prepended with "she ". this saved having to type "she " before each name, you could just go to the line of output and hit ctrl-t to open/examine/edit/save the file in another editor window. if the file was useless or unwanted, this was a last chance to delete or skip it before uploading. for some files, notes about the purpose or caveats (including known bugs) were added. i did a lot more notes for 2015, part of the streamlining of other years was to drop that as a priority- but there were still some files i wanted to add notes about while i was checking them. while ive generally tried to avoid exact duplicates, some files are code with subtle differences including the filename. ive made extensive efforts to reduce arbitrary variations and confusion, usually the most recent version of code is the best but old versions are included for various reasons. further notation would be useful for this and other purposes. october of 2024 began with processing january 2016. when i wanted a way to strip paths from filenames, i just wrote it: => 2024/getname.fig.html ill save you the click: cat 2024/getname.fig.html ``` p arrstdin forin each p try now each reverse eachlen instr now "/" minus 1 ifmore eachlen 0 trimmed now left eachlen reverse print next except now "" next next ``` find . | grep arrname ./2015/arrname.fig.html ive got a program from 2015 that gives you either the path, the filename minus the extension or the extension, but to make it a simpler code example and also out of laziness, i made it so the command line parameter was either 1, 2 or 3 but i often wish id added the ability to say 2 3 or 1 2. one of the reasons to get this stuff more organised is so that when i want a solution to something i implemented 10 years ago i dont have to spend 5 to 15 minutes doing it again, but the code for getname.fig is extremely trivial to write and test. the files were sorted by date, specifically by month- but they were across various folders in the tree. after consolidating them to a folder for that month, it was trivial to get the filenames stripped of paths by simply running ls, but not before they were moved. the advantage of being able to do that before moving them of course, is to check duplicate filenames with sort and uniq -c. all getname.fig does is accept lines piped to it, flip the string and cut it off at the first "/", flip it back and print it out. if it has trouble doing this, it prints a blank line so that input without a path is preserved. ``` find . | xargs grep getname seek uniq ``` i just used that to check for examples of this. seek isnt necessary, i couldve said xargs grep getname | grep uniq, but this lets me check the output of the first grep if the second grep would turn up nothing. i ran this while processing 2016: ``` find . -type f | ./getname.fig.py | rev | sort | rev | uniq -c | sort -n | tail -20 ``` this let me find all duplicate filenames across the whole tree, but i also used it for more specific checks: ``` for each in may jun jul aug sep oct nov ; do echo ; echo $each ; cat $each.txt | ./getname.fig.py | sort | uniq -c | sort -n | tail ; done ``` for each year i uploaded, i would make a new file for the work done- the previous lines are from 2016.txt which is the only reason i know which year they were used to process. 2017 would get its own file (and i didnt hesitate to make an auxilliary file or two for each year if it helped) but it would start with the code from 2016. the concept is simpler, but similar to python notebooks and one of the really great things about working with an editor shell. 2017.txt was based on 2016.txt and 2018.txt was based on 2017.txt, but this still helped a lot because i would only keep the code from the previous year. i couldve used one file for everything, the advantage of making one for each year is that paging around is a lot easier for smaller files. for 2016 i created files for each month- these were not for manual editing though, the files were used as additional buffers. throughout the project these tasks never became streamlined enough to be completely predictable or identical, they were only developed enough to become faster and easier, and slightly more automated. this includes how duplicates and near duplicates were chosen- if two files were nearly identical and years apart, i would try my utmost to ensure the earliest version was available (so i could say how old the project is) and also so that i wasnt tossing out improvements made years later. and also to not upload more than i needed to. most of these things are one-offs, but there are also gems im quite proud of and quite a few of the one-offs are still useful. the goal has been to reduce noise, increase organisation and eliminate as much duplication as possible. i started using python in 2009 and got rid of my last windows installation two years before that. i wrote the first version of fig in early 2015- before that, practically everything i did was using basic, or the shell. 2015 was also the year i migrated from debian, which was a big deal because everything id been working on up to late 2014 was about promoting free software with debian. in 2020 i migrated to bsd, far more quickly than i thought possible. as an aside, i have no tolerance for the rampant instability that has been foisted on other platforms over the past 10 years, nor the pathological, almost colonising attitude shown by corporate shills who literally mock the users suffering under their regime. the fsf is spineless and literally does not care about users at all. it has stopped solving problems and focused on bolstering only solutions that dismiss practically every problem that has cropped up over the past decade. they chase funding more than ever, and like a for-profit company that stops caring about anything but money, they have lost so much in this obsession with membership that they essentially lost the ability to pay for their offices. but i spent 10 years listening to pathetic excuses why they arent fighting for anything, while using a tagline like "join us so we can fight for your freedom!" three years after i wrote fig, i created a project with it to automate the creation of a fully-free version of trisquel that gave users more control of their computing, but trisquel doesnt care about that either. i used to carry that distro on a card i bought from the fsf, but not today. i spent 2016 through 2018 automating distro remasters- to add features, to add fig and utils written with fig, and even to remove non-free components and replace bloat- turning live cd images that had become live dvd images back into cd images. of course we mostly use usb drives now, but i still prefer cd-sized isos and usb images. lets show this with ` changed to ' and angle brackets squared: ``` cat ./2016/top.html | tr "\`" "'" | tr \\074 "[" | tr \\076 "]" [!DOCTYPE html] [html] [head] [meta charset="UTF-8"] [title]free software resistance[/title] [link href="../style.css" rel="stylesheet" type="text/css" media="all"] [/head] [body style="margin: 5%;"] [h1]free software resistance[/h1] [p] [div style="font-family: sans;"] [h2] the cost of computing freedom is eternal vigilance[/h2] [span id="wiki"] ### ???.py *original date:* jan 2016 *originally posted:* oct 2024 ???.py: ''' ``` thats the top of the template, heres the other bit: ``` cat ./2016/b.html | tr "\`" "'" | tr \\074 "[" | tr \\076 "]" ''' license: 0-clause bsd ''' # 2016 mn # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ''' =] https://freesoftwareresistance.neocities.org [/span] [script src="../gemwiki.js"][/script] [/p] [/div] [/p] [/body] [/html] ``` on october 2, i wrote a program called chtm to help locate files that were not processed. this generally wasnt from overlooking them, it was from decisions made about each individual file. a number of these files are literally just a second copy- sometimes with the wrong date because of how it was copied. now that the html versions are created, i could probably get rid of many of them. chtm works by grouping files with the same name, and its thorough to the point of showing matching files across various years. if it was ideal to use a more general purpose tool that groups by name, i have things like that- chtm is specifically tailored for the purpose of auditing the tasks ive completed in the past two months. i used it to check 2015 and started using it to check 2016, but its tedious and much farther from ideal than what i intended- ive skipped using it on other years. nearly a month later i wrote cklinks.fig and findgemorph.fig, these are much nicer to use and are based on checking actual links: => cklinks.fig.html cklinks.fig => findgemorph.fig.html findgemorph.fig cklinks tries to open files that are linked to and reports broken links, but i only made a modest effort to allow for relative paths. it is possible to make good use of cklinks, but my advice is that if you want to do that you should create your links to cater to it. this is easier than it sounds. you could also tweak the code to handle a broader variety of relative paths. findgemorph does the opposite of cklinks, and searches links based on files that actually exist. it will tell you if it finds a "real" link or if it finds a link to the html version, failing that it will tell you if it finds a link to the same filename but with a different path, or if no link exists at all it will report "NO LINK" next to the filename. when i wrote findgemorph i was more confident with its results than i was with cklinks, but both have proven quite useful. when i create a new file, running findgemorph tells me that i dont yet have a link to it from any file. any links to files that arent already on this website are kept in a local file. if i delete a file, cklinks should be able to report the presence of a link to it in that and other relevant files. working on 2016 was more consistent: ``` p "echo ; for each in 02 10 11 12 14 15 16 17 18 19 20 21 22 23 24 ; do for mo in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ; do find . -type f -exec stat -FL {} + | tr -d '*' | awk '{print $9 " plus qu plus " " plus qu plus " $6 " plus qu plus " " plus qu plus " $7 " plus qu plus " " plus qu plus " $5 " plus qu plus " " plus qu plus " $10}' | grep " plus qu plus "^20$each $mo" plus qu plus " ; echo ; done | uniq ; echo ; echo ; done" arrshell for each in 99 16 ; do echo ; for mon in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ./mkgem.fig.py | ./2016/getname.fig.py | she & find . -type f | ./getname.fig.py | rev | sort | rev | uniq -c | sort -n | tail -20 => 2016/fig31.html 100827 Jan 22 fig31.html => 2016/fix.fig __115 Jan 11 fix.fig => 2016/findpdf.fig __129 Jan 11 findpdf.fig => 2016/fig.fig __526 Jan 8 fig.fig echo for each in fig.fig findpdf.fig fix.fig ; do cat ../top.html | sed "s/jan 2016/jan 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done => ./2016/1/echo.fig ____136 Feb 28 echo.fig => ./2016/1/int.fig _____38 Feb 17 int.fig => ./2016/1/s.fig ____681 Feb 13 s.fig => ./2016/1/trgrc.fig ____184 Feb 05 trgrc.fig => ./2016/1/trgr.fig ____126 Feb 05 trgr.fig for each in echo.fig int.fig s.fig trgr.fig trgrc.fig ; do cat ../top.html | sed "s/jan 2016/feb 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done for each in 1616.fig arrasc.fig arrlen.fig ffd.fig fig310 figan.fig figan02.fig folders.fig functions.fig more.fig rec.fig rlen.fig un.fig wr.fig yn.fig ; do cat ../top.html | sed "s/jan 2016/mar 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done for each in may jun jul aug sep oct nov ; do echo ; echo $each ; cat $each.txt | ./getname.fig.py | sort | uniq -c | sort -n | tail ; done for each in may jun jul aug sep oct nov ; do echo ; echo $each ; cat $each.txt | grep "\/" | ./getname.fig.py | wc ; done for each in may jun jul aug sep oct nov ; do echo ; echo $each ; echo mv $(cat $each.txt | awk '{print $12}' ) $each " ; sync ; ls $each | wc " ; done may mv ./1/circ.fig ./1/circle.fig ./1/fig31.txt ./1/figguide01.fig ./1/area.fig ./1/arrf.fig ./1/cb.fig ./1/circ2.fig ./1/cmd.fig ./1/figd.fig ./1/figguide.fig ./1/figguide02.fig ./1/pip.pip ./1/u.fig ./1/valid.fig ./circ1.fig ./txts/2.9.txt ./pdfs/figk.pdf may ; sync ; ls may | wc 16 16 159 jun mv ./circles.fig ./figch0and1.gif ./examples/bestwithpygameinstalled.fig ./examples/fishsyntax.fig ./examples/ifless.fig ./examples/ucasestdin.fig ./ghw.fig ./1/ar.fig ./1/arrfile.fig ./1/python.fig ./1/437.fig ./1/asciimint.fig ./1/cd.fig ./1/fig29.py ./1/fig31.py ./1/now.fig ./1/vars.fig ./nestloops.fig 2016 ./txts/fighelp.txt ./imgs/fig31.png jun ; sync ; ls jun | wc 18 18 212 jul mv ./puppalyzer01.fig ./mn.fig ./1/puppalyzer02.fig ./1/beep.fig ./1/find.fig ./1/fxfigos08.fig ./1/mkar.fig ./1/mkfigos07.fig ./1/mkfigos08.fig ./1/mkfigos09.fig ./1/mkfigos10.fig ./1/puppalyzer03.fig ./1/rpup03.fig ./1/rpup04.fig ./1/rpup05.fig ./1/rpup06.fig ./1/showtwo.fig ./2/puppalyzer04.fig ./2/rpup07.fig jul ; sync ; ls jul | wc 19 19 239 aug mv ./mkrefpup/nop.fig ./mkfigos11.fig.py ./1/mkfigos13.fig ./1/mkfigos14.fig ./1/smath.fig ./1/35.fig ./1/dist.fig ./1/main.fig ./1/mkfigos11.fig ./1/mkfigos12.fig ./1/mkfigos140.fig ./1/mkfigos140.fig.py ./1/p.fig ./1/stringd.fig ./2/circ3.fig aug ; sync ; ls aug | wc 15 15 177 sep mv ./mkrefpup/mkfigos16.fig.1 ./1/mkfigos15.fig ./1/cir.fig ./1/distdiff.fig ./1/mkfigos141.fig ./1/mkfigos16.fig ./1/mkfigos18.fig ./1/mkfigos20.fig ./1/tokens.fig ./1/varna.fig ./2/mkfigos19.fig ./txts/mkfigos15.fig.txt sep ; sync ; ls sep | wc 11 11 143 oct mv ./neocities-codeinfig/How-fig-is-made.html ./neocities-codeinfig/Using-fig.html ./neocities-codeinfig/Why-fig.html ./etc/anon/as/u/fig ./mkrefpup/mkfigos21.fig ./1/demo.fig ./1/circl02.fig ./1/asciim.figu ./1/figk.txt ./1/rcol.fig ./1/asciim.fig ./1/asciim.figu.py ./1/ck.fig ./1/figa ./1/figs.fig ./1/hello.fig ./1/how.fig ./1/let.fig ./1/mkfigos22.fig ./1/mkfigos23.fig ./1/slow.fig ./2/prs.fig ./circl.fig ./txts/figpic.txt ./pdfs/figmini.pdf oct ; sync ; ls oct | wc 23 23 246 nov mv ./1/dircmp.fig ./1/fig.figu ./1/fig40.py ./1/fighelps.fig ./1/figue.figu ./1/c.figu ./1/c.figu.py ./1/demo.figu.py ./1/dr.figu.py ./1/ff.fig ./1/fig.figu.py ./1/fighelps ./1/figu.py ./1/figu29.tx ./1/figu29py.py ./1/figue.figu.py ./1/mkfigos24.fig ./1/ok.fig ./1/sq.fig ./1/sq.figu ./txts/figupy.txt ./txts/figu29.txt nov ; sync ; ls nov | wc 20 20 202 ls may jun jul aug sep oct nov | sort | uniq -c | sort -n for each in area.fig arrf.fig cb.fig circ.fig circ1.fig circ2.fig circle.fig cmd.fig fig31.txt figd.fig figguide.fig figguide01.fig figguide02.fig pip.pip u.fig valid.fig ; do cat ../top.html | sed "s/jan 2016/may 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done find may -type f | xargs stat -FL | tr -d '*' | awk '{print $6 " " $7 " " $10}' | sort -n sort for each in 437.fig ar.fig arrfile.fig asciimint.fig bestwithpygameinstalled.fig cd.fig circles.fig fig29.py fig31.py figch0and1.gif fishsyntax.fig ghw.fig ifless.fig nestloops.fig now.fig python.fig ucasestdin.fig vars.fig ; do cat ../top.html | sed "s/jan 2016/jun 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done for each in beep.fig find.fig fxfigos08.fig mkar.fig mkfigos07.fig mkfigos08.fig mkfigos09.fig mkfigos10.fig mn.fig puppalyzer01.fig puppalyzer02.fig puppalyzer03.fig puppalyzer04.fig rpup03.fig rpup04.fig rpup05.fig rpup06.fig rpup07.fig showtwo.fig ; do cat ../top.html | sed "s/jan 2016/jul 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done find jul -type f | xargs stat -FL | tr -d '*' | awk '{print $6 " " $7 " " $10}' | sort -n for each in 35.fig circ3.fig dist.fig main.fig mkfigos11.fig mkfigos11.fig.py mkfigos12.fig mkfigos13.fig mkfigos14.fig mkfigos140.fig mkfigos140.fig.py nop.fig p.fig smath.fig stringd.fig ; do cat ../top.html | sed "s/jan 2016/aug 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done for each in cir.fig distdiff.fig mkfigos141.fig mkfigos15.fig mkfigos16.fig mkfigos16.fig.1 mkfigos18.fig mkfigos19.fig mkfigos20.fig tokens.fig varna.fig ; do cat ../top.html | sed "s/jan 2016/sep 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done find sep -type f | xargs stat -FL | tr -d '*' | awk '{print $6 " " $7 " " $10}' | sort -n for each in How-fig-is-made.html Using-fig.html Why-fig.html asciim.fig asciim.figu asciim.figu.py circl.fig circl02.fig ck.fig demo.fig fig figa figk.txt figs.fig hello.fig how.fig let.fig mkfigos21.fig mkfigos22.fig mkfigos23.fig prs.fig rcol.fig slow.fig ; do cat ../top.html | sed "s/jan 2016/oct 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done find oct -type f | xargs stat -FL | tr -d '*' | awk '{print $6 " " $7 " " $10}' | sort -n for each in c.figu c.figu.py demo.figu.py dircmp.fig dr.figu.py ff.fig fig.figu fig.figu.py fig40.py fighelps fighelps.fig figu.py figu29.tx figu29py.py figue.figu figue.figu.py mkfigos24.fig ok.fig sq.fig sq.figu ; do cat ../top.html | sed "s/jan 2016/nov 2016/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done find nov -type f | xargs stat -FL | tr -d '*' | awk '{print $6 " " $7 " " $10}' | sort -n ``` 2017 was similar: ``` for each in 99 17 ; do echo ; for mon in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ./mkgem.fig.py | sed "s/[1234567890][1234567890]:[1234567890][1234567890]:[1234567890][1234567890]\ //" | she for each in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ; do echo ; echo $each ; echo $(cat ../2017dub.txt | grep $each | awk '{print $7}') ; done for each in arr.fig arrlen.fig circ.fig distd.fig fig.fig fig4.txt fig41.py figbook figcolor.fig figdb.py figrps.fig fnd.fig forloop.fig func.fig par.fig sent.fig ; do cat ../top.html | sed "s/jan 2017/jan 2017/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done ; rm top.html find ../jan ../feb ../mar ../apr ../may ../jun ../jul ../aug ../sep ../oct ../nov ../dev -type f | ../../2016/getname.fig.py | sort | uniq -c | sort -n for each in codex.rose codex.rose.py copy.rose d.fig fig.rose fig.rose.py figdo44.py figsh.fig figsh02.fig figsh03.fig floral2.fig funny.fig gfx.fig intro.rose prose02.py rose.rose rose.rose.py rose01.py rose02.py; do cat ../top.html | sed "s/jan 2017/oct 2017/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done ; rm top.html ``` top and b templates really didnt change at all: ``` diff ./2017/top.html ./2024/top.html 22c22 < *original date:* jan 2017 --- > *original date:* jan 2024 ``` ``` diff ./2017/b.html ./2024/b.html 10c10 < # 2017 mn --- > # 2024 mn ``` 2018 had some extra stuff to streamline little details which before that were done more manually: ``` ls | xargs grep "freewiki-js.html" | tr ":" "\n" | grep html | sort | uniq | tr "\n" ' ' replace => |=> 2018/ for each in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ; do echo ; echo $each ; echo $(cat ./2018dub.txt | grep $each | awk '{print $12}') ; done | she & for each in fac.fig fig46.py ; do cat ../top.html | sed "s/jan 2018/may 2018/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done ; rm top.html ls -l 2018/jul | cut -b 35- | sort -r echo $(ls) help installother lines.fig pythoninstall welcome.fig for each in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ; do echo ; echo $each ; echo $(cat ../2017dub.txt | grep $each | awk '{print $7}') ; done ``` by 2019 i got around to streamlining month folders, which id been using to help manage duplicates and task volume- this was implemented locally and not on the actual website: ``` for each in jan feb mar apr may jun jul aug sep oct nov dec ; do mkdir 2019/$each ; done for each in jan feb mar apr may jun jul aug sep oct nov dec ; do ls -l 2019 | grep $each ; done replace 2019 .|\n2019 . ls -l showtwo.fig asc.fig demo.fgp dircmp.fig doublevid.fig figcmp findsim.fig nodup.fig prs2.fig tal.fig | cut -b 35- | sort -r ; do cat ../top.html | sed "s/jan 2019/jan 2019/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done ; rm top.html ``` by this point the process was pretty much sorted out as can be seen from the 2021 files: ``` mv ./txts/ckslc.txt ./txts/deps.txt ./txts/f02.txt ./txts/fa.txt ./txts/hof.txt ./2021/add.fig ./2021/dpkg-deb ./2021/dpkgr ./2021/fcirc.fig ./2021/findub.fig ./2021/gb.fig ./2021/odt.fig ./2021/pkgorph ./2021/smp.fig ./cksl.fig ./foldermap05.fig ./uniqsha.fig cd 2021/jul echo $(ls) for each in add.fig cksl.fig ckslc.txt deps.txt dpkg-deb dpkgr f02.txt fa.txt fcirc.fig findub.fig foldermap05.fig gb.fig hof.txt odt.fig pkgorph smp.fig uniqsha.fig ; do cat ../top.html | sed "s/jan 2021/jul 2021/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done ; rm top.html ``` a months worth of files are moved to a month folder, echo $(ls) is used to list them in a line, then the "for each in" and the rest of the loop are copied to either side to produce the list of new html files to be checked and edited using she. why not just put the echo $(ls) after the for each part? its good to be able to edit that line for any stray files that you dont want included. this included top.html and b.html at one point, but top.html became automatically generated based on a copy in the parent (year) folder, which is where b.html was kept as it didnt change from month to month. the generated top.html would be automatically deleted. from this point, the purpose of each "notebook" was mostly to locally cache links being added to the year pages on the website, though each of those is now downloaded and integrated with the rest of the local filesystem. ``` for each in 99 24 ; do echo ; for mon in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ; do echo ; echo ; find . -type f -exec stat -FL {} + | awk '{print $9 " " $0}' | grep "^20$each" | grep "\ $mon\ " ; done ; done | egrep -v "\.\/\." | tr -d '*' | ./mkgem.fig.py | sed "s/[1234567890][1234567890]:[1234567890][1234567890]:[1234567890][1234567890]\ //" mv ./filefig.fig ./shuftail.html ./cks8r.fig.py ./fmu ./cks8r.fig ./figgycount.fig ./upf.fig ./figgy.fig echo $(ls) for each in cks8r.fig cks8r.fig.py figgy.fig figgycount.fig filefig.fig fmu shuftail.html ; do cat ../top.html | sed "s/jan 2024/jan 2024/" | sed "s/???.py/$each/" > top.html ; cat top.html $each ../b.html > $each.html ; echo she $each.html ; done ; rm top.html ``` 2024 was caught up and from then it was mostly using tools like cklinks and findgemorph to check the work. to make that better, files in year folders that werent in month folders were moved to a folder for a fictional thirteenth month called "thi", then local month folders were consolidated to the year parent folder using mv -i, and everything was checked using findgemorph. quite a lot of the other files were used while creating this document, and they can now be deleted. license: 0-clause bsd ``` # 2018, 2019, 2020, 2021, 2022, 2023, 2024 # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` => https://freesoftwareresistance.neocities.org