Skip to main content

About Gwern

Who am I on­line & what have I done? Con­tact in­for­ma­tion; sites I use; com­put­ers and soft­ware tools; things I’ve worked on; psy­cho­log­i­cal pro­files

This page is about me; for in­for­ma­tion about Gwern.net, see About This Web­site.

Personal

A tran­si­tion from an au­thor’s book to his con­ver­sa­tion, is too often like an en­trance into a large city, after a dis­tant prospect. Re­motely, we see noth­ing but spires of tem­ples and tur­rets of palaces, and imag­ine it the res­i­dence of splen­dour, grandeur and mag­nif­i­cence; but when we have passed the gates, we find it per­plexed with nar­row pas­sages, dis­graced with de­spi­ca­ble cot­tages, em­bar­rassed with ob­struc­tions, and clouded with smoke.

Samuel John­son; The Ram­bler, No. 14 (1750-05-05)⁠⁠1⁠

Be­hind a re­mark­able scholar one often finds a mediocre man, and be­hind a mediocre artist, often, a re­mark­able man.

Friedrich Ni­et­zsche, Be­yond Good & Evil §137

The reader lives faster than life, the writer lives slower.

James Richard­son, “Even More Apho­risms and Ten-Second Es­says from Vec­tors 3.0”

Work

I am a free­lance Amer­i­can writer & re­searcher. (To make ends meet, I have a Pa­treon, ben­e­fit from Bit­coin ap­pre­ci­a­tion thanks to some old coins, and live fru­gally.) I have worked for, pub­lished in, or con­sulted for: Wired (201511ya), MIRI/SIAI⁠2⁠ (2012–201313ya), ⁠CFAR (201214ya), GiveWell (2017), the FBI (2016), Cool Tools (201313ya), ⁠Quan­ti­modo (201313ya), ⁠New World En­cy­clo­pe­dia (200620ya), ⁠Bit­coin Weekly (201115ya), Mob­ify (2013–201412ya), Bell­roy (2013–201412ya), Do­minic Frisby (201412ya), and pri­vate clients (2009-); every­thing on Gwern.net should be con­sid­ered my own view­point or writ­ing un­less oth­er­wise spec­i­fied by a rep­re­sen­ta­tive or pub­li­ca­tion. I am cur­rently not ac­cept­ing new com­mis­sions.

Websites

“I don’t speak”, Bijaz said. “I op­er­ate a ma­chine called lan­guage. It creaks and groans, but is mine own.”

Frank Her­bert, Dune Mes­siah

I have no con­nec­tion to the French singer or with gwern.com, any lo­ca­tions in Wales, the gwern on My­Space, or ei­ther ac­count on Pivory.com (which are con­nected to an at­tempted ex­tor­tion of me).

Wikis

I have been ac­tive on the Eng­lish Wikipedia and re­lated projects since Jan­u­ary 200422ya. Cu­mu­la­tively⁠⁠6⁠, I have over 90,000 edits and have writ­ten or worked on hun­dreds of ar­ti­cles; dur­ing my time as an Eng­lish ad­min­is­tra­tor, I per­formed thou­sands of ad­min­is­tra­tive ac­tions; I am an admin on the Haskell wiki, han­dling ⁠rou­tine spam & van­dal­ism:

I also ran a cus­tom Google search tool at “Wikipedia Re­li­able Sources for anime & manga”; this is a cus­tom Google search with >4542 web­sites on its black and whitelists. (The source/lists are ⁠pub­licly avail­able.) It re­turns much more use­ful⁠⁠7⁠ re­sults for top­ics in pop­u­lar cul­ture, and as the name sug­gests, anime & manga in par­tic­u­lar.

Uses This

I’m some­times asked about my tech “stack”, in the vein of “Uses This” or The Paris Re­view’s Writer At Work. I use FLOSS soft­ware with a text/CLI em­pha­sis on a cus­tom work­sta­tion de­signed for deep learn­ing & re­in­force­ment learn­ing work, and an er­gonomic home of­fice with portrait-orientation mon­i­tor, Aeron chair, & track­ball.

Software

I run Ubuntu Linux with a tiling win­dow man­ager & CLI-centric habits. (I pre­fer De­bian but the sup­port of NVIDIA dri­vers has been bet­ter with Ubuntu, so as long as I need GPU ac­cel­er­a­tion, I will be using Ubuntu). I began using tiling win­dow man­agers with rat­poi­son and helped drive the ini­tial de­vel­op­ment of StumpWM and then xmonad (⁠my con­fig), which I still use in con­junc­tion with MATE, a fork of the last good GNOME desk­top en­vi­ron­ment ver­sion be­fore the crazy GNOME 3 ru­ined every­thing.

