“Jake liked his women the way he liked his kiwi fruit: sweet yet tart, firm-fleshed yet yielding to the touch, and covered with short brown fuzzy hair.”

— Gretchen Schmidt's winning entry in the Bulwer-Lytton Fiction Contest

8​. “Don’t put that in your mouth”


(via)

Pixiv: quick sketch


Rakugaki (落書き) can refer to scribbles or graffiti, but on Pixiv, it’s usually more of a quick sketch. And some artists’ “quick sketches” are quite impressive.

Let’s lead off with the extremely rare triple half-rims!

more...

Cop Craft episode 5


Still holds my interest, still feels rushed, wish the vampire chick had nipples.

My biggest concern is that they ripped through book one in 3.5 episodes, and the other books are all about 20% shorter. How far do they plan to get in 12 episodes, and will the results be coherent?

Regional Cooling


Usually by this time of year, I’ve had the air conditioner on, sometimes even at night. This year, I think I’ve had three days above 75°F.

Baby’s First Character Sheet


Just for fun, here’s the one-page PostScript character sheet I made for GURPS (3rd edition) back in the Eighties. This is good old-fashioned stone-knives-and-bearskins hand-written PostScript, because that’s just how we rolled in OSU-CIS.

PDF version (5.3KB), if you don’t feel like cutting and pasting.

