Initial commit

master
Jason T. Lenz 3 years ago
commit 24f730fb87
  1. 3
      .gitignore
  2. 24
      LICENSE
  3. 77
      Makefile
  4. 89
      Makefile.bsd
  5. 77
      Makefile.gnu
  6. 52
      README.md
  7. 19
      cogit-files.txt
  8. 16
      configure
  9. 28
      src/about/index.got
  10. 41
      src/about/logo/index.got
  11. 46
      src/contact/index.got
  12. 109
      src/contact/pgp.asc.cpy
  13. 374
      src/copyright/index.got
  14. 79
      src/css/style.css.cpy
  15. 8
      src/inc/global.igot
  16. 9
      src/inc/globalPage.igot
  17. 34
      src/inc/pageBegin.igot
  18. 12
      src/inc/pageEnd.igot
  19. 63
      src/index.got
  20. 63
      src/post/blog-tools-launch/index.got
  21. 91
      src/post/rotozip-repair/index.got
  22. 85
      src/post/setup-wireless-printer/index.got
  23. 84
      src/post/sudo-within-docker/index.got
  24. 37
      src/source/index.got
  25. 69
      src/topic/index.got
  26. 18
      template/README.md
  27. 47
      template/README.md.got
  28. 14
      template/regen-files.sh
  29. 11
      util/fsnap
  30. 13
      util/rmmeta

3
.gitignore vendored

@ -0,0 +1,3 @@
bld
*.tmp
*.raw

@ -0,0 +1,24 @@
Copyright (c) 2020 Jason T. Lenz. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