I spend most of my time in Emacs edit­ing ⁠Mark­down (my con­fig), Fire­fox (ex­ten­sions: Ever­note plu­gin, ⁠HTTPS Every­where, ⁠No­Script, uBlock ori­gin, ⁠Last­Pass, RECAP), or ⁠urxvt/Bash/screen. Most of my pro­gram­ming of R/Haskell/Python is done in a REPL+Emacs. (Friends don’t let friends use heroin or org-mode—are you ever re­ally going to ⁠make back the time it takes to learn & cus­tomize org-mode?)

Mis­cel­la­neously: I use Mnemosyne for spaced rep­e­ti­tion, Lif­erea for RSS, Ever­note/Nixnote for clip­pings/notes, rTor­rent for down­loads, mpv/Clemen­tine for media play­ing, irssi for IRC, ⁠arbtt for time-tracking, ⁠ledger for fi­nances & Google Cal­en­dar for sched­ul­ing/re­minders, Red­shift for screen tint­ing at night to help bed­times, and du­plic­ity for back­ups.

Hardware

Computer

As of June 2020, I use a work­sta­tion PC (which I built my­self), a large Dell mon­i­tor mounted in por­trait mode for read­ing⁠⁠8⁠, a 200-foot Eth­er­net cable (which re­quired I dig a trench to the next house), a Log­itech thumb track­ball, a G.SKILL KM360 me­chan­i­cal key­board⁠⁠9⁠, and Bose noise-canceling ear­phones.

The work­sta­tion is plugged into a 900W UPS for pro­tec­tion against the not-infrequent light­ning storms here, and a 6TB ex­ter­nal drive for daily in­cre­men­tal back­ups, sup­ple­mented by Back­blaze B2 (~$4/month) & mis­cel­la­neous ex­ter­nal dri­ves. While trav­el­ing, I use my ⁠ThinkPad P70 lap­top, which re­placed an Acer As­pire V17 (which died in a most un­for­tu­nate way), which re­placed a Dell Stu­dio 17, which re­placed a PC I built ~2008.

I de­signed the work­sta­tion to be use­ful for deep learn­ing, re­in­force­ment learn­ing, and Bayesian sta­tis­tics, which made it much more ex­pen­sive than I would’ve liked, set­tling on a Thread­rip­per+dual-GPU de­sign (while not for­get­ting that IO is often a bot­tle­neck), but un­for­tu­nately those are fairly con­tra­dic­tory re­quire­ments (DRL wants RAM+CPU while DL wants just GPU), and the re­sult wound up being ex­pen­sive. (I went over­board on RAM in part be­cause I was frus­trated how I kept hit­ting RAM lim­its while test­ing out var­i­ous dy­namic pro­gram­ming al­go­rithms for the Kelly coin-flip game, and be­cause that much RAM means that en­tire datasets can be cached or worked with in-memory in R/Python, sav­ing the con­sid­er­able com­plex­ity of out-of-core al­go­rithms or op­ti­miza­tions.)

The work­sta­tion is a liquid-cooled AMD Thread­rip­per CPU build on a Gi­ga­byte X399 Des­ignare EX moth­er­board, 2×1080ti NVIDIA GPUs, 110GB RAM (nom­i­nally 128GB but final stick is un­us­able due to ap­par­ent BIOS is­sues), a 1TB NVMe drive for OS/home, and an 8TB in­ter­nal HDD for bulk stor­age, all in a (un­nec­es­sary but too fun to not have) tempered-glass case. The process of putting it to­gether was dif­fi­cult—moth­er­boards/CPUs/GPUs have got­ten more com­plex since I last built a PC back in 2008—and the first moth­er­board stub­bornly re­fused to boot, and after I RMA’d it to Newegg (at a cost of $36), the sec­ond one ini­tially worked but then died overnight.⁠⁠10⁠ After tin­ker­ing & pro­cras­ti­nat­ing for months, I gave up on the Asus moth­er­board, checked what Puget Sys­tems was using for their Thread­rip­per builds (⁠Think­Mate was still not of­fer­ing any), and copied their choice of Gi­ga­byte X399 Des­ignare EX moth­er­boards, rea­son­ing that if they were ship­ping hun­dreds of such sys­tems, it must be rel­a­tively re­li­able; that moth­er­board, plus much more force­fully in­sert­ing the Thread­rip­per CPU, fi­nally worked, and I was able to switch every­thing over in June 2018. While the final re­sult was as pow­er­ful and use­ful as I hoped (es­pe­cially for work­ing with ⁠Dan­booru2018, where the 16-cores+2-GPUs al­lows me to cre­ate many dif­fer­ent spe­cial­ized datasets & ex­per­i­ment with many dif­fer­ent GAN ar­chi­tec­tures) the ex­pe­ri­ence of build­ing it has soured me on build­ing my own PCs in the fu­ture: I clearly no longer know enough about PC hard­ware to do a good job, and the more ex­pen­sive the com­po­nents, the less I enjoy the risk or fact of brick­ing them. In the fu­ture I will prob­a­bly ei­ther rely more on cloud so­lu­tions or bite the bul­let & buy pre­built sys­tems. The work­sta­tion parts list (PC­Part­Picker.com sketch):