%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 0 0 612 792
%%DocumentFonts: Times-Roman Times-Bold Times-Italic
%%Pages: 1
/D 32 dict def D begin /d{bind def}bind def /w{setlinewidth}d /f{setfont}d
/r{rlineto}d /m{moveto}d /M{rmoveto}d /s{show}d /t{stroke}d /S{dup
stringwidth pop neg 0 M s}d /c{dup stringwidth pop 2 div neg 0 M s}d
/l{m lineto t}d /h{m 0 r t}d /v{m 0 exch r t}d /b{m dup 0 r exch 0 exch
r neg 0 r closepath t}d /n{findfont exch scalefont def}d /V{/L exch def
/Y exch def{Y m 0 L r t}for}d /H{/L exch def /X exch def{X exch m L 0 r
t}for}d end
%%EndProlog
%%Page: 1 1
D begin 72 dup scale 1 72 div w
0.028 w 9.25 7 1 0.5 b 9.25 3 0.5 v 9.25 6 0.5 v 5 3 1.75 h 2 1 4 h 2 1
4.75 h 5 1 5.75 h 3 3 6.25 h 2 1 7 h 2 1 7.75 h 2 1 8.25 h 1.12 1 8.75 h
2 1 9.25 h 1 2.12 8.25 v 1.25 2.25 5.75 v 0.75 5.5 2.5 9.75 b 0.75 6.5
9.75 v 0.75 7.38 9.75 v 1.5 6.5 10.1 h 0.014 w 2 2.12 7.75 v 0.75 1.75 7
v 0.75 2.38 7 v 2 1 5.5 h 0.75 1.67 4.75 v 0.75 2.33 4.75 v 0.007 w 0.75
0.16 3.5 1.05 1.9 H 0.75 0.16 3.5 0.7 0.25 H 0.75 0.16 1.5 3.05 2.9 H
1.95 0.16 5 3.05 2.9 H 1.95 0.16 9.4 6.05 1.9 H 0.75 0.16 1.5 6.75 1.2 H
5.8 0.175 6.6 1.95 0.25 H 6.15 0.175 6.6 2.7 0.25 H 0.25 0.7 7.75 h 0.25
0.7 8.25 h 0.25 0.7 8.75 h 0.25 0.7 9.25 h 1.85 2.9 10.3 h 1.25 5.2 10.3
h 3.25 3.2 10.1 h 3.05 3.4 9.94 h 0.35 2.6 8.69 h 0.35 2.6 8.45 h 1.95 4
5.98 h 1 1.4 4.38 h 1.35 1.05 4.2 h 0.43 2.15 4.08 v /FIELD 0.125
/Times-Roman n FIELD f /X 2.55 def(Name)(Appearance)(Character Story)
9.94 .18 10.35 {X exch m s}for 4.8 10.3 m(Player)s 6.94 10.4 m
(Date Created)c 6.94 10 m(Unspent Points)c 7.69 10.4 m(Sequence)c
7.69 10 m(Point Total)c 2.56 9.62 m(FATIGUE)c 6.05 9.62 m(SKILLS)s
2.56 9.13 m(BASIC)c 2.56 9.01 m(DAMAGE)c 2.56 8.13 m(HITS TAKEN)c
2.06 7.62 m(BASIC)c 2.06 7.5 m(SPEED)c 2.69 7.62 m(MOVE)c 1.63
6.87 m(ENCUMBRANCE)c 2.63 6.87 m(PASSIVE)c 2.63 6.75 m(DEFENSE)c
3.05 5.98 m(REACTION + / -)s 2 5.59 m(ACTIVE DEFENSES)c 3.05 5.59 m
(WEAPONS AND POSSESSIONS)s 1.33 5.37 m(DODGE)c 2 5.37 m(PARRY)c
2.67 5.37 m(BLOCK)c 1.05 4.62 m(DAMAGE RESISTANCE)s 1.05 3.87 m
(ADVANTAGES,)s 1.05 3.75 m(DISADVANTAGES, QUIRKS)s 3.05 1.62 m
(WEAPON RANGES)s 6.05 1.62 m(SUMMARY)s /ITAL 0.111 /Times-Italic n
ITAL f 7.2 9.62 m(Pt. Cost)s 7.95 9.62 m(Level)S 2.2 8.69 m
(Thrust:)s 2.2 8.45 m(Swing:)s 2.06 7.05 m(\(HT + DX\)/4)c 2.69
7.05 m(Basic - Enc.)c /X 1.05 def(None\(0\)= 2 x ST)
(Light\(1\)= 4 x ST)(Med\(2\)= 6 x ST)(Hvy\(3\)= 12 x ST)
(X-hvy\(4\)= 20 x ST)5.8 .175 6.6 {X exch m s}for 2.3 6.5 m(Armor:)s
2.3 6.33 m(Shield:)s 3.08 5.46 m(Item)s 4.45 5.46 m(Damage)c 4.4
5.33 m(Type)S 4.5 5.33 m(Amt.)s 5 5.46 m(Skill)c 5 5.33 m(Level)
c 5.4 5.46 m($)c 5.95 5.46 m(Wt.)S 1.33 4.8 m(= Move)c 2 4.8 m
(Weapon/2)c 2.67 4.8 m(Shield/2)c 3.5 1.8 m(Totals: $)s 4.7 1.8 m
(Lbs.)s 7.95 1.62 m(Point Total)S 3.08 1.53 m(Weapon)s 4.5 1.53 m
(SS)S 4.9 1.53 m(ACC)S 5.5 1.53 m(1/2 DMG)S 5.95 1.53 m(MAX)S
/X 6.05 def(Attributes)(Advantages)(Disadvantages)(Quirks)(Skills)
.75 .16 1.5 {X exch m s}for /DESC 0.111 /Times-Roman n DESC f 0.825 9.7
m(Pt.)c 0.825 9.58 m(Cost)c 0.825 3.95 m(Pt.)c 0.825 3.83 m(Cost)
c 1.05 4.38 m(Armor)s 6.05 0.55 m(TOTAL)s /X 2.45 def
(T)(O)(T)(A)(L)4.07 .09 4.44 {X exch m s}for /X 2.3 def
(T)(O)(T)(A)(L)5.78 .09 6.15 {X exch m s}for /GURPS 0.556
/Times-Bold n GURPS f 1.4 10.2 m(GURPS)c /REG 0.167 /Symbol n REG f
2.3 10.5 m(\322)s /FIELD 0.181 /Times-Bold n FIELD f 1.4 9.9 m
(CHARACTER SHEET)c /STAT 0.278 /Times-Bold n STAT f /X 1.03 def
(ST)(DX)(IQ)(HT)7.9 .5 9.5 {X exch m s}for 1.03 7.28 m(Mvmt)s
/LEGAL 0.0972 /Times-Roman n LEGAL f 8 0.4 m
(Shamelessly swiped from an original that's \(C\)1988 Steve Jackson Games Inc.)
S end
showpage
%%Trailer

DanMachi 2.4


In which the first arc is quickly wrapped up, thankfully getting rid of the mustache-twirling ugly people who were spitting into the camera. Nice cameo by Mord, who’s clearly learned his lesson (he’s practically tsundere in the DanMemo game…). Pity that Lili’s self-esteem is so firmly tied up in Bell, but maybe Finn can help out with that (misleading non-spoiler).

Next up: Amazons, ho! No, wait, I meant Amazon hoes!

3D Cheesecake: De Dupes


Inevitably, there are duplicate images in my cheesecake archives. Sometimes it’s the exact same file with a different name, which I can detect with a simple MD5 checksum, but often they’re different sizes, or some site has added a watermark, or a magazine overlayed it with text, or someone cropped off the text that someone else added, etc, etc.

Enter PDQ, an image-similarity hashing system that works pretty darn well. Despite coming from the evil facebook empire (usable for detecting kiddie-pr0n and wrongthink memes), the code is pretty decent, compiles cleanly, and only blows up if you feed it a file that doesn’t contain a single image convertable with ImageMagick (pro tip: do not run it on a directory that contains a video file; your swapfile will thank me). A quick review of the images it clustered together confirmed that fully 11% of my images were duplicates.

So what better for a cheesecake theme than images I liked so much I managed to download them at least four times? (not counting any copies I’ve already posted and deleted from the archive, of course; I’ll have to go through my S3 backups sometime to find those)

The following de-duplication recipe uses Miller to process the output; I’d somehow overlooked this tool for years, and I can think of at least one project at work that I wouldn’t be stuck maintaining any more if it were a directory full of mlr recipes instead of Perl modules.

# gather up all your image files
#
find . -type f -name '[0-9a-zA-Z]*.[pjPJ]*' | sort > /tmp/images

# edit the list to remove anything that's not an image (text, video,
# etc); also sanity-check for annoying file names (containing things
# like commas(!), whitespace, quotes, parentheses, etc)

# generate the hashes; this is the tedious part
# (~13/sec on my 12-inch MacBook with images stored on an external SSD)
#
pdq-photo-hasher -d -i < /tmp/images > /tmp/hashes

# cluster similar images, then strip out all images with
# cluster-size=1 (unique)
#
clusterize256 /tmp/hashes | mlr filter '$clusz > 1' > /tmp/alldupes

# extract their filenames
#
mlr --onidx cut -f filename /tmp/alldupes > /tmp/files

# create file containing (filename, height, size) for all images
#
xargs identify -format 'filename=%i,height=%h,size=%B\n' \
    < /tmp/files > /tmp/meta

# join it to the original, for consolidated output
#
mlr join -j filename -f /tmp/meta /tmp/alldupes > /tmp/alldupes2

# for each cluster, keep the file with the largest (height, size)
#
mlr sort -nr height,size then \
    head -n 1 -g clidx then \
    sort -n clidx then \
    cut -f filename /tmp/alldupes2 > /tmp/keep

# create the complementary set of images to delete
#
fgrep -v -f /tmp/keep /tmp/alldupes2 |
    mlr --onidx cut -f filename > /tmp/nuke

# move the dupes to another directory
# (rather than deleting them immediately...)
#
mkdir -p DUPES
mv $(</tmp/nuke) DUPES

When you add additional images to your collection, you can generate their hashes and compare them to the existing data (amusingly, you have to use the tool backwards…):

# hash the new images
#
pdq-photo-hasher [0-9a-zA-Z]*.[pjPJ]* > /tmp/newstuff

# print the filenames of new dupes
# (note that mih-query is a bit twitchy about formatting; the
# hash field must be first, and non-pdq fields need to be at
# the end)
#
mih-query /tmp/hashes /tmp/newstuff | grep match= | mlr --onidx cut -f 4

# add remaining hashes to your DB of unique images

Bonus for correctly guessing which image I had eight copies of. 😁

more...

Super Miniskirt Space Pirates 1: Pirate Officer Cadets


So, the original light novels that Bodacious Space Pirates was based on moved to a new publisher, who redid the covers in a more anime style and has now spun off a new series, apparently the adventures of Marika and Chiaki as Imperial space cadets: