Very Secure

A Few Thoughts on Lisp and Programming in General

January 2nd, 2020

I noted in my most recent progress report for TheFleet that I have a bad methodology while programming.1 One issue is I begin to implement programs before having a good understanding of what their entire structure should look like. The larger problem is I don't fully map out plans before executing them: I write articles without outlines, disassemble computers without having necessary tools, cook new meals without recipes, go to the store without a shopping list, etc. These attempts to shortcut to a goal is the hallmark of stupidity through laziness.

The "figure it out while you go" mentality is costly when programming. Testing and fixing bugs takes time; it's a huge waste if that time goes into a script that doesn't even solve your problem. The CL development environment enables bad behavior because it reduces the friction for compiling and executing small chunks of code. Sending functions into the snappy repl can make you feel like you're doing a whole lot when in reality you're getting nothing done.

For tasks like cooking there is a clear delineation between the planning step and the execution step. However the line between mapping out a problem and writing a program to solve it is fuzzy. What is a program if not a formally defined plan?

The syntax of lisp allows for perhaps the most terse possible text representation of an abstract syntax tree. Thus it might be a good exercise to make a flow chart of what TheFleet needs to do in the form of an ast.2 But TheFleet's implementation requires concepts that I am not sure belong in that notation, like threads running functions that handle random inputs at random times in the future. So I am not certain this is a worthwhile exercise.3

As a final thought, I'd like to mention my personal understanding of the folly of using Common Lisp on a modern day machine. The beauty of lisp is its ability to neatly express solutions to closed problems. But is there a benefit from a CL program that is "15% shorter" than its python equivalent if it takes 471,556 additional lines of sbcl to be able to use it?

~/sbcl-1.4.14$ cloc ./
    1833 text files.
    1743 unique files.
    364 files ignored.