Other

For scan­ning books, I use a 12-inch guil­lo­tine paper cut­ter to de­bind books evenly (a big up­grade from using X-Acto knives with Fiskars curved blades), an Epson sheet-fed scan­ner with imagescan for scan­ning & gscan2pdf for post-processing.

My desk is an old desk made out of ply­wood & plumb­ing hard­ware by my great-grandfather for my aunt; I re­pur­posed it when I re­al­ized it was the per­fect size and height. In July 2020, be­cause I failed to find any good stand­ing desks I could buy used lo­cally to test it out, I gave up and bought a 48x30 curved bam­boo Jarvis stand­ing desk ($766$6092020). I ex­per­i­mented with a tread­mill desk but found it dis­tract­ing, chron­i­cally un­pleas­ant, and dis­tress­ing to my cat. I put the desk in front of my bay win­dow so I could enjoy the view and rest my eyes, while watch­ing what hap­pens on the river. The bay win­dow un­for­tu­nately often has di­rect sun­light through it, so I added re­flec­tive sheet­ing, which greatly re­duces the heat dur­ing the sum­mer (at the cost of mak­ing it gloomier in win­ter, of course, but that is why I have bright LED bulbs). The chair is a used Aeron chair I bought off Craigslist for $312$2252016 in No­vem­ber 2016 (a bar­gain, al­though I doubt I would pay the list price); I re­placed the mesh when it tore through in April 2021 for $75$602021, which is much cheaper than the usual rec­om­men­da­tion of re­plac­ing the en­tire seat-pan ($249$2002021). The sisal cat tree (Petco) pro­vides an ex­cel­lent perch for my cat, and I have added a pet flap with a cat win­dow sill so he can more eas­ily come & go, with acrylic sheet­ing to re­duce air flow. (He turns out to greatly dis­like soft sur­faces, so half of the cat win­dow sill was use­less! I had to re­place the foam padding & cover with a sheet of ply­wood I cut to fit.) The box fan by my feet (Wal­mart, $26$192017) & the work­sta­tion both rest on rubber-cork anti-vibration pads. To re­duce RSI, I keep a grip ex­er­ciser around to use dur­ing idle mo­ments like watch­ing videos. For mak­ing tea, I boil water in a sim­ple ad­justable elec­tric tea ket­tle which I’ve made ‘pro­gram­ma­ble’ by drilling a hole into the clear plas­tic & in­sert­ing a meat ther­mome­ter (which com­bi­na­tion is far cheaper than elec­tronic ket­tles and more trust­wor­thy); I then steep the tea in a Finum fil­ter in­side a big Colo­nial Williams­burg ce­ramic fox mug.

My cat would like to re­mind you to take a typ­ing & com­puter break every hour.

Mailing Lists

MOOCs

Fin­ished:

In­com­plete:

Aban­doned:

Profile

This sec­tion cov­ers some of the most im­por­tant things pos­si­ble to know about me: my per­son­al­ity and men­tal de­scrip­tion. No doubt some read­ers ex­pected a care­fully air­brushed & pot­ted bi­og­ra­phy de­scrib­ing where & when I was raised, what my fa­mil­ial & tribal af­fil­i­a­tions are, or what fa­mous in­sti­tu­tions I am af­fil­i­ated with; even though this in­for­ma­tion is al­most en­tirely use­less—what can one pre­dict about me if one knows that I was born in Illi­nois and raised on Long Is­land, but (maybe) my ac­cent and a gen­eral lib­er­al­ism? The irony—that peo­ple want most the in­for­ma­tion they will learn from least—will not be lost on those fa­mil­iar with sig­nal­ing. In con­trast, stan­dard­ized & val­i­dated psy­cho­me­t­ric in­stru­ments like the NEO-PI-R or RAPM re­ally do have pre­dic­tive va­lid­ity for many life out­comes.

