commit 7462d8a16a532467b8a59d762481b4ed1d3b60f4 from: Alexander Arkhipov date: Sat Jun 24 14:04:17 2023 UTC initial import commit - /dev/null commit + 7462d8a16a532467b8a59d762481b4ed1d3b60f4 blob - /dev/null blob + d643372f5988860dcf45b2aa0623e902f914e5b1 (mode 644) --- /dev/null +++ README.txt @@ -0,0 +1,118 @@ +Q: Who are you? +A: I am Alexander Arkhipov, a Unix hacker from Moscow. + +Q: What's your email address? +A: See "What do you call your Unix users?" and append "@alearx.org" + to your findings. + +Q: Do you have a PGP key? +A: Yes, it's at ftp://alearx.org/pub/pgp/ -- pick the latest one. + The pub directory is also mirrored on http and gopher. + +Q: What services does alearx.org provide? +A: Most services are at alearx.org. There is a mail server running, + so you can send me mail to this server. I publish news via finger + (don't just finger the host itself, see instead see "What do you + call your Unix users?"), and you can read them via http and gopher + as well. I publish some files to the ftp server, and the pub + directory is mirrored to http and gopher. There are the http and + gopher sites, which are mostly identical. You can clone my git + repositories via anongit (see the /git/ directory on either www + or gopher site). I also maintain a boring site with a blog and a + resume at pro.alearx.org. + +Q: What language(s) do you speak? +A: Russian is my native language, but I speak English fluently. I + generally don't read email in Russian -- English is the language + of computing. I also speak a little bit of German. + +Q: Do you maintain any "public" accounts elsewhere? +A: I am called alearkh on github. The rest that you might be able to + see either exist for stupid reason, or not needed anymore. + +Q: What's up with your domain names? +A: I got my first domain name, and started my first open-source + projects when I was finishing my university. At the time I allowed + another student to convince me that a good "internet identity" + would be a unique, easy to pronounce string (even if meaningless), + such as those people from reddit or whatever would use. I ended + up making a website at the domain mcflexy.net. In a short while, + however, I decided that I should instead allow my (real) name to + speak for itself, but still didn't want to embed my name into a + domain name because: + + 1) I've got a pretty long name + 2) Most shorter versions I could think of at the time were taken + + So instead I decided to register something that'd read as an + English word or phrase, and finally came up with mineeyes.cyou. + I would regret the decision almost immediately, as I discovered a + lot of spam filters had no trust in .cyous. + + At the time I didn't have a lot of money to begin with, and + transferring them was becoming a huge problem (it was 2022, and my + "benevolent" government forbids me from naming the Ukrainian event + that broke out then). It wasn't too long, however, before I + graduated from my slave camp, and was hired into another, at which + point I at least managed to get my bitcoins together and start + thinking. I registered manpager.net (named after the environment + variable MANPAGER), and put a notice that mineeyes.cyou is going. + I also realised at later point that I transferred way too much + bitcoin (unless I just wanted to renew one domain for the next 20 + years), so I registered a few I thought may be useful later. + + I was happy with the situation for a while, but then I had to + register on github to participate in a project. Github required me + to give my user a name (and not just a mail address), but all my + favourite names for Unix users were already taken, and I didn't + want to name my user "manpager"! I came up with "drjfaust", as in + "doctor Johann Faust", but I wasn't happy with it. + + Eventually the idea of catenating first X letters of my first name + with first Y letters of my surname occurred to me. The method also + has some flexibility, and can produce funny results. 3 for both X + and Y seemed to be a good number, so I registered alearx.org (.net + was a mistake -- it's a TLD for ISPs and the like), and changed my + github user name to alearkh. The x in alearx is substitute for + Greek chi. + + That pretty much concludes the situation up until now. + +Q: What do you call your Unix users? +A: I usually name my main user aa for my initials. I maintain users + for the more spammy mail called alexander (so if I were to + register on amazon, I'd give alexander at this domain). Most of + the other users, that I might maintain to drop some privileges for + certain tasks, are usually given short names like "tim" or "jean". + +Q: What do you call your hosts? +A: I distinguish between the name(s) by which the host is known on the + local network, and among friends via /etc/hosts, and the + publicly-known FQDNs, which are set up via DNS, but also matter + with web and smtp servers. + + The "local" names are short Unix "words", such as "manpager", + "cflags", "ex", &c. The FQDNs are just whatever makes sense, while + being short and memorable. + +Q: What about copying your works? +A: When I first began programming, I was perplexed by copyright. + ("license my program!? it's not a book, or something, you know") + Then there was a period during which I was extremely confused, and + now I am just mildly confused. + + Inspecting existing licences I stumbled upon BSD0, which removes + the attribution clause from the normal BSD licence. So I decided + to deal with the issue by just putting that into COPYING for each + of my projects. Many still are distributed this way. + + Later I discovered that the copyright laws don't allow me to + reject my right to sue people who'd forgotten to attribute my work + to me, so from that point I decided to instead use OpenBSD's ISC + licence. I also discovered that further complications arise when a + project includes files from different sources, so instead I now + have a licence-comment at the top of each source file. + + Now I believe that some of the text files I publish via gopher may + be subjects of copyright, so I now also have a small notice at the + bottom of such files. blob - /dev/null blob + bb25755e08aec6ecbe3a13f95667e04c4a8ff577 (mode 644) --- /dev/null +++ art/battlestar.txt @@ -0,0 +1,438 @@ +battlestar(6) is an game written by "His Lordship, Admiral David W. +Horatio Riggle." It is an adventure game not unlike adventure(6) +(yes, that's a pun). His Lordship claims it to be less of a puzzle +and more of an exploration-game. Apparently he wrote it to learn C +better (the game was written in 1979, however, so we are still +talking about pre-ANSI C with its weird function declarations and the +like). It also has some interesting verbs like "fuck" (unfortunately +performing that on corpses and general population does not lead to +results all that interesting). But that's not all! battlestar(6) is +not "just" an adventure game: It also has what I can only describe as +"action segments!" + +All that sounds pretty neat. Considering that adventure(6) has a small +collective that managed through a lot of research and collaboration +find every one of the game's secrets, so should battlestar(6)... +Except it doesn't! The game is actually worse at teaching the player +how to play than adventure(6) is, and there don't appear to be any +walkthroughs on the internets. The only way I managed to complete the +game was by consulting the source code. So, for the first time ever +I am writing a walkthrough. + +For a bit of clarification: I started playing battlestar(6) on Void +Linux and consulted the same sources as the ones from which the games +are compiled on Void (which, I think, are *not* Debian's and are +written in bronze-age (pre-ANSI) C (but I might be mis-remembering)). +Later my life returned to normal somewhat and I continued playing on +OpenBSD. For that purpose I downloaded the source tree via CVS and +observed that the games have been rewritten somewhat, mostly +stylistically, however: adventure(6)'s main.c still is written in the +kind of style that used to infuriate Dijkstra etc. + +Oh, but what even is a battlestar? Well, I was wondering that as +well. Apparently at about the same time (1978) there used to exist +one of those very cheap, uninspired and horribly dull American +television-space-shows called "battlestar Galactica". By "battlestar" +the authors, of course, meant a sort of space-carrier-ship because +the meaning is so "obvious". The premise of the series, as far as +there is one, is that a very advanced human civilisation lives on +some far-away planets, waging war against some robots called +"cylons", whose dearest wish it seems to be to murder every man alive +for no reason at all. Of course, the character I shall refer to as +"Judas Iscariot" assists the robots in doing so on the condition that +they spare his home-planet Guatemala (not what they called it, but I +have bad memory for things that are somehow nonsensical, yet +uninspired) and install him as its president. Genocide is something a +lot of very resourceful people have failed to achieve on a lesser +scale after decades of constant work, yet the robots desecrate 99% of +human population in just a few hours. The other 1% is divided in +half: 0.5% is left to starve to death, while the lucky few fly in the +general direction of the earth, where we, their very primitive +brethren live. Naturally, the robots at first try to execute Judas +Iscariot after killing every single other Guatemalan, but then decide +to instead put him in command of an entire fleet with the sole +purpose of pursuing these space-gypsies. It's much more boring than +it sounds like. + +And what does any of it has to do with the game? Well, not much. The +player starts on a "battlestar" that features smaller spacecrafts +called "vipers", and then goes into space where there are a bunch of +"cylons" to kill, but that's about it. + + +WALKTHROUGH + +So, first thing to do is to open the file words.c in the source code +and find all the VERBS. Now actually start the game. + +The game starts at a LUXURIOUS STATEROOM. We check our inventory and +see the following: + + >-: i + You aren't carrying anything. + + You are wearing: + + pajamas + + You are in perfect health. + >-: + +(Some time after my first session I noticed that the prompt looks a +bit like a sad face.) + +Oh, and, yes, we'll be completing most of the game in a pyjama, so I +suggest making an alias like `alias hitchhiker=battlestar'. + +If we go back we will discover some royal robes, which we can +put on instead, however they don't appear to have any effect +whatsoever (no, really, "grep 'ROBE|PIJAMA' *.c" yourself), so +instead we shall go right. + +From the EXECUTIVE SUITES we can go in all six directions. + +Ahead is the MAID'S UTILITY ROOM. Unfortunately, the maid has +accidentally stabbed herself to the death with a knife! We take the +knife, leaving the body for the police, and go back. + +To the right is the PRESIDENTIAL SUITE. It has a laser pistol just +lying on the floor, so we take that. If we go ahead we can discover +that the president too has accidentally shot himself to death, so +instead we go back. + +Down at the FIRST CLASS LOUNGE we discover some rubble and matches. +There is not much to see at the back, so we go up. + +We could go up to get another knife and a cleaver, but we already +have a knife! So instead we go ahead to the bridal suite. + +In the BRIDAL SUITE we put on a strange amulet that we found lying on +the floor and go down. + +In the HALLWAY there area a bunch of coins, which we take and go +right and ahead. + +From the MAIN HANGAR we can go left, up or right. + +The only thing of interest on the left is a nuclear warhead. +Unfortunately, all possible interactions with it may or may not +result in the player's death, so we won't be going left. + +Up and right actually lead to the same locations. We go right twice. +There are two guards "guarding" something called "Viper," but they +don't seem to mind us launching too much. + +At this point the game prints a very helpful message: + + >-: launch + You climb into the viper and prepare for launch. + With a touch of your thumb the turbo engines ignite, thrusting you back into + your seat. + + You are in space. + + + >-: + +So, what is "space" exactly? Well... + + ... + /* 32 */ + {"You are in space.", + {33, 34, 35, 36, 37, 1, 33, 1}, + "****\n", {0} }, + /* 33 */ + {"You are in space.", + {38, 32, 39, 40, 41, 1, 42, 1}, + "****\n", {0} }, + /* 34 */ + {"You are in space.", + {32, 44, 45, 46, 47, 1, 48, 1}, + "****\n", {0} }, + /* 35 */ + {"You are in space.", + {40, 45, 49, 32, 50, 1, 51, 1}, + "****\n", {0} }, + ... + +This is all part of a struct room (two of them technically), which is +defined in extern.h: + + struct room { + const char *name; + int link[8]; + #define north link[0] + #define south link[1] + #define east link[2] + #define west link[3] + #define up link[4] + #define access link[5] + #define down link[6] + #define flyhere link[7] + const char *desc; + unsigned int objects[NUMOFWORDS]; + }; + +So, right off, flyhere and access are useless when trying to draw +some sort of a map. Miraculously there are north, south, east and +west in space, but we are yet to invent a space-proof compass. But +first of all: which point of space are we even in? Well... + + $ grep ^launch\( * + command6.c:launch() + $ less command6.c + ... + +Oh, but of course, we are at location[position].up! Also known as 32. +So, knowing that rooms 32-66 are all space, it appears that other +options include: 67 and 68, corresponding to the orbits of a small +blue planet and a tropical planet. The first leads to 69, and while +it is, as the user of an internet forum would put it, "nice," I +wouldn't go somewhere described as: + + ... + {69, 69, 69, 69, 69, 1, 69, 1}, + ... + +So instead we'll try to navigate to the tropical planet. This, +thankfully is much more straightforward than the labyrinths of +adventure(6) our path is 32-34-44-64-66-68, or s-s-s-s-s-s -- +basically, we just need to find that mysterious "space south." +Throughout these space rooms there are also some objects called +CYLON, being in one cell with a CYLON triggers the function visual(), +which produces a visual fight with the alien. I know that on this +path the only CYLON is in the room 64, which we can use to determine +which direction is south (it's right because by typing `r' once and +`a' twice I arrive at a CYLON). + +So, how about defeating the CYLON? Well, turns out that this is a +curses game as well (of course it is!), and I don't really know how +to use curses. Anyway, before starting the fight, I'd make sure that +the terminal being fought on is 80x24, because that will make things +much simpler. Right, I don't think I can put off reading fly.c any +more because the in-game prompts are most unhelpful. + +So, the first thing to do is to press plus (`+'). This will draw a +target in the middle of the screen. Our objective is to bring the +enemy (looks like `/-\') there and press `f' or space to fire. Of +course we can't move the enemy, but we can move ourselves by pressing +h/r, l, j/u and k/d along with their capitalised versions for greater +effect. This is the hardest part of the game! + +Save once the game says "You are orbiting a tropical planet." Go +down, approaching an island. This is the main part of the game. + +At this point you are free to explore the island, which is the main +part of the game. Completing it is very tricky, however. A sequence +that seems to work: + +1. Firstly, it is very important to find the goddess. If not found, +she will disappear after the first day. Once the goddess is found you +need to kiss her, follow her, kiss her a few more times and finally +love her. She will drop a medallion. DON'T take it (now at least). + +2. Find a woman who'll tell you that she wants to meet you in the +gardens at midnight. Once there and then, accept a rope from her. + +3. Otherwise explore the island. You should at least find the potion +before the rendezvous. + +4. Quickly go to the catacombs. They are only open at night, so there +is no time to lose. + +5. There are mainly three points of interest here: the sepulchre, the +room with the dark lord (a.k.a. darth vader) and a storage room. The +latter contains a grenade, which is quite honestly not that +interesting of an item. The sepulchre is more interesting: it +contains a mail shirt, an armoured helmet and a sword. It is vital to +go into the final fight wearing (not carrying) mail, the helmet, the +rope and carrying (not wearing) the sword, the laser, the potion +and the amulet. + +6. In the last room before Darth Vader make sure to sleep and eat if +carrying food and a knife. Enter with the aforementioned items and +smite the enemy until you deal him 34 points of damage (see below on +the explanation of the fight mechanic). Then retreat by typing `b'. +He'll take your amulet and retreat. Follow him. Now smite him until +you deal him 25 points of damage and finish him off by shooting. At +this point you will most likely have so many injuries you won't be +able to do anything, which is why we brought the potion. Drink it to +restore your health. There'll be some treasures lying around. We just +want to take the amulet, the talisman and throw the rope up to +escape. Once on the surface (you'll need to climb there with command +`u') use amulet -- that'll teleport you outside of the canyon. + +7. Finally return to the nymph and give her the amulet and the +talisman. Follow some further instructions. + + +COMBAT + +I already touched the space-combat briefly and there is not much more +to explain. Ground-combat is a bit stranger. There are three types of +enemies: woodsmen, elves and Darth Vader. All that should be known +about the first two is that carrying a laser and typing `shoot' puts +a swift end to the affair. The dark lord is more complicated than +that. + +There are several things to keep in mind when a fight starts: the +type of enemy, his strength, your tiredness, your injuries, the sort +of weapon carried, wearing one or several of the medallion, the +amulet and the talisman, and wearing mail and helmet and carrying +the shield. + +There are several things that can be done on each turn: smiting, +shooting going back and managing inventory. I advise to go into +fights with the inventory already managed. + +The enemy's strength determines two things: how many times will he +have to be smitten before he dies and how many times will he have to +be smitten before he may be killed through shooting instead of having +your laser deflected and destroyed. It is, essentially "health +points" and they are opposed to the value of lifeline, which +indicates how many "damage points" has the enemy suffered. The dark +lord starts with 100 strength the first time and 75 the second time. + +With each round of the fight you become more tired. If you are +sufficiently tired, the enemy simply kills you. + +injuries is an array of 13, that determines what parts of your body +are injured and how much. Each turn a number between 0 and 12 is +generated in order to determine which part of your body the enemy +will try to injure. The following items each reduce that number by +1: helmet (worn), mail (worn) and shield (held). Similarly for +each of the amulet, the medallion and the talisman being worn the +number is increased by 1. Should the number be less than 0 it becomes +0, equally it won't exceed 12. The injuries 10, 11 and 12 are +particularly important: they correspond to the deep incisions, +fractured skull and broken neck. Should these three injuries happen +at the same time you'll die, which is why it is so important to wear +at least some protective gear, which can make one or several of these +injuries impossible. + +Aside from the laser there are three kinds of weapons in this game +the first is the two-handed sword, the second is the normal sword and +the broadsword, the third is everything else. The two-handed sword is +the most damaging, however it is impossible to carry almost anything +else together with it (laser, importantly), so I am avoiding it. A +sword is lying not far from Darth Vader together with mail and a helmet, +so we'll use that. + +The damage dealt is calculated slightly differently depending on the +type of weapon. For sword it is: + + rnd(50) % (WEIGHT - carrying) - card(injuries, NUMOFINJURIES) + - encumber - exhaustion. + +It's mostly self-explanatory. Depending on how much damage was dealt +one of the following messages will be displayed: + +0: + You swung wide and missed. + He checked your blow. CLASH! CLANG! + His filthy tunic hangs by one less thread. +1: + He's bleeding. + A trickle of blood runs down his face. + A huge purple bruise is forming on the side of his face. +5: + He staggers back quavering. + He jumps back with his hand over the wound. + His shirt falls open with a swath across the chest. +10: + A bloody gash opens up on his left side. + A bloody gash opens up on his right side. + The steel bites home and scrapes along his ribs. + You pierce him, and his breath hisses through clenched teeth. +20: + You smite him to the ground. + The force of your blow sends him to his knees. + Clutching his blood-drenched shirt, he collapses, stunned. +30: + His ribs crack under your powerful swing, flooding his ... +55: + You shatter his upheld arm in a spray of blood. The blade ... + With a mighty lunge the steel slides in, and gasping, he ... + +Shooting the enemy will instantly kill him if his strength minus the +damage you've dealt already is less than or equal to 50. Otherwise +he will deflect and destroy your laser. + +Going back is quite interesting. Normally it prints how far you've +got in the fight and you retreat back. Of course, the next time the +fight starts none of the displayed stats will matter. It is, however, +necessary to retreat during the first fight with Darth Vader. If +you've managed to deal him 34 (or maybe 33 since it involves +floating-point arithmetic) points of damage, while wearing or +carrying the amulet and try to go back he will either: + +1. Trigger a game-over in case you also have the medallion on you. +2. Fracture your skull and retreat with your amulet. Afterwards you +can follow him, which is the only way to get into the room with the +talisman. + +Hopefully that explains the combat system. + + +FINAL BUG/FEATURE + +Now one would think that this plan I've outlined of defeating the +dark lord and saving the day would be some sort of a guarantee. Well, +no, it still relies quite heavily on random numbers being in the +player's favour. I have, however, found a -bug- feature thanks to +which completing this game doesn't even require a laser, or a +two-handed sword. You see, you've got to follow the dark lord after +he cowardly retreats and then fall back yourself. The author seems +to have "forgotten" (actually he's probably just left cheats for +himself!) to account for that final fight in the fight() function. +The logic there depends somewhat on your previous position, so there +are two ways it may go: either you and all the items remain in the +same room, or you, the amulet and the talisman are transported +somewhere else. Either way, all that remains to do is to navigate to +the nymph. + + +OTHER TIPS + +While flying, it is easy to return back to the original location on +the island by simply following a `u' with a `d'. It is, however, +somewhat dangerous at night, as yet another cylon will be spawned +just above the planet. + +After you return to the goddess, collect the medallion and go to +another room. You will become a wizard! (If you still have the other +two on you.) This gives you the ability to type the magic word `su' +and to fly without an aeroplane. + + +ENDING + +So, I realise not all people consider such feats of exploration worth +their time, therefore I finally leave the game's ending here. + +>-: give amulet to goddess +amulet: +Given. +>-: give talisman to goddess +talisman: +Given. +>-: give medallion to goddess +medallion: +Given. +The powers of the earth are now legitimate. You have destroyed the Darkness +and restored the goddess to her throne. The entire island celebrates with +dancing and spring feasts. As a measure of her gratitude, the goddess weds you +in the late summer and crowns you Prince Liverwort, Lord of Fungus. + +But, as the year wears on and autumn comes along, you become restless and +yearn for adventure. The goddess, too, realises that the marriage can't last. +She becomes bored and takes several more natives as husbands. One evening, +after having been out drinking with the girls, she kicks the throne particularly +hard and wakes you up. (If you want to win this game, you're going to have to +shoot her!) +>-: shoot goddess +The blast catches the goddess in the stomach, knocking her to the ground. +She writhes in the dirt as the agony of death taunts her. +She has stopped moving. + +You win! blob - /dev/null blob + 8e1c9aa0fd1dc64df511eb681085a931d9185a6a (mode 644) --- /dev/null +++ art/comppractice.txt @@ -0,0 +1,390 @@ +A very sad thing about modern man is that computers are ubiquitous to +everyone's life, yet there are very few people (even among +programmers!), who have any idea how to use them. This text will +contain a quick overview of several topics on the practice of +computing from "how to set up your shell" and "how to get +documentation" to "how to write better programs". Most of such +subjects, of course, require much more than a quick overview, so +when possible I'll try to describe how to get proper introduction +and reference manual to each subject. + + +FILE HIERARCHIES + +This document focuses on maintaining good file hierarchies under +Unices, and so many consequent presumptions and opinions are taken. + +File hierarchies are hard. What makes it worse is that we've all been +damaged from childhood with all those graphical file-managing tools +that are both slower than the command line and promote some very bad +habits. Natural consequences of such damage are even getting +standardised: there are a lot of programs that create weirdly-named +dirs like ~/Downloads and ~/Documents, and there is the XDG base dir +specification. It is my opinion that file hierarchies should +facilitate three things primarily: + +1. It should be easy to navigate to the file by typing its name. +2. It should be easy to manipulate files via scripts. +3. It should be easy to perform similar operations on a group of +closely-related files, e.g. with only one or two commands all my +configs for $program should be able to be archived, copied, change +permissions and ownership etc. + +Generally I assume that the user is not an idiot and knows where +most of his files are and can find the rest with find(1) or locate(1) +or something. + +Firstly if you are reading this document, you probably aren't a +secretary, are you? Well, don't name your files like one! Use only +[A-Za-z0-9_.-]. Avoid minuses (dashes/whatever) as the first +character (or at all, really): they cause all sorts of problems like +"rm -i *" becoming "rm -i -f file1 file2", and there seems to be a +correlation between people who put a lot of dashes in their names and +the ones that end up unwieldily-named files. Minuses are OK for +semantic purposes, however, such as naming files after dates +("2013-05-05.photo.jpg" (though depending on how it will be used it +might be fine to name it "20130505.photo.jpg")), or versioning them +("prog-0.4.tar"). If you use them for separating "fields" in +filenames, consider using periods instead. There are also some +characters, which are not mandated by posix, but which are still +commonly used by some programs: comma (,) and colon (:) are used in +maildirs, I believe some GNU utilities like tilde (~), I think +systemd uses at (@), Linux's filesystems like pluses (+) for special +files/dirs and test(1) can often be invoked as `['. I'd advise +against using those for normal files, however. Be conservative with +numbers and underscores and only capitalise letters with VERY +IMPROTANT files that should be sorted first like README, Makefile, +CHANGES, INSTALL etc. That is not to name directories in your ~ so: +they already are sorted because the "unimportant" files have a period +as the first character. + +Naturally, keep the names short. Of course if you have some, e.g., +photo saved on your disc, but you only open it once a decade, it's +fine to give it a longer, more descriptive name like +"1998.tortoise_on_red_sea_beach.png" (do tortoises live on the Red +sea?). On the other hand if you have a copy of "the brave soldier +Schweik" on the disc, there is no need to name it +"the_fateful_adventures_of_the_brave_soldier_schweik_during_the_world_war_by_jaroslav_hashek.pdf" +that doesn't even fit the line! Instead, Name it "schweik.pdf" and be +done with it. + +Also, unless you are serving these files with a web-server or +something, avoid putting the `.txt' suffix there like some people +like to do. When one sees a file without a suffix (eh, extension) one +should ask the operating system: is this file executable? If it +isn't, well, it's probably plain text isn't it? These extra 4 bytes +at the end are superfluous, annoying and don't impress anyone. + +Another thing is don't spread your files around. The reason there is +a separation between /etc/ and /usr/share/ is because people are +unlikely to copy the latter between hosts. On the other hand if you +install a, say, dictionary program, download some custom dictionaries +for it and decide that you want this program somewhere else, well, +you'll want to copy both your configs and the extra data files you've +downloaded. And now with the XDG directory specification this +operation no more as simple as `scp -r ~/.dict user@host:'! So, thank +you, XDG! + +There are a several of reasons for separating closely-related files +into several directories: + +1. It may help avoid naming collisions. For example, if I were to +make a note-taking program, I'd store all the notes in their own +directory and all the helper files in the directory above. + +2. There may be other technical reasons. For the same program may +load different configs depending on a directory. git(1) is one +example of that. + +3. You *actually* only want to have a subset of files visible at a +time. For instance, it may be good idea to keep old mail, however, +in the vast majority of cases one is only interested in the very +recent mail, so there is no need to load one's mailing program and +own brain with the old stuff, except when explicitly asked. One +solution is to move each prior year's mail into its own directory, +and only keep the current year's mail in the actual inbox. + +Another thing people seem to like to do that is even worse than +creating those weird single-file directories is creating unreasonably +short files. I see this manifested primarily in two ways: + +1. People decide that foo.conf is not enough somehow and instead +create foo.conf.d/ putting dozens of single-line files there. + +2. There is this "style" of programming where people create separate +files for each function. + +Now, firstly this sort of behaviour is very rude to your disc: I am +yet to encounter one with 20-byte-long sectors. Secondly, the only +purpose it serves is creating more busywork. Beforehand I had +everything I needed in the place where it logically should reside. +Now I have to jump from file to file just to figure out the meaning +of a single line. This, by the way, also relates to programming in +general. + +Another issue is symlinks. Don't use them, unless there is some +strong reason to do so. There are several kinds of symlinks: those +between directories, which mostly just cause confusion. Those between +files on different filesystems, which don't even always work. And +there are symlinks between normal files on the same filesystem. These +should be hardlinks. The only "benefit" there is to be had from using +symlinks instead lies in confusing some poor program once the actual +file has been deleted, and the symlink it depended upon is no longer +pointing to some useful location. + + +For some more particular advice, here are directories in my ~: + + bin/ games/ lit/ mail/ misc/ src/ sync/ tmp/ vid/ + +~/bin/ is part of my PATH. This is where I put all my "permanent" +scripts. + +~/misc/ and ~/tmp/ are both for files of varying degree of +temporariness. The first is where I put files when I either don't +know where else to put them yet, know where to put them, but don't +want to do that just yet, or intend to remove them later, yet would +like to hold on to them for now. ~/tmp/ is more temporal than that, +yet less so than /tmp/. This is where downloaded files and +screenshots land initially. This is also where I conduct experiments +that for whatever reason cannot be conducted in /tmp/. + +The inner structure of ~/games/ is very much ad-hoc. You can guess +the rest. + +~/lit/ is composed entirely of pdf files as of right now. A bit +surprisingly, getting untranslated foreign fiction on some dead-tree +paper is much, much simpler in Moscow, than getting untranslated +technical literature, even though one would think the translations of +the latter would be mostly useless. An interesting thing about +technical literature is that it's mostly reasonably self-contained, +and so there are hardly any book series I keep in this directory. The +ones that are there are put into their own subdirectory and +structured like so: + + ~/lit/bookname/ + |-- bookname1.pdf + |-- bookname2.pdf + ... + `-- booknameN.pdf + +Most of them, however, don't get their own directories, of course. + +~/mail/ houses two kinds of maildirs: ones named +~/mail/{2021,2022,...}/ and ~/mail/in/. Stuff arrives into ~/mail/in/ +and moves on to a newly-created maildir once a year has passed. + +~/src/ is where I put the source code of various projects. Because I +commited to some projects using github, but I don't want the site to +expose my mail address, there is also the subdirectory ~/src/gh/, +which is pretty much the same, except that it has its own gitconfig. + +~/sync/ contains files I sync between my local machine and my server. +I might change the hierarchy there slightly if I start maintaining +more systems on a regular basis. The internal hierarchy mostly +corresponds to that of the server's root, though there are a lot of +extra files in ~/sync/ itself like plan, profile, kshrc, sync.sh etc. +Hopefully the names are revealing enough. + +~/vid/ contains Monty Python mostly. Somewhat similar in structure to +~/lit/, excepting that there are more subdirectories. + + +PROGRAMMING + +There are already a lot of good stylistic references for C (and +probably for other languages, but we'll stick with C here). Good ones +in particular are OpenBSD's style(9) (google it on +http://man.openbsd.org) and the style employed by K&R in their book +"the C programming language". A lot of good advice is offered in +"the practice of programming" by Brian Kernighan and Rob Pike. Do +read those for a more complete overview of good style. Here I shall +instead go over some techniques that are critically underemployed +and some mistakes that + +I find it very helpful to compile with flags +`-std=c99 -Wall -Wextra -pedantic -O0 -g'. Of course, this is just +for the debugging purposes, for "real" compilation you'd probably +remove at least the `-O0 -g'. Other than that, I don't find linters +to be particularly helpful -- they misreport all but too often. For +instance, I used to employ LLVM's scan-build(1) until discovering +that it complains about such code: + + void + err(int eval, char *fmt, ...) + { + ... + exit(eval); + } + + void + somefunc(void) + { + char *ptr; + if (!(ptr = malloc(n))) + err(1, "bad malloc"); + *ptr = '\0'; + } + +but not with this modification of somefunc: + + void + somefunc(void) + { + char *ptr; + if (!(ptr = malloc(n))) { + err(1, "bad malloc"); + exit(1); + } + *ptr = '\0'; + } + +So, the moral is: compile with -std=c99 -Wall -Wextra -pedantic, fix +warnings, test thoroughly, fix bugs as soon as they are found, avoid +common missteps, and don't rely on external linters. + +Portable programs tend to not only cause much less pain, but to also +be better written in general, so try to stay within mainstream, only +using local extensions when necessary. Definitely do not rely on a +particular compiler's or standard library's quirk. + +In the vast majority of cases code alignment (except indentation) is +a huge waste of effort that doesn't even pay off, so I avoid that. + +When possible I position my functions starting on their own line like +so: + + int + foo(void) + ... + +this makes the code very easily grep(1)pable (grep ^foo\( *.c)). And +no need for ctags! Generally it is worth writing in a way that'll +make moving around simpler. + +Side effects should generally be avoided, except for some +well-understood idioms like *a++ = *b++. + +There are many programs whose portability depends upon preprocessor +instructions like #if and #ifdef. It is easily observed that even +in small number they can bring much confusion. Avoid such constructs +when at all possible. Even the debug macros are often not really +necessary. Compare the two: + + #define DEBUG + + #ifdef DEBUG + printf("this is a debug statement\n"); + #endif /* DEBUG */ + +and + + enum = { DEBUG = 1 }; + + if (DEBUG) + printf("this is a debug statement\n"); + +If we set DEBUG to 0 in the second case, the compiler will optimise +the statement away in any case, but it'll warn us if we mess up the +actual debug code. + +Comments are often used in silly ways. In fact some people even have +their editors configured to make the comments dimmer. In fact they +should have them configured to make comments brighter and/or bolder. +Comments are very powerful and should therefore be used with much +discretion. Good comments include the ones that go briefly over +functions and global data, and the ones which help the reader to +understand a complicated algorithm used in code. They should +definitely not, state the obvious, or be seen as a compensation for +bad code, which should be rewritten instead. Such comments have a +tendency of eventually contradicting the code, which is the great +danger of comments. + +There are many examples of not just bad, but moronic comments: + + /******************************************************* + * * + * * + * MY HELLO WORLD ROUTINE * + * * + * * + *******************************************************/ + + do_stuff() //!!! + + /**** Maybe I should draw more asterisks... ****/ + +Don't laugh, I actually get paid for working with these! + +And another thing is to definitely not just leave code commented out, +at least not after debugging. Though if you do write a debugging +function, leave it there, for you might need it in the future. + +There are a lot of reasons to divide programs into multiple files. Do +create as many as are needed, especially for portability, and when +compilation becomes too long. Do not, however put things into new files +just for the sake of it. Many programmers seem to think that if they put +every single function into its own file it'll somehow make things +better. In fact it only makes their code a navigational nightmare. + +Speaking of multiple files, don't include files in your included files. +There is, of course a "protection" often employ to avoid cycles: + + #ifndef THISFILE_H + #define THISFILE_H + #include "a.h" + #include "b.h" + /* file contents... */ + #endif /* THISFILE_H */ + +which does not, however, protect your preprocessor from processing +this rubbish over and over again, ensuring the program doesn't +actually finish compiling for a stupid multiplied by long amount of +time. Instead simply comment what files should be included before that +one and let the actual includer worry about what to include: + + /* + * Description of what the file is for. + * + * #include "a.h" + * #include "b.h" + * #include "thisfile.h" + */ + +A thing that I, thankfully, see more rarely, but still do sometimes +is variables getting burdened with as many qualifiers as the +programmer managed to come up with. In truth, there should be as +*few* qualifiers as possible. In particular many people seem to make +variables unsigned for no reason other than that they should never be +negative. That not only encourages integer overflow errors, but can +make the code much more complicated. Observe, for instance, this +piece of code, which calculates the column, corresponding to nth +character in some line: + + ... + for (off = 0, col = -1; off <= n; off++) + if (s[off] == '\t') + col = ((col+1)/8 + 1) * 8 - 1; + else if (isprint(s[off])) + col++; + ... + +col here should never end up negative, however it is still useful to +assign it to -1 initially to simplify the program, and possibly to +indicate an error. + +For the last I'll leave you with this bit of bad code that I've seen +too often: + + if (bad) + return 0; + else { + /* The rest of the function's code here. */ + } + +If you do that people will laugh at you. Instead write normally: + + if (bad) + return 0; + + /* The rest of the function's code here. */ blob - /dev/null blob + 50a094291b7d1bc6568c7c1c69c3dfe227bfbc7f (mode 644) --- /dev/null +++ art/fallout2.txt @@ -0,0 +1,368 @@ +I am quite partial to the games "fallout" 1 and 2, as I grew up +playing mostly those and some strategy games. So I was very happy to +find out one day that the second game has been mostly successfully +reverse-engineered and ported to sdl as [fallout2-ce]. Whilst the +memories are still fresh, I will here attempt to summarise my first +experience with the port. + + +INSTALLATION + +So, my first question was "ok, but does it compile on OpenBSD?" Well, +it does. Quite well in fact. The project uses cmake, for which the +author gets -15 karma. Initially compilation failed, I suspected some +lacking linking flags to be the culprit. Googling a bit I found how +to force cmake to actually print commands it uses, rather than just +uselessly report errors, and found that just as I suspected the +command lacked -L/usr/local/lib. It took me a bit more googling after +which I found out that I can set this flag by running cmake with +-DCMAKE_EXE_LINKER_FLAGS=-L/usr/local/lib. There weren't any +compilation errors afterwards and the game ran quite well after I put +the binary into the game's root directory and launched it as +`./fallout2-ce' (so the pwd is the game's directory). + +There turned out to be some problems with the data files then. +Firstly I had to change f2_res.ini a bit so that the window does as +little damage to my system as possible: I set WINDOWED to 1, and +later SCR_WIDTH to 640 and SCR_HEIGHT to 480. There still were some +problems with the mouse, however, to fix which I had to restart the +game. Also I noticed that the music sometimes would play, and +sometimes wouldn't. To fix that I made sure that all files and +directories mentioned in fallout2.cfg are named exactly as they are +mentioned there and also made four copies of all files in +sound/music: all-lowercase, all-uppercase, upper before period and +upper after period (e.g. 01hub.acm got copied to 01HUB.ACM, 01HUM.acm +and 01hub.ACM). The reason being, of course that somehow caseless +fopen is not yet implemented in this program. Also it later turned +out that one of the maps in addition to mixing case randomly has a +typo, so I copied 13carvrn.acm to 13carvrvn.acm. I vaguely remember +there being no music in the area in the original, but I often skip +Redding anyway, so perhaps its just a local "feature". + + +NEW CHARACTER + +I played a jinxed character once on normal difficulty without +investing much into armour class and ultimately ended up not liking +it. This time I thought "but what if I play on easy and invest as +much as possible into AC?" Well, this way it actually turned out to +be pretty fun up to and including New Reno, but I rushed the rest of +the game. The character was like this: + + age: 33 + gender: male + name: Dr. Scar (after the lion king character) + attributes: 1 luck and charisma, the rest is mostly even + traits: jinxed, heavy bruiser + tags: doctor (useful), lockpick (less useful), steal (which I + thought to be funny) + +The idea is to get HtH evade and tag unarmed once it can be boosted +to 300 thus. I decided that my character should be a somewhat chaotic +force, neither strictly evil, nor very righteous: I'd for instance +become a slaver, but would then help Modoc instead of slaughtering +some innocent farmers. + +My disappointment was almost immediate, as I noticed that for some +reason none of the giant ants ever seemed to crit miss, but they did +crit hit for 0 damage quite a lot. Found the issue pretty quickly and +spent the weekend reviewing the rest of the file. Fixed some other +bug, sent the diff to the owner. Now my fixes are part of the engine. + + +THE BEGINNING + +After that I decided to actually do Arroyo for once, instead of +immediately wondering in the general direction of the GECK. +Slaughtered a more-than-reasonable amount of the templar fauna and +actually kicked Cameron's butt instead of stealing the key from him. +I think I might have ended up poisoned with 1 health, however, so my +next stop was Hakunin's tent. Attempted refusing the main quest, had +to take it anyway, didn't respect the shaman, completed all local +quests available to me, went east to Klamath. + +At Klamath I talked to Ardin: told her how sad I am about Smiley, but +didn't offer to help. Instead went straight to "whisky" Bob, agreeing +to refuel his still; immediately decided it was not worth it and sold +him out to Sajag. Satisfied with myself I told Torr that I'll help +him guard his cows. As soon as two suspicious-looking men offered me +some cash to betray Torr as well, did that. Returning found out that +Torr ran in the least convenient of directions (for him), so I +decided to help him for more money; did just that. With my newfound +wealth I exchanged some of that and half the junk from around the +town for a suit of leather armour. Well-protected I went straight to +the rat-infested part of town to one-hit-kill the rat king. I did, of +course, take the fuel-thingy from the car, but later I decided to +stash it in a container until I can actually use it. I quickly forgot +which one, however, and never managed to install it. + +With that I went south to reach the Den. Immediately kicked all the +local children's arses. Took Rebecca's and Lara's quests; tried to +see what the traders have, but wasn't interested. "Got" Rebecca's +money out of Fred, by having him promise to make me a rich man +sometime in the future, but later I had so much money and so little +to spend it on that I forgot about that completely. Found Rebecca's +book. Tyler didn't to believe that I come from Metzger, so I put that +quest off for now. Agreed to destroy Rebecca's still for Frankie. His +whore demanded 1000$ from me, so instead I took "Mom's" quest and +listened to Karl's story. In the slaver's guild I delivered the radio +to Vic. After Metzger still demanded from me as much as that whore at +the Hole, joined the guild instead. After completing the slave runs I +bought Vic's freedom only to have the ungrateful bastard refuse to +follow me. In-between the runs I returned Rebecca her book, +immediately afterwards destroyed her still, delivered his (rather +cold now, I think) dinner to Smitty, completed Lara's quests by +getting Tyler so drunk he told me about his stupid party, and put a +woman's ghost to rest by beating Joey the local punk to the death. +With that I headed in the direction of the Vault City, skipping +Modoc. + +I found very few bugs in this section; everything went quite +smoothly. + + +THE MIDDLE + +This is my favourite part of the game. There is quite a lot to do, +usually with many possible solutions, but unlike some late-game +locations these feel much more like real places, rather than game +locations. + +Right, so, here is a very deep question to the writers: Valerie the +mechanic of Vault City is a product of Vic fornicating with one of +the female citizens of the city. Contrary to that fact, Phylis the +nurse (or whatever she is) tells us that while the decades +underground after a nuclear war have indeed made the people of the +vault 8 devoid of marital morality, it may very well be due to the +fact that radiation and incest have made them so sterile they are +only able to procreate artificially. Now which one is it? + +Arriving to the city I immediately went to the greetings office in +order to be very rude to both officers. After they no longer wished +to talk with me I found a local child's stupid doll so he would tell +me where I can find a wrench. I let my character internally curse Vic +after he'd found out how unhelpful Ed is and proceeded to purchase +advanced leather armour from the trader. I tried to fix the auto-doc, +but failed. + +At the front gate I had attempted to get a day pass as a slaver, +found out that I need to actually carry some "slaves" around for them +to believe that, and instead bought a fake citizenship and, extorting +my money back from the seller immediately after the purchase. +Entering the city proper I immediately turned to the bar to get +disappointed that they don't actually sell booze; sold the 20 bottles +I just so happened to be carrying upon my person. At the repair +"shop" I told Valerie to shut up because I already have the tools +she needs. At the library I got some free books, read the declaration +of the human rights, thought to myself "what sort of nonsense is it", +told so to "Thomas Moore" (right, and then the king of Vault City +becomes the head of the church and executes him as part of religious +genocide) and took some quests from the city's military captain. At +the council building I told Lynette that she was stupid for refusing +to inspect my pyjamas, but agreed to do her dirty work so that I can +get into the vault. + +Circling Gecko to complete the quest, I entered the town. At Gecko I +discussed humour and games with the local tavern owner and spoke to +Harold, Percy and Skeeter to take their quests. Went back to Vault +City, took my repair kit from Valerie, reported to the security man +and went back to Gecko with a hydroelectric magnetosphere regulator. +Back at Gecko I simply exchanged the repair kit for the car fuel +thingy and repaired the atomic station using the robot. Returning to +the city I looted as much as I could from the vault (one of the doors +got jammed and I decided not to reload) and found out about the vault +15. + +It was somewhere during the previous two paragraphs that I discovered +my horrible miscalculation. In the original you can delay picking a +perk for as long as you care: if you don't take one at levels 3, 4 +and 5, you'll have 2 perks to pick at level 6. My plan has been to +pick both tag and hth evade somewhere at levels 12-15. Well, it turns +out that the feature got fixed in fallout2-ce: now if you keep +adamantly refusing to pick a perk for 3 levels, you'll end up not +receiving an extra pick. Later I also lost 1 perk by accident: I must +have exited the character menu via the escape key rather than the +"done" button and never noticed it because I decided to stockpile +skill points for the next 3 levels. + +I turned west for the Den and decided to actually visit Modoc. I took +Jo's quest, healed Bess' leg, had all of Grisham's cows saved, sold +Bess to Grisham (of course, I never returned for the actual jerky), +went down the well to steal a very minor amount of money. I broke +down all of Rose's doors, bought an over-priced cookie from her, had +her force-feed me with some cows' bollocks. In retaliation for that +abuse I killed her "chicken". I told Cornelius I'll find his watch +and proceeded to descend into the latrine-cave. There I found my +first major bug: I can't remember ever dropping active dynamite in +this cave at it not exploding immediately as I exit (in the original). +Here, however, it would sometimes do the thing, and other times just +keep being "active" in the unexploded cave. I had to reload several +times. Finally I was able to tell Cornelius that Farrell stole his +clock. + +At the ghost farm I immediately noticed that the "corpses" are +dummies; after I have fallen through his floor, Vegeir confirmed the +peaceful ways of the mole people. I went back to Jo, telling him how +much of an idiot he and his fellow villagers (the game calls Modoc a +"town", but I am not Yankee enough to call every settlement with 3 +families in it a "town") are. There was peace between the starving +people and the mole people. I brought Jonny back to Balthas and +continued towards the Den. There I found Woody, told Karl his +compatriots decided to stop bullying him, got the car and got out. I +must have been planning on returning to Gecko on my way back to +Arroyo to complete the last quests there, but I never did. + +Instead for now I rode in the direction of Broken Hills. I actually +thought of going to New Reno initially, but decided to actually get a +power fist in Broken Hills first. It proved to be a prudent decision +later. I thanked God when the zombie under my car told me that he +isn't hurt, and just broken a few limbs. A horrible catastrophe +avoided! I went straight to Eric to tell him the good news. Instead +of rejoicing for my new friend, Eric kept complaining about cooling. +I helped in exchange for some pills. According to his advice went to +Francis. Used my skills acquired during my days as a slaver to offer +him some "free" amphetamines, waited 10 minutes for the mutant to +become weak and sluggish from withdrawal and ate doping myself. I +must have paid the Olympic committee more bribes than Francis because +they allowed me to walk away with a power fist. Talked to Marcus and +Jacob, took all their quests, wondering in the meantime what to do +with all these idiots. Brought a talking plant to the house of the +old ghouls, did some tasks for Typhon, while outsmarting a very smart +scorpion. Eventually found Typhon's stash of bottle caps, stole the +porn mag back from him as a punishment and went into yet another set +of lavatory-caves. There I discovered corpses of the missing people, +described the scene in detail to a grieving husband, told Zaius that +he is a terrible person and ordered Francis to leave the town. With +my newfound knowledge that mutants *are* a thread of society I +adopted racialism, rescued Mason and Franc from prison, told Zaius +that I am going to fix his air purifier, actually blew it up. With +the knowledge that now free of the international mutantry Broken +Hills will grow into a great and powerful Broken Reich, colonising +all the lands to the east, I left the town. + +As I arrived to New Reno I initiated dialogue with Jules just to tell +him to shut up and instead looted Jesus Mordino's casino before +taking a job from him. Now, here's another question: why does taking +this job takes the player character straight to the "stables"? Can't +it just mark those on the map? Anyway, the stables are pretty boring +this time around. I just told Ramirez what a buffoon he is before +delivering his poison and stole a few things from Myron. Back at New +Reno I discovered that somebody stole my car. I'd verbally abused +Jules until he showed me the place. I solved the situation by buying +my own car back and getting it upgraded. After I reported back to +Mordino he told me to get his tribute from the pornographers. The +issue here is that for some reason those guys refuse to talk to +slavers, who aren't also adopted by one of the bosses, or have kicked +enough people at the boxing ring, so instead I took a quest from +Mordino's rival Salvatore, stole batteries from him and his goons and +started working on getting a more powerful unarmed weapon. The thing +about it is that the "mega power" fist is not actually that much +better than a normal one, but it is very tricky to get normally. So +instead I decided to do what I don't do normally and get my weapons +upgraded for free by the madmad beneath the New Reno arms. Once that +was done I became a boxer, beat up all the other boxers, got the +tribute from pornographers, delivered it to Mordino, completed all +the Salvatore's quests, poisoned his air, killed all his goons, +reported to Mordino and made him choke on nuka cola. After that I was +still lacking one porn mag for miss Kitty, so I fornicated with mr. +Bishop's wife, and robbed the family of their possessions. +Unfortunately I was unable to disarm the trap on mr. Bishop's own +safe, so I had to hide under his bed. I also wanted to plant my own +trap on it, but found myself unable to do that either. In the end I +just walked by Bishop back to his casino. + +This is another bug, actually. Walking two tiles past the door is +supposed to trigger dialogue, out of which there'll be no escape +other than through dozens of corpses or chickening out of the +building. Well, it didn't. Another bug that I first noticed at New +Reno, and which would become more and more annoying as the game +progressed is that sometimes performing attacks or interacting with +items would segfault the game (but not the other times, so it +probably has to do with faulty (re)allocation, or randomness). + +At NCR I first and foremost talk to the local punk, who offered me to +guard my car, in exchange for which I offered him a rude gesture. NCR +is pretty weird. Entrance to NCR is a bit weird: it seems to be the +only place in the world with a newly-build parking slot for cars. +Just one. Actually some dialogue in fallout 2 would suggest that +there are at least a few car-drivers in the area. How come it's not +explored further? Anyway, what I gave the local bum 1000$ to work on +my car, took quests from the slavers and the mafia and entered the +city in the morning. Entering the city I was a bit surprised that the +sheriff offered me a job for Westin. Instead of doing this right now, +I stole some papers from a local researcher, stole maps from the +rangers, killed a suicidal policeman, killed a cultist (while +sneaking) and kicked the president's son a few times in the eyes, +breaking his nose thus, took the quest from the president and +completed the one for Westin. I didn't invest into outdoorsmanship, +so failed to discover the vault 13. Returning to NCR I handed the +papers I acquired earlier to Merk and bought a disc with the fake +13's location, discovered it's a fake, killed Merk for refusing to +give me a refund. + +I went to the vault 15, one of my least favourite locations (I've +actually been thinking about just buying the map from the doctor, but +ended up a little short on money). Rescued a local woman's daughter +from raiders and went underground. There I sneaked past the guards on +the first level, which turned out to be pretty useless, as the +computer room's guards noticed me anyway. I thus learned of the vault +13's location and retrieved computer parts, but was forced to fight +my way back through the raiders. I didn't kill Darion because both I +and probably my character considered him to be too tough. + +After giving Tandi her parts (and not exposing the spy because I +didn't know that there was one) I was finally able to arrive to the +actual vault 13. I attacked the deathclaws on sight, retrieving the +GECK at the end, thus proving genocide to be viable solution to any +problem. + + +THE END + +I went back to Arroyo in an almost straight line after the village +-idiot- shaman called me. Then I realised that I still don't have +HtH evade, so instead of going to San Francisco rode to the +Experience Town of Redding. This is where I ran out of Salvatore's +batteries, so my adventures ended rather abruptly after I crashed +a dozen times fighting Frog Morton's goons, so instead I just +killed Frog himself and ran away with, like, four batteries left. + +The Shi merchants turned out to be on the other level than myself: +selling all those tiny nuclear reactors and gauss rifles. Well, +what about small batteries? This is my least favourite location in +the game anyway. I took the quest from the brotherhood of steel guy, +arrived to Navarro, killed the guy in the front, went into the +facility via the tunnel, grabbed all the equipment I could find, +did the usual, got the commander's guard drunk, killed the commander, +looted his office, ran away. + +Back south I saved a damsel in distress on a tanker, fixed the ship's +navigation while at it, got the damsel's boyfriend to get the fuel +from the Shi for me and went for the final dungeon. + +Again during this section game seemed commited to not letting me win, +instead segfaulting on every 5th attack I made. Also the aliens and +floaters would often fail to initiate combat when I was walking right +by them. + +There I encountered what I am pretty sure was a bug. I first tried to +get the people around the president drunk, get my sneak skill up and +kill him silently. I think it should have worked, but it didn't. +Somewhat disappointed I tried to blow him up: then I discovered that +somehow neither he, nor I take damage from explosions in our pants. +At last I was forced to commit murder by superstimpaks. Finished the +game by stuffing dynamite down the trousers of a researcher near the +reactor and having the turrets shoot Frank Horrigan to the death. +Once more the turrets didn't attack Horrigan immediately, though I am +quite sure they are supposed to. + + +FINAL BUGS? + +I am pretty sure I didn't get all the ending slides I was supposed +to. + + +REFERENCES + +[fallout2-ce] https://github.com/alexbatalov/fallout2-ce blob - /dev/null blob + 910198be383063638589fe320439434acadc1355 (mode 644) --- /dev/null +++ art/freegames.txt @@ -0,0 +1,388 @@ +Even if I didn't know how to vocalise it, I considered the human +civilisation to be in a great decline since I was in the middle +school. Barbarians are very much at the gates, except this time +we who consider ourselves civilised are the barbarians. + +There are quite a few things so important to the civilised society +that they precede even the formation of formal hierarchies. Chief +among them is, of course, agriculture. I don't think I am very well +qualified to judge the state of that, I will just say that only Islam +preserved that relatively intact in some places for the Moslems have +a need of the halal food. Then on his road to civilisation man also +needs to form a spirituality, for how else is he do be guided in his +decisions? In spite of that, the fact that we somehow managed to kill +Him within ourselves has been noted a couple of centuries before, and +things are even worse now. Civilised man also has a need for science, +as a civilisation without knowledge ceases to be civilised. The fact +that science is dead should be obvious to any graduate of a +university: we killed it with patents, standards and so-called +"antiplagiarism." Finally, a civilised man has a need for culture: +art and games, that which makes him satisfied intellectually. I am +very much convinced that we are on the road of replacing all art with +commerce and politics. + +If we are to somehow slow down, or even reverse that process, I +believe that we need more art unburdened by propriety, licences and +cheap political messages. In particular that concerns computer games, +which at first weren't really considered an object of culture and +received instead the same terrible treatment that software +development did outside of the very few places, and which later +largely transformed into a monster similar to the BBC and Hollywood. +(Or Netflix and HBO, or whoever produces that rubbish nowadays.) + +Unfortunately, even the people who understand the importance of being +free to have a culture usually concentrate so much on the +software-related aspects (DRM, freedom to inspect/modify the code, +etc.) that they forget completely that this artificial legalese +surrounds all other aspects of art as well. In computer games it is +now common to refer to all the more "traditional" (not programming) +art involved as mere "assets." In fact, it is somewhat common even to +allow the copying of the code, yet forbid that of the "assets." I +say, however that the assets are equally as important! There already +are countless programs we've lost due to the human greed and +commercialisation of art (yes, the art of computer programming), I do +not think that anyone reading this will need much convincing to +accept that statement. Yet there are also countless of "assets" we've +already lost due to the same stubbornness and vanity. Just look up +what happened to the early episodes of Doctor Who! + +With my philosophy clearly stated I will proceed to list the games I +managed to play that were free completely -- i.e. neither the code, +nor the "assets" were burdened too much. Expect many more to appear +in the future. + + +ENDLESS SKY + +https://endless-sky.github.io/ + +This must have been the first completely libre game that I have ever +played. At the time I was writing my baccalaurean diploma, and +whenever I do such projects I find it to be a good practice to take +short breaks and do something that is neither very mentally taxing +instead, nor allows my brain to retreat into the automatic state +completely. So far, nothing has been able to fit this description +entirely, but Endless Sky did come closer than some other things I'd +tried. + +The game is pretty typical of the other top-down exploration/trading/ +combating games. For the most part it consists of going to planets +and taking missions, considering one's travel route against the time +it'd take in order to maximise the profits. It also has quite a few +special missions, which make it all much more interesting. Overall, +the game really is quite impressive, however it is also not hard to +notice that many things in it are unfinished. In particular that +relates to these campaign-missions and the areas of the map that +become explorable afterwards. The former, it feels like, should have +much more branchings that should have a much bigger impact, while the +latter feels a bit too empty. + +In conclusion, Endless Sky is a fantastic game that I can recommend +to anyone, and I wish the people working on it the best of luck. + + +BSD GAMES + +Historically there've been a lot of games written for BSD that are +now usually available on most modern BSDs in /usr/games/, and can be +installed on Linuces from packages like bsd-games and similar. Most +famous of these games is probably rogue(6), which had many +descendants. I managed to play most that come with OpenBSD. + +- adventure(6) is a bit of a classic. The later "adventure games" get +this label from it. The manual is very brief stating that part of the +game is figuring out the rules, and only stating that "quit" is for +quitting and "suspend" is for quitting but saving. Thankfully, when +launched, the game does provide a little bit of help and says that +further help is provided by commands "help" and "info." Otherwise the +game is played very much like the latter text-based adventures it +inspired: the player types one, or two words per command, consisting +of a verb and a noun, though one of the two can be omitted if it can +be inferred from the other. In order to play this game I also had to +draw the map on paper, which I wish more games would have forced me +to do. Another interesting feature of adventure(6) is that saving the +game involves quitting it, and then waiting at least 45 minutes +before continuing. It probably made quite a lot of sense when it was +originally written, and many people would connect to the same +mainframe from a terminal for a limited time, and even now I wish the +games would do that so that the player may also spend his free time +doing other things. Oh, well, at least most new games aren't as +insistent on the player not quitting as Id's games. + +Unfortunately, adventure(6) would also lead to the issues that still +trouble similar games, namely that they are impossible to complete +while playing in any other way than through the players' collective +wisdom: really, how on Earth was I supposed to know that spooking a +giant snake is a matter as simple as releasing a small bird onto it +for some reason? Somehow I did manage to complete the thing through a +combination of my own wits, googling and backing up my saves, but in +the end I only received 330 out of 350 points, becoming an annoying +single point short of achieving the next rank. + +- arithmetic(6) prints rather simple expressions like "6 + 5" and +"14 - 9" and waits for the user to input the answer. Occasionally it +also prints out the score. Not the most challenging, or creative +game. + +- atc(6) is a brutal game. The man page states: Suspending a game is +not permitted. If you get a talk message, tough. When was the last +time an Air Traffic Controller got called away to the phone? Neither +the rest of the man page, nor the game's UI were very telling: just +like a certain Monty Python character the only thing I know about +planes is that I flew some (and that the only worse travelling +experience I've had was in cars -- even metro at peak hours is +somehow better.) The controls are also quite hostile except for the +majority that types on QWERTY. Even for a player that managed to get +through all these things nothing but stress awaits -- and no wonder, +it puts the player into control of air traffic. Personally, I gained +a new appreciation of just how relaxed Doom is through atc(6). + +- backgammon(6) is what it sounds like. It also includes the tutorial +invoked as teachgammon. Unfortunately, I have never had the pleasure +of playing actual backgammon, but I can recall trying to play nards, +which is a very similar games of Persian (I think) origin, mostly +known among the various Caucasian and Russian (and maybe Iranian, but +I wouldn't know) peoples. I've heard it's particularly popular among +the Armenians. Like most users of Unix I don't have a single friend +that understands a single sentence coming from my mouth even when I +merely quote, so in I went against the computer. I was, however, +rather worried. Strangely enough it was when I was writing my +diploma, which ended up having nothing to do with backgammon anyway, +that I discovered that backgammond is among those games, which +computers can't play effectively using only classical game theory. +Rather the only known more-or-less efficient backgammon-playing +programs so far have used some learning algorithm, or as they are +known among the proogers, the neural networks. + +In any case, in I went typing "teachgammon" into my terminal. A bit +of surprise was that a lone piece (called "man" in this version) does +not deny the opponent's moves to the same position, but rather +becomes vulnerable, as the opposing man can land on him (it?), +sending the unfortunate man to the bar (position 0). On the next +turn the player will first have to bring all his men from the bar +before he or she is able to perform any other moves. I *think* this +is not the case in nards, where a piece cannot land on another, no +matter how many are there. Also, I think that in nards all pieces +start at the first position, rather than begin somewhat scattered +already. + +Moments later I played a couple of parties as red because additions +are easier that subtractions. As I discovered, however, either this +is one of the good AIs, or I am completely, or I am completely +untrained myself. + +- banner(6) and banner(1) are actually two different programs, though +their purpose is identical -- the printing of huge letters out of +number signs (#). Example output: + + $ /usr/games/banner .. + ###### + ########## + ############ + ############## + ############## + ############## + ############ + ########## + ###### + + + ###### + ########## + ############ + ############## + ############## + ############## + ############ + ########## + ###### + + + $ /usr/bin/banner Unix + # # + # # # # # # # + # # ## # # # # + # # # # # # ## + # # # # # # ## + # # # ## # # # + ##### # # # # # + +- bcd(6) transforms input into an ASCII art representation of punched +cards and back. Sorry, but I am born too recently to know what it +means. + +- boggle(6) -- I don't even know. + +- bs(6) means "battleship". In real life the game is only slightly +better than naughts-and-crosses and is thus only played on the +especially boring occasions. Here it's not even multiplayer. + +- caesar(6) also invoked as rot13 attempts to decypher Caesar's +cypher. There is probably a reason for this utility to exist... + +- canfield(6) & cfscores(6). Although I am often critical of windows, +I don't think it's a completely terrible operating system. No OS that +features minesweeper can be such. Solitaire, however, is most +definitely a mistake. What even is solitaire? And you know what +canfield(6) is? Solitaire for Unix! + +- cribbage(6) -- another card game. + +- factor(6) and primes(6) work with the prime numbers. factor(6) +prints all prime factors of a number and primes(6) lists all primes in +a range. + +- fortune(6) prints silly messages. + +- gomoku(6) is a sort of naughts-and-crosses-on-19x19 board. The AI +is terribly slow as well: it may take dozens of seconds to think its +move. + +- grdc(6) turns the terminal screen into a huge clock. Better than +xclock(1)! (which doesn't even seem to ever find an appropriate font +to use). + +- hack(6) is like rogue(6) but full of bugs... + +- hangman(6) is pretty much what one would have expected. + +- hunt(6) is among the multiplayer BSD games that work on OpenBSD. +Unfortunately, I don't really know a lot of people that'd be willing +to try that out with me. + +- mille(6) -- yet another product of Ken Arnold's overactiveness. +Seems to be a multi-player clone of some existing board game. I +did't go too much into details. + +- monop(6) -- ah, yes, monopoly on my terminal. + +- morse(6). Let me demonstrate: + + $ echo morse | morse + dow daw + daw daw daw + dit daw dit + dit dit dit + dit + + dit dit dit daw dit daw + +- number(6) reads number and converts it to English like so: + + $ number 129 + one hundred twenty-nine. + +Of course, 129 as read as "one hundred *and* twenty nine," but oh +well... + +- phantasia(6) unfortunately requires some other human beings to play +with and doesn't work on OpenBSD anyway. + +- pig(6) translates sentences from English to pig Latin. Shame +bsdgames are usually not installed by default with most Linuces, +otherwise it'd be useful at work... + +- pom(6) displays the phase of the moon similarly to how date(1) +does something useful. + +- ppt(6) is a close relative of bcd(6), so I don't know what it means +either. + +- quiz(6) the player some questions on a topic. Funnily there have +been quite a few very simple women that tried to convince me that the +quiz TV programmes are somehow educational. Well, sorry, but both the +quiz programmes and programs are the opposite of educational. + +- rain(6) plays a nice animation. + +- random(6) can either print random lines from input, or random +numbers, e.g.: + + $ man random | random + RANDOM(6) Games Manual RANDOM(6) + + NAME + random – random lines from a file or random numbers + SYNOPSIS + random [-er] [denominator] + + DESCRIPTION + must be at least 1, its default value is 2. + The options are as follows: + -r The -r option guarantees that the output is unbuffered. + + SEE ALSO + OpenBSD 7.2 August 23, 2022 OpenBSD 7.2 + +- robots(6) is quite a lot of fun, actually! It's very simple as +well, so I'll finish that at that. + +- sail(6) is currently same as phantasia(6), unfortunately. + +- snake(6) is pretty similar to robots(6). + +- I'd probably be more surprised were I to not find tetris(6). + +- trek(6) is in somewhere between adventrue(6) and hack(6). It is +pretty complex, but pretty fun nonetheless and can be played without +first having to find anyone interested. Unfortunately the +documentation is rather weird. The man page only gives a brief +overview explanation of some commands, while the actual doc is not +distributed with OpenBSD. Oh, well, I do have the sources: + + $ tbl /usr/src/games/trek/USD.doc/trek.me | groff -Tascii | + less -r + +Basically, the player is given a space-ship that responds to a number +of commands. A limited space is shared with several enemies friendly +planets etc. All enemies have to be destroyed before time runs out. +Personally I found the game to be very well-made and would argue that +it is a great example of how games should me made. + +- wargames(6) is a very strange game indeed. My version is +implemented as a small shell script. Here is the code: + + echo -n "Would you like to play a game? " + read x a + x=`/usr/bin/basename $x` + + if [ -f /usr/games/$x ] ; then + tput cl + exec /usr/games/$x $a + else + echo "A strange game." + echo "The only winning move is not to play." + fi + exit 0 + +- worm(6) is of the variety where apples make the worm bigger, not +the one where worms from the team A drown the ones from the team B +by exploding the ground they stand on. + +- worms(6) is another nice animation. + +- wump(6) is mostly a luck-based game. Like adventure(6) it features +a non-Euclidian cave. One room in this cave contains an evil wumpus +that has to be killed by guessing, which cave he is in, while some +others contain bottomless pits and bats. Fortunately, the player is +told which room he's in, which rooms are nearby and if there are any +bats/wumpuses/pits closely. Unfortunately, the player is never told +which ones are the dangerous rooms before it is too late, so really +there is no way to win other than by guessing. + + +ANARCH + +https://gitlab.com/drummyfish/anarch + +The game's made by one Miroslav Chizh of Moravia, quite an +interesting man (though personally I disagree with a lot that he +claims to believe). It mostly plays like a generic Doom clone. The +achievement here is mostly technical. Being a programmer myself I am +at a disadvantage when actually trying to describe any code. It is +also further complicated by the fact that Miroslav is one of those +annoying people who think that placing two extra spaces at the start +of a line indents it by one extra level. An interesting part here is +that the game has quite clearly defined back- and front-end, which is +most unlike other games, which rather only divide data, state and +logic. blob - /dev/null blob + 182dd4ddc594a4e6d13b410879e26226fdd64e5b (mode 644) --- /dev/null +++ art/git.txt @@ -0,0 +1,101 @@ +Using git + +Most tutorials are pretty bad because they can only attempt to give +you some surface-level overview, and scarcely any give you leads on +further research. Git seems to be one of the worst examples of the +trend, and yet the irony is that git is very simple. All you really +have to do to understand git is type `man gittutorial'. The command +is very deceptively named: by the time I started using Unix, and so +have learned of the great blessing that is actually having your +operating system, and most software under it come with a manual, I +already knew a bit of git, so I thought "I don't need yet another +tutorial, I need a manual!" Well, more than a year later it turned +out that although gittutorial(7) indeed is a tutorial, not very +useful by itself, manuals it references are. Particularly, +gittutorial-2(7) and gitcore-tutorial(7) contain an actual +explanation of how git works. + +So, my biggest suggestion is to read gittutorial(7), and some of the +further pages it reference. Do it now, and return if you want to +read the rest of the article for some reason later. + +OK, you should have read or skimmed through at least gittutorial(7), +gittutorial-2(7), gitcore-tutorial(7), gitglossary(7) and +giteveryday(7). You should be able to say what things like "HEAD^^^", +"refs", "objects", "branches" and "tags" are (and not merely what +they might mean). In the next section I will tell why I think git +(both porcelain and plumbing) is quite good, actually, and how to +really appreciate the system. + + +BACKEND (PLUMBING) + +Git's backend is awesome! This should be obvious to anyone who've +read gitcore-tutorial(7), and to whom Unix is more than just "that +server OS I have to deal with at work". + +The git repository is just a dumb filesystem. It stores two things: + +1. Every bit of content ever to be recorded as an object (a blob or a + tree). The objects' format accounts for the deficiencies of some + filesystem, so you may even store your git repository on a + FAT32-formatted flash drive (though why would one do that I am + uncertain) +2. A bunch of references so that you don't have to memorise each + object's hash. In lieu of not all filesystems supporting actual + links, these are just text files. + +Unfortunately, the objects' binary format makes them less immediately +useful because you can't use normal Unix commands with them (though +you can with references). Instead git repositories should be treated +somewhat like an archive, except instead of tar/cpio/whatever you +type `git'. With that in mind it becomes simple (if not exactly +convenient -- that's what the frontend is for) to, e.g., print each +"file" (object) "below", e.g. master: + +$ git ls-tree .git/refs/heads/master +100644 blob file1 +100644 blob file2 +040000 tree dir +... +$ echo "here's file1:"; git cat-file blob +... +$ echo "here's file2:"; git cat-file blob +... +$ git ls-tree +... +# repeat with each object + +With commands like these it becomes very much possible to implement +some convenient frontend via scripts. In fact, that's how git used +to be, but now they have the entire front-end in C as well (for +speed, presumably). + + +FRONTEND (PORCELAIN) + +Git's frontend is, perhaps, its most chided part. Some of the +criticism is true. Personally I dislike how many commands use such +long and hard-to-type options. When I complain people often answer +that I should use tab-completion. My counter is usually that +tab-completion should not be needed in the first place, and instead +we ought to do better more when designing interfaces. + +A lot of complaints, however, comes from the people who never took +their time to understand the system, and now don't understand what is +it they are interfacing. Such is often the way. + +The important points for ergonomic use of git are: + +1. Understand the backend -- much in the frontend's man pages is + written from the backend's point of view +2. Read git-rev-parse(1), which will allow you to type things like + "@^" instead of "HEAD^" +3. Use branches and, perhaps, tags to mark the immediately important + commits -- you can then type "git diff master mybranch" instead + of first scanning "git log" and then "git diff " + +Once you've got that, read giteveryday(7), and whatever frontend +man pages you are likely to need. Some of them are quite a bit longer +than they should be, but only some of that is of immediate +importance. The rest can be referenced as needed. blob - /dev/null blob + 323441044ae604a346c3404fb64fe0ccf9d2090a (mode 644) --- /dev/null +++ art/isolated_wwwbrowser.txt @@ -0,0 +1,100 @@ +Nowadays it is often necessary to use either firefox, or chromium for +tasks that you'd think to be basic enough not to require anything +special. These programs are so huge that they tower over the Linux +kernel like Goliath did over David, and even worse they are meant to +do the stupidest thing since the dawn of networks -- connect to +untrusted hosts and interpret arbitrary scripts supplied by them. +Truly we live in a dark time! + +Anyway, it is actually pretty simple to isolate this great evil from +the parts of your system that you probably don't want it to touch, or +even see. The method consists of launching the offender inside a +nested X session under a different user. There are particular +benefits to doing that on OpenBSD because both browsers are further +limited with unveil(2) and pledge(2), meaning that their visibility +of the file system is limited even further, and the amount of +available syscalls is much less crazy too. + +Nevertheless, it should work on other Unices, just as long as X is +available. There you might, however, have to do your own research on: + +- setting up sudo; +- setting up disc quotas; +- setting up other limits (CPU time, memory, &c.); + +On OpenBSD read at least the following man pages: Xephyr(1), +xauth(1), useradd(1), doas.conf(5); and the FAQ 14: +https://www.openbsd.org/faq/faq14.html . + +For the basic set-up we change permissions for our own home directory +to 750 because we are paranoid and create a new user: + +# chmod 750 /home/mainuser +# useradd -m anotheruser + +A nice thing about OpenBSD is that the resources that any process, or +user may employ are already pretty limited, with some allowances made +for the staff login class (naturally, we'll be keeping anotheruser +outside of staff). For setting up a disc quota, consult the FAQ, +however. You may also put some other restrictions, for instance +limiting printer access to users inside the printer group: + +lp|someprinter:\ + ...\ + :rg=printer + +Of course, if you do stuff like this, it only makes sense to +have your firewall limit anotheruser's access to either most of the +local network, or at least some addresses. And you don't have to stop +there, but I will just for the moment. + +As for giving anotheruser an environment, where he may be *allowed* +to do some things, you can use a simple script: + +#!/bin/sh + +umask 077 + +[ $# -lt 1 ] && set -- :10 -screen 1280x720 -no-host-grab +Xephyr "$@" & +xephyrp=$! +ps -p$xephyrp >/dev/null || exit 1 +while ps o stat -p$! | grep -Fq R; do :; done +ps -p$xephyrp >/dev/null || exit 1 +trap 'rm -f $tmpfile; kill $xephyrp 2>/dev/null' EXIT INT HUP + +for e in $(export); do unset $e; done +export PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin +export DISPLAY="$1" + +tmpfile=/tmp/$$ +[ -f $tmpfile ] && { + echo "ERROR: temporary file $tmpfile already exists" >&2 + exit 1 +} +: >$tmpfile +xauth -qf $tmpfile generate $DISPLAY . trusted +nlist=$(xauth -f $tmpfile nlist $DISPLAY) +rm -f $tmpfile + +doas -u anotheruser /bin/sh -l < + action "in" maildir "%{user.directory}/mail" + action "out" relay tls no-verify pki example.com + + match from local for local action "local" + match from any for domain example.com ! rcpt-to root action "in" + match from local for any action "out" + +Do, by the way take a look at aliases: you might, for instance, want +local mail to root to arrive to another user instead. + +Set up thus, our server will refuse to talk with others over +plain-text, meaning less spam. If that bothers you, read the mans (or +just remove "tls-require"). And no, the server doesn't handle +authentication: that is done with ssh below. + + +SPAM? + +You might have noticed that we are not running any spam-filters on +the server itself (other that denying external mail to root). You +might have also noticed that I introduced the mysterious line +`smtp sub-addr-delim "_"'. This line is responsible for the vast +majority of spam-filtering anyone will ever need. With this mail to +alexander@example.com, alexander_smith@example.com and +alexander_alexander@example.com arrive to the same user alexander, +while the assholes of the internets are none the wiser because +underscore is a character commonly used for actual usernames, but not +subaddresses. Now, simply use different subaddresses for different +purposes, and perhaps employ some subaddress-based whitelist with +procmail or something like that. + +Beyond that, however, there is spamd and rspamd, which also contain +interesting stuff like spam traps, or denying mail with bad helo &c. +Just don't use those horrible blacklists, please! + + +CLIENT + +This section used to contain my set-up for the set of maildir +utilities mblaze, but that proved to be too much of a moving target. +I therefore leave most of the MUA set-up up to the reader, and only +describe the way of emulating an MDA and MTA with ssh. + +To get mail, create a script, say, "msync": + + #!/bin/sh + + while :; do + cd $HOME && + scp -r user@example.com:mail/new/ mail/ 2>/dev/null && + find mail/new -type f -exec \ + ssh user@example.com rm {} + 2>/dev/null + sleep 3600 + done + +It may be called automatically from, e.g., ~/.profile: + + while :; do + ps xo args | grep -q msync$ || msync + sleep 10 + done >/dev/null 2>&1 & + +Some shells know what a maildir is, and if you set the variable $MAIL +to the path to you maildir, they will notify of your mail. Otherwise +you may put something like this in you, e.g., ~/.kshrc: + + ls $HOME/mail/new/* >/dev/null 2>&1 && echo You have mail. + +And sending mail is as simple as creating this script: + + #!/bin/sh + + ssh user@example.com sendmail "$@" + +Now either call it "sendmail" and put it in your $PATH so that it is +found before the actual sendmail (if any), or configure your MUA to +use this script instead of sendmail. + + +DKIM + +If you take this set-up and go to mail-tester.com, you are likely to +get 9/10 with -1 being for DKIM. It means that the absolute vast +majority of mail servers in the entire world will accept you mail. If +you still want dkim, do the following on your server: + + pkg_add opensmtpd-filter-dkimsign + mkdir -p /etc/mail/dkim + doas -u _dkimsign openssl genrsa -out /etc/mail/dkim/private.rsa.key 1024 + openssl rsa -in /etc/mail/dkim/private.rsa.key -pubout + +Add the following DNS record: + + ._domainkey.example.com. 680 IN TXT "v=DKIM1;p=" + + can be any string and is the one that we just +printed printed (it'll be over several lines, make sure to paste +it all without whitespace). + +Finally, add this to /etc/smtpd.conf + + filter "dkimsign_rsa" proc-exec "filter-dkimsign -d example.com -s \ + -k /etc/mail/dkim/private.rsa.key" user _dkimsign group _dkimsign + listen on socket filter "dkimsign_rsa" + +Of, course, make same here as it is in the records. + +This *should* do it, but I give no promises. If you want the key to +have more than 1024 bits, you'll also need to spread the selector +across several strings in the DNS records. And even with 1024 you +might have to do it. I don't even know. + + +REFERENCES + +[blacklist checker] https://mxtoolbox.com/blacklists.aspx blob - /dev/null blob + 11f01c7c951e7c5575572c5d6fe004071d055e4c (mode 644) --- /dev/null +++ art/oldgames.txt @@ -0,0 +1,251 @@ +I can name a few modern games that I thought were quite good. Most of +them, however, aren't. I have, however, played of quite a lot of +older games that are way better than anything that's being spat out +into Steam nowadays. The best way to play most of these games would +be by getting them from GOG, or sailing the Seven Seas should that +option no longer be available, as it is in some cases. Note that this +list will only contain games that I still regard to be commercial. +For the free games see my other article [free]. + +Just as the [free] list, this one will most likely be expanded in +the future, as I find that I play a lot less games now than I used +to, but when I do, it is usually something classical or libre. + + +FALLOUT 1 & 2 + +Once my sole two favourite games. They still hold a very special +place for me. + +Before we go further, I should note that I am far from the only +person that noticed the two games' genius, which in the world of +commercial games unfortunately means that the thing became a +"franchise." "Franchise" is one of these strange words like +"commerce," whose literal definitions are completely neutral, but +whose responsibility for the sorry state of the world we live in +becomes apparent, once we examine how it is used in the context of +pseudo-propriety -- one that is immaterial, and only exists due to +the spread of some silly legal notions from Victorian Britain. And +in the context the meaning is following: a great many of +barely-related mediocre products are being inhumanly overprice +through the tactic of putting the word "Fallout" in the name and +changing the font. + +As far as Fallout goes, I however, am interested mostly in the real +thing -- the first and second games. Of course, that is not to say +that there weren't any other games unfortunate enough to find +themselves part of a franchise that weren't all that bad. I actually +quite enjoyed Tactics and 3 the first time through, and completed +New Vegas many times, as it does constitute a bit more that some +surface relation with the thing it's named after combined with the +desire to sell. However, even the latter fails to bring the same +feelings as I have about the originals. + +Now to my mind, Fallout is one of the few games that I became +attached to for reasons other than interesting gameplay. Rather I +have to say that the gameplay is not marvellous safe for one or two +qualities. Rather it is unique because every time I play I find +myself sucked into the illusion of controlling a character living in +a real world. That's not to say it at all makes sense! the plots for +both the main quest and the side-quests are rather basic, even the +most well-understood areas of physics are constantly contradicted and +there is quite a bit of paranormal along with the fourth wall breaks. +(and no, the second game is not the only one that suffers from it!) +However, once those things are dismissed, one does begin to +appreciate how this world functions: visiting each settlement, the +player discovers that just like the human settlements it does have +an economy, law, crime, science, culture, infrastructure and all the +other features of human settlements, however brutal and primitive at +times. The player further discovers that all those settlements are +interconnected: in the first game there is already a lot of trade and +some warfare going on, and in the second many settlements form +polities, and so often establish the more political relationships. +In all that, the player's character is not a mere observant, but a +participant: the fate of many such societies depends on the player's +actions, and sometimes the same decision alters the history of +several. + +The gameplay, as I alluded, is not crazy, but it's not all that +terrible either. It all starts with building the character. When I +first played I was probably very impressed by the amount of different +specialisations my character could take. Now, however, I know that +there is a large part of these choices that is completely useless and +never comes up. Still, what does come up does so frequently and +allows the player to solve the quests he or she is given in many new +ways, usually the expected ones. There are also some things that +don't require any special input of in-game experience points, but +rather that of the player's attention. There are many options for +instance where wearing different clothes might result in different +reactions from the characters, or there are quite a few things that +can be solved with explosives. + +And then there is also combat, which many people seem to not enjoy +that much, but in spite of it being clunky on the surface, I do think +that it is a bit more nuanced than people give it due. Largely this +is because Fallout might be the only game I've played where missing +is made fun. Misfired shots have a great possibility of landing on +another target. Allies are often killed by accident. There are the +critical misses where the unfortunate character may drop his weapon, +hit himself (to the death, possibly), or maim one of his limbs. +Overall, combat in Fallout is not very technically impressive, but +it is definitely not boring. + + +DEUS EX + +Deus Ex is yet another game that had the misfortune of becoming a +franchise. I think only of the first two games to be much enjoyable +(even though many will disagree with me on the second), and only the +original to be worth returning to. + +I consider Deus Ex to be one of the best designed games I've ever +played. It differs from most games -- even the other "immersive sims" +I've played in that instead of presenting the player with a set of +options on how to solve a particular problem, but instead presents +him or her with a set of instruments and asks the player to instead +figure just it out, whichever way seems to be the best. What's even +more interesting is that each time this set of tools will be +different not only because the player will find different general +items and invest into different skills, but also because unlike with +most such games, levelling is not done entirely through the experience +points. That is, in addition to the more traditional skills, there +are also nano-augmentations (i.e. with nanites), which are much more +interesting than normal skills, as they essentially give the +protagonist super-powers. There is, however, a catch: the set of +augmentations that the player will be able to take depends entirely +on the augmentation-canisters that he will be able to find. Many such +canisters are also applied to the same part of body, limiting the set +still further. All of it makes each playthrough actually unique even +in spite the seemingly linear plot and set of missions. + + +ARCANUM: OF STEAMWORKS AND MAGICK OBSCURA + +After the first Fallout was released, some of the main people that +worked on it had some disagreements on what Fallout 2 should be like, +so they left to create their own studio named "Troika Games," and +quite aptly proceeded to make three games before running out of +money. The other two are somewhat interesting as well, but their +first project Arcanum is what really impressed me. If I were to +describe the game in one sentence, I'd say something along the lines +of "A bigger Fallout in a different setting and without the +misfortune of becoming a franchise." + +So, the first point is that the game is much bigger than Fallout. By +that I mean that the world-map is huge and has more than a few +locations that are never pointed out, which the player can only find +by randomly coming across them. Another thing that I mean is that the +local maps are now so great that there is even a special mechanic that +allows the player to place waypoints and allow the character to +automatically follow them. I should say that normally I would +consider this to be a sign of bad things to come, as such huge maps +are usually only so huge because they are filled with void. Somehow, +however, Troika has managed to avoid this trap, and instead make the +world both grand and interesting at the same time. + +Then there is the setting. I usually don't talk much about settings +in anything, as there is mostly not much to talk about. And I +specifically dislike that vile notion of "lores." I mean, supposedly +the word used to mean something, and if one opens a dictionary, one +could probably still find a sensible definition, but at this point +the mere utterance of the word makes my brain go into the automatic +mode for half an hour. In spite of that, I do think that what Arcanum +presents is a rather unique setting, not found elsewhere, and is +worth at least mentioning. Like the name suggests, the game is set in +a Tolkienite world during an industrial revolution. Even in real life +the industrial revolution was a strange time: technological marvels +and definite improvements in some areas of life went side-by-side +with pseudoscience, destruction and radicalism that plague mankind +to this very day. Strangely enough, a fantasy setting seems to be +ideal for highlighting those issues: our pseudoscience actually has +some backing in Arcanum, but is it right to act on it? Entire +civilisations are being destroyed in pursuit of questionable goals. +Senseless bickering between the traditional magicians and the more +progressive technologist leaves no room for cooperation and +co-existence. + +Finally there is the gameplay. It's mostly fine. The +character-building shows that the game is made by the same people +that made Fallout, and it works very well. Combat on the other hand +is pretty terrible. And there are also a lot of things that can only +be done through some badly-thought-out keyboard shortcuts that cannot +be reassigned to something more sensible. + + +THE WITCHER 1 + +When people talk about the witcher games, it's usually about the +second or the third game (or the fourth one, which I hear is being +developed). Neither of those, however ever interested me too much. +The Witcher 1 on the other hand seems to be a game that people have +to "force" themselves to play. I never experienced such problems, but +my idea of a good game is quite different. + +And the game really is very strange. I've heard once it being +described as a game that can be completed with one toe on the +keyboard, and that is not too far from the truth either. Gameplay, +however, is not what attracted me to this game so much. Strangely +enough, it was the writing. I do say that it is strange, and that is +because I found that most people who spend their time "seriously" +discussing the quality of writing in games are mostly the sort of +ignoramuses that don't ever take time to read a book. Thus in most +cases when I discuss writing in a game, I merely say that it is good +for a game, and proceed to the more important parts. The Witcher 1, +however, is the only game about which I can say that I found the +writing to be pretty solid in the general sense -- definitely more +solid than 90% of film-writing, and people are somehow enjoying that! +Indeed, the writing was so more than passable that it was much thanks +to the game that I actually looked into the books, which were to this +day the only piece of literature that I didn't regret reading in +translation. + + +TOMB RAIDER 1-5 + +Tomb Raider is another game I liked mostly due to the very good +gameplay. And it did manage to produce 5 good games, which is pretty +impressive. Unfortunately, the games beyond that are barely at all +related and aren't very much worth playing. + +The games' gameplay consists primarily of the three activities: +solving puzzles, jumping around places and shooting things. I'll +start with the jumping around because platforming is not what I +generally enjoy in games: usually the activity is either very +RNG-dependant, which makes it very frustrating, or very automated +to the point where it feels that the player's input almost doesn't +matter at all. Tomb Raiders avoid that by making every move Lara (the +protagonist is one lady Lara Croft for those that lived in the woods +for the past several decades) makes extremely predictable. +Platforming in Tomb Raider does require careful planning, attention, +precision and timing, but no luck, which is how I grew to like it. + +Puzzles are, I'd say, mostly pretty decent. There were a few that +were simpler to brute-force than to come up with a "real" solution, +a few whose logic didn't make much sense, and a few rather +frustrating ones where Lara has to escape some labyrinth by pushing +blocks, while being completely blind to the maze's general structure, +but those were in the minority. + +Shooting is quite honestly pretty bad. For me at least most of the +shooting involved holding down control (shoot) and alt (jump), while +pressing left and right alternatively so that Lara would sideflip +instead of jumping vertically, still facing the enemy, but avoiding +some of the attacks. There were, however, some improvements in the +fourth and fifth games, as they presented both some weapons and some +enemies with the more unique behaviour that required a different +approach. + +Of all the five the first was probably the best game: just the right +amount of platforming and puzzling with being assaulted by +(near-)extinct animals in-between. Unfortunately, of the remaining +only the fourth once again capitalised on that idea with the fifth +consisting of rather diverse "mini-campaigns," which are also very +enjoyable. My opinion on the second and third is a bit more mixed: +both are very well made, but still shift the focus away from puzzling +and platforming in the direction of shooting various mafiosos and the +like. And shooting is by far the worst of the three chief activities! + + +REFERENCES + +[free] gopher://manpager.net/0/art/free.txt blob - /dev/null blob + e9dc2ef469029e2467953043ca3cdfb8c31c1def (mode 644) --- /dev/null +++ art/passwd.txt @@ -0,0 +1,81 @@ +Most of this document is a long version of the +"correct horse battery staple" [comic]. There are some more +interesting observations towards the end. + +The strength of a passphrase does not derive from it having at least +one letter, one digit and one special character, but from something +called "entropy". "Entropy" is this mysterious concept that my +professors kept telling me about, all the while I would wonder "what +is an entropy?". In our case we are dealing with "more is better" and +the formula + + E = log_2(R^L) + +where E is entropy, R is the size of the dictionary (a rather +offputting term, see below) and L is the length of the password. I +won't be telling how much entropy is needed for a good password: +calculate that yourself. That formula works if passphrases are +generated by taking random words from the dictionary. If your +password is your birthday, the entropy is 1 because the passphrase is +cracked by answering the question "is it the owner's birthday?". + +"Word" here is simply the smallest unit we are dealing with, while a +dictionary is a list of unique words. English alphabet is a +dictionary of single-byte words. + +There are several ways the vast majority of people make passwords in +practice: they either use something very simple like their birthday, +or they use something very hard to remember, yet easy to crack. This +is further promoted by many sites refusing to take passwords with +more than e.g. 20 characters &c. The readers may be surprised to read +from me that the issue lies not with the fact of using such weak +passwords on its own: unless the attacker has physical access to a +device, he is usually limited to "n tries per t time". The real +issues begin with man's faulty memory. Firstly such lack of +methodology leads to passwords being easily forgotten, which is just +horrible; secondly, people like this tend to use the same password +for everything. This means that should one service's security turn +out to be less-than-optimal (it usually is), all of the other +accounts become compromised as well. + +And quite simply because I am quite tired of hearing stuff like "They +wouldn't get anything important anyway": no, "they" bloody will, +unless you consider your bank information, personal information and +the ability to be the only one to write messages from your name to be +unimportant. + +The solution is to randomly generate passwords, and then store and +retrieve them using a password manager. There are generally two kinds +of such passwords: strings of randomly-generated bytes from something +like [A-Za-z0-9] and sequences of randomly-generated words. I +strongly prefer the latter, as they may be typed by looking at them +even when clipboard is unavailable. + +Then there is of course the issue of setting up one or more "master" +passwords. Generally the following _have_ to be memorised: password +to a normal user on the system, password to the root user, the +password to the password-manager and passphrases to ssh &c. Since it +all really ought to be done entirely locally on a single-user system +(if it isn't, start panicking), there is not much danger in setting +them to be the same thing. It does, however, have to be something +strong, memorable and not too complicated to type. One option is to +generate a passphrase via a normal method and simply memorise it (or +write it down, unless you live with people you don't trust +unconditionally). Another method is to make up a few words, not tell +anyone about the fact and use those. + +And now since I mentioned the ssh passphrases, I'd like to also state +that yes, ssh keys should have passphrases. A possible exception are +the keys used for things like backups. This should instead be +restricted to certain users and/or commands. A concern some people +might have is that it could hurt automation. I say not nearly as much +as people think. Executing ssh-agent and ssh-add at every login does +mean typing password twice, but it also means that all those scripts +could still be run, provided they are started afterwards in the same +session. OpenBSD's xenodm is already set to run the necessary. On +platforms that use startx, a wrapper would be simple to write. Other +DMs should have such functionality (or they should be avoided +otherwise). If not starting X at all, then executing it from +~/.profile or similar file is even simpler. + +[comic] https://xkcd.com/936/ blob - /dev/null blob + 752b9d2c92080408a90790b8d797853b29156f9e (mode 644) --- /dev/null +++ art/revolution.txt @@ -0,0 +1,85 @@ +Revolution Software has made a few interesting games, some of which +I played. I think I might have played Broken Sword once as a child, +but more thoroughly I familiarised myself with them only much later +beginning a bit before I started writing my bachelor's diploma and +ending some time later (I think at least). My recollections of them +are a bit hazy now that some months have passed, but I'll try to give +at least a brief overview of my thoughts about the games. + +So, what's so interesting about these games? Well, not they +themselves: I found them to be rather forgettable, actually. What's +more interesting is that four of them: Lure of the Temptress, Beneath +a Steel Sky & Broken Sword 1 & 2 can be played via ScummVM, which is +an open-source engine for many adventure games. More interestingly, +the first two (not "Swords" unfortunately) have their data files +distributed gratis for non-commercial purposes as well. It's a shame +the original engines never got open-sourced, but from the other angle +this can be viewed as "better than Doom", which still can't be played +without either buying the necessary data, or sharing it. + +As for the reason why they are so forgettable, consider that there +are generally two types of games: the more classical ones not unlike +adventure(6) itself, which give the player some game rules and set +him loose to figure it all out for himself, and the games which try +to be films. Most of the latter adventure-games, including the ones +by Revolution are in the latter category. I very rarely watch films, +and when I do it's mostly Monty Python or something. The reason is +that unlike books or any "interactive" activities films do not +require intellectual involvement, instead they promote staleness of +the mind: they are very much like sleeping without actually getting +the benefits of doing so. The "game-films" are slightly better in +this aspect, as they do require at least some involvement from the +player. Furthermore the "adventure-games" are even better off in this +aspect, as the player is usually required to perform some creative +thinking in order to solve the game's puzzles, rather than to do +something mechanical. Still, the majority of it has been arranged by +the "director" and the player is the "audience". + +Oh, well, here go the games themselves. + + +LURE OF THE TEMPTRESS + +I don't really think much of this game and the reasons I dislike it +seem to align exactly with the features it was marketed for, which is +hilarious. + +So, firstly, almost none of the characters ever remain in a +predictable position, instead they go around the entire map in a +randomised manner. This makes it an unnecessarily hard job to find +the one, which has to be talked to in order to progress the +storyline. This is worsened further by the fact that at times the +player is not given so much as a clue on what to do next, and so he +has to talk to every character in the game in order to find out. That +last deficiency is also combined with the fact several times +throughout the game things simply happen without the player being +given a hint, like a door that was closed the majority of the time +suddenly opening for no reason in particular. + +My last grudge is the UI. "Temptress" was one of the earliest games +to use an entirely mouse-based interface, yet just like all those +graphical file-managers it did so relying on the textual idioms. +Basically the player often has to find-and-click a single verb from +a couple dozen and then do the same with nouns. The vast majority are +quite simply unused. + +Oh, well, I suppose the characters and graphics are charming. + + +BENEATH A STEEL SKY + +Now, this is a much better game. I'll say as much: of all the +adventure games I've played only this one made any sense. Clues are +simple enough to come by and the solution that follows mostly makes +sense. Things don't just happen off-screen and there aren't many +one-off mechanics. Very solid. + + +BROKEN SWORD 1 & 2 + +These games people are probably more familiar with than the other +two. Personally, I liked "Sky" more. It seems that people generally +find more problems with the game's puzzles than I did, which is as +much as can be said for the gameplay. They did make some good work on +the animations, so well done there. Other than that, however, I found +the games to be pretty average. blob - /dev/null blob + 91c8a1ef52c3ea8df156592ac95e9bb2551704a4 (mode 644) --- /dev/null +++ index.gph @@ -0,0 +1,11 @@ +I am Alexander, the insane Unix hacker and owner of alearx.org. To +know more, please see the README file. + +[0|README|/README.txt|server|port] + +[1|articles|/art/|server|port] +[0|plan|/plan.txt|server|port] +[0|feed|/feed.ass|server|port] +[1|news|/news/|server|port] +[1|ftp|/pub/|server|port] +[1|git|/git/|server|port]