Hits since 2022-04-03 11:16:28:
- I found this post on the Usenet's alt.os.linux.slackware
I have a system running 15.0 with Internet access.
Every so often this system must send terse email
notifications, as invoked from a cron job. It is not going
to receive any emails.
Any suggestions on how to do this without having to get
sendmail configured and running? This would amount to
using an email client that does not require a local
sendmail, like e.g. Thunderbird. This is of course
not a an option: I need something that is
command-line oriented and lightweight.
Well, you can use a Python script to send email using a
commercial email server. I had a need to do this, so I went
looking. This is what I found:
Note that the original had a bug. It had:
I fixed the bug and rearranged the code a little, adding to
its usefulness and suitability for my needs along the
way. You you can get my script from:
but it may be an older version. Let me know that you
want it and I'll provide the updated script.
Let me tell you the rest of the story: The result of the
above programming was a moderately short Python script (less than
60 lines of code) which I could run from the Bash command line
(or from a Bash script). It met my needs, and I used it to
send lots of emails (about 24 every month for about two
years). My need arose from my position as the person in
charge of staff credit card accounts. I sent emails each
month to each credit card holder. The script had the
ability to optionally include an email attachment. I used
this ability to send a form to each card holder requesting
information about the card holder's purchases.
Incidentally, this job, which
I held for three years, was the most remarkable job I've ever
had--remarkable, because I was allowed, in the second and final
years, to use Linux to automate my tasks. This was a
finance office where traditional methods (Excel and ACS General
Ledger) ruled supreme. My creativity was tolerated.
This was likely due to the resulting cost savings and decrease in
time to perform the task.
- Today was Black Friday, but I did not go shopping.
Perhaps "Black Friday" describes my mood or the darkness of the
- It took some effort, but I "finished" the recent set of
revisions to the ZombieSlack code.
- I was motivated by the desire to do a favor for my
brother. He has an HP All-in-One which is broken.
Somehow his MicroSoft Windows operating system stopped
working. He lives too far away for me to go there and fix
his computer, and I don't fancy myself a Windows expert anymore,
Instead I made a ZombieDrive and mailed it to him. Now
his computer works and runs Slackware Linux in the form of
Note that together--on the phone--we changed the BIOS settings
(disabled secure boot, enabled legacy boot), but nothing else.
Nothing was changed on the main drive, and the new Linux system
runs completely without use of it.
- Another motivator was the desire to make a new ZombieDrive
for my wife to use when she wants to do online shopping or
banking. She had one already, but it was sadly dated.
It is safer to use an up-to-date system. Now she has
The result was good. The ZombieSlack code is much
improved and now runs in SAM.
Let me clarify. The ZombieSlack code is the tool set by
which the user creates and manages ZombieDrives. It is this
tool set which runs in SAM. The ZombieDrives themselves do
not need SAM.
- After accomplishing the above, some needs became apparent,
so I made some changes (to be used in down-stream
- I added the use of xrandr to the .xinitrc file that
starts Fvwm2 when the ZombieDrive boots, and I added the use
of file "screen" which keeps system's current display
state. The user can change the display state, thus
choosing different x and y pixel combinations, by specifying
"screen=<screen>" at the boot line.
- I added a new tool to /usr/local/bin called
showvol. Whereas before I depended on
xfce4-volumed-pulse, now I use showvol, instead. This
is a simple xterm-based tool. It displays the current
volume as a number, and plays a sound using that volume, when
the volume is changed.
- I've been working on my ZombieSlack project. This
is the Fix Thin Clients project,
- I received some comments recently about this
website--thank you to those who commented. I will reply
here, and (bear with me) I'm going to teach.
In particular, I want to teach about three kinds of
code. There is code (executables) that can "run" and by
running does things, there is code (HTML) which when viewed by a
web browser appears as a website, and there is code (PHP) which
is changed into HTML dynamically by the remote computer, or
server, where the website lives. The word "code" has many
meanings. I am referring here to three of the many kinds of
computer code. (See definitions: code,
To make my website I made executables which, in turn, made PHP
when they ran. Because the PHP becomes HTML, I will say
that my executables made HTML, although this is not quite
true. Forgive me--I say this because it helps understanding.
HTML is special. If you have a website (a Blogspot blog,
for example), then you have HTML. To view the HTML for a
website, just right-click on the page and choose "View Page
Source". That's how you do it with the Firefox web browser
on a desktop computer, for example. I don't know how to do
it on a cell phone.
To make the executables I sat at my desktop computer and ran a
text editor program. A text editor is a sort of word
processor that works well for composing code, however you
can do it with Microsoft Word if pressed. It's like
composing a poem or a blog article, except that there are special
words that have special meanings and capabilities. When
used correctly these words allow the executable to run and do the
tasks it was designed to do. And a good executable
will be multipurpose--once written it can be reused for different
situations--in this case, for different web articles and
The HTML of a Blogspot blog is made for you when you
submit your article for publication. (Or something like
that--variations are possible and likely. See my above
discussion of PHP.) However, I don't use any programs to
make or publish HTML other than the web browser, the text editor
(to compose the text of the articles that will become HTML), my
home-made executables, and a large set of general-purpose
executables that are standard on my Linux computer.
Not to short sell my creations, much of the credit here goes
to the makers and supporters of the Linux operating system.
The Linux operating system and the Linux user community,
together, are an awesome and unimaginably rich resource.
(See Wikipedia article on Linux.)
- This web page suffered a counter failure. I think it
did, anyway. It's hard to say for sure. The counter
suddenly lost several hundred hits. I'm guessing that it
failed in this way due to a problem with my PHP code. I
knew that the code lacked file locking. I read online about
PHP and file locking, and learned how to do it, although it seems
there are at least two ways.
I did it using:
which I was inspired to do by a stackoverflow.com article.
This method insures that instances of "..." take turns in each
- Woohoo! I installed Slackware64 15.0, although I'm
not yet using it as my "daily" system. This was a
significant step for me as it is my first experience using
- One of my Fvwm window decorations, an X which closes the
window, didn't look the same in the new Slackware. I fixed
it by re-making the vector data. I'm guessing that this was
needed due to a change in Fvwm.
- I made a gnuplot graphing menu (called "plotting") for
SAM. Gnuplot is already easy to use, but this made it
easier. My plotting menu has a sample gnuplot instruction
file in /mnt/other/websites/data, and I plan to add more such files for handy
reference.  The tool I made is called gogeeqie
and it takes two arguments:
As you might guess from the name, gogeeqie
makes an image of the graph using gnuplot and the supplied data
and instructions, then displays the image using
geeqie (an image viewing tool that comes with
- I added to SAM some changes that allow it to run on a 64
bit machine. SAM needs Linux, and I have not tested it
significantly with anything other than Slackware. However,
it wouldn't run (as expected) using Slackware64 15.0 without some
SAM uses three small C executables. I compiled them
using my new Slackware64 15.0, and I put all (three 32 bit and
three 64 bit) executables in a new place. Where the
executables previously lived I made three scripts with the same
names that the 32 bit executables had (and still have). I
put in these scripts code which determines whether the machine is
running a 32 or 64 bit operating system (using "uname -m") and
then invokes the corresponding 32 or 64 bit executable.
These changes were a success!
- I modified two SAM functions in the rsthread menu.
Doing this gave rsthread the ability to write datalines to files
called data.txt in each local dir that has a counter in the
corresponding remote dir. The result is that I now have a
way to capture the state of the counters, writing the data to
files that can be plotted using my (see above) gogeeqie
- I worked on clarifying the text of Linux in the Finance Office.
- I put the Slackware 15.0 data point on the graph.
- I worked as a finance assistant from November 2018 thru
the end of December 2022. This job, being in the realm of
computers and numbers, was a good match for my abilities.
What I liked best about it, however, was that it gave me a rare
opportunity--a chance to apply my Linux skills and tools to a
business finance office.
I have decided to document this experience of applying Linux in the Finance Office as a
project, since that's what it was. If you click the link
and read about it, you will see that, for better or worse, I took
what would have been an ordinary job and made a project of
it. Hopefully, it was a worthy project.
- I added floating captions to the picture and movie
thumbnails of this website. To read a caption, hover over a
thumbnail. Then I remade all the thumbmails to use this
- I fixed a problem that was caused by my use of "block" and
"inline-block" in my html for this website. Instead I now
use an additional, nested table. The problem was that the
pages would print differently than they appeared on the
screen. The additional table was added around the headings
in my content. These are normally colored. When I
removed the "block" and "inline-block" the colored portion of the
heading assumed the full line length. I solved the problem
using the addtional table, as I described.
- I fixed a problem with floating captions (see
above). Since they are made from the same files that I use
for the regular captions, some have html tags in them. Well, it
so happens that the title attribute that I used to make them,
doesn't interpret html tags.
I fixed this problem by writing and implementing (in
coolage) a tool that I call
begone. This tool outputs the first
argument less occurrences of <...> that it contains, thus
removing the html tags. (Script coolage is
one of the tools in rsthread. It makes the html for the
collages of pictures and movies.)
- I want to mention these exciting software tasks I've been
- I'm currently working on adding PHP counters to
rsthread and my websites.
- I made a new SAM tool (in $sam_tool) called
wolf. It is a variation on another tool
in the same menu called dog. Like
dog, wolf is for displaying
"dog and pony shows" (a funny name for presentations).
Basically, it is a way of displaying html.
Now that I have a way to create html that can be browsed
without a webserver I was inspired to make
wolf for viewing this html. Since this
is similar to what dog does, I put it in the
same menu and gave it a related name. (Whereas
dog views text files with embedded html tags,
wolf is for complete websites installed
locally.) I also made a tool, noserver,
which helps me to use rsthread to make this
- I can't remember ever having blogged about my backup
tools--the primary tool I call dd_back.
Making backups has long been a difficult task.
dd_back has been changing that. It
works well, and making backups is not so difficult now.
In recent weeks, however, I have made some
improvements. dd_back works by using
two well known tools that are not mine--ddrescue and rsync--as
needed to either make a disk image (when the image doesn't
exist) or to update the disk image (when the image does
exist). So much use of devices and images has made me
aware of the need for running e2fsck and/or dosfsck first
before running dd_back on a device. By
my improvements I have automated this extra work and
integrated it into the normal use of
- About a month or two ago I wrote a short bit of code
called alarm that functions within an
existing SAM menu. (This menu I called "fmenu". I wrote
it to use at work, and it gave me convenient access to a
collection of tools that I used daily.) alarm
turned out to be surprisingly useful especially after I bought
Bluetooth Wireless Headset. So useful, in fact, that
I use it now around the house.
Let's say I'm baking bread, for example. I already
have my Linux box fired up and I'm enjoying a bit of Mark
Hurst's Techtonic radio
show (WFMU) on my new
headphones. I go to the kitchen and put my bread in the
oven, then return to my Linux box in my office and navigate to
fmenu. I enter, "alarm test" to verify
that the alarm is working. "alarm off"
silences the alarm. Then I enter "alarm
set 40". The alarm will beep in my headphones in 40
minutes. The available shell command "atq" lets me
review this scheduled alarm and any others. And all this
can be done without missing the radio show. Again,
- I've been working on two projects. The first one is
a pair of SAM menus I call t_card and t_period. Each is a
collection of executables that work together for two different,
but related, purposes. Both are for the purpose of
recording and reviewing my time worked on the job. t_card
is for my daily hours, and t_period uses the data from t_card to
provide a summary of my hours worked for the pay period.
Both allow logging and totaling of hours by task.
Both also allow for a comparison of hours actually worked to
hours reported for pay. This may seem like an odd thing to
do, but really it is not. It is not uncommon for an
employer to ask that the employee report hours rounded to the
nearest tenth of an hour or even the nearest quarter of an
hour. This will cause an accumulated error over time.
And there may be other reasons for an error of this kind.
With my tools I can keep a running total of the accumulated error
(or "delta"). Also, of course, having total hours worked by
task is also useful.
These tools are not new. I started using them in March
2020, so that is just three months short of two years ago.
What is new that I am working on now is a revision to both t_card
and t_period that changes the internal method of recording and
summing the hours. Whereas currently the tasks for which I
could record hours were hard coded, I will soon be able to add
and remove tasks to and from the set that the code processes
without changing the code. This will be a welcome
relief. I will be able to add and remove tasks easily,
instead of the nightmare-ish code changes that were needed.
I say "nightmare-ish", because it is true. I had worked
on an intial set of changes which allowed a sort of straddling
the fence. I used indirection to refer to variables (for
the tasks) on the fly, and I kept a table of the currently used
tasks to which the method referred. This was enormously
clever, but not an improvment. I abandoned that effort,
and I now am using a method by which each task is represented by
a file which stores the sum of the hours for that task. Yes
this is encumbered by using a file paradigm, but it works well
enough it seems, and simplified the code.
This change has been coded for t_card, but not yet for
- The other project is more work on rsthread. I made
some modifications to two of the executables (a function called
mk_web and a script called harvest) and also a change to a
required file, _link, in the set of files from which the webpages
are built. Additionally file _target is no longer
The result is the optional ability to create a set of .html
files for the website which can be viewed without the use of a
web browser. I had a need to present information in
website form for my employer, but as the information was not
suitable for publishing on the Internet, I searched for another
The changes I made were simple and don't interfere with the
original functioning of harvest. Best of all, the changes
seem to work!
I'm learning, in the process of this work, about the syntax
used by web browsers to interpret what you enter in the URL field
or type into the href string. It seems to be different for
Firefox and Chrome. I was able to coax Chrome into
correctly displaying the same website that I normally upload to a
webserver. This surprised me, and I wonder if this is a
reliable approach. Certainly it is a handicap to require
the user to use Chrome only.
With my new rsthread I can build an alternate set of .html
files that have all href strings like this: "file:///<drive
approach seems to be reliable, but it requires that the hard
coded drive letter used in the website be mapped before the
website (perhaps on a flashdrive) is viewed by a browser.
- I augmented crawl. It can now skip dirs "junk" which
I use to store previous versions of things--mostly
executables. And it can use files _dirlist instead of "ls
-l" to find the dirs. This allows me to put the menus in
arbitrary order instead of the order given by "ls -l".
- I updated three movies (two in my Adventures of Bendyman set and a
demo of a Fixed Thin
Client). I made the movies using my Canon camera, but
discovered that although the mp4 files that I made from them work
in Firefox (and other browsers?), they did not work on some (or
all?) cell phones. I have a tool which fixes them, as I've
been aware of this problem. What's new is that I used the
tool to fix the movies.
- I did some work on rsthread. I gave it (my tool
called sink) a limited use of recursive file
transfers. In particular it uses recursion for three dirs
(called "ready", "thumb", and "flash"). They are well
behaved dirs that I trust will not give rsync any trouble.
And the first two contain pictures and movies and so using
recursion for them will save time. The third one contains
the html which is used to display the pictures and movies and the
- I used what I described above (the fixed movies and
sink) to make updates to this website.
- I made and posted a new Adventures of
- I've been trying to decide where to go from here with the
development and use of rsthread. I toyed with some ideas
for additional features which would be generalizations of the
current capabilities. For example, I considered modifying
the method to save intermediate results when building the pages,
so that these intermediate results could be reused. This
seems do-able, but it makes the code complex.
I also considered adding the ability to have more than one
collage on the same page. I began to see perhaps how to do
this. I'm afraid it would add considerable complexity.
I decided that I don't need either of these right now.
It is odd how the pull toward complexity is strong. It had
a hold on me. I shook it off. I will keep the code
simple for now--it is elegant and usable.
I do need the ablity to add content that has full-size
pictures and movies--not in a collage--mixed with text.
That will be fun finding good solution to this problem. I
will report back.
I will also spend some time using rsthread to edit and augment
my websites (this site and Rosevear Software).
- I've been using rsthread in its current form. It
- Because of continued, sporadic trouble with rsync for
updating my websites, I embarked on a new project to make a website
I had already a tool I call "crawl". I wrote it for use
by rsthread. It changes from directory to directory,
recursively, performing a task in each. I combined this
with some rsync tricks and put the code together as Bash scripts
The result was a script called sink plus a
few other supporting tools, especially one called
trans which invokes sink via
crawl like this (below) to transfer a whole directory,
recursively, to the webhost:
Or it invokes sink directly to transfer just
the current directory:
Tools sink and trans are
brand, spanking new and have only been used a few times to update
a website. I have hopes that transferring files in this way
will prove to be reliable and useful.
Note that this method I have crafted uses rsync, as I did
before, but it uses it in a different way. Before I used
rsync in the classical way--I used it to mirror a directory from
my local staging directory to the corresponding directory on the
webhost, and I did this as a single, recursive, rsync
invocation. With my trans and
sink method I can still do a
recursive transfer of a whole directory, but multiple rsync
invocations are used, without recursion, to transfer the contents
of each directory one directory entry at a time. Then it
changes to the next directory and repeats.
- I added to sink the ability to remove
files and dirs on the host.
- I discovered how to use ssh to run a command on the remote
host from a local script. I used that in
sink to test whether the "to" dir for an rsync
invocation exists before attempting to run it.
- I reached out. I found a great group on Facebook (facebook.com/groups/unixshell).
It is great, because it is full of smart people who write shell
code. Not exclusively bash, but that's good--maybe I'll
After reviewing some of the posts in the group I was excited
to find that others also are dealing with the challenges of using
the shell to interface with spreadsheet data (see my January post
below about crimport). In fact, I soon had an opportunity
to tell the story of crimport and bob<n>.
The group is about the *nix shells. I learned that
posts about Python are not allowed. I will assume therefore
that posts about C code are likewise not allowed. I will,
however, share about it here.
Here is a link to the source for the current version, bob8.c. And here is a brief
It's a simple C program. It reads from standard
input and writes to standard output--one character at a
time. For each character it determines by some simple
rules whether it is part of a new field or not and also
whether or not the original field was quoted. In this
way it removes the commas that are not in quoted fields, but
leaves the commas that are in quoted fields. There is a
little more to it, so please read the comments in the source
code. Also you can view file trans8.txt to learn more.
- Hello, hello, hello. How is everyone out there? How
are you all?
I'm just carrying on as I usually do. Not much ukulele
playing though. Instead I have been immersed in Bash
programming. Bash-shell programming in Linux is really
amazing. How can I tell you? I am on a secret
journey, it seems. Sometimes I reach out for others who
might understand--I know you are out there--but rarely do I get a
I have been writing sets of tools which perform tasks for my
job--I work in a finance office. My latest tool-set I call
crimport. This name applies to a collection of bash scripts and
functions, plus one C executable. Here are the names and
types of the tools in the set:
byfunc, Bash script
bob6.exe, C executable
runchimp, Bash script
runcrimp, Bash script
crimport, Bash function
crfields, Bash function
The script runchimp is the main tool, as it runs the other
tools. Or you can use runcrimp, but the first one, which
came from the second, does a better job. These tools work
together to make a journal entry import file for our finance
software, called ACS OnDemand.
The import file is made from a csv file which comes from an
Excel (spreadsheet) file. The spreadsheet contains staff
credit card data. One of my work tasks is to collect data
(and receipts) from staff members regarding their credit card use
so that I may make the monthly journal entry which reflects the
expenses in our general ledger.
Collecting the data and transferring it to the spreadsheet is
no small part of the task. I have tool-sets for that also,
and I would like to share about them as well--later. This,
the current topic I'm sharing, is about translating the
spreadsheet data into a journal entry import file.
Script byfunc and C executable bob6.exe were breakthroughs in
making this happen. And I use a tool that is in my "handy"
tool collection called dribble--all within the framework of a
menuing system (of my own creation) called SAM.
Here is an excerpt from file crimport.sam which defines
bob6.exe and dribble (and byfunc) are made available for
execution by use of invocations of SAM tools within the scripts
The above code sends the spreadsheet csv data (in file
$longsprd) through three filters: skip
just skips the number of lines named to get past the title lines
and the headings. bob6.exe re-writes the
csv data in space separated values format with double-quotes
where needed to preserve the empty fields, which would be lost
otherwise. And dribble, together with a
built-in shell tool called eval, relocates the incoming fields of
the stream putting them after crfields where they function as
shell parameters (also called arguments). And that's where
the magic happens.
This, I'm proud to say "clever", bit of code allows me to
process the fields of the spreadsheet as bash arguments--the
rest, with the exception of byfunc, was easy
Script byfunc should have been easy to write. In the
end, it was simple. There's not much to it. It is a
single script that takes various arguments. For example:
sums $84.23 into a file called sum001 where the current sum
for ledger-function 001 is stored. File sum001 is made and
a value of 0 is put in it, if it doesn't already exist.
After the above command it will contain 84.23 more that it did
outputs the value which is in file sum001, and
lists all the ledger-functions represented by the sum
Add to this
which removes all the sum files, and you have a complete
tool.  With this I was able to solve the problem of
generating the balancing transactions. These are the
transactions against the asset accounts which balance (by
ledger-function) the sums of the transactions against the expense
Did I say that right? Anyway, whiz bang, it works, and
I'm giddy. I apologize for my self-congratulation, but as I
said, this is a secret journey!
- Yes, if you asked me, I would surely say that life during
the current COVID-19 pandemic is difficult. For me the
biggest hardship has been the disruption to my routine.
I'm naturally routine-challenged to begin with--meaning I'm prone
to keeping an erratic schedule, so I clearly do not need the
Perhaps some good has come of it, however. I've found
some time for things I wouldn't normally do. Good things
like building relationships (Facebook) and singing (accompanied
by myself on ukulele).
So it is my singing that I was working toward in this
post--could you tell I was edging in that direction? My
croaking voice. And my wavering ukulele playing Click
for a sample.
- We (my hard working wife and I) filed our taxes.
Whew. That's over, but I want to tell a story about the
California form 540-2ez, and forgive me if I rant a little.
I'm getting suspicious. The California form, for
several years, has been less than satisfactory. The federal
form 1040 is fill-able, and you can save it after filling it
out. Thank you. The California form on the other
hand, like previous years, is fill-able, but it claims that you
cannot save your entries. What good is that?
Actually it seems that you can save them (I was using Evince
pdf viewer), but there is another more serious problem--some of
the fields on the form would not let me make an entry. That
is not good. What is going on? Is it that hard that
the state of California cannot make a tax form that works, let
alone one that lets you save your entries? I wonder if
there was money involved. Was this done to boost sales of
So I found a way to do it using my existing Slackware Linux
installation. In short, I did it in these steps:
-I converted the form to a pdf form that doesn't have the
extra buttons on it. Again I am suspicious. The
buttons "Print", "Check for errors" and "Reset" might be
useful, but I wonder if they are there simply to deface the
form and spoil it for use by the method that I discovered.
Spoiled it was, but I found a work around which allowed me
to convert the pdf to one without the buttons. I used
the Print button to print the form, but I selected a special
printer that I installed a few years ago after reading a very
interesting Internet article. The printer is called
"/tmp/whatever". That is a story in itself, which I will not
tell now, but when you print to this printer it looks for file
/tmp/whatever--you need to make the file first. If it exists,
and is writable, then CUPS (the printer software) writes to
/tmp/whatever a pdf file which if printed would be exactly
what was requested to be printed--the blank tax form. So
after doing this I had a pdf of the form without the buttons!
-Next I imported this pdf file into Gimp (which comes with
Slackware). Gimp is like PhotoShop, only free. I
imported the pdf page by page each time exporting the page to
a different pnm file. This format, pnm, is like jpg,
except that is is not, I think, compressed. It is an
-Then, equipped with a pnm file for each of the pages of
the state form, I proceeded to fill the blanks by writing to
the image files, one at a time, using Kolourpaint. I
found that the Deja-Vu 12pt font worked great, except for the
SSN and maybe one other field which needed 10 pt. I
saved each filled-out page as a png file (not pnm), because it
was suitable, and it seemed that Kolourpaint did not offer
This wasn't particularly hard. OK, it was a little
hard, but it was such a relief and a pleasure to have a method
that worked and did what I needed. Thank you Linus
Torvalds, Patrick Volkerding, and thank you to the person who
wrote the article about printer /tmp/whatever. Thank you
Just to clarify: This method that I described does not
give you a fill-able form. Instead it gives you a way to
write on the form, which is almost as good. You need to use
care to align your text in the fields. This method gives
almost the same result as a fill-able form, and it has the
benefit of allowing you to save the filled-out form.
- Hello. This will be a blog-style post, as I'm
feeling a little blog-ish.
Hosting a website can be rewarding, but I've noticed two
trends that are, frankly, discouraging.
Firstly, this website doesn't get as many visits as it did
once. Surely, I'm partly to blame for this. I don't
post updates regularly, and I don't try very hard to make my
posts interesting and relevant. I admit it: This
website is primarily self-serving--I like to talk about
myself. Yet, in talking about myself, or by posting links
about things of interest to me, I have in the past I think
sparked a little interest. Sadly, that "little interest"
seems to be fading.
Secondly, I've been receiving an increasing number of requests
to post links on this website to dumb stuff. And I'm being
nice when I say that. At first, just to see what would
happen, I played along. I put the links in a separate
place, my Gratis Links, to let the reader
know that I had some reservations, and I posted links to mostly
whatever came my way. Well, I'm starting to get
annoyed. Apparently I'm not alone in this. Here is a
link to a sympathetic article:
New Mouth Inc. The most stupid series of emails J4MB has ever
OK, I do use some judgment when selecting the requests
to which I will respond. I will try a little harder,
though--maybe we can do this together. Your part is to send
requests to me to link to good stuff. Stuff that
matters. Stuff that is not so obviously an effort to fleece
the public and take advantage of the gullible. I will, in
turn, try to keep this site interesting, relevant and
- I made a Patreon project called Joe's Life. It is
about my projects, links, photos, and more, and it
references this website.
Will you be my patron?
- I wrote some software that I use at work. Every
month I send about eighteen emails each to a different address,
some with a Cc, and each with one or two unique attachments.
Previously, I did it the hard way--manually, one at a time
using Office365. That worked, but it wasn't long before I
was wishing for a better way. After some searching, I found
an example Python script which sent emails using Starttls
I understood Starttls to be the encryption method I needed to
use for Office365. You see, I needed more than just to send
emails. I needed to send them from the same server from
which I had previously sent them by hand. That way I could
put my work email address in the From header and the recipients
could reply in the usual way. The emails would appear to
have been sent normally.
The Python script I found was great. Its only lack was
not having a way to send attachments. I searched some more
and found lots of rather confusing scripts, then finally a simple
one that I could reproduce and harness for my needs.
But it didn't work.
Stymied, I remembered something I had read in a post
on StackOverflow.com. Someone had commented about a
typo seen on the Internet--"content-decomposition" instead of
"content-disposition". I checked my code and discovered
that was the problem. I felt a little foolish for not
having noticed. I fixed it, and bingo--I could send an
email with an attachment.
But I wasn't done. I added to the script some
modifications which enabled:
- Adding a Cc when needed.
- Adding one or two attachments when needed.
- Giving server name, port, password, user name, and from
address by running a user-provided function which assigns the
above information to environment variables referenced by my
- Invoking the script from the command line with six
arguments: <to address> <cc address or "-">
<file containing the subject> <file containing the
content> <optional first attachment or "-">
<optional second attachment or "-">
I also canonized it by adding it to my SAM
menu system. This made it easy to use and document and also
paved the way for adding some helper scripts.
I call the Python script dupe, and you can
get it here.
Alternately, when you get SAM at the above link,
it contains dupe in a menu called
handy which is part of the
example module. The helper scripts are
If you don't use SAM and the helper scripts,
then I recommend that you make a bash script to invoke
dupe as many times as needed with your choice of
arguments for each invocation. You'll also need to manually
check the existence of the referenced files and the syntax of the
- Although my Fix Thin Clients
project has wound down, I have continued development of the
method on which it was based. And I have renamed it.
Instead of SuperDrive I now call my method ZombieSlack.
Slack because it is an embodiment of Slackware. Zombie
because it is not a live system and it is also not a
traditional non-live system. Being neither live nor
dead there is only one word for it--zombie.
OK I'm playing word games I'll admit, but there is another
reason for the zombie moniker--it does what a zombie does--it
takes posession of the host and re-animates it. It does
this at different levels.
It runs in the same form whether installed to a flash drive,
hard drive, or solid state drive. Also it matters not whether
the drive is internal or external. Whatever the drive, when you
boot the machine from the drive ZombieSlack takes over the
machine--much like how a zombie takes over the host body.
This is zombie behavior level zero. Zero because the host
possesion is temporary. Whatever was installed to the host's
drives remains completely unchanged and usable as before.
When ZombieSlack is installed to a drive I call it a
ZombieDrive. A ZombieDrive is an interesting thing. As I
explained above, you can use it to boot a machine (it is
bootable). You can also use it to wipe and install
to a host drive. The wiping is done by invoking function
wipe which is in the SAM menu
at /RS/opt/h_tool, and the installing is done by
running script /boot/tool/uptask-stc. A
ZombieDrive thus has the ability to pass its zombie-ness to other
drives. Essentially, when it bites another drive the drive
becomes a ZombieDrive. Level one.
Level two answers an important question, "If zombies come from
zombies, then where did the first zombie come from?" My
ZombieSlack is an embodiment of Slackware. My first
ZombieSlack installation was on a hard drive in a computer. I
made it by tweaking a stock Slackware 14.1 installation.
The changes were made by hand by careful design. After I
got it working I then wrote the script which installs ZombieSlack
to another drive. Finally, as a last step, I
reverse-engineered a method by which I could apply the changes
(ZombieSeed) to a new Slackware installation, thus making it into
ZombieSlack, and I incorporated that method into the install
script. The install script could thus insert ZombieSeed
into a Slackware installation (making a ZombieDrive) or install
from one ZombieDrive to another drive (also making a
What I did was elementary--I added some scripts and dirs to
Slackware, and I modified some existing scripts and config
files. Elementary, yet radical. By making a few
changes I made the default user's home directory contents (I call
this file space) changeable, yet self-restoring. In
this way I was able to fit a full Slackware 14.1 installation on
a 16GB USB 3.0 flashdrive--without performance issues. And
I made a system that was immune to breakage by user error.
I tested the new script that I made by doing something that I
seriously needed. I made a Slackware 14.2 based ZombieDrive. I
called it ZombieSlack/Slackware-14.2. That was a
breakthrough. I might have been able to upgrade from Slackware
14.1 to 14.2 without this ability, but with it I upgraded in a
way that kept my modifications neatly separated, conceptually,
I am looking for new projects--new opportunities to apply this
- Here's a little story about my Latitude E5400 laptop and
Slackware Linux. (Windows users, I think this may interest you
Some time ago my laptop started giving me a message that went
something like "The AC power adapter wattage and type cannot be
determined..." Then it would refuse to charge the battery. At
first it was intermittent. I would disconnect and reconnect the
power, and it would be OK. But today not.
I was faced with the possiblity of being without my laptop
which I use for work. Alternate ways of getting at my data were
turning over in my mind. Hmmm.
A little Internet research and some twiddling with my laptop,
battery, and adapter led me to conclude that it was the fault of
my AC power adapter, so I started an Internet search for a
replacement. I found a Targus 90W Universal laptop charger at
Best Buy. I paid for it online and it was ready for pickup
within an hour.
When I picked it up at the store I was immediately comforted
by the nice box it came in. Stupid huh? Anwyay, when I got it
home and un-boxed it, it seemed to work fine. Whew. That was a
relief. Later I realized that I gained more than the continued
use of my laptop. I had learned a neat trick in the process.
Earlier, while investigating the problem, I had re-discovered
the built-in function which turns the battery charger on and off.
You operate it by holding the blue Fn key, followed by pressing
the F2 key. (I'll call this "Fn+F2".) I had used this before,
but today I found a neat trick I could do with it.
I had read that Lithium batteries, such as the one in my
laptop, would have a longer life if stored with a 40% charge.
That always left me wondering, though, how it could be done. The
normal function of the laptop charger brings the battery up to
100% charge before stopping. The unanswered question was how to
charge to 40%, then keep it there.
One way of course would be to charge to 100%, then, unplug the
charger and monitor the dis-charge with a tool like gkrellm
or upower (use "upower
-d"). When the battery reaches 40%, shutdown, remove the
battery, and store it. Sorry, but that is a really lame
Enter the neat trick. Do the above, but let the battery
discharge to about 30%. Then reconnect the power and watch the
charge. When it reaches 40% stop the charge by pressing Fn+F2.
I don't know exactly what this does, but it seems to allow the
adapter to power the computer without charging the battery. It
seems to effectivley halt the charge, thus keeping it, at least
for a while, at a constant level.
Actually when I did the above the charge crept up to 41%
somehow after I pressed Fn+F2. No problem. What I wonder is
will the charger maintain the charge level, or just leave the
charge level alone and thus allow for the natural self-discharge
to gradually bring the level down? Of course, there is also the
self-discharge that will happen while the laptop is off and not
Well, I still think it is a neat trick.
- I learned a little more about use of "Fn+F2". It doesn't
actually turn off the battery charger. Instead it toggles the
charge rate between the normal rate (which may be slow or fast
depending on the BIOS setting) and a very low rate. I'm guessing
that this very low rate is intended as a way to maintain the
charge at the current level. Just enough to balance the the
So maybe it isn't so lame to remove the battery. One might
wonder what harm is done to the battery by maintaining it for
long periods on a very low rate of charge? Perhaps do the steps
I described to adjust the charge to 40% and keep it there, then
remove the battery at the next regularly occuring shutdown.
Maybe store it in a resealable bag with a note stating the charge
level and the date.
- I found an interesting service called Peertopia. I might someday
want to sell Rosevear
Software products on this site. I started to read the
details and I came to a section called "Limitation of
Liability". I thought, "Great, not this again!" The
text was in all caps and nearly impossible to read. I
re-wrote it using
just as I did before (see September 2018). Here is the
You acknowledge and agree that you assume full responsibility for your
use of the site.
You acknowledge and agree that any information you send or receive
during your use of the site may not be secure and may be intercepted by
You acknowledge and agree that your use of the site is at your own
You acknowledge and agree that, to the fullest extent permitted by
applicable law, neither peertopia nor its affiliates, suppliers, or
third-party content providers will be liable for any direct, indirect,
punitive, exemplary, incidental, special, consequential, or other
damages arising out of or in any way related to the site, or any other
site you access through a link from this site or from any actions we
take or fail to take as a result of communications you send to us, or
the delay or inability to use the site, or for any information,
products, or services advertised in or obtained through the site,
peertopia's removal or deletion of any materials submitted or posted on
its site, or otherwise arising out of the use of the site, whether
based on contract, tort, strict liability, or otherwise, even if
peertopia, its affiliates, or any of its suppliers has been advised of
the possibility of damages.
This disclaimer applies, without limitation, to any damages or injury
arising from any failure of performance, error, omission, interruption,
deletion, defects, delay in operation or transmission, computer
viruses, file corruption, communication-line failure, network or system
outage, your loss of profits, or theft, destruction, unauthorized
access to, alteration of, loss or use of any record or data, and any
other tangible or intangible loss.
You specifically acknowledge and agree that peertopia shall not be
liable for any defamatory, offensive, or illegal conduct of any user of
Your sole and exclusive remedy for any of the above claims or any
dispute with peertopia is to discontinue your use of the site.
In no event shall either party be liable to the other for exemplary or
Content is also provided by sellers on the site.
Please note that sellers may post content that is inaccurate,
misleading, or deceptive.
We neither endorse nor are responsible for any opinion, advice,
information, or statements made by sellers.
We will not be liable for any loss or damage caused by your reliance on
such information or materials.
The opinions expressed by sellers and third parties reflect solely the
opinions of the individuals who submitted such opinions and may not
reflect our opinions.
I don't intend to discredit the site. I think it is a
great site offering a valuable service. I just wanted to
translate the text that was hard to read as a help to you.
Don't you agree it is better to use text that is
readable? Why hide your words by making them hard to
read? I think it is poor business to use such tactics.
- This Harry Nilsson song
popped into my head the other day. It was the phrase "Going
where the weather suits my clothes" that did it. Here are the
- The United States Postal Service (USPS) has enticed me to
try their new Informed
Delivery Service. As part of the signup process I am
asked to agree to their Terms and Conditions. These contain a
horribly hard to read paragraph in all caps.
Perhaps they didn't want me to actually read this
Rather than concede to their rude tactics I piped it though
Linux tr command
to help me re-write the paragraph. The re-write also
- Capitalizing the first letter of each
- Correcting two spelling errors.
- Correcting one grammar error.
- Adding one line of white space between each sentence to
Here is the result:
accepting and agreeing to this agreement, you consent to and accept the
risk in receiving information via email and/or text messaging through
Such electronic communications may provide the above mentioned
services, but may also contain marketing messages as well as requests
for feedback from you regarding the service.
You may withdraw such consent at any time, but if withdrawing such
consent, some functionality of the service may not be available to
You acknowledge and agree that your telecommunications carrier may
charge data usage fees (including additional charges when roaming as
well as fees for sms or text messaging that may be used to receive
updates related to the tracking of mailable items) to access the
service, and that the postal service shall not be liable for any such
fees as a result of your use of the application or the service.
Additional fees or costs may accompany your receipt of emails sent
through the service. You should contact your wireless or
telecommunications provider for complete pricing details.
Now that I can read it, I wonder why they tried to hide it.
Perhaps it was not intentional after all, just poor
- I have an HP Deskjet D1560 printer that I want to use in
Slackware 14.2 (Linux). It worked fine in Slackware
14.1. In 14.2 I get filter errors. I traced the
problem by looking in /var/log/cups/error_log. It said that
there was a problem with the perl script:
I Googled for help and I found a post in LinuxQuestions.org describing
a similar problem (different printer) also going from Slackware 14.1 to
I also learned that the syntax used in the perl script is deprecated
and destined to fail in future versions of perl:
Well, it's failing.
This is bound to affect more people than the two I've counted so
Are you listening, HP?
- Well, I fixed it. I'm not sure where the blame
lies. There is probably more to this than I
understand. Anyway, I fixed it by making some changes in
I should explain, however, that the bug report was not about my problem. It was about a very different
printing problem, but, lucky for me, it had a similar solution.
- Patrick Volkerding of Slackware.com needs
money. See this article.
See also my links at joeslife.org/links/computing/slackware
- This fascinating fractal-zoom of the Mandelbrot set may
cause eye strain or headaches. You have been warned:
- I encountered a new word, "performant".
Animadversor at english.stackexchange.com
had this to say about it:
There's not really anything inherently wrong with
performant; its formation is regular enough and it seems to
convey a meaning that no other single word conveys. If
that is enough for you, then go ahead. But you ought to
know that the word will be ill-regarded by many, who will
consider it a pseudo-learned, affected, vulgar and pointless
novelty. Of course, perhaps they are wrong about this,
but even if so, they may well be people whose good opinion of
your language is important to you.
answered Mar 31 '13 at 6:52
- I made a new project, Fix Thin Clients.
- I took my picture off of the pages and replaced the old
banner with a simple box. The reason was twofold: One, I'm
tired of having my picture on the pages, and, two, the new banner
is stretchable. This allows the text line length with to be
adjusted. Sorry it has taken me so long to make this
change. Before it may have been hard to read the long lines.
- This is the best news. I've been a radio controlled
model airplane builder and flyer for nearly forty years.  Now
I'm an aviator!
"Make no mistake: unmanned aircraft enthusiast are
aviators, and with that title comes a great deal of
responsibility," said U.S. Transportation Secretary Anthony
Foxx. "Registration gives us an opportunity to work with these
users to operate their unmanned aircraft safely. I'm excited
to welcome these new aviators into the culture of safety and
responsibility that defines American innovation."
What happens to a dream deferred?
Does it dry up
Like a raisin in the sun?
Or fester like a sore --
And then run?
Does it stink like rotten meat?
Or crust and sugar over --
Like a syrupy sweet?
Maybe it just sags
Like a heavy load.
Or does it explode?
Run Rudolph Run
Out of all the reindeer you know you're the mastermind
Run, run Rudolph, Randalph's not too far behind
Run, run Rudolph, Santa's got to make it to town
Randalph he can hurry, he can take the freeway down
And away went Rudolph a whizzing like a merry-go-round
Said Santa to a boy child "What have you been longing for?"
"All I want for Christmas is a Rock and Roll electric guitar"
And away went Rudolph a whizzing like a shooting star
Run, run Rudolph, Santa's got to make it to town
Can't you make him hurry, tell him he can take the freeway down
And away went Rudolph a whizzing like a merry-go-round
Said Santa to a girl child "What would you like most to get?"
"I want a little baby doll that can cry, scream and wet"
And away went Rudolph a whizzing like a Saber jet
JOHNNY MARKS, MARVIN BRODIE
Lyrics © ST. NICHOLAS MUSIC INC.
Christmassy, huh? Many artists recorded this song, but I like
Chuck Berry's the best. I found these lyrics at www.metrolyrics.com
- I wrote some tools to enable me to use rsync to maintain
this site. Formerly I used lftp which was tragically,
dramatically slow. I used the new tools to make a bunch of
revisions to this site.
There once was a barber named Ware
Who was sadly allergic to hair.
When customers called,
Unless they were bald,
He would sneeze them right out of the chair.
--- Ogden Nash
- I put a few new links in my computing
links page. If you want to see them, search on "sed", and
you will get the old and new links about "sed".
- I upgraded to Slackware 13.37. (Here's a link to the Slackware
- I've been building a little, on my Curtis Robin.
- I've even been flying my Wanderer occasionally.
- I've been staying busy, but not by working on this
website! I've posted a few new links and a few new
- Here's what I have been doing:
- I integrated a Linux box into our home entertainment
area. Now we can watch TV, internet movies, or
- I upgraded my rsync-based backup system with some software
improvements plus two new, one-terabyte hard drives in USB
- I migrated my daily computing to Slackware 13.1.
I've had it on my box for a long time, but had to work out
- Another detail was my e-mail software. I had been
using kmail, but it doesn't work well in Slackware 13.1.
So I migrated to Thunderbird (which works great!).
- I bought an MP3 player and learned how to use it. I
wrote some tools to manage putting songs on it.
- I downloaded and installed the new Adobe Reader 9. Ah,
progress.  New data formats require new software.
The good news is that it was free!
- I made some improvements to my Fvwm2 desktop.
Mainly, I made a bunch of new MiniButtons to make it easier to
invoke my commonly used apps.
- I discovered that "links -g" works great in my new
Slackware 13.1. Is this because I'm using a different
- I learned how to better use USB sound devices, and I
managed to get my old PPA 6channel USB sound adapter to work
(after about three years of trying).
- It has been a full year since my
last entry. I made a few revisions to this site in the
links area. Looks like I've also made some revisions to my
- I've made a little progress on this website.
- I've been working on a website that lives on my camera's
flash memory stick. That may sound a bit odd. It is
another of my humble inventions. It helps me to organize,
view and share the pictures that I take..
- OK, the website is shaping up a little. I've been
adding pictures, and there is a page of links. You may have
noticed that this site replaces my previous website.
- Ya, hi. Joe here. Hope you like the website.