(Much of this data comes from Your­Morals.org. I plan to re­take the sur­veys, if pos­si­ble, every decade; it will be in­ter­est­ing to see what changes.)

Personality

To de­scribe my per­son­al­ity briefly: I am in­tro­verted, calm, nei­ther par­tic­u­larly in­dus­tri­ous nor lazy, con­trary, and patho­log­i­cally cu­ri­ous. I have made a copy of my 2011–201412ya re­sponses to the Your­Morals.org cor­pus; dis­cussed in more de­tail below. My scores on the “Big 5 Per­son­al­ity In­ven­tory” (⁠1/⁠2/⁠3):

  1. Open­ness to Ex­pe­ri­ence⁠11⁠: high (short) or 87/87th per­centile (long)

  2. Con­sci­en­tious­ness⁠12⁠: medium or 64/69th

  3. Ex­tra­ver­sion⁠13⁠: low or 6/7th per­centile

  4. Agree­able­ness⁠14⁠: medium-low or 3/3rd per­centile

  5. Neu­roti­cism⁠15⁠: medium-low or 16/13th per­centile

For those who enjoy play­ing the game of ‘ad hominem via lay psy­chi­atric di­ag­no­sis’, may I sug­gest not ac­cus­ing me of As­perger syn­drome—which is so over­done—but some­thing more novel & scary-sounding like schizoid per­son­al­ity dis­or­der?

Philosophy/morals

The rel­e­vant re­sults

Politics

Contact

  • Email: gwern@gwern.net; I do not use Skype or Zoom.

  • PGP key (mir­ror; fin­ger­print: 0329E13129E08F19EDBA7250678AC516DD6A88CF)

-----BEGIN PGP PUBLIC KEY BLOCK-----
 
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
p5IV9yhbHXXHKYyLpLwJN8KpBO4oM0s=
=1NJ8
-----END PGP PUBLIC KEY BLOCK-----

Collaboration Style

Once on #haskell, I was asked why I have no large pro­grams to my credit; I replied, “My prob­lem is that most pro­grams I use al­ready exist.”

I am not a bad Haskell pro­gram­mer (al­though I am no guru like Simon Peyton-Jones, Apfel­mus, or Don Stew­art), but given how long I’ve been using Haskell, my con­tri­bu­tions prob­a­bly look pretty slim. This isn’t be­cause I don’t like Haskell—I do, I find func­tional pro­gram­ming nat­ural: defin­ing trans­for­ma­tion after trans­for­ma­tion until the re­sult is what I need. And of the func­tional lan­guages, Haskell seems the best com­bi­na­tion of power be­yond basic arith­metic or list pro­cess­ing, one of the best ecosys­tems, and good basic lan­guage. (Which is not to say it’s per­fect: there are some sharp edges in the basic math which ir­ri­tate me when I’m mess­ing around in the REPL.)

This is partly be­cause of my style of con­tri­bu­tion. I’ve al­ways pre­ferred to work on ex­ist­ing ap­pli­ca­tions and li­braries than to go write my own. I’ve al­ways pre­ferred to take some­one else’s work and bring it up to snuff than write a clean im­ple­men­ta­tion of my own. I’ve al­ways pre­ferred prod­ding the au­thor or main­tainer to do the right thing than to drop a large batch of patches onto them. Like­wise, I view it as bet­ter to use Haskell stan­dards like Cabal or Darcs than to use some­thing like Au­to­tools even if the lat­ter lets us man­age just a lit­tle more au­toma­tion. I view it as bet­ter to up­load to ⁠Hack­age than to use any fancy site like Github or Source­forge.

It’s bet­ter to do yeo­man’s work tak­ing two sim­i­lar mod­ules in two ap­pli­ca­tions and split them out to a li­brary than to write even the fan­ci­est purely func­tional fin­ger tree using monoids. Bet­ter to com­mit changes that re­duce user con­figs by a line than to demon­strate once again the el­e­gance of mon­ads. Bet­ter by far to file a bug than wank around in #haskell golf­ing ex­pres­sions.