@ -0,0 +1,77 @@
.SUFFIXES:
PGOT-LOC=pgot -i ":src/inc" -d '{"siteurl":"$(shell pwd)/bld/loc","dfile":"index.html"}'
PGOT-PUB=pgot -i ":src/inc" -d '{"siteurl":"https://blog.lenzplace.org","dfile":""}'
CHUF=chuf '|||md+' '|||md-' markdown
INC=$(shell find src -type f -name '*.igot')
GOT=$(shell find src -type f -name '*.got')
RAW=$(shell find src -type f -name '*.raw')
RAWD=$(shell find src.raw -type f)
CPY=$(shell find src -type f -name '*.cpy')
all loc: $(RAW:src/%.raw=bld/loc/%) \
$(CPY:src/%.cpy=bld/loc/%) \
$(GOT:src/%.got=bld/loc/%.html)
publish: pub
rsync -avz --delete bld/pub/* pub_www:/var/www/htdocs/blog.lenzplace.org/
pub: $(RAW:src/%.raw=bld/pub/%) \
$(CPY:src/%.cpy=bld/pub/%) \
$(GOT:src/%.got=bld/pub/%.html)
bld/loc/% bld/pub/%: src/%.raw
@mkdir -p $(@D)
@echo "raw -> $@"
@cp $< $@
bld/loc/% bld/pub/%: src/%.cpy
@mkdir -p $(@D)
@echo "cpy -> $@"
@cp $< $@
bld/loc/%.html: src/%.got $(INC)
@mkdir -p $(@D)
@echo "pgot -> $@"
@$(PGOT-LOC) $< | $(CHUF) > $@
bld/pub/%.html: src/%.got $(INC)
@mkdir -p $(@D)
@echo "pgot -> $@"
@$(PGOT-PUB) $< | $(CHUF) > $@
cogit: bld/cogit.tar cogit-files.txt
@ echo "Moving cogit tarball to release folder"
mkdir -p ../blog-lenzplace-release
mv bld/cogit.tar ../blog-lenzplace-release/blog-lenzplace-cogit-$(shell date +"%Y-%m-%d").tar
CGTMP=cg.tmp
CGSRT=cgsrt.tmp
bld/cogit.tar: $(CGSRT)
@mkdir -p $(@D)
@echo "generating $@"
@tar -T $< -cf $@
cogit-files.txt: $(CGSRT)
@echo "generating $@"
@while read CGFILE; do util/fsnap $$CGFILE; done < $< > $@
$(CGSRT): $(RAW) $(RAWD)
@find src -type f -name '*.raw' > $(CGTMP)
@find src.raw -type f >> $(CGTMP)
@sort < $(CGTMP) > $@
@rm -f $(CGTMP)
clean:
rm -Rf bld *.tmp
lint: loc
@grep -n -r '<no value>' bld/loc/ || true
scrub:
# Remove metadata from all raw files (pictures and video)
find src -type f -name '*.raw' -exec util/rmmeta '{}' ';'
.PHONY: all loc pub clean lint scrub

@ -0,0 +1,89 @@
.SUFFIXES:
PGOT-LOC=pgot -i ":src/inc" -d '{"siteurl":"$(.CURDIR)/bld/loc","dfile":"index.html"}'
PGOT-PUB=pgot -i ":src/inc" -d '{"siteurl":"https://blog.lenzplace.org","dfile":""}'
CHUF=chuf '|||md+' '|||md-' markdown
INC!=find src -type f -name '*.igot'
GOTS!=find src -type f -name '*.got'
GOTL:=$(GOTS:src/%.got=bld/loc/%.html)
GOTP:=$(GOTS:src/%.got=bld/pub/%.html)
RAWS!=find src -type f -name '*.raw'
RAWSD!=find src.raw -type f
RAWL:=$(RAWS:src/%.raw=bld/loc/%)
RAWP:=$(RAWS:src/%.raw=bld/pub/%)
CPYS!=find src -type f -name '*.cpy'
CPYL:=$(CPYS:src/%.cpy=bld/loc/%)
CPYP:=$(CPYS:src/%.cpy=bld/pub/%)
all loc: $(RAWL) $(CPYL) $(GOTL)
publish: pub
rsync -avz --delete bld/pub/* pub_www:/var/www/htdocs/blog.lenzplace.org/
pub: $(RAWP) $(CPYP) $(GOTP)
$(RAWL): $(@:bld/loc/%=src/%.raw)
@mkdir -p $(@D)
@echo "raw -> $@"
@cp $? $@
$(RAWP): $(@:bld/pub/%=src/%.raw)
@mkdir -p $(@D)
@echo "raw -> $@"
@cp $? $@
$(CPYL): $(@:bld/loc/%=src/%.cpy)
@mkdir -p $(@D)
@echo "cpy -> $@"
@cp $? $@
$(CPYP): $(@:bld/pub/%=src/%.cpy)
@mkdir -p $(@D)
@echo "cpy -> $@"
@cp $? $@
$(GOTL): $(@:bld/loc/%.html=src/%.got) $(INC)
@mkdir -p $(@D)
@echo "pgot -> $@"
@$(PGOT-LOC) $? | $(CHUF) > $@
$(GOTP): $(@:bld/pub/%.html=src/%.got) $(INC)
@mkdir -p $(@D)
@echo "pgot -> $@"
@$(PGOT-PUB) $? | $(CHUF) > $@
cogit: bld/cogit.tar cogit-files.txt
@ echo "Moving cogit tarball to release folder"
mkdir -p ../blog-lenzplace-release
mv bld/cogit.tar ../blog-lenzplace-release/blog-lenzplace-cogit-$(shell date +"%Y-%m-%d").tar
CGTMP=cg.tmp
CGSRT=cgsrt.tmp
bld/cogit.tar: $(CGSRT)
@mkdir -p $(@D)
@echo "generating $@"
@tar -T $< -cf $@
cogit-files.txt: $(CGSRT)
@echo "generating $@"
@while read CGFILE; do util/fsnap $$CGFILE; done < $< > $@
$(CGSRT): $(RAW) $(RAWD)
@find src -type f -name '*.raw' > $(CGTMP)
@find src.raw -type f >> $(CGTMP)
@sort < $(CGTMP) > $@
@rm -f $(CGTMP)
clean:
rm -Rf bld *.tmp
lint: loc
@grep -n -r '<no value>' bld/loc/ || true
scrub:
# Remove metadata from all raw files (pictures and video)
find src -type f -name '*.raw' -exec util/rmmeta '{}' ';'
.PHONY: all loc pub clean lint scrub

@ -0,0 +1,77 @@
.SUFFIXES:
PGOT-LOC=pgot -i ":src/inc" -d '{"siteurl":"$(shell pwd)/bld/loc","dfile":"index.html"}'
PGOT-PUB=pgot -i ":src/inc" -d '{"siteurl":"https://blog.lenzplace.org","dfile":""}'
CHUF=chuf '|||md+' '|||md-' markdown
INC=$(shell find src -type f -name '*.igot')
GOT=$(shell find src -type f -name '*.got')
RAW=$(shell find src -type f -name '*.raw')
RAWD=$(shell find src.raw -type f)
CPY=$(shell find src -type f -name '*.cpy')
all loc: $(RAW:src/%.raw=bld/loc/%) \
$(CPY:src/%.cpy=bld/loc/%) \
$(GOT:src/%.got=bld/loc/%.html)
publish: pub
rsync -avz --delete bld/pub/* pub_www:/var/www/htdocs/blog.lenzplace.org/
pub: $(RAW:src/%.raw=bld/pub/%) \
$(CPY:src/%.cpy=bld/pub/%) \
$(GOT:src/%.got=bld/pub/%.html)
bld/loc/% bld/pub/%: src/%.raw
@mkdir -p $(@D)
@echo "raw -> $@"
@cp $< $@
bld/loc/% bld/pub/%: src/%.cpy
@mkdir -p $(@D)
@echo "cpy -> $@"
@cp $< $@
bld/loc/%.html: src/%.got $(INC)
@mkdir -p $(@D)
@echo "pgot -> $@"
@$(PGOT-LOC) $< | $(CHUF) > $@
bld/pub/%.html: src/%.got $(INC)
@mkdir -p $(@D)
@echo "pgot -> $@"
@$(PGOT-PUB) $< | $(CHUF) > $@
cogit: bld/cogit.tar cogit-files.txt
@ echo "Moving cogit tarball to release folder"
mkdir -p ../blog-lenzplace-release
mv bld/cogit.tar ../blog-lenzplace-release/blog-lenzplace-cogit-$(shell date +"%Y-%m-%d").tar
CGTMP=cg.tmp
CGSRT=cgsrt.tmp
bld/cogit.tar: $(CGSRT)
@mkdir -p $(@D)
@echo "generating $@"
@tar -T $< -cf $@
cogit-files.txt: $(CGSRT)
@echo "generating $@"
@while read CGFILE; do util/fsnap $$CGFILE; done < $< > $@
$(CGSRT): $(RAW) $(RAWD)
@find src -type f -name '*.raw' > $(CGTMP)
@find src.raw -type f >> $(CGTMP)
@sort < $(CGTMP) > $@
@rm -f $(CGTMP)
clean:
rm -Rf bld *.tmp
lint: loc
@grep -n -r '<no value>' bld/loc/ || true
scrub:
# Remove metadata from all raw files (pictures and video)
find src -type f -name '*.raw' -exec util/rmmeta '{}' ';'
.PHONY: all loc pub clean lint scrub

@ -0,0 +1,52 @@
# blog-lenzplace
This repository contains the source files that are used to generate the website
at <https://blog.lenzplace.org>. The [makeht](https://git.lenzplace.org/lenzj/makeht) utility toolkit is used to
generate the html files.
## Installing
To install, clone the git repository and ensure you have the
[dependencies](https://git.lenzplace.org/lenzj/makeht#dependencies) installed.
In addition you will need to download the latest "cogit" file set from the
[release](https://git.lenzplace.org/lenzj/blog-lenzplace/releases) folder. This is a tar archive
containing any images or video etc. used by this website. From within the main
git repository you can then extract the tar archive as follows (assuming the
downloaded cogit tar archive is in your ~/Download folder) and it will populate
the cogit files into the "src" directory.
$ tar -xf ~/Download/blog-lenzplace-cogit-20XX-XX-XX.tar
You should then execute the configure script which selects the appropriate
Makefile version depending on which operating system you are using (linux or
bsd).
$ ./configure
Lastly, you can then execute "make loc" to generate a local set of files that
you can browse with your default web browser.
$ make loc
$ xdg-open bld/loc/index.html
If you want to view the same files that are hosted on the website you can
instead execute "make pub". Note however that links and paths within files
will point to the public web server rather than your local files in "bld/pub".
## Contributing
If you have a bugfix, update, issue or feature enhancement the best way to reach
me is by following the instructions in the link below. Thank you!
<https://blog.lenzplace.org/contact>
## Versioning
I follow the [SemVer](http://semver.org/) strategy for versioning. The latest
version is listed in the [releases](/lenzj/blog-lenzplace/releases) section.
## License
This project is licensed under a BSD two clause license - see the
[LICENSE](LICENSE) file for details.

@ -0,0 +1,19 @@
5657857740ec45d08356165134b9b7c7bb599f34f7738bc1782d0bf0685dbf6d src/about/profile.jpg.raw
d8ffbafc97b2947cd8d1327b9ed5d1685ff02f9b21e0f3c166369f411a66a914 src/favicon.png.raw
52ea7b0b991a848036d84ee0618fdeed85aea09dcd232ec16895191234d11e63 src/post/blog-tools-launch/screencast.gif.raw
7b4f905a223af278c4368ea2b3d8809a918fa679856cfeaa2e2cb0172cc2122b src/post/blog-tools-launch/thumb.png.raw
27e40e37333a62ac4b464d79f1dc1045abd875a5cc4caac58c054ac7d42f2b03 src/post/rotozip-repair/back-in-business.jpg.raw
49962a9b35c188035df9b03c014280a025b9dc0ef3514526f3c458e924fa5530 src/post/rotozip-repair/bent-pin.jpg.raw
02595c6a508ba9ac046ca0e50d4617ade17a56787d7e7b4fbed9233095d55631 src/post/rotozip-repair/first-opened.jpg.raw
8919f2931c2db5c3cc950f563ba6b0e1a9970cc30d9408110312c1f56d8ce018 src/post/rotozip-repair/heat-shrink.jpg.raw
bd156f54b69b2475f67572aca602718a8053a803cb1242ea4a9a2911e5451e29 src/post/rotozip-repair/opening-visible.jpg.raw
14c23503ffe7270bd2a72b759e27505d8869f76bf23586d685594d9b2eae417e src/post/rotozip-repair/prior-to-assembly.jpg.raw
29fe289c0d1a7db7927655efee489c9bf16d3e6ad45fa62d686e7a0c64cf8344 src/post/rotozip-repair/scratched-shaft.jpg.raw
ac3dc0d3ef3bce3f9c41fdd8738b0466adfd0a4611c31137e98b33083e6b8d60 src/post/rotozip-repair/screw-removal.jpg.raw
5952e07c7bc2321c4786f058576037ff621d28a78776c78473f9b1c902a25ba9 src/post/rotozip-repair/slice-label.jpg.raw
f514f2cb97691c3b7a102b2de43043bc639cd051cb91fea83cbc18ace862d119 src/post/rotozip-repair/thumb.jpg.raw
855c208c5925959cfd94ce84f4e1c7644d58ff99c22125ff9f2370daad00ebf2 src/post/rotozip-repair/worn-wire2.jpg.raw
12b92135a0909d1b6a7e2dc3755c1e96d01f81ff908221bd8f18f680ccc25313 src/post/rotozip-repair/worn-wire.jpg.raw
1d9a468feba789cf7c1753dd3cc519529c599028abd404654dcee785fed50917 src/post/setup-wireless-printer/thumb.png.raw
ab6afb7145980d8a5e3c67bf35362c4889d5f6ab10ad15c9133b4a3541332ef6 src/post/sudo-within-docker/thumb.png.raw
83761fc44418431501092edf9e166debba7fbebae964972d8a41ba99a95b2f22 src.raw/blog-logo-2020-05-15.svg

16
configure vendored

@ -0,0 +1,16 @@
#!/bin/sh
echo -n "Setting up Makefile"
case $(uname | tr '[:upper:]' '[:lower:]') in
linux*)
echo " for Linux"
cp Makefile.gnu Makefile
;;
openbsd*)
echo " for OpenBSD"
cp Makefile.bsd Makefile
;;
*)
echo " ... Failed! Unknown OS!"
exit 1
;;
esac

@ -0,0 +1,28 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "About",
"description" : "Some things about me and this website.",
"cdate" : "2020-05-08",
"tag" : "about"
}
;;;
{{template "pageBegin" . -}}
|||md+
![](profile.jpg "profile picture")
I'm a mechanical engineer by training working in new product development (R&D)
at a large medical device company, but also enjoy programming, and building /
repairing electronics. In addition I have a passion around open source
software, internet privacy, self sufficiency, and generally trying to simplify
software and reduce bloat.
This website is intended in a small way to give back to the online community
that I've benefitted greatly from. I hope others find something of use or
interest in these pages.
If you are interested in the icon/logo used on this site you can find out more
[here](logo/{{.dfile}}).
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,41 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "About the logo",
"description" : "For those curious about the logo or what it means.",
"cdate" : "2020-02-19",
"udate" : "2020-05-09",
"tag" : "about,logo,icon"
}
;;;
{{template "pageBegin" . -}}
|||md+
The logo wasn't initially created with the intent of using it for an icon on
this website. Rather it was driven more by nostalgia to recreate the logo from
my father's original business card. He owned a small business doing fine
woodworking and the chisel itself is an exact replica of the one used in his
business card.
* Conceptually, it's a wood chisel carving a "shaving" off a digital block.
* The binary digits are not random. They have some meaning to me (age and
number of days in a year).
* There are some
{{lnp "analogies" "https://pragprog.com/book/tpp20/the-pragmatic-programmer-20th-anniversary-edition"}}
between fine woodworking and writing good software. One needs to establish a
set of essential tools, learn how to use them well and apply them
consistently. When a task becomes repetitive or needs precision create a
fixture. It's not about adding as many decorations and features as possible,
but rather choosing quality materials, designing the product well up front,
creating something that will last, using proven methods and
{{lnp "keeping things simple" "https://en.wikipedia.org/wiki/KISS_principle"}}.
* "{{lnp "Perfection" "http://www.quotationspage.com/quote/26979.html"}} is
achieved, not when there is nothing more to add, but when there is nothing
left to take away."
![](../../favicon.png =500x "Large Logo")
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,46 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Contact",
"description" : "You can contact me using one of the methods below.",
"cdate" : "2020-05-08",
"tag" : "contact,email,pgp,gpg"
}
;;;
{{template "pageBegin" . -}}
|||md+
The best way to reach me is via email. I'm listing it here in a format that
hopefully people can read but automated spam bots cannot.
s o n z e .
a n e p c o
J @ L l a r g
A standard email is fine. If you prefer to send me an encrypted email my
public key can be obtained [here](pgp.asc).
Lastly if you would like to report a software bug, submit a patch or otherwise
collaborate on software please use one of the methods below:
### File a bug or request a feature
If you've found a bug or issue in one of the applications in the
[git repository]({{.repUrl}}), or you have a question or feature request for an
application the best way to let me know is to file an issue on the associated
repository page. You will need to create a user account if you haven't already
done so.
### Submit a pull request
Better yet if you have a fix or upgrade for a package you can fork the repository
and submit a pull request to merge your updates.
### Alternatives
If the above options aren't feasible, you can simply email me with a description
of the problem or attach a patch file, etc.
Thank you!
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,109 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=mpWa
-----END PGP PUBLIC KEY BLOCK-----

@ -0,0 +1,374 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Copyright",
"description" : "Copyright terms for content on this website.",
"cdate" : "2019-10-13",
"tag" : "copyright,creative commons,cc by 4.0"
}
;;;
{{template "pageBegin" . -}}
|||md+
# Human Readable Summary
Attribution 4.0 International (CC BY 4.0)
This first section is a human-readable summary of (and not a substitute for)
the formal [license](#license) further below.
### You are free to:
**Share** - copy and redistribute the material in any medium or format
**Adapt** - remix, transform, and build upon the material for any purpose, even
commercially.
I cannot revoke these freedoms as long as you follow the license terms below.
### Under the following terms:
**Attribution** - You must give appropriate credit, provide a link to the
license, and indicate if changes were made. You may do so in any reasonable
manner, but not in any way that suggests that I endorse you.
**No additional restrictions** - You may not apply legal terms or technological
measures that legally restrict others from doing anything the license permits.
### Notices:
You do not have to comply with the license for elements of the material in the
public domain or where your use is permitted by an applicable exception or
limitation.
No warranties are given. The license may not give you all of the permissions
necessary for your intended use. For example, other rights such as publicity,
privacy, or moral rights may limit how you use the material.
# Formal License<a name="license"></a>
Creative Commons Attribution 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution 4.0 International Public License ("Public License"). To the
extent this Public License may be interpreted as a contract, You are
granted the Licensed Rights in consideration of Your acceptance of
these terms and conditions, and the Licensor grants You such rights in
consideration of benefits the Licensor receives from making the
Licensed Material available under these terms and conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
d. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
e. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
f. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
g. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
h. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
i. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
j. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
k. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
4. If You Share Adapted Material You produce, the Adapter's
License You apply must not prevent recipients of the Adapted
Material from complying with this Public License.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material; and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
# Sources:
This page was derived in large part from:
<https://creativecommons.org/licenses/by/4.0>
<https://creativecommons.org/licenses/by/4.0/legalcode.txt>
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,79 @@
body {
margin: 0 auto;
padding: 0 0.5rem;
max-width: 45rem;
float: none;
text-align: left;
}
ul.navbar {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
border-bottom-style: solid;
border-width: 0.1rem;
}
ul.navbar li a {
display: block;
text-align: center;
padding: 0.4rem 0.4rem;
text-decoration: none;
border-left-style: dotted;
border-width: 0.1rem;
border-radius: 0.7rem;
}
ul.navbar li { float: left; }
ul.navbar li.right { float: right; }
header {
border-bottom-style: solid;
border-width: 0.1rem;
}
header img { float:right; }
header p.end { clear:right; }
header h1,
header p { margin: 0.7rem 0; }
img {
max-width: 90%;
height: auto;
display: block;
margin-left: auto;
margin-right: auto;
}
img.half {
max-width: 44%;
display: inline-block;
padding: 0.25rem;
}
code {
background-color: lightgrey;
border: 0.1rem solid;
display: block;
overflow-x: auto;
padding: 0.5rem;
word-wrap: normal;
}
footer {
border-top-style: solid;
border-width: 0.1rem;
margin: 0.5rem auto;
}
@media print {
img {
break-before: auto;
break-after: auto;
break-inside: avoid;
}
}

@ -0,0 +1,8 @@
;;;
{
"lang" : "en",
"copyright" : "2020",
"author" : "Jason T. Lenz",
"repUrl" : "https://git.lenzplace.org/lenzj/"
}
;;;

@ -0,0 +1,9 @@
;;;
{
"pgotInclude":[
"global.igot",
"pageBegin.igot",
"pageEnd.igot"
]
}
;;;

@ -0,0 +1,34 @@
;;;
;;;
<!DOCTYPE html>
<html lang="{{.lang}}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width">
<meta name="keywords" content="{{.tag}}">
<meta name="description" content="{{.description}}">
<meta name="author" content="{{.author}}">
<title>{{.title}}</title>
<link rel="stylesheet" href="{{.siteurl}}/css/style.css" type="text/css">
<link rel="icon" href="{{.siteurl}}/favicon.png">
</head>
<body>
<ul class="navbar">
<li><a href="{{.siteurl}}/{{.dfile}}">Home</a></li>
<li><a href="{{.siteurl}}/topic/{{.dfile}}">Topics</a></li>
<li class="right"><a href="{{.siteurl}}/contact/{{.dfile}}">Contact</a></li>
<li class="right"><a href="{{.siteurl}}/about/{{.dfile}}">About</a></li>
<li class="right"><a href="{{.siteurl}}/source/{{.dfile}}">Source</a></li>
</ul>
<article>
<header>
<a href="{{.siteurl}}/{{.dfile}}"><img src="{{.siteurl}}/favicon.png" width="65"></a>
<h1>{{.title}}</h1>
<p>{{.description}}</p>
<p class="end">
{{if .udate}}{{.udate}} / {{end}}{{.cdate}}
{{if .category}}- <i>cat</i>: {{.category}}{{end}}
{{if .tag}}- <i>tag</i>: {{.tag}}{{end}}
</p>
</header>
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,12 @@
;;;
;;;
<footer>
<p>
<span style="float:left;">Made with <a href="{{.repUrl}}/makeht">makeht</a></span>
<span style="float:right;"><a href="{{.siteurl}}/copyright/{{.dfile}}">Copyright</a> &copy; {{.copyright}} {{.author}}</span>
</p>
</footer>
</article>
</body>
</html>
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,63 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Lenzplace",
"description" : "Thoughts and projects relating to programming, computers, and electronics.",
"cdate" : "2020-05-17",
"posts" : [
{ "title": "Launch of blog tools (makeht, pgot, chuf, etc.)",
"path": "post/blog-tools-launch",
"thumb": "thumb.png",
"description": "Background on the tools used to generate this website.",
"date": "2020-05-17",
"category": "programming",
"tag": "golang,html"
},
{ "title": "Sudo within docker",
"path": "post/sudo-within-docker",
"thumb": "thumb.png",
"description": "Fix sudo: policy plugin failed session initialization error.",
"date": "2015-11-14",
"category": "computer",
"tag": "docker,configure"
},
{ "title": "Setup wireless printer in Linux",
"path": "post/setup-wireless-printer",
"thumb": "thumb.png",
"description": "Instructions for setting up a Canon MX870 wireless printer in Archlinux.",
"date": "2014-12-14",
"category": "computer",
"tag": "printer,configure"
},
{ "title": "Rotozip Repair",
"path": "post/rotozip-repair",
"thumb": "thumb.jpg",
"description": "Steps to get a Rotozip with a broken shaft lock back to a useable state.",
"date": "2013-08-31",
"category": "electronics",
"tag": "repair,teardown"
}
]
}
;;;
{{template "pageBegin" . -}}
<p></p>
<table>
{{range .posts -}}
<tr>
<td>
<a href="{{.path}}/{{$.dfile}}">
<img src="{{.path}}/{{.thumb}}"></a>
</td>
<td>
<a href="{{.path}}/{{$.dfile}}">
<p><b>{{.title}}</b></p></a>
<p><i>{{.date}}</i> - {{.description}}</p>
<p><i>cat:</i>{{.category}} - <i>tag:</i>{{.tag}}</p>
</td>
</tr>
{{end -}}
</table>
<p></p>
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,63 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Launch of blog tools (makeht, pgot, chuf, etc.)",
"description" : "Background on the tools used to generate this website.",
"cdate" : "2020-05-17",
"category" : "programming",
"tag" : "golang,html"
}
;;;
{{template "pageBegin" . -}}
|||md+
# Why another static website tool?
There are a lot of good static website authoring tools available including
[Hugo](https://gohugo.io/) and [Jekyll](https://jekyllrb.com/) just to name a
couple. So why yet another static website authoring toolkit? It mainly boils
down to:
* My interest in finding simpler and more minimalistic tools (I.E. the
[Unix Philosophy](https://en.wikipedia.org/wiki/Unix_philosophy)).
* A desire to learn the go programming language and apply it to a current
project (namely this blog).
# About the tools
I started using existing unix tools to make static web pages.
[make](https://en.wikipedia.org/wiki/Make_%28software%29) and
[sed](https://en.wikipedia.org/wiki/Sed) worked for a while with simple web
pages but I soon realized that it wasn't a good fit for authoring larger
websites. A much more effective solution was to use a template system to define
and standardize components of the site. The go standard library has a well
designed template system, but I needed to add a wrapper to enable it to be used
from the command line and to also "include" other template source files to
enable a hierarchy structure for web pages. The [pgot]({{.repUrl}}pgot) utility
was created as a result. In addition I wanted to be able to use
[markdown](https://en.wikipedia.org/wiki/Markdown) and raw html within the pgot
template files and ended up creating the [chuf]({{.repUrl}}chuf) utility. Both
of these combined with make and various other standard unix utilities (find,
sort, sha256sum, etc.) enabled the [makeht]({{.repUrl}}makeht) functionality
currently used to build this blog site.
* makeht - <{{.repUrl}}makeht>
* pgot - <{{.repUrl}}pgot>
* chuf - <{{.repUrl}}chuf>
* markdown - I use discount <https://github.com/Orc/discount> Any markdown
processor will do though.
# Screencast demo
![](screencast.gif "screen cast")
# Other static website authoring toolkits
For reference below are a few other similar projects that I found along the way
that may be of interest.
* makebakery - <https://github.com/datagrok/makebakery>
* gomplate - <https://github.com/hairyhenderson/gomplate>
* sigil - <https://github.com/gliderlabs/sigil>
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,91 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Rotozip Repair",
"description" : "Steps to get a Rotozip with a broken shaft lock back to a useable state.",
"cdate" : "2013-08-31",
"category" : "electronics",
"tag" : "repair,teardown"
}
;;;
{{template "pageBegin" . -}}
|||md+
I have a Rotozip that I used quite often that unfortunately broke. The issue
was with the button that is used to lock the shaft so that tools can be
changed. While changing a particularly stubborn tool, the internals of the
button suddenly gave way and remained jammed. I couldn't change the tool or
use the Rotozip anymore. It sat collecting dust on the shelf for about six
months because I assumed it was completely broken and because I didn't have the
heart to throw it in the trash. I eventually decided to take the plunge and
pull it apart to see if I could figure out the issue.
The first order of business was to remove the quick release handle and then
take out the seven screws highlighted by the red arrows below. You will need a
size T20 torx bit to remove these screws.
![](screw-removal.jpg "screw removal")
Next you'll need to slice through the labels on the sides of the Rotozip. The
manufacturer cleverly taped these across the separating seam so that they could
tell if anyone opened it up. Since mine is out of warranty anyway the easiest
solution was to cut through the labels right along the seam using a razor blade
or utility knife (see the yellow line below). You'll need to cut through both
labels on each side of the Rotozip.
![](slice-label.jpg "slice label")
At this point I was able to pull the Rotozip open and observe what was going on
inside. The first observation was that the Rotozip was filled with drywall and
wood dust which I blew out with an air compressor hose before reassembling.
You can see the bent stop pin in the images below. The metal bushing
essentially tore out of the plastic housing holding it in place and jammed the
shaft. You can see the scratches on the metal shaft where the pin dragged when
I was trying to open up the collet.
![](first-opened.jpg "first opened")
<p style="text-align:center;">
<img class="half" src="bent-pin.jpg">
<img class="half" src="scratched-shaft.jpg">
</p>
I pulled the wedged pin completely out of the housing since it was useless at
this stage. Assuming the motor was still running fine a metal rod could be
inserted through the opening where the old pin was whenever I needed to lock
the shaft to change a bit.
I also was able to pull the motor most of the way out of the housing so that I
could completely blow out the various nooks and crevices in the Rotozip. While
doing this I also noticed a wire that was basically worn through because it was
improperly installed in the factory and had been rubbing constantly against a
motor element.
![](worn-wire.jpg "worn wire")
![](worn-wire2.jpg "worn wire 2")
I had no desire to leave this fire hazard as is, so I pulled the quick connects
off where the wires connected to the motor and put some heat shrink tubing over
the wire (it just fit over the connector). I also ended up putting heat shrink
over the second wire. You can see the second wire was pinched in the photo
below.
![](heat-shrink.jpg "heat shrink")
Below is a picture of the Rotozip just prior to closing it back up. You can
see the pieces of the old locking pin setting next to the housing.
![](prior-to-assembly.jpg "prior to assembly")
And here's the assembled Rotozip with the opening visible. It turns out that
an 11/64ths drill bit is the largest diameter that will fit into the shaft
opening. I have an old drill bit that I'll just plan on keeping with the
Rotozip to use for changing bits. The old stuck zip bit came out no problem,
and the Rotozip started up like a charm. Back in business!
![](opening-visible.jpg "opening visible")
![](back-in-business.jpg "back in business")
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,85 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Setup wireless printer in Linux",
"description" : "Instructions for setting up a Canon MX870 wireless printer in Archlinux.",
"cdate" : "2014-12-14",
"category" : "computer",
"tag" : "printer,configure"
}
;;;
{{template "pageBegin" . -}}
|||md+
These instructions cover how to setup a Canon MX870 network connected printer
from your Linux computer (Arch Linux in my case) using CUPS (Common Unix
Printing System).
## Network Printer Address:
Ideally to work well with CUPS you should make sure your MX870 printer has a
consistent network IP address. In my case it was easiest to go into my
wireless router setup, view the MAC address of the MX870 printer, and then set
up the DHCP configuration in the router to always provide the same IP address
for the MX870 MAC identifier. I set up the ip address for my printer to always
be 192.168.1.60
Turn off and on your MX870 so that it reconnects to the router after the
updates above. To confirm what the ip address is you can go to the physical
menu buttons on your printer and have it display the network configuration.
Press the "Setup" button, then use the scroll wheel to move to the "Device
Settings" menu, followed by "LAN settings", then "Confirm LAN Settings", then
"WLAN setting list". You should then be able to scroll down and view the "IP
address" setting.
## Printer Software Installation:
The following commands can be used to install Avahi and CUPS in Arch Linux.
Avahi is used to automagically "discover" your printer on the network. CUPS
and associated supporting files are used to print to your printer. The most
difficult part of this will likely be the installation of the "cups-bjnp"
driver because it is located in the Arch User Repository (AUR).
pacman -S avahi
systemctl enable avahi-daemon.service
systemctl start avahi-daemon.service
pacman -S cups ghostscript gsfonts gutenprint
systemctl enable org.cups.cupsd.service
systemctl start org.cups.cupsd.service
If you are using a gtk-3.0 application (such as firefox) you will also need to
install the following package:
pacman -S gtk3-print-backends
Install "cups-bjnp" from the AUR. Instructions and the link to the package are
below. Optionally you can use an AUR manager like pacaur if you use AUR
software packages frequently.
<https://wiki.archlinux.org/index.php/AUR_User_Guidelines>
<https://aur.archlinux.org/packages/cups-bjnp>
## CUPS Printer Configuration:
Setting up the printer can be accomplished using the CUPS web interface. From
your linux computer type the following into a web browser:
<http://localhost:631>
1. On the top of the subsequent CUPS web page select the "Administration" link.
2. Then select "Add Printer".
3. If a dialog prompts for a password type in a username of "root" followed by
the root password for your linux computer.
4. If everything has gone well your printer will have been discovered and will
show up in the list of options for setup. Select the checkbox next to your
printer and hit continue. If it doesn't show up for some reason you can try
selecting the "http:" printer access option and type in "bjnp://192.168.1.60"
(or whatever IP address you set up for your printer in the earlier step.)
5. Your printer should then be setup in CUPS.
6. You can then select "Printers" on the top. Select your MX870 printer, and
then select the menu drop down option to print a test page to confirm that
everything is working.
## Source links:
<https://wiki.archlinux.org/index.php/CUPS>
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,84 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Sudo within docker",
"description" : "Fix sudo: policy plugin failed session initialization error.",
"cdate" : "2015-11-14",
"category" : "computer",
"tag" : "docker,configure"
}
;;;
{{template "pageBegin" . -}}
|||md+
## Problem:
When executing sudo within an ArchLinux Docker container the following error
message was happening:
sudo: policy plugin failed session initialization
Environment: sudo v1.8.15, Docker v1.9.0, ArchLinux as of 2015-11-14
## Quick Solution:
Within the archlinux docker container one needs to comment out the following
line in "/etc/security/limits.conf":
* - nice 0
changed to:
#* - nice 0
## Long Explanation:
I started by turning on logging for sudo to see what was driving the error.
One needs to add the following lines to "/etc/sudo.conf" to turn on verbose
logging:
Debug sudo /var/log/sudo_debug all@debug
Debug sudoers.so /var/log/sudoers_debug all@debug
After executing a sudo command again I looked at the "/var/log/sudoers\_debug"
file and found the following indicating a "pam" (pluggable authentication
module) permission issue:
...
-> sudo_auth_begin_session @ ./auth/sudo_auth.c:341
-> sudo_pam_begin_session @ ./auth/pam.c:223
pam_open_session: Permission denied @ sudo_pam_begin_session() ./auth/pam.c:277
...
I then went and looked at the "/etc/pam.d/sudo" configuration file which
further references "/etc/pam.d/system-auth". Through trial and error I found
that by commenting out the following line in system-auth, sudo began to work
again without the error:
session required pam_limits.so
changed to:
#session required pam_limits.so
Through further web searching I determined that the "pam_limits.so" module uses
settings in "/etc/security/limits.conf". Again, through trial and error I
found that by commenting out the following line in "limits.conf" alone I could
get sudo working again:
* - nice 0
changed to:
#* - nice 0
Not sure why the "nice" limit setting is the one causing problems, but I
suspect it has to do with docker not allowing system "nice" settings to be
adjusted within a container.
## Source links:
<https://www.sudo.ws/man/1.8.15/sudo.conf.man.html>
<https://linux.die.net/man/8/pam\_limits>
<https://en.wikipedia.org/wiki/Nice_(Unix)>
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,37 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Source",
"description" : "Repository of open source code and assets.",
"cdate" : "2020-05-09"
}
;;;
{{template "pageBegin" . -}}
|||md+
Open source code associated with this site can be obtained from the gitea
repository at:
<{{.repUrl}}>
The main project below consists of the source files and utilities written to
generate this static blog. Other projects and source code will be added to the
list below over time.
## blog-lenzplace
This blog is a static website written using a text editor and some small
command line utilities. In particular, the standard unix make utility along
with a markdown inline filter and a template processing utility are used for
the core workflow.
* **[blog source files]({{.repUrl}}blog-lenzplace)**: The raw text files,
images, Makefile etc.
* **[pgot]({{.repUrl}}pgot)**: A command line template processing utility
using the go standard library.
* **[chuf]({{.repUrl}}chuf)**: A simple command line filtering utility used
to process sections of markdown within files.
|||md-
{{template "pageEnd" . -}}
{{- /* vim:set noet tw=80: */ -}}

@ -0,0 +1,69 @@
;;;
{
"pgotInclude" : [ "globalPage.igot" ],
"title" : "Topics",
"description" : "Content on this website listed by category, tag, date.",
"cdate" : "2020-05-17",
"posts": [
{ "title": "Rotozip Repair",
"path": "post/rotozip-repair"
},