http://cloc.sourceforge.net v 1.64  T=9.72 s (153.2 files/s, 62448.5 lines/s)
---------------------------------------------------------------------------------------
Language                             files          blank        comment           code
---------------------------------------------------------------------------------------
Lisp                                  1095          39905          75460         426310
C                                      105           4480           7760          31973
C/C++ Header                           134           1146           1847           5423
Bourne Shell                            63            767           1185           4029
Assembly                                11            721           1775           2825
D                                       45              0              0            319
make                                    24             75             60            278
HTML                                     5             10              0            185
CSS                                      3             41             11            184
Pascal                                   1              0              0             23
Windows Module Definition                3              0              0              7
---------------------------------------------------------------------------------------
SUM:                                  1489          47145          88098         471556
---------------------------------------------------------------------------------------
  1. I have ~no methodology, just a long list of stuff I know not to do. []
  2. As in draw one in my notebook. []
  3. And also I'm not certain whether lisp is the best language to implement the program in either. That said I don't plan to switch my choice of language mid project. (Although if I used python would I really be switching? I did write the web scraper for netsplite.de that grabbed the networks and their hostnames and ports in python. The only function I've written so far that was actually "in lisp" imo, was make-groups)

    (defun make-groups (lst group-size)
        "Breaks up lists into length group-size sublists, if the length of the list is not a multiple of group-size the last sublist will have a length of (mod (length lst) group-size)"
            (cond ( (null lst) nil)
    	         ( (<  (length lst) group-size) (list lst) )
    		 (t (append (list (subseq lst 0 group-size) ) (make-groups (subseq lst group-size) group-size) ) ) ) )

    []

Progress Report On TheFleet

December 31st, 2019

Yesterday, the first ships set sail accross the sea of IRC Networks to four small islands: UniBG, ShadowWorld, QuickFox, and OptiLan. The channels on these networks were empty of human activity. Most of the rows in my log db contained botspam such as

Now playing on Radio Mega-Hit: >50 Cent - Candy Shop (Feat. Olivia) (Pro50 Cent

I also attempted to dock 23 bots at DalNet, a larger network. But after the 4th or 5th bot connected, they all were kicked off the network w/ the message:

The maximum allowed connections from your host 200.100.50.25 has been exceeded.

So for the bigger networks I will either have to rotate through their channels or obtain a few more ip addresses.

**

There are two tasks I'm working on. The first is the channel-snagger, which keeps an updated list of all channels for all networks on a best effort basis. The second is fleetbot, the ircbot extension that keeps a set of bots logging the channels in that list, also on a best effort basis. Ideally channel-snagger puts the channels into a queue that fleetbot will draw from to assign channels to bots.

I. channel-snagger.lisp

Below is a list of (networkname, num_channels) for the 200 networks I found with at least one channel.

(freenode 12975)
(Frozyn 7182)
(EFnet 5070)
(DALnet 2712)
(OFTC 1874)
(synIRC 873)
(euIRC 719)
(IRCHighWay 579)
(FreeUniBG 465)
(P2P-NET 354)
(EuropNet 351)
(Mibbit 341)
(MindForge 307)
(IRC.tl 296)
(GIMPnet 286)
(SwiftIRC 278)
(SlashNET 272)
(GeekShed 269)
(PTnet 266)
(IndoGaul 238)
(AllNetwork 238)
(Aitvaras 202)
(2600net 185)
(DarkMyst 185)
(GeekNode 174)
(AnthroChat 153)
(Recycled-IRC 146)
(MagNET 122)
(UniBG 117)
(EnterTheGame 109)
(Tweakers 103)
(IdleChat 100)
(tchattons.com 99)
(Evolu.NET 99)
(Chattersworld 98)
(ForestNet 90)
(German-Elite 87)
(Otaku-IRC 86)
(VirtuaLife 84)
(SurrealChat.net 84)
(AnonNet 83)
(Chattersweb 78)
(Coolsmile.net 75)
(Gotham 74)
(DSNnet 72)
(OptiLan 66)
(Zoite 62)
(DejaToons 60)
(Sinsira 59)
(MagicStar 55)
(Apropo 54)
(SKYROCK 53)
(ForeverChat 53)
(TwistedNet 52)
(ShadowFire 52)
(IRCstorm 52)
(Immortal-Anime 52)
(DarkVoltage 52)
(GigaIRC 50)
(Chat-Solutions 47)
(Buddy.IM 46)
(SiberChat.Org 45)
(IrcWorld 45)
(Abandoned-IRC 44)
(Subluminal 42)
(Hub4Ever.Org 41)
(Xerologic 38)
(TripSit 38)
(BrasIRC 37)
(ScoutLink 36)
(DigitalIRC 36)
(BSDUnix 36)
(Anynet 35)
(LunarIRC 34)
(Global-Irc.Org 34)
(ForumCerdas 33)
(Netrusk 32)
(WNet 31)
(out-dated.net 31)
(GreekIRC 31)
(P2PChat 30)
(BrasPort 30)
(LUGS 29)
(IRCsource 28)
(MaddShark 28)
(ChatIRC 28)
(LichtSnel 27)
(ECNet 27)
(IRCnet.gr 26)
(Andromeda.Fr 26)
(NFNet 25)
(AustNode 25)
(PSIGenix 24)
(PowaNet 24)
(PC-Logix 24)
(SoylentNews 23)
(interlinked.me 23)
(Chatters 22)
(Blafasel 22)
(QuickFox 21)
(AlphaIRC 21)
(ShadowWorld.Net 20)
(ZwergenIRC 20)
(SA-IRC 20)
(Everchat 20)
(CakeForceUK 20)
(RisposteInformatiche 19)
(oz.org 19)
(mircphantom.net 19)
(IRC2 19)
(ChillNet 19)
(ChatIrc.net 19)
(tm-irc 18)
(MeFalcon 18)
(KernelPanic 18)
(Omninet 17)
(FDFnet 17)
(Albnetwork.net 17)
(Absoluty-IRC 17)
(FreshChat 16)
(Cognet 15)
(swissIRC.net 15)
(IRCFreakz 15)
(homo.net 15)
(ChatLounge 15)
(AfterX 15)
(TransAdvice 14)
(PurpleSurge 14)
(Italian-Amici 14)
(GreekChat 14)
(EntropyNet 14)
(IRC-Mania 13)
(Griefplay 13)
(Futuragora 12)
(Crippler 12)
(Chaterz.nl 12)
(Blitzed 12)
(UplinkIRC 11)
(SomeNet 11)
(PhatNET 11)
(Teepi 10)
(Striked 10)
(SceneCritique 10)
(RelaxedIRC 10)
(IRC-Ban.de 10)
(420-Hightimes 10)
(Station51.net 9)
(StarLink-IRC 8)
(RelicNet 8)
(ExodusIRC 8)
(Pilgerer 7)
(paranode.net 7)
(FyreChat 7)
(chatnets 7)
(BoredIRC 7)
(onzin.org 6)
(SoundsNWaves.net 6)
(KewlFun 6)
(D4RCnet 6)
(Black-Cell.net 5)
(IRDSI 5)
(GTAXLnet 5)
(DynastyNet 5)
(byxnet 5)
(BSDnet 5)
(AsylumNet 5)
(UKChatBox 4)
(RootWorlD 4)
(PIRC.pl 4)
(Genscripts 4)
(eXolia 4)
(Eagles-myIRC 4)
(degunino.net 4)
(BDCHAT 4)
(Ceviz 3)
(XeroMem 3)
(OSPnet 3)
(Langochat.net 3)
(ircHax0r 3)
(Fewona 3)
(Do-Dear.com 3)
(AureAWorld 3)
(DarkerNet 2)
(UnderMind 2)
(Snyde 2)
(SceneP2P 2)
(Powers.cl 2)
(MauriceRadioLibre 2)
(dreams-fr 2)
(DALNetwork 2)
(zeolia 1)
(kyunet 1)
(EsperNet 1)
(Canternet 1)
(AtomicEdge 1)

And here is the script I used to acquire the channels for these networks.1
For every network I:

  1. connect with an unauthed nick
  2. wait to receive the network's RPL_WELCOME-MESSAGE
  3. request a list of all the channels with /list
  4. wait for the RPL_LISTEND-MESSAGE, timing out after 35 seconds

I ran into a few errors related to connecting: 'BADHOST, 'USOCKET-TIMEOUT, and 'USOCKET-CONNECTION-REFUSED. I also saw an error from issuing the /list command

"You must be connected for at least 60 seconds before you can use this command."

I may want to try grabbing channels from different linknames2 to see if I can connect to the networks that threw USOCKET errors. I also need to do another scan for networks where I wait 60 seconds before issuing /list.

There are some big networks3 missing: IRCnet, Undernet, QuakeNet, Rizon, BSDUnix, Chatzona, IRC-HIspano to name a few. There are also discrepancies from the data I've collected and what's listed on netsplit.de. Netsplit.de lists EFnet having 9000+ channels but my EFnet responded to my /list command with only ~5000. It is possible this discrepancy is due to a large variance of number of channels on a day to day basis.

II. fleetbot.lisp

Before trying to connect the fleet of ships to a network I gave a look through the lisp cook book page on threads. The one tricky bit I did not see in that guide was how to do proper error handling. I'm surprised that a guide on this was excluded. From my experience dealing with threads often means dealing with file i/o or socket exceptions.

I learned that a thread cannot signal an error to its parent thread, so any error handling must occur inside the function that is passed to make-thread.4


;; handler-case is the basic "try-catch" tool of common lisp.
;; it takes an expression and then a list of error-clauses.
;; if an error occurs in the first expression, handler-case searches the error-clauses for a matching error and runs the corresponding code.
;; more details can be found here: http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html

;; incorrectly handles error because handler case is defined outside of the child thread that throws the error
(handler-case
  (sb-thread:make-thread
    (lambda () (error 'simple-error)))
  (simple-error () t))

;; catches error correctly since all error handling is done inside the child thread
(sb-thread:make-thread
  (lambda ()
    (handler-case
      (error 'simple-error)
      (simple-error () t))))

The biggest TODO item is to figure out a way around the maximum connections per host limit. Networks usually drop me after I connect more than 3 bots. So with a 120-channel-per-nick limit that means I can only log 360 channels per ip. The connections-per-host is likely on a per server bases rather than per network, so I could conceivably connect to 10 different links which would bring me to 3600 channels per ip. This is an ugly solution since when an individual server goes down I will miss logs from channels assigned to that server.

Some other items on the TODO list:

  • obtain the max-channels-per-nick for every network
  • learn about file descriptors + sockets. Look into the Select (2) syscall error
  • figure out the Socket error in "connect": EINTR (Interrupted system call) [Condition of type SB-BSD-SOCKETS:INTERRUPTED-ERROR]
  • log when a ship joins or leaves a channel

Lastly, a note on my methodology. After speaking with trinque and diana_coman and doing a bit of reflection I realized I have a common Common Lisp problem. My reasons for using the language are essentially that I think it's in fashion.

CL+emacs+slime lubes up a workflow that is painful with languages like c.5 Instead of using this to my advantage once my program is well thought out, i've been whackin' away: testing half-baked-functions as they're written, tweaking knobs randomly until something appears to work, patting myself on the pack for functions that do work, etc. etc. Going forward I will focus on scoping out the problem and fixing my own misconceptions before putting anything into the repl.

  1. The function populate-networks-with-channels takes a plist of networks from the channel-snagger and attempts to insert into that plist a list of channels with key :channels. If no channels are found, the value of :channels becomes a symbol representing an error. []
  2. A linkname is the hostname of an individual server on a network. []
  3. Big in terms of reported number of users and channels, but as I saw the reports on netsplite.de may be wildly inaccurate. []
  4. This makes sense. The main thread continues executing and leaves the "try-catch" block when the subthread gets spawned. So if the error were to be caught in the main thread, then it would have to schedule the catch clause at some random point further in its execution. []
  5. The process of testing a function you wrote by sending it from the file you're working on into a repl. []

Thoughts on Shrysr Leaving Younghands and Asciilifeform's Excommunication

December 28th, 2019

I'm taking the time to write about shrysr leaving, not for the sole purpose of passing judgement,1 but to reflect on my own situation and what I think about the cult aspects of younghands and tmsr. I can't discuss shrysr's departure without sharing my thoughts on the rating changes with asciilifeform. I said previously that I wasn't going to speak on that subject, but what can you do.

So to begin with shrysr, I believe during his last conversation with diana_coman she correctly assessed why he wanted to leave. I had internally experienced a flow of thoughts that mirrored the reasons diana_coman accused shrysr for packing his bags. My thoughts went something like ~ diana_coman has got me off my ass, helped me settle into a nice apartment, motivated me to get my hours done in the saltmines, prevented me from making bad investments after nights of drinking, helped me organize my schedule for 11 weeks straight, pulled me out of the haze of pot, put me to work on an interesting project, helped me acquire a personal computer, given me better methods to become bilingual, read all my articles and commented on them, etc. etc. But now there's nothing to stop me from walking away. I will continue my life at a much higher comfort level, and I can enjoy that comfort while dropping the hard work and getting back to surfing and weed. And I have the perfect excuse - asciilifeform got excommunicated unjustly, and I just won't stand for that! I entertained this thought, but let it pass. By acting on it I would be simultaneously betraying diana_coman and working against my best interest.

So I see shrysr's decision to leave as selfish2 and stupid. He's cashing out early and leaving diana_coman to eat a loss of time invested. Based on my own experience and what he said himself about receiving 10x the attention from diana_coman than from those he paid, I believe he would develop more at DCU than anywhere else. In sincerity I wish him the best of luck on his journey, I hope that he works harder than ever and blogs about his success.

But I do not see that happening. His website looks great now and has a handsome picture of him in some lab gear, but his blog has been lacking new content since he left. As far as I can tell, he has given up a path to meaningful and interesting academic work to twiddle css parameters until he makes his site shiny enough for him to get paid six figures of monopoly money.

The excommunication of asciilifeform is a more complicated matter. I have tremendous respect for him, and the situation has left me in quite a knot. I believe his side of the story and had I submitted to training under him, which I considered, I would likely be on the other side of the fence.3 He built tons of infrastructure and worked loyally for mp and others, and seeing him tossed to the side after his effort makes me believe it naive to become attached to any relationships within tmsr.

The only way I reconcile his having been tossed out is by hanging onto the idea that tmsr is only a place to grow and the moment the derivative of one's graph of progress over time becomes negative, that's it - no matter the max y value achieved. I am most cautious and aware of one point asciilifeform made, namely that mp picking up a bunch of noobs is perhaps his strategy to stay safely seated on his throne and keep the council well indoctrinated.4 There's not much I can retort to this, as it is true I trade my fidelity for a path to growth. I anticipate asciilifeform will call me a 'chained biorobot', and to some degree he will be right. But I would rather be a chained lion than an independent sand gnat, free to fly where I'd like --- until a gust of wind sweeps me to sea.

I don't doubt that shrysr leaving and running into the arms of asciilifeform is avoidance behavior. I think it is even worth gently reminding asciilifeform about his own prediction that leeches will come trying to make friends. Maybe now that shrysr is done sapping from diana_coman he'll see if he can get something from asciilifeform.

I do have doubts about the justification of asciilifeform's excommunication. As strong as those doubts are, I don't plan to use them as an excuse desert diana_coman and younghands. I hope asciilifeform respects that I took an oath and doesn't ban me from his chan for it. But I will see myself out if requested because I understand he sees diana_coman as chained to mp, and I would follow diana_coman's orders to leave his channel should I be so instructed. I have grown under her guidance, and I don't plan to start making exceptions to my pledge. Diana Coman keeps me "hypnotized" because she has this habit of giving advice that is in my self-interest to follow.5

  1. Although I will. []
  2. Misguidedly selfish. []
  3. The fence asciilifeform predicted would exist. []
  4. There are various other warnings asciilifeform's made that keep me on my toes. For example, mp is a talented writer with tits by his side. I don't question his ability to convince me of anything. []
  5. Even though following the advice may be painful in the short term. []

Review of An Outpost of Progress by Joseph Conrad

December 27th, 2019

Society, not from any tenderness, but because of its strange needs, had taken care of those two men, forbidding them all independent thought, all initiative, all departure from routine, and forbidding it under pain of death.

-Joseph Conrad, An Outpost of Progress

In Conrad's An Outpost of Progress two "men" have their umbilical chords that tether them to society severed. The protagonists Kayerts and Carlier are appointed first and second in command of a trading post after being dropped off on the coast of Africa. They begin their adventure full of excitement while the director of the Great Trading Company sails away, happy to leave the two imbeciles to fend for themselves. Kayerts and Carlier's self-deception and inability to perceive their environment eventually leads them to fight to the death over a sugar cube.

The short story is sprinkled with sarcasm and irony that mirror false promises of society. The irony begins with the title, An Outpost of Progress. There is no progress anywhere in the outpost, only a few white men withering away. The duo's doom is foreshadowed by the old stager, who, "with a quiet smile" says, "They will form themselves there." When the ship returns at the end of the story, Conrad informs us The Great Trading Company has become The Great Civilization Company "since we know that civilization follows trade." Kayerts and Carlier believe the ideas that Conrad intends to be ironic, while other characters in the book know what really goes on at the outpost.

The characters have different levels of understanding of the true nature of The Outpost of Progress, but they all participate in their own form of self-deception. Makola, the local on staff, has this thing with believing in evil spirits. Gobila, an old man from a neighboring village, believes white men are all brothers and immortals.1 Kayerts and Carlier continually kid themselves with regards to their own importance. Carlier says, "In a hundred years, there will be perhaps a town here. Quays, and warehouses, and barracks, and-and-billiard-rooms. Civilization, my boy, and virtue-and all. And then, chaps will read that two good fellows, Kayerts and Carlier, were the first civilized men to live in this very spot!" Carlier forgets that there was a pioneer before them who "died of fever." At one point the two read some literature lying around that contain protagonists with good qualities. Conrard writes that Kayerts and Carlier "discounted their virtues, suspected their motives, decried their successes, scandalized at their duplicity, or were doubtful about their courage." The two needed to discredit imgainary betters to cope with their personal failures.

Kayerts and Carlier are similar but not the same. Carlier is lazy just like Kayerts, but there are clues that show he has an inkling of intelligence. He does not swallow the director's flattery as does Kayerts. Later when they pass the grave of the first person put in charge of the outpost, Conrad's description of Carlier's question:

"He died of fever, didn't he?" muttered Carlier, stopping short.

hints at Carlier's suspicion of the narrative of that death. At the end of the story, Carlier has a moment of clarity. He has an independent thought, takes initiative, and breaks routine. Carlier admits out loud he and Kayerts are slave dealers and goes to get a sugar cube for coffee. In response, Kayerts acts on behalf of society and shoots Carlier.2 Having completed his duty to society, Kayerts hangs himself on the cross over the first pioneer's grave.

An Outpost of Progress is worth a few passes.3 Conrad writes that men are not able to grasp their surroundings, and meanwhile places tiny clues4 that are easily missed. The reader needs to be engaged to avoid the fate of Kayerts and Carlier.

  1. He does not let the death of the first white man from the Great Trading Company shake this belief. []
  2. At this moment Kayerts's level of self-deception becomes so high that he actually believes he has been shot by Carlier. []
  3. I was assigned to read the short story by diana_coma. This is perhaps the first book (albeit it's only ~30 pages) that I read a few times in succession. Conrad puts in foreshadowing that can only be recognized on subsequent rereads. For example, Carlier makes a note to Kayerts about how sturdy the cross is that he put upright and mentions that he was able to hang from it with both hands. This description is ominous when the reader knows Kayerts's fate. []
  4. Such as Carlier's mannerism demonstrating that he questions whether the first pioneer really died of fever. []

J.C. Catford's A Practical Introduction to Phonetics

December 26th, 2019

It may be worth drawing attention to the fact that the title of this book is, designedly, 'A Practical Introduction to Phonetics' and not 'An Introduction to Practical Phonetics', for it is, indeed, an introduction to general, or theoretical, phonetics, though it proceeds towards that goal in a highly practical way.

Readers are introduced to the phonetic classification of the sounds of speech by means of a series of simple introspective experiments carried out inside their own vocal tracts, their own throats and mouths. By actually making sounds (very often silently) and attending to the muscular sensations that accompany their production one can discover how they are produced and learn how to describe and classify them.

At first sight 'making sounds silently' may appear contradictory, but, as Abercrombie (1967) has aptly pointed out, speech is 'audible gesture' and the principal aim of this book is to enable the reader to discover and to analyse the gestural aspect of speech (upon which most phonetic classification is based) and to bring it under conscious control. This must be done, to a large extent, in silence, since the auditory sensations of loud speech tend to mask the motor sensations, which are the perceptual accompaniment of the gestural aspect of speech.

That this kind of experimentation is an effective means of acquiring a knowledge of the categories and principles of general phonetics I know from personal experience, for this was precisely how I learned phonetics as a boy, without a teacher, eagerly reading Sweet's Primer of Phonetics and constantly experimenting in my own vocal tract.

Although, as this reference to boyhood experience suggests, phonetics is a fascinating hobby for young people, it is primarily an indispensable tool for all those adults who have to work with language: students of linguistics, teachers and students of languages, teachers of the deaf, the hearing-impaired themselves who may be striving to acquire intelligible speech, actors, and many others. Armed with the understanding of the basic principles of phonetics which this book seeks to inculcate, they should be able to read and fully understand any specialist work on whatever aspect of phonetics is of special interest to them.

Much of the material of the book has been used for some years past at the University of Michigan, in teaching phonetics to large groups of students of linguistics, speech pathology, anthropology, languages, education, drama, and many other fields. I am grateful to all those students who contributed comments and suggestions, and I should also like to thank Dr Harriet Mills who read most of the text and made numerous valuable criticisms.

J. C. C.
AnnArbor,
Februam 1988

From the preface to the 2nd edition of J.C. Catford's A Practical Introduction to Phonetics

Catford's book on phonetics deserves more than a footnote in my incomplete Differences Between English-Spanish Pronunciation series. Reading and doing the exercises in A Practical Introduction to Phonetics is a pleasure. The curriculum of the average ESL-producing American school lacks a study of the art of pronunciation. Not only is the ESLtard unable to speak another language, but they1 don't understand their own ability pronounce words in their mother tongue! They rely on subconscious muscle memory acquired at a young age. A Practical Introduction to Phonetics's terse explanations, abstract diagrams,2 and bite-sized exercises provide a means for adult Americans to recover from one of the many missing elements in their education.

I became interested in understanding pronunciation after reading Bernard Shaw's Pygmalion. Inspired by the phonetician protagonist, I sought out a book on phonetics. A comment on the Amazon page of some mammoth linguistic textbook recommended Catford's book as a good way to learn about the field. After reading the preface and introduction in a pdf version found on b-ok.org, I bought a paper copy. The preface3 contains a gem of advice: when you attempt to pronounce new words, you need to mouth them out silently so you can focus on the position of your vocal tract organs. Their form determines the sound wave you will produce, but it is difficult to determine their position when they are vibrating from the air blown out by your lungs.4

The book has an intelligent layout of exercises. The exercises isolate concepts and slowly build off of each other. Learning to control one's vocal tract with these exercises is a good way to learn-to-learn, since you can practice phonetics at anytime without any props.5 After I learned how to pronounce many of the phonemes in the book, I was confident in my ability to learn how to make other sounds.6

Going through A Practical Introduction to Phonetics helped me fix long standing problems with my Spanish pronunciation. From the perspective of Catford's book, if you try to learn "just the Spanish r trill" then you are jumping ahead to exercise 44 and skipping fundamentals. It is better to take the time to learn the many different sounds from the many different languages in Catford's book than to tunnel vision a target foreign language.

  1. we []
  2. The book has anatomical diagrams placed next to schematics of similar devices to help illustrate the function of an organ. []
  3. The one quoted above. []
  4. When learning to pronounce foreign words the intuitive process is to repeatedly say a word until the sound made matches the sound produced by the foreign speaker. The folly of this method can be readily explained by an analogy to learning an instrument.

    Imagine while being instructed on how to play the piano you were asked to play back an isolated note. Instead of watching the instructor to see which key he pressed, you looked away and listened to the sound made and tried to press each key until you could hear the matching note. This ridiculous method is the way most people attempt to mimic the creation of a sound in a foreign language.

    Instead of trying to match the audio output directly, one should try to match the articulation of the foreigner. The correct sound will follow. []

  5. But if you live with other people, they may not be too amused once you start enunciating all your new phonemes. []
  6. I taught myself the loud finger-in-mouth dog whistle. This one must be practiced alone. []

TheFleet - A Systematic Exploration of the IRC Space

December 25th, 2019

TheFleet is a set of bots that will sail across the digital ocean and dock at the ports of the 260 or so irc networks listed on netsplit.de. The goal of the project is to do a systematic exploration of what is there. The first step is to collect the hostname, port, and list of all active channels for each irc network. The next step is to make a script that parks a logging bot in each found channel. There needs to be a separate script making sure the fleet of bots remain connected. TheFleet must have an interface for viewing the data collected.

To obtain a list of all channels for all networks I wrote a script that scrapes information off netsplit.de. This morning diana_coman informed me of a simpler method to get the channel list for each network with the command /list. I still need a way to get the list of channels from /list as a structured piece of data. My heathen client Limechat just opens up a popup that I can scroll through. I will look into seeing if I can use the backbone of logbot, :cl-irc, to create a script that grabs all the channels from every irc network using the /list command. I will format my list of all networks with all their channels into an sexpr structured as a list of plists, where each plist looks like1 ~

(:network "freenode" :host "irc.freenode.net"
:port 6667 :channels ("#ossasepia" "#trilema" "#lisp"))

Once I have the networks mapped to their channels structured as a list of plists, the next step is to iterate through the plists and park a logging bot in every channel. I plan to use a modification of trinque's logbot pressed to ben_vulpes's logbot-multiple-channels-corrected vpatch. The first modification is to change the db schema to include a column, "network", for the log table.2 Then I need to create a function connect-fleet. connect-fleet iterates through all the networks, and for each network divides its channels into lists the length of the network's max number of channels allowed per nick. For every channel group, a new thread is created with a bot connected to all channels in the group. The code is sketched out below. make-fleetbot and fleetbot-connect-thread should be small modifications to their corresponding make-logbot and logbot-connect-thread. max-channels-per-nick may wind up a hard coded lookup table for the ~260 or so irc networks.

(defun connect-fleet (networks)
  "Logs every channel in each irc network in networks"
  (mapcar #'connect-to-all-channels networks))

(defun connect-to-all-channels (network)
  "Connects a logging bot to all channels in the network, each bot runs in its own thread and connects to as many channels as possible."
  (mapcar
   (lambda (channel-group) (connect-bot-to-channel-group network channel-group))
   (get-network-channel-groups network)))

(defun connect-bot-to-channel-group (network channel-group)
  "Connects a bot to the channels in channel-group from network network and returns a plist containing the bot and the connection thread."
  (let ( (bot (make-fleetbot :host (getf network :host) :port (getf network :port) :channels channel-group)))
    (list :bot bot :thread (fleetbot-connect-thread bot))))

(defun get-network-channel-groups (network)
    "Takes a network and returns a list of a list of channels. The channels are grouped into lists the length of the max number of channels allowed per nick "
    (make-groups (getf network :channels) (max-channels-per-nick network)))

(defun make-groups (lst group-size)
    "Breaks up lists into length group-size sublists, if the length of the list is not a multiple of group-size the last sublist will have a length of (mod (length lst) group-size)"
    (cond ( (null lst) nil)
          ( (<  (length lst) group-size) (list lst))
          (t (append (list (subseq lst 0 group-size)) (make-groups (subseq lst group-size) group-size)))))

(defun max-channels-per-nick (network)
  "TODO: Create a way to find out the max channels allowed per nick for every network. The limit for freenode is 120."
  120)

(defun make-fleetbot (&key host port channels)
  "TODO: Implement")

(defun fleetbot-connect-thread (bot)
  "TODO: Implement")

My plan is to create 1 process for each irc network and then have each process create num-channels / max-channels-per-nick subthreads. Each subthread has a logbot connected to max-channels-per-nick channels.3 One question is whether or not there is a limit I will surpass of total-processes * total-subthreads allowed per VM. There should be about 260 processes each with a maximum of roughly 550 subthreads.4

The next step is to create a process on another server that makes sure that TheFleet is up and running, resurfacing ships whenever they sink. We can monitor the processes for each irc network, restarting them if they get killed. It will be more tricky to find partial deaths. We need to make sure that each subthread within each alive process is running with a connected bot. That is where the swank server may come in handy, each process should allow for another process to connect and issue commands in its sbcl environment. The script that is checking the individual subthreads can run on the same VM as TheFleet.

Once I have a fleet of bots connected I plan to make a simple web interface to visualize the db. The homepage will be a list of networks where each network links to a long unpaginated list of all channels sorted by activity.5 Channels can be clicked to see their logs displayed in the same daily format as i.e. logs.ossasepia.com.

To be continued.

  1. It may be worth including the key :linknames which points to a list of all the servers that comprise the network. We may also want to keep the channel list constantly updated as TheFleet is running, connecting to new channels as they appear for the first time in subsequent calls to /list. []
  2. Currently the logstable has the columns id, target, message, host, source, user, received_at:

                      id                  |  target   | message |        host         | source |  user   |        received_at
    --------------------------------------+-----------+---------+---------------------+--------+---------+----------------------------
     1a1aaa4e-41a0-4971-96e3-fe5d62d63649 | #whaacked | yo      | unaffiliated/whaack | whaack | ~whaack | 2019-12-24 19:24:04.979817

    The column names (which I believe are chosen to match :cl-irc's naming system) are a bit confusing, for example target is the word used for channel. I am not sure of the distinction between the columns "source" and "user", both of which imo should be "nick". []

  3. This means that I may move the logic of the connect-fleet function to a bash script. I don't know how to create a different top level process from within sbcl and I don't think it is possible unless I import a library to issue system commands. []
  4. Only freenode should take 550 or so bots to connect to all the channels. Most of the networks should require between 1-30 bots and consequently 1-30 subthreads. []
  5. The question of how to figure out which channel's logs to read will need some pondering. []

Humility, Self-Respect

December 23rd, 2019

The past ten weeks at DCU1 have both humbled me and increased my self-respect. Gaining self-respect while being humbled may sound contradictory. When someone is humbled they are made aware of their lower status. Self-respect comes from valuing oneself. So it would seem natural to lose self-respect when one is humbled. But if one does not have a real assessment of themselves, and instead their confidence comes from a distorted self-view, then they do not have self-respect at all. There is an aspect of self-respect hidden in the etymology. It is the ability to self-re-spect, as in look at oneself again. If you have confidence based on reality then self-respect is easy. If confidence is built on false premises then self-respect is difficult, because the moment you actually look at what's in the mirror you will break that flimsy confidence.

When I started at DCU, I produced an article titled What I Find Worthy of My Time. I tried to be humble with the content, but only barely, and nothing could make up for that pretentious title anyways. Pretentious is another word worth examining. I thought it meant "full of oneself" but that is not its meaning. American Heritage Dictionary gives the definition,

Claiming that or behaving as if one is important or deserving of merit when such is not the case: a pretentious socialite.2

I was claiming I found the time I spent valuable in order to signal my (false) sense of importance.

Weekly schedules and reviews revealed the title's foolishness. What I find worthy of my time? My eod/weekly reports said: anything! Week after week I had to admit "well.. I was going to get that done but then a surfpal came over..." or "I planned to surf for only 15 hours this week but really it was more like 30 hours..." Diana Coman told me she gathered I did not value myself too highly. Upon examination this made sense. If I valued myself, then why would I be so willing to give up time to other people or base activities? Clearly, I did not believe in my capability to use my time wisely. My actions showed I valued the dopamine kick of riding waves for a few hours higher than what I figured I could get done in the equivilant time.

Thankfully the problem of undervaluing my work is fading away. Sometimes there are setbacks, yesterday I spent over 30 minutes believing there was something wrong with my new computer because I didn't press the on button. When I waste time like that, man do I want to just start paddling for some waves. But often only a few minutes of work leads to a major life improvement. A one hour grammar study session cleared up a misunderstanding I've had for years about a large category of phrases in Spanish. Finding where to get a mosquito net will improve my sleep for the next nine months. I figured out a plan to get my fleet of bots connected to freenode with a spare fifteen minutes. These gains that occur from small effort make me question myself anytime I think it's a good idea to wander away from my desk.

Going forward I would like my writing to portray an accurate self-view that demonstrates both humility and self-respect. This is a challenge since it is easy to come off as either pretentious3 or unnecessarily meek. The best way to accomplish my goal is not to focus on what words to use while writing, but rather to do good work every day. Then I can publish self-respecting, humble pieces by just writing about what I do.

  1. younghands.club []
  2. This is the first definition of three. The other two are:

    Showing or betraying an attitude of superiority: made pretentious remarks about his education.
    Marked by an extravagant or presumptuous outward show; ostentatious: a pretentious house.

    []

  3. For example I wrote another article titled Candidate components for whaack's first build. The wording implies I am some authority on the matter surveying my options, which was not the case. []

My First Summer In The Saltmines

December 23rd, 2019

I entered the saltmines for the first time at 17. I had picked up a few programming skills at a younger age that helped me land a job over the summer. The first skill I acquired, which still helps me to this day, is the ability to type quickly. In early middle school I had a weekly class where we used a program called Type To Learn. Doing exercises from that program formed habits that permit me a 110wpm typing speed. Towards the end of middle school, I took my first programming class. I used RealBasic to program some interactive visual animations. I remember distinctly making a ball bounce on a screen; it grew and shrank as it went up and down since its size was defined as a function of its y coordinate. With some free time I played with Autoscript V3, a programming language for windows that had readily available functions for simulating key presses and mouse movements. Then later I learned a bit of scheme and java in high school classes. During free time in high school I taught myself some python and set up a web server running django. The programming experience I obtained by 17 is much less than a kid can/should have at that age, but it was more than most do.

So with these basic skills I got an internship at Morgan Stanley through my high school Stuyvesant. The internship was a mentorship program where I met for lunch weekly with one employee while working for a separate team within the company. My mentor was the salesman type. He told me to read How to Win Friends and Influence People by Dale Carnegie. According to him, that was the most important book to succeed in business. I learned from the book something akin to the idea that people do what they think is in there best interest. But I partially blame Mr. Carnegie for my having picked up the bad habit of bending what I say to match what I believe people want to hear.

For the job portion of the mentorship program, I was assigned to a team of three close friends. They had joined Morgan Stanley together and, unlike my social mentor, kept separate from the other employees. In the only meeting I went to with them, they got into a loud fight with another team.

We worked on a project called TAP, Temporary Access Protocol. Morgan Stanley had just gone through a merger or some other major bureaucratic event that had changed compliance rules throughout the company. I was supposed to help the team build a unix tool where users could request permission to access files and a superior could grant that permission for a set period of time. The work they gave me was first to teach myself perl and then do some exercises to learn how to write regular expressions. The team also had me study the Kerberos authentication protocol. So for a big chunk of the internship I was getting paid $15/hour to learn. Eventually I had to write a piece of code that sent out an email when an event happened, and I ended the internship doing some QA testing for the team.

My cubicle was positioned next to this loud, fat lady. While I was teaching myself perl she just filed her nails, making a phone call now and then. Naive to the way of the world, I was surprised that someone could work in an amazing company like Morgan Stanley while doing jack shit. At lunch one day I asked my team leader just what is it she does here. He explained to me that there were many people in the company who did nothing, and those who did do something could usually have their jobs replaced by a script.1

There was more ridiculousness I saw go on within the walls of Morgan Stanley's skyscraper at One New York Plaza near Bowling Green. My classmate at Stuyvesant who also got an internship there had been abandoned by his team. His manager never gave him any assignment, so he would just come to work for 40 hours a week and be paid to do whatever he liked at his desk. He used his paid free time to work on some graphic art and make a video game. Recalling the insanity at Morgan Stanley only serves to reinforce my "extract from" rather than "work for" attitude towards the salt mines.

  1. He warned that it was not good politics to write said scripts. []

The Preassembled Machine

December 22nd, 2019

The ever helpful ticos unboxed all the parts I ordered1 and assembled my computer for me. It looks reasonably put together, but my knowledge of computer assembly is zilch. I don't even know where I'd place my two hard drives with this setup.

ticocomp-1

ticocomp-2

The interface to the motherboard has no cover. That appears a recipe to expediate the dust collecting process.

ticocomp-3

  1. Save for the SD card reader, which they did not include and did not bother to tell me it was missing until after I was picking up the package from the post office. []

Finding Meaning in a Deterministic World (Part 4)

December 22nd, 2019

Continued from part 3.

The best shot at finding one's way is through submission to a worthy master. Left alone, one is destined to explore paths that lead to nowhere. Only through following the instructions of someone who knows which branches to follow and which to avoid can one move efficiently towards a goal. Thus, in a quest for some notion of individuality I have wound up on my knees.

The process of submitting to diana_coman and joining young hands began when I announced my plans in channel to move to Costa Rica and start doing something with my life. My message was not directed to her, but diana_coman congratulated me and asked what I had been working on. To which I had to respond ~ "nothing." She invited me to #ossasepia1 and advised me to switch my attitude from "I can start helping" to "I'll ask for help and do what I'm asked to do, today."

Speaking with diana_coman, which started on September 11th and has continued to the present, has changed my view of the people who comprise2 TMSR. I did not have a full appreciation of her mental prowess until we had a few back and fourths. Her ability to parse my own words better than I could myself and quickly reply to messages with meaningful responses is something I could not have understood by just reading her blog. Having gained tremendous respect for diana_coman, I also readjusted my opinion of the other lords.3

Shortly after speaking with diana_coman, I submitted to her and joined young hands. I don't recall the exact moment I pledged because it felt only a formality. From the moment I begun conversing with diana_coman, I was following her advice.4 She helped me make important decisions that affect me to this day. For example, before I pledged diana_coman motivated me to be more systematic in my search for a place to live in Guanacaste and make more out of my trip to Japan and Korea by assigning me to document the journey.5

Diana Coman played her hand first and made it in my best interest to submit to her. It is my duty to return the favor and make it in her best interest to remain my master. I started with doubts on my ability to do the later, but respect for myself and diana_coman6 has calmed those worries. I'm grateful for the way my interest in bitcoin helped me find a way to agency7 via the unexpected path of submission to diana_coman's judgement.

  1. Technically to #spyked as well. []
  2. I incorrectly wrote the word comprise as compromise when I published this article. []
  3. When I was passively reading the logs, I the ridiculous notion that the lords who didn't speak much in #trilema didn't do much either. Gotta watch out for the quiet ones. []
  4. Well, Will's "surprisingly" convenient interpretation of her advice. []
  5. With a great camera, too! []
  6. Respecting your master means respecting their ability to choose their pages. []
  7. And thus meaning. []