It is much bet­ter to find some peo­ple who have tried in the past to solve a prob­lem and bring them to­gether to solve it, than to solve it your­self—even if it means being a foot­note (or less) in the an­nounce­ment. What’s im­por­tant is that it got done, and peo­ple will be using it. Not the credit. It is a high ac­com­plish­ment in­deed to fac­tor out a bit of func­tion­al­ity into a li­brary and make every pos­si­ble user ac­tu­ally use it. Would that more Haskellers had this mind­set! In­deed, would that more peo­ple in gen­eral had this mind­set; as it is, peo­ple have bad habits of re­peat­edly fail­ing when they think they have spe­cial in­for­ma­tion, are highly over­con­fi­dent even in ob­jec­tive areas with quick feed­back, and badly over­es­ti­mate how many good ideas they can come up with⁠⁠16⁠—in­deed, most good ideas are Not In­vented Here. One should be able to draw upon the wis­dom of oth­ers.

This is an ethos I learned work­ing with the ⁠in­clu­sion­ists of Wikipedia. No code is so bad that it con­tains no good; the most valu­able code is that used by other code; credit is less im­por­tant than work; a steady stream of small triv­ial im­prove­ments is bet­ter than oc­ca­sional mas­sive edits.

A leader is best when peo­ple barely know that he ex­ists, not so good when peo­ple obey and ac­claim him, worst when they de­spise him. Fail to honor peo­ple, They fail to honor you. But of a good leader, who talks lit­tle, when his work is done, his aims ful­filled, they will all say, ‘We did this our­selves.’⁠⁠17⁠

This is not an ethos cal­cu­lated to im­press. Fil­ing bug re­ports, help­ing new­bies, com­ment­ing on ar­ti­cles and code, ca­bal­iz­ing & up­load­ing code—these are things hard to eval­u­ate or take credit for. They are use­ful, use­ful in­deed (shep­heb or, eg. my­self, never boast in #xmonad of hav­ing helped 5 new­bies today, but over the months and years, this friend­li­ness and ready aid is of greater value than any mod­ule in all of XMon­ad­Con­trib.) but they will never im­press an in­ter­viewer or earn a fel­low­ship. Is that too bad? Did I waste all my time?

I don’t think so. I value my con­tri­bu­tions, and the Haskell com­mu­nity is bet­ter for it. It may have made my life a lit­tle more dif­fi­cult—all that time spent on Haskell mat­ters is time I did not de­vote to classes or jobs or what-have-you—but ul­ti­mately they did help some­body. One could do worse things with one’s time than that.

Coding Contributions

I mostly con­tribute to projects in Haskell, my fa­vorite lan­guage; I have con­tributed to non-Haskell projects such as StumpWM, Mnemosyne, GNU Emacs⁠18⁠ etc. but not in major ways, so I do not list them here. After start­ing this web­site, I wound down my reg­u­lar cod­ing ac­tiv­i­ties in favor of my writ­ings; when I code, now it tends to be tools doc­u­mented or hosted on this web­site (eg. Archiv­ing URLs, Re­sorter) or in­te­grated into write­ups (eg. Gen­er­at­ing Anime Faces with Style­GAN). For that code, you can browse by lan­guage tag: C/CSS/Haskell/JS/Python/R/Scheme/shell.

Below is a more de­tailed list of my old Haskell con­tri­bu­tions, most of which is now of only his­tor­i­cal in­ter­est.

Haskell

  • arbtt

    • wrote tu­to­r­ial on con­fig­ur­ing the time-tracker & defin­ing rules: ⁠“Ef­fec­tive Use of arbtt”

    • doc­u­mented de­pen­den­cies, sim­i­lar soft­ware, con­fig­u­ra­tion syn­tax mode, CLI flag cor­rec­tions

  • Darcs

    1. Switched from Fast­Packed­Strings to ByteStrings

    2. Low-level C op­ti­miza­tion

    3. Ini­ti­ated Ca­bal­iza­tion (my work ini­tially ap­peared as ⁠darcs-cabalized and then was merged into HEAD and darcs-cabalized dep­re­cated)

    4. Refac­tor­ing of shell tests

    5. Ini­ti­ated switch from Moin­Moin wiki to Gitit

    6. Iden­ti­fied per­for­mance issue & in­sti­gated ad­di­tion of --max-count op­tion for File­store

  • XMonad

    1. reg­u­lar XMon­ad­Con­trib patch re­views

    2. ⁠Con­fig archive down­loader

    3. Con­tributed mod­ules:

      1. XMonad.Util.Paste

      2. XMonad.Actions.Search

      3. XMonad.Actions.WindowGo

      4. XMonad.Util.XSelection

    4. Main­tained pre­vi­ous⁠⁠19⁠

  • Yi

    1. Con­tributed mod­ules:

      1. Yi.IReader

      2. Yi.Mode.IReader

      3. Yi.Hoogle

    2. Im­proved Emacs key­bind­ings

    3. Ini­ti­ated ‘Uni­cod­ify’ or ‘Pretty Lamb­das’ fea­ture for Haskell syn­tax high­light­ing

    4. Added movement-related func­tions for im­proved in­cre­men­tal search

    5. Cleanup⁠⁠20⁠

    6. Com­ment sup­port to cabal-mode

  • Lambd­abot

    1. (Re)Ca­bal­ized⁠⁠21⁠

    2. Adapted to use Mue­val

    3. Refac­tored out code in mul­ti­ple pack­ages:

      1. ⁠show

      2. ⁠lambdabot-utils

      3. ⁠brain­fuck

      4. ⁠un­lambda

    4. Im­ple­mented run-in-any-directory func­tion­al­ity (pre­vi­ously Lambd­abot could only run in the repos­i­tory di­rec­tory)

    5. Cleanup

    6. Main­tained it (with Cale Gib­bard)

  • Gitit

    • Wrote Darcs back­end (which was moved to the file­store pack­age and be­came Data.File­Store.Darcs)

    • Did some op­ti­miza­tion work (im­ages, JavaScript & CSS mini­fi­ca­tion, wrote gzip en­cod­ing & ini­ti­ated ex­pire head­ers, JS re­lo­ca­tion, fewer calls to ex­pen­sive file­store func­tions)

    • Wrote RSS sup­port

    • Wrote In­ter­wiki plu­gin

    • Wrote Date plu­gin

    • Wrote We­bArchiver & We­bArchiver­Bot plu­g­ins (see later ⁠archiver stand­alone tool/li­brary)

    • Wrote Uni­code plu­gin

    • Wrote HCAR entry

    • Misc. bug re­ports & sug­ges­tions

    • Added PDF ex­port func­tion­al­ity

    • In­te­grated JQuery-based ⁠float­ing foot­notes

  • File­store

    • In­sti­gated its de­vel­op­ment/use in Gitit & ⁠Or­chid

    • Main­tained the Darcs back­end (debug & op­ti­mize)

  • archiver: Wrote and main­tain it (see ⁠re­lease ANN)

  • Mue­val: Wrote it

  • wp-archivebot: Wrote it (see ⁠re­lease ANN)

  • Change-monger: Wrote it

  • Base

  • Unix: fixed a pos­si­ble run­time crash in mkstemp; added mkstemp docs

  • Au­to­proc

    • Cleanup

    • Im­proved basic func­tion­al­ity

    • Im­ple­mented an XMonad-style re­load sys­tem to allow ac­tual cus­tomiza­tion

    • Main­tained it

  • Frag

    • Up­dated for GHC 6.8 & 6.10⁠⁠22⁠

    • Cleanup

    • Re­placed the non-Free level data and graph­ics with Free ones

  • Hint

    • Im­proved ex­am­ples, docs

    • Added UTF8 sup­port

    • Made use ghc-paths li­brary

    • En­abled QuickCheck sup­port

    • Added GHC-options sup­port

  • Hlint: added GHCi in­te­gra­tion

  • Pugs

    • Cleaned up their third-party mod­ules

    • Fixed up var­i­ous Cabal is­sues

    • Helped main­tain it

  • QuickCheck: Data.Complex in­stance

  • Tag­soup: re­placed old cus­tom HTTP down­load code with stan­dard li­brary func­tions

  • Hashell: Up­dated for 6.8’s GHC API; Cleanup; Ca­bal­ized

Cabalization

As part of my ef­fort to help shift the Haskell com­mu­nity to the use of cen­tral­ized pack­ag­ing repos­i­to­ries pi­o­neered by CPAN, which is a fun­da­men­tal re­quire­ment for any mod­ern lan­guage, I made a sys­tem­atic ef­fort to get all ex­tant Haskell code into Cabal for­mat & up­loaded to Hack­age—whether the orig­i­nal au­thors wanted it or not. (For all the ruf­fled feath­ers and con­tin­ued in­fe­lic­i­ties of Haskell pack­ag­ing, a decade later, no Haskeller would go back to the pre-Cabal/Hack­age Au­to­tools days.) I ca­bal­ized and/or up­loaded (ac­cord­ing to the 2013-05-10 ⁠Hack­age up­load log):


  1.  

    This is a lit­er­ary way of say­ing I am not as in­ter­est­ing as my writ­ings, and in some re­spect, it should not mat­ter who I am or what I have done be­cause ⁠ar­gu­ment screens off au­thor­ity.

  2.  

    When I say “re­search as­sis­tant”, I mean it in the older sense of some­one who does de­tail work for an­other per­son’s orig­i­nal re­search—so I spent a lot of time read­ing up on spe­cific areas and mak­ing notes about stuff my boss needs, and only oc­ca­sion­ally do in­de­pen­dent work. Not all my work can be made pub­lic, but some of it is. A par­tial list in rough chrono­log­i­cal order:

  3.  

    The fol­low­ing is a list of my sub­mis­sions to LW I re­gard as sub­stan­tive or par­tic­u­larly good, ex­clud­ing con­tent which can be found on Gwern.net, in chrono­log­i­cal order with in­ter­est­ing ones high­lighted:

  4.  

    Of course, I don’t agree with every MIRI or LW po­si­tion. The in­tel­lec­tual ho­mo­gene­ity has been much over-estimated by out­siders who have not ⁠both­ered to look at the an­nual sur­veys, I think. Here are some major points for me:

    1. MWI: I think that LWers who were per­suaded by ⁠Eliezer’s MWI writ­ings are wrong to do so, as they are un­fa­mil­iar with even the rudi­ments of any al­ter­na­tives in­ter­pre­ta­tions and can­not judge in the mat­ter; how many LWers have ever se­ri­ously looked at all the com­pet­ing the­o­ries, or could even name many al­ter­na­tives? (“Col­lapse, MWI, uh…”), much less could dis­cuss why they dis­like pilot waves or what­ever. Lack­ing any real un­der­stand­ing, they ought to sim­ply adopt the ex­pert con­sen­sus, where MWI seems to have a plu­ral­ity or bare ma­jor­ity of ad­her­ents (with the weak con­fi­dence that im­plies).

    2. Heuris­tics and cog­ni­tive bi­ases: I am not much con­vinced that knowl­edge of heuris­tics & bi­ases help in or­di­nary life. Feed­back & learn­ing are pow­er­ful tools in elim­i­nat­ing error, cal­i­brat­ing pre­dic­tions, and jus­tify com­mit­ting what may look like the ⁠sunk cost fal­lacy; and feed­back is what one gets in or­di­nary life.

      Per Moravec’s para­dox, where our knowl­edge of heuris­tics & bi­ases will pay off most is in what Han­son would call “Far” sce­nar­ios: evo­lu­tion­ary novel sit­u­a­tions with few prece­dents and only costly or non-existent feed­back. (For ex­am­ple, the ques­tion of whether ar­ti­fi­cial in­tel­li­gence will be de­vel­oped by 2040: it will only hap­pen or not once, there are few com­pa­ra­ble events, the con­se­quences may be dra­matic, and our or­di­nary lives offer no use­ful in­sights.) As it hap­pens, this de­scribes much of fu­tur­ism & fore­cast­ing but we can­not jus­tify our fu­tur­ism by claim­ing its tech­niques are in­cred­i­bly valu­able in or­di­nary life!

    3. ⁠Cry­on­ics girl: The do­na­tions ap­pall me, for rea­sons I lay out at length there—they are a com­plete aban­don­ment of core ideas like util­i­tar­i­an­ism & op­ti­mal phil­an­thropy.

    4. Al­icorn’s ⁠“Liv­ing Lu­mi­nously” par­a­digm struck me as du­bi­ous, not backed by even token re­search, and likely idio­syn­cratic to her; I thought her Lu­mi­nos­ity e-novel was merely OK de­spite the end­less dis­cus­sions on LW (ri­val­ing those for Meth­ods of Ra­tio­nal­ity it­self) and that her fol­lowup, Ra­di­ance, was just ter­ri­ble. Nev­er­the­less, her novel ca­reer seems to con­tinue.

  5.  

    There is a ⁠slightly funny story about how Ger­ard came to write it, based on my mu­si­cal in­com­pe­tence.

  6.  

    That is, sum­ming up the (sur­viv­ing) edits of my var­i­ous ac­counts over the years: User:Gwern, User:Marudub­shinki, & User:Rhwawn

  7.  

    Com­pare the CSE re­sults with the Google Re­sults for the anime Wings of Honnêamise. Which is more use­ful for an ed­i­tor? For more de­tails, see my ⁠re­lease an­nounce­ment.

  8.  

    A trick I dis­cov­ered when vis­it­ing FHI in 201511ya—I had used widescreen lap­tops for so long I had for­got­ten how nice portrait-orientation was for read­ing.

  9.  

    I had a Ki­ne­sis Ad­van­tage key­board, but strug­gled with the keymap­ping & large phys­i­cal size mak­ing it dif­fi­cult to find a com­fort­able desk & chair height which left my arms high enough to use the thick Ki­ne­sis. In July 2020, I switched to the split er­gonomic me­chan­i­cal key­board Er­go­dox EZ ($409$3252020), but that wound up hav­ing sim­i­lar is­sues.

    At this point, I began get­ting frus­trated with the time & money I was spend­ing dab­bling in ex­otic key­boards—the biggest prob­lem with the generic key­board was the switches, and that the ten-key is­land took up a lot of space & made it hard to reach for the track­ball. So in Sep­tem­ber 2022, I looked through a key­board search site until I found a cheap $50 thin ten-key-less key­board with good low-travel me­chan­i­cal switches (to help fore­stall RSI from heavy key­presses) from G.Skill, and called it a day. It is thin enough to fit my pos­ture, didn’t re­quire painful re­learn­ing of decades of mus­cle mem­ory, and has been sat­is­fac­tory.

  10.  

    My best guess is that my prob­lem ini­tially was that I se­ri­ously un­der­es­ti­mated how much pres­sure it takes to in­sert a Thread­rip­per CPU into its socket—it re­quired a truly ter­ri­fy­ing amount of force and I only got it right after triple-checking on­line tu­to­ri­als & videos & dis­cus­sions—and that was why the first moth­er­board never worked at all, and the sec­ond one was killed by sta­tic elec­tric­ity or a short.

  11.  

    See also “Ac­tively Open-Minded Think­ing Scale”, “Clar­ity Scale”, “En­gage­ment with Beauty”, & “a mea­sure of what types of sto­ries you enjoy”.

  12.  

    See also “Zim­bardo Time Per­spec­tive In­ven­tory”. Brent W. Roberts crit­i­cizes these two in­ven­to­ries when used to mea­sure Con­sci­en­tious­ness.

  13.  

    See also “Re­la­tional Mo­bil­ity scale”, “Em­pathiz­ing and Sys­tem­iz­ing scales” & “Ra­tio­nal vs Ex­pe­ri­en­tial In­ven­tory”.

  14.  

    See also “Self-Report Psy­chopa­thy Scale”.

  15.  

    See also “Ex­pe­ri­ence in Pur­chas­ing Be­hav­ior Scale” & “Ken­tucky In­ven­tory of Mind­ful­ness Skills”.

  16.  

    For fur­ther read­ing on over­con­fi­dence, see ⁠all LW ar­ti­cles so tagged. I once read in a book of a study in which sub­jects were asked to gen­er­ate ideas for, IIRC, putting out a fire, and to stop only when they were con­vinced they had thought up all good ones, and usu­ally stop­ping when they had thought up only a third; but I have been un­able to re­find it and would ap­pre­ci­ate know­ing de­tails if this de­scrip­tion rings any bells for a reader.

  17.  

    ⁠Chap­ter 17, Tao Teh Ching

  18.  

    For ex­am­ple, my clean-up and ex­ten­sion of the browse-url mod­ule was com­pletely rewrit­ten by RMS; so I can hardly take credit there.

  19.  

    Hence­forth, this im­plies I have a commit-bit (or equiv­a­lent) for that project.

  20.  

    Hence­forth, ‘cleanup’ should be taken as re­fer­ring to ex­ten­sive mis­cel­la­neous changes which in­clude (in no par­tic­u­lar order):

    • fix­ing GHC’s -Wall or hlint warn­ings

    • re­plac­ing OP­TION prag­mas with LAN­GUAGE prag­mas

    • track­ing down li­cens­ing in­for­ma­tion

    • switch­ing from Haskell98 im­ports to the stan­dard hi­er­ar­chi­cal mod­ule im­ports

      1. eg. import Charimport Data.Char; non­triv­ial in some cases where Haskell98 mod­ules were dis­persed over mul­ti­ple base mod­ules

    • re­or­ga­niz­ing the file tree

    • im­prov­ing the Ca­bal­iza­tion

    • white­space for­mat­ting, and so on.

  21.  

    Hence­forth, this typ­i­cally im­plies that I up­loaded it to Hack­age as well

  22.  

    Hence­forth, this im­plies that I made what­ever changes nec­es­sary to get it com­pil­ing on GHC 6.8.x and 6.10.x

Similar Links