2023-01-20

spwnn - embarassing

Spwnn is embarrassingly parallel.  Ooh - Wikipedia says I can call it "delightfully parallel."  I like it.

The spwnn program has zero critical sections (mutexes), but the command line version has one, around managing a list of dictionaries.  Each thread gets its own dictionary which eliminates all access contention.  

Except ... the code runs on a computer, and computers have limited resources, so the contention, if there is any, will be visible in a lower part of the stack - the OS or the hardware.

The OS mostly doesn't get in the way of my code - I have run the code long enough that eventually some bookkeeping task fires up and interrupts my code.  But it's rare.

Ah, but the hardware!  There are two places where contention is visible:  on bullshit hyperthreaded machines, the hyperthreads contend with everything, because they are shit.  And then on computers with real cores only, there could be contention when it comes to memory access.

Let's start by measuring perf on the laptop I took on my programming retreat.



Time        Thread Count 30.1493114 1 16.2259312 2 14.4654877 3 13.2778618 4 13.3141502 5 13.3918478 6 13.4732965 7 13.5409872 8

Each row is the time in seconds of a separate execution of the spwnn program with GOMAXPROCS set to a different number. If you don't set GOMAXPROCS, Go will use the core count (including evil hyperthreads) as the default. Luckily, it is super-easy to override.

The laptop has two real cores, and two phony-baloney cores. As you can see, using two threads cuts the execution time just about in half. Setting the thread count to 3 should take 1/3 the time if these were real cores, but as you can see, it makes a small difference, but not much. From then on the execution times are almost identical.

What's great about the Go scheduler is that it is crazy efficient - piling on extra threads (threads 5 through 8) that share the same hardware does not slow the code down!


Nice.


OK, enough about the hyperthreads.


The other place you can get contention is memory access. Sometimes a machine will have more cores than the memory buss can support. Way back in about 2010 I was testing a 32-[real]core (4x8) Intel behemoth and it could only keep up to about 26 cores busy before the memory saturated. Since these beasts were expensive, it was far better to buy 3 12-core (2x6) machines. You got 36 real threads and plenty of memory bandwidth for way less cost. w00t.


In the next part we'll look at some machines that do a delightful job of parallel execution of spwnn.






2023-01-17

spwnn - lambda

AWS lambda's are a boatload of fun.

My first pass, in 2018, was not fun, as it used the old API, which is overly complicated.

The new API "simply" proxies everything into a series of Go maps (hash tables) or similar structure in one of the support languages. "Simply" is quoted because I didn't realize that if I scrolled down the page a bit more in the documentation it told me everything I needed to know, so I spent some extra time writing a lambda echo server to figure out what was what.

In 2022 I used the more modern proxy version.

The new one works as one would expect a web API to work:

https://e36dc3glwa.execute-api.us-east-1.amazonaws.com/default/spwnn?word=contented

I'll probably add more arguments over time, because just seeing internally how a lambda runs is pretty fun.

The new lambda tells you if it is a reused instance of itself, which is a big part of the joy of lambdas.  You can do somewhat expensive initialization which will get reused until AWS decides to retire your lambda.

Lambda start and dictionary load 95.910051ms

_consented_
_contended_
_contented_
_concentrated_

Execution  152.628215ms

Hit reload and:

Lambda reused from previous execution

_consented_
_contended_
_contented_
_concentrated_

Execution  145.135558ms

The execution times are variable, depending on whatever else is going on with the server hosting your lambda.

As a test, I just hit F5 a few times and the runtime varied from 120ms to 160ms. [Update: 2023-01-25: I tried it again, and I'm getting runtimes between 4ms and 60ms. I wonder if your lambda might end up running on significantly different AWS instance types depending on what is available when it first launches.]

Try it out!

NOTE: I haven't posted the code yet because included in the repository is an extremely useful script to create the lambda (which needs to run on an Intel AWS instance - it can be a very cheap one) and another script to update. I'm not sure whether one of the parameters should be secret. I don't think so - I think the secret stuff is already baked into the instance I'm building on. But better to be sure, right? We don't want to post our secrets on Github.

I tried in vain to send enough requests to the lambda so it would start up another one. My code doesn't run long enough to make that easy. (Maybe I'll add a &sleep= parameter for testing that out.)

(2024-05-04 Updated to use ARM64 Lambda)


2023-01-16

spwnn - anana

കൈതച്ചക്ക.jpg


One of the most egregious validation errors with the 370K dictionary is this:

 '_anana_' miscorrected to '[{1 0 _anama_} {1 0 _anana_} {1 0 _asana_} {1 0 _acana_} {1 0 _anasa_} {1 1 _anna_} {1 1 _ariana_} {1 1 _anaqua_} {1 1 _anagua_} {1 1 _arcana_} {1 1 _anarya_} {1 1 _aduana_} {1 1 _ancona_} {1 1 _angina_} {1 1 _anatta_} {1 1 _ananda_} {1 1 _annona_} {1 1 _anabia_} {1 1 _ananta_} {1 2 _anacara_} {1 2 _antenna_} {1 2 _apadana_} {1 2 _annalia_} {1 2 _aptiana_} {1 2 _ana_} {1 2 _andrena_} {1 2 _arabana_} {1 2 _anaudia_} {1 2 _ayapana_} {1 2 _anaemia_} {1 2 _anatira_} {1 2 _anatifa_} {1 2 _aracana_} {1 2 _alkanna_} {1 2 _alemana_} {1 2 _anahita_} {1 2 _anareta_} {1 2 _alcanna_} {1 2 _anapnea_} {1 2 _anaphia_} {1 2 _akhyana_} {1 2 _analgia_} {1 2 _adriana_} {1 2 _analoga_} {1 2 _avadana_} {1 2 _anamnia_} {1 2 _anabata_} {1 3 _antonina_} {1 3 _anaconda_} {1 3 _anaxonia_} {1 3 _analecta_} {1 3 _analogia_} {1 3 _africana_} {1 3 _anandria_} {1 3 _anacusia_} {1 3 _andriana_} {1 3 _anamirta_} {1 3 _angelina_} {1 3 _anadenia_} {1 3 _araneina_} {1 3 _anorgana_} {1 3 _anaspida_} {1 3 _analemma_} {1 3 _anapsida_} {1 3 _angerona_} {1 3 _anabaena_} {1 3 _anasarca_} {1 3 _anaphora_} {1 3 _anathema_} {1 4 _anatropia_} {1 4 _antennata_} {1 4 _anaglypta_} {1 4 _anachueta_} {1 4 _anaberoga_} {1 4 _anaplasma_} {1 4 _anaplasia_} {1 4 _anastasia_} {1 4 _anaphoria_} {1 4 _annapurna_} {1 4 _anarthria_} {1 4 _antiphona_} {1 4 _anconagra_} {1 4 _anapanapa_} {1 4 _anaerobia_} {1 4 _analgesia_} {1 4 _anadipsia_} {1 4 _anamniota_} {1 4 _athanasia_} {1 4 _anamniata_} {1 4 _anarithia_} {1 4 _americana_} {1 5 _antennaria_} {1 5 _anatinacea_} {1 5 _arthuriana_} {1 5 _anathemata_} {1 5 _analemmata_} {1 5 _anarithmia_} {1 5 _anacahuita_} {1 5 _anacolutha_} {1 5 _antimerina_} {1 5 _anacletica_} {1 5 _anticorona_} {1 5 _anazoturia_} {1 5 _anastatica_} {1 6 _alexandrina_} {1 6 _addisoniana_} {1 6 _anaspidacea_} {1 6 _anamnionata_} {1 6 _anastrophia_} {1 6 _anacoluthia_} {1 6 _anacoluttha_} {1 6 _anakoluthia_} {1 6 _angeronalia_} {1 6 _adenanthera_} {1 6 _antaimerina_} {1 6 _anaesthesia_} {1 6 _aquamanalia_} {1 7 _anaphrodisia_} {1 7 _anapterygota_} {1 7 _aquaemanalia_} {1 7 _antilegomena_} {1 7 _anarthropoda_} {1 8 _alternanthera_} {1 8 _anallantoidea_} {1 10 _anagignoskomena_}]'

What are those words?  I might recognize 5 or 10 % of them, tops.

In fact, what is 'anana'?  Not even Google knows: https://letmegooglethat.com/?q=define:anana

It's a pineapple?  A word that means life?  An offering of peace?

Check this out:  https://english.stackexchange.com/questions/134659/why-is-pineapple-in-english-but-ananas-in-all-other-languages 

spwnn - 370K

Here are the validation results on the really big aspell 370K+ word dictionary.

It looks like a lot of errors but out 370,000+ words ... pretty good!

.................................................................................................................................................................................................................................................................................................................................................................................

370104 words in dictionary


Command or word: -g

Letters = 'abcdefghijklmnopqrstuvwxyz'; noisy = true

'_alidad_' miscorrected to '[{1 0 _adalid_} {1 0 _alidad_}]'

'_amaga_' miscorrected to '[{1 0 _agama_} {1 0 _amaga_} {1 13 _agammaglobulinemia_}]'

'_anana_' miscorrected to '[{1 0 _anama_} {1 0 _anana_} {1 0 _asana_} {1 0 _acana_} {1 0 _anasa_} {1 1 _anna_} {1 1 _ariana_} {1 1 _anaqua_} {1 1 _anagua_} {1 1 _arcana_} {1 1 _anarya_} {1 1 _aduana_} {1 1 _ancona_} {1 1 _angina_} {1 1 _anatta_} {1 1 _ananda_} {1 1 _annona_} {1 1 _anabia_} {1 1 _ananta_} {1 2 _anacara_} {1 2 _antenna_} {1 2 _apadana_} {1 2 _annalia_} {1 2 _aptiana_} {1 2 _ana_} {1 2 _andrena_} {1 2 _arabana_} {1 2 _anaudia_} {1 2 _ayapana_} {1 2 _anaemia_} {1 2 _anatira_} {1 2 _anatifa_} {1 2 _aracana_} {1 2 _alkanna_} {1 2 _alemana_} {1 2 _anahita_} {1 2 _anareta_} {1 2 _alcanna_} {1 2 _anapnea_} {1 2 _anaphia_} {1 2 _akhyana_} {1 2 _analgia_} {1 2 _adriana_} {1 2 _analoga_} {1 2 _avadana_} {1 2 _anamnia_} {1 2 _anabata_} {1 3 _antonina_} {1 3 _anaconda_} {1 3 _anaxonia_} {1 3 _analecta_} {1 3 _analogia_} {1 3 _africana_} {1 3 _anandria_} {1 3 _anacusia_} {1 3 _andriana_} {1 3 _anamirta_} {1 3 _angelina_} {1 3 _anadenia_} {1 3 _araneina_} {1 3 _anorgana_} {1 3 _anaspida_} {1 3 _analemma_} {1 3 _anapsida_} {1 3 _angerona_} {1 3 _anabaena_} {1 3 _anasarca_} {1 3 _anaphora_} {1 3 _anathema_} {1 4 _anatropia_} {1 4 _antennata_} {1 4 _anaglypta_} {1 4 _anachueta_} {1 4 _anaberoga_} {1 4 _anaplasma_} {1 4 _anaplasia_} {1 4 _anastasia_} {1 4 _anaphoria_} {1 4 _annapurna_} {1 4 _anarthria_} {1 4 _antiphona_} {1 4 _anconagra_} {1 4 _anapanapa_} {1 4 _anaerobia_} {1 4 _analgesia_} {1 4 _anadipsia_} {1 4 _anamniota_} {1 4 _athanasia_} {1 4 _anamniata_} {1 4 _anarithia_} {1 4 _americana_} {1 5 _antennaria_} {1 5 _anatinacea_} {1 5 _arthuriana_} {1 5 _anathemata_} {1 5 _analemmata_} {1 5 _anarithmia_} {1 5 _anacahuita_} {1 5 _anacolutha_} {1 5 _antimerina_} {1 5 _anacletica_} {1 5 _anticorona_} {1 5 _anazoturia_} {1 5 _anastatica_} {1 6 _alexandrina_} {1 6 _addisoniana_} {1 6 _anaspidacea_} {1 6 _anamnionata_} {1 6 _anastrophia_} {1 6 _anacoluthia_} {1 6 _anacoluttha_} {1 6 _anakoluthia_} {1 6 _angeronalia_} {1 6 _adenanthera_} {1 6 _antaimerina_} {1 6 _anaesthesia_} {1 6 _aquamanalia_} {1 7 _anaphrodisia_} {1 7 _anapterygota_} {1 7 _aquaemanalia_} {1 7 _antilegomena_} {1 7 _anarthropoda_} {1 8 _alternanthera_} {1 8 _anallantoidea_} {1 10 _anagignoskomena_}]'

'_andriana_' miscorrected to '[{1 0 _anandria_} {1 0 _andriana_}]'

'_anterointerior_' miscorrected to '[{1 0 _anteroinferior_} {1 0 _anterointerior_}]'

'_antinganting_' miscorrected to '[{1 0 _antigambling_} {1 0 _antinganting_} {1 1 _antiganting_}]'

'_antitartaric_' miscorrected to '[{1 0 _antarthritic_} {1 0 _antitartaric_}]'

'_apama_' miscorrected to '[{1 0 _amapa_} {1 0 _apama_}]'

'_araca_' miscorrected to '[{1 0 _acara_} {1 0 _araca_} {1 2 _anacara_} {1 2 _aracana_} {1 3 _aracanga_} {1 4 _arracacha_} {1 4 _arracacia_} {1 5 _araracanga_} {1 5 _asarabacca_} {1 7 _arthrostraca_}]'

'_aracana_' miscorrected to '[{1 0 _anacara_} {1 0 _aracana_}]'

'_aracari_' miscorrected to '[{1 0 _acarari_} {1 0 _aracari_}]'

'_aranga_' miscorrected to '[{1 0 _angara_} {1 0 _aranga_} {1 2 _aracanga_} {1 3 _antaranga_} {1 4 _araracanga_}]'

'_arara_' miscorrected to '[{1 0 _araua_} {1 0 _amara_} {1 0 _araba_} {1 0 _araca_} {1 0 _afara_} {1 0 _acara_} {1 0 _arara_} {1 0 _arawa_} {1 1 _aralia_} {1 1 _aguara_} {1 1 _aimara_} {1 1 _aranea_} {1 1 _akhara_} {1 1 _arabia_} {1 1 _aymara_} {1 1 _arthra_} {1 1 _adhara_} {1 1 _aranga_} {1 1 _arauna_} {1 1 _angara_} {1 1 _ankara_} {1 1 _antara_} {1 1 _atsara_} {1 2 _aroeira_} {1 2 _arikara_} {1 2 _avatara_} {1 2 _aramina_} {1 2 _anacara_} {1 2 _ara_} {1 2 _arariba_} {1 2 _arabana_} {1 2 _aeraria_} {1 2 _agouara_} {1 2 _arabica_} {1 2 _agraria_} {1 2 _aracana_} {1 2 _araroba_} {1 2 _araujia_} {1 3 _aratinga_} {1 3 _ahankara_} {1 3 _aracanga_} {1 3 _ahamkara_} {1 3 _arapunga_} {1 3 _araminta_} {1 3 _ataraxia_} {1 3 _arabella_} {1 3 _arrastra_} {1 3 _araneina_} {1 3 _anusvara_} {1 3 _antarala_} {1 3 _aranyaka_} {1 3 _aranzada_} {1 3 _arapaima_} {1 3 _araponga_} {1 3 _ararauna_} {1 3 _araneida_} {1 3 _arcifera_} {1 4 _armoracia_} {1 4 _alcantara_} {1 4 _aldhafara_} {1 4 _arthragra_} {1 4 _arachnida_} {1 4 _araucaria_} {1 4 _aleochara_} {1 4 _alcarraza_} {1 4 _arracacia_} {1 4 _arracacha_} {1 4 _antaranga_} {1 4 _alpujarra_} {1 5 _arthralgia_} {1 5 _adelarthra_} {1 5 _araneoidea_} {1 5 _asarabacca_} {1 5 _aparavidya_} {1 5 _arteriagra_} {1 5 _arthrodira_} {1 5 _arachnopia_} {1 5 _araracanga_} {1 6 _arachnoidea_} {1 7 _arthrogastra_} {1 7 _archicerebra_} {1 7 _arthropleura_} {1 7 _arthrostraca_} {1 7 _arthrotrauma_} {1 7 _araneiformia_} {1 7 _antiparabema_} {1 8 _arachnephobia_} {1 9 _antiparabemata_} {1 9 _arthrobranchia_} {1 10 _arthroneuralgia_}]'

'_asana_' miscorrected to '[{1 0 _anasa_} {1 0 _asana_} {1 3 _anasarca_}]'

'_assesses_' miscorrected to '[{1 0 _avgasses_} {1 0 _assesses_} {1 1 _amasses_} {1 1 _assessors_} {1 1 _assembles_} {1 2 _assemblies_} {1 2 _assess_} {1 2 _assertress_} {1 2 _abasedness_} {1 3 _assessments_} {1 3 _assemblages_} {1 3 _asseverates_} {1 3 _asses_} {1 5 _assertiveness_} {1 5 _assentiveness_}]'

'_avadavat_' miscorrected to '[{1 0 _amadavat_} {1 0 _avadavat_}]'

'_avadavats_' miscorrected to '[{1 0 _amadavats_} {1 0 _avadavats_}]'

'_banana_' miscorrected to '[{1 0 _banaba_} {1 0 _banana_} {1 1 _babiana_} {1 1 _bandana_} {1 2 _bandanna_} {1 2 _banovina_} {1 2 _bana_} {1 4 _balandrana_} {1 5 _bacchanalia_}]'

'_bangalay_' miscorrected to '[{1 0 _balangay_} {1 0 _bangalay_}]'

'_batakan_' miscorrected to '[{1 0 _bakatan_} {1 0 _batakan_}]'

'_batata_' miscorrected to '[{1 0 _balata_} {1 0 _batara_} {1 0 _batata_} {1 1 _ballata_} {1 1 _battuta_} {1 1 _batta_} {1 2 _battalia_} {1 3 _batatilla_} {1 5 _bambacciata_} {1 6 _barotraumata_}]'

'_batatas_' miscorrected to '[{1 0 _balatas_} {1 0 _batatas_} {1 1 _battutas_} {1 2 _battalias_} {1 8 _bastardizations_}]'

'_bedead_' miscorrected to '[{1 0 _beaded_} {1 0 _bedead_} {1 2 _beheaded_} {1 3 _beeheaded_} {1 3 _besteaded_} {1 4 _beefheaded_} {1 6 _beetleheaded_}]'

'_belee_' miscorrected to '[{1 0 _beele_} {1 0 _belee_}]'

'_berber_' miscorrected to '[{1 0 _barber_} {1 0 _berber_} {1 3 _barbecuer_} {1 4 _bearbaiter_} {1 4 _beerbibber_} {1 6 _barbermonger_}]'

'_berberry_' miscorrected to '[{1 0 _barberry_} {1 0 _berberry_} {1 0 _burberry_} {1 1 _bearberry_} {1 2 _briarberry_} {1 2 _brierberry_}]'

'_berbery_' miscorrected to '[{1 0 _barbery_} {1 0 _berbery_} {1 1 _barberry_} {1 1 _berberry_} {1 1 _burberry_} {1 2 _bearberry_} {1 3 _briarberry_} {1 3 _brierberry_}]'

'_berbers_' miscorrected to '[{1 0 _barbers_} {1 0 _berbers_} {1 4 _barbershops_}]'

'_bereaved_' miscorrected to '[{1 0 _beavered_} {1 0 _bereaved_} {1 1 _berreaved_}]'

'_bringing_' miscorrected to '[{1 0 _bridging_} {1 0 _bringing_} {1 3 _bribegiving_}]'

'_bulbul_' miscorrected to '[{1 0 _bulbel_} {1 0 _bulbil_} {1 0 _bulbul_} {1 5 _bulborectal_} {1 5 _bulbospinal_} {1 7 _bulbourethral_}]'

'_bulbuls_' miscorrected to '[{1 0 _bulbels_} {1 0 _bulbils_} {1 0 _bulbuls_}]'

'_cabaa_' miscorrected to '[{1 0 _caaba_} {1 0 _cabaa_}]'

'_calaba_' miscorrected to '[{1 0 _cabala_} {1 0 _calaba_} {1 1 _cabbala_} {1 2 _calabaza_} {1 5 _calabazilla_}]'

'_canaba_' miscorrected to '[{1 0 _cabana_} {1 0 _canaba_} {1 5 _cassabanana_}]'

'_cantalas_' miscorrected to '[{1 0 _calantas_} {1 0 _cantalas_}]'

'_carara_' miscorrected to '[{1 0 _cacara_} {1 0 _caraja_} {1 0 _camara_} {1 0 _carapa_} {1 0 _carara_} {1 1 _carbora_} {1 1 _carauna_} {1 1 _carrara_} {1 1 _cascara_} {1 1 _caraboa_} {1 1 _caranga_} {1 1 _caracoa_} {1 1 _caranda_} {1 1 _caraipa_} {1 1 _caramba_} {1 1 _caranna_} {1 1 _cantara_} {1 2 _camarera_} {1 2 _caiarara_} {1 2 _camarada_} {1 2 _caragana_} {1 2 _caracora_} {1 2 _caracara_} {1 2 _cara_} {1 2 _capybara_} {1 2 _carancha_} {1 2 _capibara_} {1 2 _caraunda_} {1 2 _carajura_} {1 3 _carambola_} {1 3 _cardiagra_} {1 3 _carvoeira_} {1 3 _carvoepra_} {1 3 _carnivora_} {1 3 _cucaracha_} {1 3 _carretera_} {1 3 _caraguata_} {1 4 _caricatura_} {1 8 _cardiemphraxia_} {1 8 _carposporangia_} {1 9 _carbohydraturia_}]'

'_careerer_' miscorrected to '[{1 0 _careener_} {1 0 _careerer_} {1 2 _career_}]'

'_careerers_' miscorrected to '[{1 0 _careeners_} {1 0 _careerers_} {1 2 _careers_}]'

'_casaba_' miscorrected to '[{1 0 _cabasa_} {1 0 _casaba_} {1 1 _cassaba_} {1 5 _cassabanana_}]'

'_castana_' miscorrected to '[{1 0 _canasta_} {1 0 _castana_}]'

'_catenate_' miscorrected to '[{1 0 _catenane_} {1 0 _catenate_} {1 1 _catenae_} {1 2 _catenative_} {1 3 _concatenate_} {1 5 _catechumenate_}]'

'_chanca_' miscorrected to '[{1 0 _cancha_} {1 0 _chanca_} {1 2 _carancha_} {1 4 _camanchaca_} {1 5 _canchalagua_}]'

'_chestiest_' miscorrected to '[{1 0 _chertiest_} {1 0 _chestiest_}]'

'_chonchina_' miscorrected to '[{1 0 _chinchona_} {1 0 _chonchina_}]'

'_colocolo_' miscorrected to '[{1 0 _cocobolo_} {1 0 _colocolo_}]'

'_commendment_' miscorrected to '[{1 0 _commandment_} {1 0 _commendment_}]'

'_conicine_' miscorrected to '[{1 0 _ciconine_} {1 0 _conicine_}]'

'_contented_' miscorrected to '[{1 0 _convented_} {1 0 _consented_} {1 0 _contended_} {1 0 _contented_} {1 2 _concentered_} {1 2 _componented_} {1 3 _concentrated_}]'

'_copopoda_' miscorrected to '[{1 0 _copepoda_} {1 0 _copopoda_} {1 3 _condylopoda_}]'

'_corneocalcareous_' miscorrected to '[{1 0 _calcareocorneous_} {1 0 _corneocalcareous_}]'

'_danglingly_' miscorrected to '[{1 0 _dandlingly_} {1 0 _danglingly_}]'

'_deeded_' miscorrected to '[{1 0 _deseed_} {1 0 _deeded_} {1 0 _deemed_} {1 1 _decreed_} {1 1 _degreed_} {1 1 _deedeed_} {1 1 _despeed_} {1 2 _deerweed_} {1 2 _deed_} {1 2 _deepened_} {1 3 _deathweed_} {1 5 _deepmouthed_} {1 5 _deescalated_} {1 5 _deepfreezed_} {1 6 _deemphasized_}]'

'_deedeed_' miscorrected to '[{1 0 _degreed_} {1 0 _decreed_} {1 0 _deedeed_} {1 0 _despeed_} {1 1 _deseed_} {1 1 _deeded_} {1 1 _deemed_} {1 1 _deerweed_} {1 1 _deepened_} {1 2 _deathweed_} {1 3 _deed_} {1 4 _deepmouthed_} {1 4 _deepfreezed_} {1 4 _deescalated_} {1 5 _deemphasized_}]'

'_dependency_' miscorrected to '[{1 0 _dependancy_} {1 0 _dependency_}]'

'_dependent_' miscorrected to '[{1 0 _dependant_} {1 0 _dependent_}]'

'_dependence_' miscorrected to '[{1 0 _dependance_} {1 0 _dependence_}]'

'_dependently_' miscorrected to '[{1 0 _dependantly_} {1 0 _dependently_}]'

'_dependents_' miscorrected to '[{1 0 _dependants_} {1 0 _dependents_}]'

'_descendent_' miscorrected to '[{1 0 _descendant_} {1 0 _descendent_} {1 5 _descendentalist_}]'

'_descendence_' miscorrected to '[{1 0 _descendance_} {1 0 _descendence_}]'

'_descendents_' miscorrected to '[{1 0 _descendants_} {1 0 _descendents_}]'

'_dinging_' miscorrected to '[{1 0 _dirging_} {1 0 _dinging_} {1 0 _digging_} {1 2 _diverging_} {1 2 _divulging_} {1 3 _disgorging_} {1 3 _digitising_} {1 3 _digitizing_} {1 3 _dislodging_} {1 3 _dialogging_} {1 4 _disengaging_} {1 4 _dialogising_} {1 4 _disobliging_} {1 4 _dingdonging_} {1 4 _dialogizing_} {1 4 _discharging_} {1 4 _disparaging_} {1 5 _discouraging_} {1 5 _digitalizing_} {1 5 _disarranging_} {1 5 _diphthonging_} {1 5 _ditchdigging_} {1 6 _dismortgaging_} {1 7 _diphthongising_} {1 7 _diphthongizing_} {1 7 _disadvantaging_}]'

'_dispersers_' miscorrected to '[{1 0 _dispensers_} {1 0 _dispersers_} {1 1 _disperses_} {1 3 _dispersedness_}]'

'_dispossesses_' miscorrected to '[{1 0 _disposedness_} {1 0 _dispossesses_} {1 2 _dispossess_}]'

'_divertive_' miscorrected to '[{1 0 _divertise_} {1 0 _divertive_} {1 1 _divertible_} {1 1 _diverticle_} {1 3 _dissertative_} {1 4 _diverticulate_}]'

'_felafel_' miscorrected to '[{1 0 _falafel_} {1 0 _felafel_}]'

'_femininity_' miscorrected to '[{1 0 _feminility_} {1 0 _femininity_} {1 2 _feminity_}]'

'_fringing_' miscorrected to '[{1 0 _frigging_} {1 0 _fringing_}]'

'_fulful_' miscorrected to '[{1 0 _fulfil_} {1 0 _fulful_} {1 1 _fulfill_} {1 1 _fullfil_}]'

'_fulfullment_' miscorrected to '[{1 0 _fulfillment_} {1 0 _fulfullment_}]'

'_fullfil_' miscorrected to '[{1 0 _fulfill_} {1 0 _fullfil_}]'

'_grugrus_' miscorrected to '[{1 0 _grugous_} {1 0 _grugrus_}]'

'_gulgul_' miscorrected to '[{1 0 _gilgul_} {1 0 _gulgul_}]'

'_halala_' miscorrected to '[{1 0 _halaka_} {1 0 _halala_} {1 1 _halacha_} {1 1 _harmala_} {1 2 _hala_} {1 5 _holocephala_}]'

'_halalah_' miscorrected to '[{1 0 _halakah_} {1 0 _halalah_} {1 0 _halavah_} {1 1 _habdalah_} {1 1 _haskalah_} {1 1 _halachah_} {1 1 _hallah_} {1 1 _havdalah_} {1 3 _haiathalah_}]'

'_halalahs_' miscorrected to '[{1 0 _halakahs_} {1 0 _halalahs_} {1 0 _halavahs_} {1 1 _habdalahs_} {1 1 _hallahs_} {1 1 _havdalahs_}]'

'_holohemihedral_' miscorrected to '[{1 0 _hemiholohedral_} {1 0 _holohemihedral_}]'

'_homomorph_' miscorrected to '[{1 0 _holomorph_} {1 0 _homomorph_} {1 1 _homeomorph_} {1 2 _homoeomorph_}]'

'_homomorphic_' miscorrected to '[{1 0 _holomorphic_} {1 0 _homomorphic_} {1 1 _homeomorphic_} {1 2 _homoeomorphic_}]'

'_homomorphy_' miscorrected to '[{1 0 _holomorphy_} {1 0 _homomorphy_} {1 1 _homeomorphy_} {1 2 _homoeomorphy_}]'

'_homomorphism_' miscorrected to '[{1 0 _holomorphism_} {1 0 _homomorphism_} {1 1 _homeomorphism_} {1 2 _homoeomorphism_}]'

'_homonomous_' miscorrected to '[{1 0 _homogonous_} {1 0 _homonomous_} {1 0 _homotonous_} {1 1 _homophonous_} {1 2 _homochronous_} {1 4 _homoeochronous_}]'

'_homomorphosis_' miscorrected to '[{1 0 _holomorphosis_} {1 0 _homomorphosis_} {1 2 _heteromorphosis_}]'

'_hypostatization_' miscorrected to '[{1 0 _hypostasization_} {1 0 _hypostatization_}]'

'_indentment_' miscorrected to '[{1 0 _indebtment_} {1 0 _indentment_}]'

'_insense_' miscorrected to '[{1 0 _incense_} {1 0 _intense_} {1 0 _insense_} {1 2 _insensate_} {1 3 _insensible_} {1 4 _insensitive_} {1 4 _insentience_} {1 5 _insenescible_} {1 6 _insensibilize_} {1 6 _incomprehense_} {1 6 _inconsequence_} {1 6 _introsensible_}]'

'_insensed_' miscorrected to '[{1 0 _incensed_} {1 0 _insensed_}]'

'_intended_' miscorrected to '[{1 0 _indented_} {1 0 _intended_} {1 4 _interblended_}]'

'_intendedly_' miscorrected to '[{1 0 _indentedly_} {1 0 _intendedly_}]'

'_intender_' miscorrected to '[{1 0 _indenter_} {1 0 _intender_} {1 2 _indecenter_} {1 6 _intercondenser_}]'

'_intenders_' miscorrected to '[{1 0 _indenters_} {1 0 _intenders_}]'

'_intendente_' miscorrected to '[{1 0 _intendence_} {1 0 _intendente_} {1 2 _indentee_} {1 5 _interdependable_} {1 5 _interdependence_} {1 7 _interindependence_}]'

'_intented_' miscorrected to '[{1 0 _intended_} {1 0 _intented_} {1 0 _indented_} {1 0 _invented_} {1 2 _intervened_} {1 3 _intentioned_} {1 3 _intenerated_} {1 3 _intensified_} {1 3 _incremented_} {1 4 _interblended_} {1 4 _instrumented_} {1 5 _intelligenced_} {1 5 _inaccentuated_} {1 6 _interentangled_} {1 6 _intercatenated_} {1 7 _interinfluenced_} {1 7 _interpenetrated_} {1 8 _indifferentiated_} {1 11 _interdifferentiated_}]'

'_ischioiliac_' miscorrected to '[{1 0 _ilioischiac_} {1 0 _ischioiliac_}]'

'_jereed_' miscorrected to '[{1 0 _jeered_} {1 0 _jereed_} {1 1 _jerreed_}]'

'_jingling_' miscorrected to '[{1 0 _jiggling_} {1 0 _jingling_}]'

'_kinnikinnik_' miscorrected to '[{1 0 _kinnikinick_} {1 0 _kinnikinnik_} {1 1 _kinnikinnick_}]'

'_kokio_' miscorrected to '[{1 0 _kioko_} {1 0 _kokio_}]'

'_kuskus_' miscorrected to '[{1 0 _kuskos_} {1 0 _kuskus_}]'

'_linolin_' miscorrected to '[{1 0 _lanolin_} {1 0 _linolin_} {1 1 _linolein_} {1 2 _linolenin_}]'

'_literality_' miscorrected to '[{1 0 _laterality_} {1 0 _literality_}]'

'_literalities_' miscorrected to '[{1 0 _lateralities_} {1 0 _literalities_}]'

'_macrurous_' miscorrected to '[{1 0 _macrourus_} {1 0 _macrurous_}]'

'_marara_' miscorrected to '[{1 0 _maraca_} {1 0 _matara_} {1 0 _marara_} {1 0 _makara_} {1 1 _mascara_} {1 1 _marasca_} {1 1 _maranta_} {1 1 _mampara_} {1 1 _maratha_} {1 1 _maranha_} {1 2 _maharaja_} {1 2 _mara_} {1 2 _marinara_} {1 2 _makaraka_} {1 2 _maharana_} {1 2 _marattia_} {1 3 _marajuana_} {1 3 _maranatha_} {1 3 _marabunta_} {1 3 _macaranga_} {1 4 _marcgravia_} {1 4 _marinorama_} {1 4 _manvantara_} {1 5 _maharajrana_} {1 6 _madreporaria_} {1 6 _massaranduba_} {1 9 _marsipobranchia_} {1 11 _marsipobranchiata_}]'

'_mascara_' miscorrected to '[{1 0 _marasca_} {1 0 _mascara_}]'

'_mascaras_' miscorrected to '[{1 0 _marascas_} {1 0 _mascaras_}]'

'_maucaco_' miscorrected to '[{1 0 _macauco_} {1 0 _maucaco_}]'

'_mediatization_' miscorrected to '[{1 0 _medialization_} {1 0 _mediatization_}]'

'_mendment_' miscorrected to '[{1 0 _mandment_} {1 0 _mendment_}]'

'_metatatic_' miscorrected to '[{1 0 _metabatic_} {1 0 _metatatic_} {1 1 _metastatic_} {1 1 _metathetic_} {1 2 _metatitanic_} {1 2 _metasomatic_} {1 2 _metrectatic_} {1 3 _metatungstic_} {1 4 _metachromatic_} {1 6 _metachromatinic_}]'

'_microchemical_' miscorrected to '[{1 0 _macrochemical_} {1 0 _microchemical_} {1 5 _microhistochemical_}]'

'_microchemically_' miscorrected to '[{1 0 _macrochemically_} {1 0 _microchemically_}]'

'_microcosmic_' miscorrected to '[{1 0 _macrocosmic_} {1 0 _microcosmic_}]'

'_microcosmical_' miscorrected to '[{1 0 _macrocosmical_} {1 0 _microcosmical_}]'

'_microcosmically_' miscorrected to '[{1 0 _macrocosmically_} {1 0 _microcosmically_}]'

'_microeconomic_' miscorrected to '[{1 0 _macroeconomic_} {1 0 _microeconomic_}]'

'_microeconomics_' miscorrected to '[{1 0 _macroeconomics_} {1 0 _microeconomics_}]'

'_microseismic_' miscorrected to '[{1 0 _macroseismic_} {1 0 _microseismic_}]'

'_minglingly_' miscorrected to '[{1 0 _middlingly_} {1 0 _minglingly_} {1 1 _mislikingly_} {1 4 _misbelievingly_}]'

'_mmmm_' miscorrected to '[{1 0 _mumm_} {1 0 _mmmm_} {1 2 _mm_} {1 4 _mummydom_} {1 5 _mammogram_} {1 5 _melammdim_} {1 5 _mummiform_} {1 5 _monogramm_} {1 5 _mammonism_} {1 5 _mammondom_} {1 5 _mammiform_} {1 7 _mohammedism_} {1 8 _monoammonium_} {1 8 _mammilliform_} {1 9 _metalammonium_} {1 9 _muhammadanism_} {1 9 _mohammedanism_} {1 10 _metagrammatism_} {1 11 _mercuriammonium_}]'

'_monochronous_' miscorrected to '[{1 0 _monochromous_} {1 0 _monochronous_}]'

'_monotonous_' miscorrected to '[{1 0 _monotocous_} {1 0 _monotomous_} {1 0 _monotonous_} {1 3 _monotrematous_} {1 4 _monotonousness_}]'

'_mormaor_' miscorrected to '[{1 0 _maormor_} {1 0 _mormaor_}]'

'_myelomeningocele_' miscorrected to '[{1 0 _meningomyelocele_} {1 0 _myelomeningocele_}]'

'_nationalization_' miscorrected to '[{1 0 _naphthalization_} {1 0 _nationalization_} {1 1 _naturalization_} {1 3 _nasalization_} {1 3 _nonnationalization_} {1 3 _nonrationalization_}]'

'_nicotinian_' miscorrected to '[{1 0 _nicotianin_} {1 0 _nicotinian_}]'

'_nondependence_' miscorrected to '[{1 0 _nondependance_} {1 0 _nondependence_} {1 5 _noninterdependence_}]'

'_nondependency_' miscorrected to '[{1 0 _nondependancy_} {1 0 _nondependency_} {1 5 _noninterdependency_}]'

'_nondependencies_' miscorrected to '[{1 0 _nondependancies_} {1 0 _nondependencies_}]'

'_nonionized_' miscorrected to '[{1 0 _noniodized_} {1 0 _nonionized_}]'

'_outbringing_' miscorrected to '[{1 0 _outbridging_} {1 0 _outbringing_}]'

'_outringing_' miscorrected to '[{1 0 _outrigging_} {1 0 _outringing_}]'

'_outshout_' miscorrected to '[{1 0 _outshoot_} {1 0 _outshout_} {1 1 _outshot_}]'

'_outshouts_' miscorrected to '[{1 0 _outshoots_} {1 0 _outshouts_}]'

'_outshouting_' miscorrected to '[{1 0 _outshooting_} {1 0 _outshouting_}]'

'_outspout_' miscorrected to '[{1 0 _outsport_} {1 0 _outspout_}]'

'_overcover_' miscorrected to '[{1 0 _overcolor_} {1 0 _overcomer_} {1 0 _overcover_} {1 1 _overcollar_} {1 1 _overcolour_} {1 2 _overconquer_}]'

'_overhover_' miscorrected to '[{1 0 _overhonor_} {1 0 _overhover_} {1 1 _overhour_}]'

'_overnearness_' miscorrected to '[{1 0 _overdearness_} {1 0 _overnearness_} {1 3 _overearnestness_} {1 3 _overlearnedness_}]'

'_overseers_' miscorrected to '[{1 0 _overseeds_} {1 0 _overseers_} {1 1 _oversees_}]'

'_overstrove_' miscorrected to '[{1 0 _overstrode_} {1 0 _overstrove_}]'

'_overwove_' miscorrected to '[{1 0 _overwore_} {1 0 _overwove_} {1 4 _overwomanize_}]'

'_palala_' miscorrected to '[{1 0 _palila_} {1 0 _palala_} {1 0 _palaka_} {1 0 _palama_} {1 1 _palatua_} {1 1 _palabra_} {1 1 _palanka_} {1 1 _palla_} {1 1 _palatia_} {1 1 _palmula_} {1 1 _paleola_} {1 2 _pala_} {1 2 _palapala_} {1 2 _palladia_} {1 2 _palmella_} {1 2 _palmilla_} {1 3 _palaestra_} {1 3 _palilalia_} {1 3 _palamedea_} {1 3 _paralalia_} {1 4 _palacsinta_} {1 4 _palaeogaea_} {1 5 _paludicella_} {1 5 _palaeofauna_} {1 6 _palatoplegia_} {1 6 _palaeocarida_} {1 6 _palaeoconcha_} {1 6 _palaeostraca_} {1 7 _paleencephala_} {1 8 _pallanesthesia_} {1 8 _palaeonemertea_} {1 9 _palaeocrinoidea_} {1 9 _palaeoencephala_} {1 9 _palaeechinoidea_} {1 10 _palaeonemertinea_} {1 11 _palaeodictyoptera_}]'

'_patata_' miscorrected to '[{1 0 _pataka_} {1 0 _pataca_} {1 0 _patata_} {1 0 _patana_} {1 1 _patta_} {1 1 _pataria_} {1 1 _pattara_} {1 1 _patagia_} {1 1 _passata_} {1 2 _pata_} {1 2 _palliata_} {1 3 _paramatta_} {1 3 _patagonia_} {1 4 _parabemata_} {1 4 _parramatta_} {1 5 _parapegmata_} {1 5 _papillomata_} {1 6 _pantostomata_} {1 6 _pantatrophia_} {1 6 _pachydermata_} {1 7 _pancreatalgia_} {1 8 _pantastomatida_} {1 10 _palliobranchiata_}]'

'_patination_' miscorrected to '[{1 0 _pagination_} {1 0 _patination_} {1 1 _pampination_} {1 6 _paragglutination_}]'

'_phrenicopericardiac_' miscorrected to '[{1 0 _pericardiacophrenic_} {1 0 _phrenicopericardiac_}]'

'_physiopathology_' miscorrected to '[{1 0 _pathophysiology_} {1 0 _physiopathology_}]'

'_physiopathologic_' miscorrected to '[{1 0 _pathophysiologic_} {1 0 _physiopathologic_}]'

'_physiopathological_' miscorrected to '[{1 0 _pathophysiological_} {1 0 _physiopathological_}]'

'_pinging_' miscorrected to '[{1 0 _pigging_} {1 0 _pinging_} {1 2 _pidgizing_} {1 2 _pillaging_} {1 5 _pilgrimaging_}]'

'_pinnatopectinate_' miscorrected to '[{1 0 _pectinatopinnate_} {1 0 _pinnatopectinate_}]'

'_podophyllous_' miscorrected to '[{1 0 _phyllopodous_} {1 0 _podophyllous_}]'

'_postcostal_' miscorrected to '[{1 0 _postcoital_} {1 0 _postcostal_} {1 5 _postconsonantal_}]'

'_prereceiver_' miscorrected to '[{1 0 _predeceiver_} {1 0 _prereceiver_}]'

'_pronational_' miscorrected to '[{1 0 _probational_} {1 0 _pronational_} {1 2 _provocational_} {1 2 _propagational_} {1 3 _proeducational_} {1 3 _progestational_} {1 4 _pronunciational_} {1 6 _prodenominational_}]'

'_protocols_' miscorrected to '[{1 0 _procotols_} {1 0 _protocols_}]'

'_psychopathology_' miscorrected to '[{1 0 _pathopsychology_} {1 0 _psychopathology_}]'

'_psychopharmacology_' miscorrected to '[{1 0 _pharmacopsychology_} {1 0 _psychopharmacology_}]'

'_psychophysiology_' miscorrected to '[{1 0 _physiopsychology_} {1 0 _psychophysiology_}]'

'_psychophysiological_' miscorrected to '[{1 0 _physiopsychological_} {1 0 _psychophysiological_} {0.9500000000000003 2 _psychophysiologically_}]'

'_pyopneumothorax_' miscorrected to '[{1 0 _pneumopyothorax_} {1 0 _pyopneumothorax_}]'

'_ratification_' miscorrected to '[{1 0 _ramification_} {1 0 _ratification_} {1 3 _rancidification_} {1 3 _regratification_} {1 4 _restratification_}]'

'_reeded_' miscorrected to '[{1 0 _redeed_} {1 0 _reeded_} {1 2 _redeemed_} {1 2 _reseeded_} {1 5 _reevidenced_}]'

'_refeed_' miscorrected to '[{1 0 _reefed_} {1 0 _refeed_} {1 2 _refereed_}]'

'_remanded_' miscorrected to '[{1 0 _redemand_} {1 0 _remanded_} {1 2 _redemanded_}]'

'_rememberer_' miscorrected to '[{1 0 _recomember_} {1 0 _rememberer_} {1 2 _remember_}]'

'_renderer_' miscorrected to '[{1 0 _revender_} {1 0 _renderer_} {1 0 _retender_} {1 2 _render_} {1 3 _reprehender_} {1 3 _resurrender_} {1 3 _recommender_}]'

'_repossesses_' miscorrected to '[{1 0 _reposedness_} {1 0 _repossesses_} {1 2 _reposefulness_} {1 2 _repossess_} {1 2 _repossessions_}]'

'_reregister_' miscorrected to '[{1 0 _registerer_} {1 0 _reregister_} {1 2 _register_}]'

'_resee_' miscorrected to '[{1 0 _reese_} {1 0 _resee_} {1 3 _relessee_} {1 3 _reservee_} {1 6 _representee_}]'

'_reveler_' miscorrected to '[{1 0 _relever_} {1 0 _reveler_} {1 1 _reveller_}]'

'_reveree_' miscorrected to '[{1 0 _rereeve_} {1 0 _reveree_}]'

'_reverers_' miscorrected to '[{1 0 _revelers_} {1 0 _reverses_} {1 0 _reversos_} {1 0 _reverers_} {1 0 _revivers_} {1 0 _reversis_} {1 1 _revellers_} {1 1 _revengers_} {1 1 _revenuers_} {1 1 _revealers_} {1 1 _reverters_} {1 1 _revolvers_} {1 1 _reversals_} {1 1 _reversers_} {1 1 _relievers_} {1 2 _retrievers_} {1 2 _reprievers_} {1 2 _reversions_} {1 2 _revers_} {1 3 _reverseways_} {1 3 _reverseless_} {1 3 _reverencers_} {1 4 _redevelopers_} {1 5 _reverberators_} {1 6 _reversibleness_}]'

'_ringings_' miscorrected to '[{1 0 _riggings_} {1 0 _ringings_}]'

'_ringingly_' miscorrected to '[{1 0 _ridgingly_} {1 0 _ringingly_}]'

'_riveret_' miscorrected to '[{1 0 _rerivet_} {1 0 _riveret_}]'

'_rollerer_' miscorrected to '[{1 0 _reroller_} {1 0 _rollerer_}]'

'_sarsars_' miscorrected to '[{1 0 _sangars_} {1 0 _sarsens_} {1 0 _sambars_} {1 0 _sarsars_} {1 0 _sardars_} {1 0 _sansars_} {1 0 _saggars_} {1 0 _sartors_} {1 1 _samovars_} {1 1 _sambhars_} {1 1 _sandbars_} {1 2 _sarsenets_} {1 4 _saltcellars_} {1 6 _sarsaparillas_}]'

'_semeed_' miscorrected to '[{1 0 _seemed_} {1 0 _semeed_}]'

'_sememe_' miscorrected to '[{1 0 _semese_} {1 0 _sememe_} {1 1 _semee_} {1 1 _semence_} {1 2 _semateme_} {1 2 _seme_} {1 2 _semidome_} {1 2 _semitime_} {1 3 _semanteme_} {1 3 _semiplume_} {1 3 _semicrome_} {1 4 _semichrome_} {1 4 _semencinae_} {1 6 _semelfactive_} {1 7 _semipermeable_}]'

'_singing_' miscorrected to '[{1 0 _sieging_} {1 0 _singing_}]'

'_spikelike_' miscorrected to '[{1 0 _spicelike_} {1 0 _spikelike_} {1 0 _spinelike_} {1 2 _spindlelike_}]'

'_springing_' miscorrected to '[{1 0 _sprigging_} {1 0 _springing_}]'

'_stinting_' miscorrected to '[{1 0 _stenting_} {1 0 _stinting_} {1 0 _stunting_} {1 1 _strunting_} {1 3 _staghunting_} {1 6 _substantiating_} {1 7 _substantivizing_} {1 8 _substantializing_} {1 8 _substantiallying_}]'

'_surucucu_' miscorrected to '[{1 0 _sucuruju_} {1 0 _surucucu_}]'

'_swinging_' miscorrected to '[{1 0 _swigging_} {1 0 _swinging_}]'

'_tarantas_' miscorrected to '[{1 0 _tantaras_} {1 0 _tarantas_} {1 1 _tarantass_} {1 2 _tarantases_} {1 2 _tarantulas_}]'

'_tarantara_' miscorrected to '[{1 0 _tantarara_} {1 0 _tarantara_} {1 0 _tarantula_} {1 1 _tarantella_} {1 2 _tantara_} {1 2 _taratantara_}]'

'_testiest_' miscorrected to '[{1 0 _tentiest_} {1 0 _testiest_}]'

'_theater_' miscorrected to '[{1 0 _teather_} {1 0 _theater_} {1 4 _theatergoer_}]'

'_tictac_' miscorrected to '[{1 0 _tactic_} {1 0 _tictac_} {1 3 _tritactic_} {1 4 _tonotactic_} {1 4 _topotactic_} {1 5 _thymotactic_} {1 6 _thermotactic_} {1 6 _thigmotactic_} {1 8 _tachyphylactic_} {1 8 _traumatotactic_}]'

'_ticktick_' miscorrected to '[{1 0 _ticktack_} {1 0 _ticktick_} {1 0 _ticktock_}]'

'_tictacs_' miscorrected to '[{1 0 _tactics_} {1 0 _tictacs_}]'

'_tictic_' miscorrected to '[{1 0 _tictoc_} {1 0 _tactic_} {1 0 _tictic_} {1 0 _tictac_} {1 3 _triarctic_} {1 3 _tritactic_} {1 4 _topotactic_} {1 4 _tonotactic_} {1 4 _thiolactic_} {1 5 _thymotactic_} {1 5 _transarctic_} {1 6 _thigmotactic_} {1 6 _thermotactic_} {1 7 _trophallactic_} {1 8 _traumatotactic_} {1 8 _telangiectatic_} {1 8 _tachyphylactic_}]'

'_tinglingly_' miscorrected to '[{1 0 _ticklingly_} {1 0 _tinglingly_} {1 0 _tinklingly_}]'

'_tinting_' miscorrected to '[{1 0 _tenting_} {1 0 _tinting_} {1 1 _tjanting_} {1 1 _tainting_} {1 1 _taunting_} {1 2 _tenanting_} {1 2 _truanting_} {1 2 _talenting_} {1 3 _tormenting_} {1 4 _tufthunting_} {1 5 _turpentining_} {1 6 _transplanting_} {1 10 _transessentiating_} {1 10 _transelementating_} {1 11 _transubstantiating_}]'

'_titanic_' miscorrected to '[{1 0 _tanitic_} {1 0 _titanic_} {1 2 _titanitic_}]'

'_tormentor_' miscorrected to '[{1 0 _tormenter_} {1 0 _tormentor_}]'

'_tormentors_' miscorrected to '[{1 0 _tormenters_} {1 0 _tormentors_}]'

'_triliterality_' miscorrected to '[{1 0 _trilaterality_} {1 0 _triliterality_}]'

'_trophophore_' miscorrected to '[{1 0 _trochophore_} {1 0 _trophophore_} {1 0 _trophospore_}]'

'_twinging_' miscorrected to '[{1 0 _twigging_} {1 0 _twinging_}]'

'_tzetze_' miscorrected to '[{1 0 _tzetse_} {1 0 _tzetze_}]'

'_tzaritza_' miscorrected to '[{1 0 _tsaritza_} {1 0 _tzaritza_}]'

'_tzaritzas_' miscorrected to '[{1 0 _tsaritzas_} {1 0 _tzaritzas_}]'

'_unbereaved_' miscorrected to '[{1 0 _unbeavered_} {1 0 _unbereaved_}]'

'_uncontented_' miscorrected to '[{1 0 _unconsented_} {1 0 _uncontended_} {1 0 _uncontented_} {1 2 _uncontinented_} {1 3 _unconcentrated_}]'

'_underverse_' miscorrected to '[{1 0 _underserve_} {1 0 _underverse_}]'

'_unintended_' miscorrected to '[{1 0 _unindented_} {1 0 _unintended_}]'

'_unlistened_' miscorrected to '[{1 0 _unenlisted_} {1 0 _unlistened_}]'

'_unringing_' miscorrected to '[{1 0 _unrigging_} {1 0 _unringing_}]'

'_unsense_' miscorrected to '[{1 0 _untense_} {1 0 _unsense_} {1 1 _unserene_} {1 1 _unsenile_} {1 2 _unsensate_} {1 2 _undefense_} {1 3 _unpropense_} {1 3 _undersense_} {1 3 _unsensible_} {1 4 _unsensitive_} {1 4 _unsensitize_} {1 4 _unsensitise_} {1 5 _unsensualize_} {1 8 _underrecompense_} {1 9 _unsentimentalize_}]'

'_unsensed_' miscorrected to '[{1 0 _unlensed_} {1 0 _unsensed_} {1 2 _unlicensed_} {1 2 _undefensed_} {1 2 _unincensed_} {1 3 _unsequenced_} {1 3 _uncondensed_} {1 3 _unconsented_} {1 3 _unsentenced_} {1 3 _unsegmented_} {1 3 _undispensed_} {1 3 _unserenaded_} {1 4 _unsensitized_} {1 4 _unsensitised_} {1 4 _unsentineled_} {1 5 _unsensualised_} {1 5 _unsensualized_} {1 5 _unsentinelled_} {1 5 _unrecompensed_} {1 8 _underrecompensed_} {1 9 _unsentimentalised_} {1 9 _unsentimentalized_}]'

'_untaintable_' miscorrected to '[{1 0 _unpaintable_} {1 0 _untaintable_} {1 2 _uncontainable_} {1 3 _unacquaintable_} {1 3 _unmaintainable_} {1 4 _unentertainable_}]'

'_untended_' miscorrected to '[{1 0 _undented_} {1 0 _untended_} {1 2 _unintended_} {1 2 _untendered_} {1 2 _unindented_} {1 3 _uncontended_} {1 3 _underrented_} {1 4 _untenderized_} {1 7 _underventilated_} {1 8 _underrepresented_}]'

'_untentered_' miscorrected to '[{1 0 _uncentered_} {1 0 _untendered_} {1 0 _untentered_} {1 1 _unentered_} {1 1 _underrented_} {1 2 _unceremented_} {1 3 _uncarpentered_} {1 3 _unencountered_} {1 6 _underrepresented_} {1 6 _undifferentiated_}]'

'_venene_' miscorrected to '[{1 0 _venere_} {1 0 _venene_} {1 0 _venine_} {1 1 _verbene_} {1 2 _venenate_} {1 2 _venenose_} {1 2 _ventrine_} {1 2 _venerate_} {1 2 _venefice_} {1 2 _vetivene_} {1 3 _veneridae_} {1 3 _venerable_} {1 3 _venturine_} {1 3 _verbenone_} {1 3 _venerance_} {1 4 _venerative_} {1 6 _venepuncture_} {1 7 _veratrylidene_}]'

'_viceregent_' miscorrected to '[{1 0 _vicegerent_} {1 0 _viceregent_}]'

'_viceregency_' miscorrected to '[{1 0 _vicegerency_} {1 0 _viceregency_}]'

'_viceregents_' miscorrected to '[{1 0 _vicegerents_} {1 0 _viceregents_}]'

'_winging_' miscorrected to '[{1 0 _wigging_} {1 0 _winging_} {1 3 _wigwagging_}]'

'_worrywort_' miscorrected to '[{1 0 _worrywart_} {1 0 _worrywort_}]'

'_zinging_' miscorrected to '[{1 0 _zigging_} {1 0 _zinging_} {1 3 _zigzagging_} {1 4 _zoologizing_}]'

Elapsed time 6m29.087588486s; GOMAXPROCS 64


Isn't that some fun reading?


spwnn - iteration

The fastest computer I own can validate the 49K dictionary in about 45 seconds.

The laptop computer I took with me on my programmer retreat (i7-6500U Skylake U/Y @ 2.6 GHz - 2 real cores) took 30 seconds just to do the words that start with 'a'.  In fact, my early benchmarks were based on the time it took to validate the words that started with 'a', because I didn't want to test the whole dictionary.  

Looking back at my notes I see I had a single core version in Go when I started on the trip (i.e., no goroutines) and one of the first goals was to parallelize it, which I did, and which cut test time in half on that machine.  The entire validation pass in parallel is almost three minutes.  Yech!

I never tried the 370K dictionary.  That would have taken forever!

For <reasons> I had some AWS credits burning a hole in my pocket (they expired last Dec 31, 2022).  It was time to "finish" this project!  (Nothing is ever finished, right?)  This motivated me to use the fastest AWS machine I could find for fast iteration.  That was a r6i.32xlarge which could validate the entire dictionary in 7 seconds but also cost $8.00 / hour.  This was a great boost to productivity!  99% of the time I was using one core of this beast (in VIM) but when I wanted to test, my results just popped right up in seconds!  And I could test the 370K dictionary.  So while using this expensive machine was overall inefficient it was highly effective, and effectiveness matters more!

As the end of year 2022 was approaching, I realized Graviton 3 had been released (I had still thought it was in preview).  I switched to the biggest Graviton 3 machine which is only a bit over $2.00 / hour to rent.  Those are hobbyist rates! (I mean, not if you leave it on all the time, but people spend way more on hobbies than $2.00 / hour.)

So 4x in savings right there.  And it validates the 49K dictionary in ... 6 seconds.  The 370K dictionary takes 6 1/2 minutes on the Graviton 3 64 core.

I love Graviton.  No hyperthreading!  Cheap!  Available!

Another benefit of fast iteration was I saw a pattern that was too grumpy to see while sitting around waiting for my own computer.  It's obvious in retrospect, but the way forward is to have a list of 30 words - the 12 that don't fully resolve to themselves and a two dozen more as a test case.  That test would run in not-measurable-time me thinks.  So that's on the table for the future.  Then if that test fails run the whole thing (if necessary) to figure out the issue.

The current benchmarks based on go 1.18.6 are here:  https://github.com/Above-the-Garage/spwnnmark

Gus who lives at the house where I had my programming retreat.  He doesn't like hyperthreading either.




spwnn - go!

My 1980-ish version of spwnn was written in Lisp, cause that's what I was doing a lot of at the time.  And the neurons are ... lists.

Then the version of spwnn in 2000-ish was written in C/C++ (mostly C I imagine), because that's what I was doing at the time.

When it came time to start on the "final" version I chose a language I wanted to learn - Go.

I chose Go because it was designed by the same minds behind C and I really liked the idea of goroutines.



From some notes, I see I did a serial version of spwnn in 2016, and it wasn't until my programming retreat in 2018 that I upgraded it to the parallel version.

Aside from a few tiny programs for testing features and APIs, this is my only Go program (okay, more like a family of programs).

My only complaint about Go so far is modules.  I understand the problems the system is meant to solve but it reminds me of a story in The Mythical Man-Month about the job control language (JCL) for the 360 series of computers.  Nobody liked that job control on previous products was several languages and confusing, so they decided they would have one language.  Unfortunately, the result was all of those languages got merged into one gigantic language where the only difference from before was that you prefixed everything with "JCL".

I also don't like that when I upgraded from Go 1.9 to 1.18 my code wouldn't compile. In fact, in Go 1.9 some external libraries stopped working after a couple of years because they depended on modules and versions and shit I didn't understand.

If my use of modules is all wrong, it's because I didn't want to learn another language.


2023-01-15

spwnn - fun with letter pairs

Below is a pointer to a PDF of the neuron sizes.  The "neuron size" is the number of words that contain that letter pair.

(The column to the left is the first letter, then scan along the columns to find the second letter.)

https://s3.amazonaws.com/above-the-garage.com/spwnnStuff/neuronSizes-49K-2023-01-14f.pdf

The print is small so it fits on a page - you can zoom in with your browser.

Lots of analysis can be done with this simple document (the source is in Excel).

For instance - what letter pairs are never used in my 49K dictionary?

The highlighted cells have no words assigned to them.

One can identify "unpopular" letter pairs. I don't see an overall pattern, except some letters are unpopular no matter what other letter they pair with.

For fun, suppose we are authoring a book and we want to invent some names and show clearly to the reader they are in an alien dialect.  (Like metaverse shows where the alternate universe always has floating airships.)

Some infrequently (or never) occurring letter pairs could be used to indicate alien words.

"jl" has no words in my dictionary.  Let's make up a character name using that fact: "Bojlus".  Clearly alien.

The letter 'q' is fantastically unpopular in my dataset, but let's not use that, as it's too obvious, and getting other usages in contemporary life.  How about ... "vf".  Another character name: "Savfin".

It works, right?

How about coloring by overall popularity?

In that last chart, the intensity of a cell is colored by the number of words attached.  Most cells are so dark you can't read the number - but a few are super popular, by a couple of orders of magnitude.

The most popular letter pair is "s_" or "s at the end of a word."  Next up in popularity is "in".

Interestingly, GPT-3, of the currently famous chatGPT, rarely uses individual letters.  spwnn tokenizes into letter pairs.  GPT tokenizes into an unknown number of single letters, pairs, triplets and quadruplets.  Here is how it tokenizes the alphabet:

Link to tokenizer doc: https://beta.openai.com/tokenizer

Their documentation, linked to above, but liable to disappear in the future, so I've copied the key bit, says: 

"A helpful rule of thumb is that one token generally corresponds to ~4 characters of text for common English text. This translates to roughly ¾ of a word (so 100 tokens ~= 75 words).

If you need a programmatic interface for tokenizing text, check out the transformers package for python or the gpt-3-encoder package for node.js."


spwnn - the fundamental question

The question I wanted to answer for myself is why we clearly can read words "all at once" at a glance, and yet the order of the letters in the word matters.  That seems perhaps like a silly question ... but what would be an algorithm that would run in parallel on parts of the word, completely independently, and yet somehow deal with the implied word ordering.  I hypothesized that by grouping the letters of the words into pairs there would be a way to derive the original word - even if it were misspelled.

And it works well, even though there is no inherent reason it should.  One would expect it would require a deep neural network, but this is insanely shallow.

In my big dictionary of 370,000 or so words, only 255 don't return themselves as the correct word.  In my 49000 or so word dictionary only 10 or 12 don't pass that test.

That's amazing!

It supports my hypothesis that people process words in letter pairs, in parallel, at a glance.



spwnn - 40 years in the making!

I worked on this program for 40 years and I finally published it on GitHub.

It's a spelling corrector.

https://github.com/Above-the-Garage/spwnn/blob/main/README.md

I'll write more about it as I work out how to explain it.

You can try it here:

https://above-the-garage.com/spwnn

Just type in a word (misspelled or otherwise) and see what it comes up with.

I've found it useful when I am so far off on the spelling of a word that regular spelling correctors won't even give me a hint.

I hope I'm in the running for fewest lines of code produced over the longest period of time.

2023-01-14

What model?

DeepLens is a hobby IoT device Amazon sells.  It is a small Intel-Atom powered computer (2 cores, 1.3 GHz) with a camera builtin.

I have the 1.0 version.  There is a 1.1 version that is faster, and I can see why they made that!

My version is painfully slow to use.

My original idea (just over four years ago) was to set it up and then SSH into it and poke at it from time-to-time.

But ... it's really good to have a screen so you can see what the camera is seeing!

(There is no doubt a way to do this remotely but I didn't figure it out.)

Well, I powered it up today, with the goal of doing a factory reset.  The instructions are long and complicated, basically resulting in a 16 GB USB stick that it will boot from and erase itself.  And I made it harder by doing it on the device itself!

I learned stuff about Linux file systems.  That's good.

When I was done I had evolved my setup quite a bit, from just the device plugged into an HDMI monitor and keyboard and mouse, to lots of additional power and a USB-extender.

Frankensetup for factory reset!

Luckily the Seahawks made it to the playoffs today (sadly, they failed on their quest, but dang, what a successful first half!).  So when I started up long-running operations on DeepLens I was actually busy watching American football.

Picture copied from AWS site.  Should be linked.

I remember four years ago I followed the instructions, registered the device to an AWS account, got all the IAM settings correct, and then started to follow the tutorial for doing some machine learning.

Then I hit the showstopper: "Pick your model."

What model is that?  For what?  Don't I just give it a bunch of pictures and train it?  You mean I have to understand what a model is!  Well, I don't.

Yesterday, I used a Google service to translate some speech to text.  It said, "Pick your model", but luckily it had a dropdown, so I just picked one.  

Pick your model.  Isn't that a huge part of being a data scientist who specializes in machine learning?  Knowing the strengths and weaknesses of models?

I dunno.  Someday I'll learn what a model is, and how that is different from the data.  Or I'll learn something completely different because I don't understand any of these terms at all.

It's on my list of things to learn about, this mysterious machine learning, that as I write this is generating art, text, and even computer code.

But not right now.




2023-01-12

CellMapper

The final leg of my triangular approach to improving the quality and reliability of our internet was moving off Verizon into Google Fi.

We were on Verizon because an important part of the extended family was on it and calling within the network was free.  I mean, like 10 years ago.  And 10 years ago Verizon probably worked a bit better in our neighborhood (2G?).  But over time it got worse and worse until it would take minutes to get a text message.  Luckily with Wi-Fi calling it was not so much of a problem - except then Comcast went bonkers and we couldn't depend on Wi-Fi calling either!

Ok.  So big deal - switch providers - how hard can it be?  Well, since I also had the T-Mobile hotspot (later replaced with Starlink) I knew that T-Mobile coverage worked, albeit poorly.  But more research was required!

Enter:  CellMapper.

T-Mobile (which is what Google Fi uses in our state) had way more cell towers than Verizon.  They are also 5G towers - that's why there are so many.  So even though we are in a cell-shadow even with T-Mobile, it's not as bad.

I couldn't really test T-Mobile without getting a T-Mobile phone (because had locked Verizon phones) so it was a risk to switch carriers, but when bad is bad (our Verizon coverage), how much worse could it get?

(My wife says:  "Never challenge worse.")

Google Fi is also 50% of the cost of Verizon!  That's nice.

Anyway, moral of the story is:  Check out CellMapper!  It's awesome.

Also, speaking of legs and triangles:


BTW - if you switch cell providers for you and your family, move your phone LAST.  I thought I would be a helpful guinea pig and move my line first - but my line is the billing line!  Once I moved it, it was much harder to login to the Verizon site!  So do yourself a favor and move your line last.

2023-01-10

The Speed

My original hypothesis was slowing down the Xfinity modem would make less use of the higher frequencies (which are more subject to interference) and my problems would be solved.

As it is, I think, from something one of the techs told me, that slower modems are just configured to run more slowly, and still use all the frequencies.

But!  I wanted to get a speed reduction from Comcast because my modem used to work before we bumped it up to gigabit.  It wasn't a pretty process.  They kept saying they had me on a new, cheaper, and slower plan, but it didn't work, and there was no confirmation email.

Once I mentioned Starlink I got a real tech on the line who configured the modem (and my billing plan) to slower (and cheaper).

I bought the slowest plan they had - 300 megabits - and then a few months later they cranked it up to 400 megabits for the same price!  So I'm at 400 megabits, which usually will go up to 440.

I suspect since the bad connector was fixed that I could go back to gigabit ... just not feeling like taking the risk right now.

One benefit of getting the slower plan (because Comcast screwed up) was my premium channels went away.  So Comcast cut the cord for me.

Thanks Comcast!

[2023-11-14 - back up to a gigabit and things are working!  My previous poor performance was caused by a single bad connector that was out of site in a bush.]



2023-01-09

The Modem

As I started to concentrate on my Comcast issue I felt like all of my problems started when I upgraded to Gigabit service.  Previously it was ... 500 megabits?  I don't remember.

One thing about faster modems is they use higher frequency bands to push more data down the wire.  I thought, hey, maybe, for whatever reason, the infrastructure, somewhere along the way, can't handle the increased frequencies.  (Turns out I was (almost) right - it was a connector that couldn't reliably handle the higher frequencies.)

So I thought, a relatively cheap experiment would be to get a cable modem that has limited speed - one that can't do gigabit speeds.

I bought a Netgear CM1150V for a hundred bucks.  It was only rated to 400 megabits by Comcast, but it turns out it could easily handle gigabit speeds.  Oh, and it had to handle VOIP, which the CM1150V did fine with.

Well, shit.  It's still fast.  For some reason I did a web search for CM1150V, probably looking for the manual, and discovered this awesomeness:  A script for scraping the error rates of every frequency band and plotting it!

I downloaded it and I was off to the races.  

Here's a graph of the data it collected over a few days:

That's a lot of errors!

So my hypothesis about the errors being worse at higher frequencies - wrong.  But boy that's a lot of errors.  And they were worse in the morning for unknown reasons.

Now somewhere I got the idea, I think from the author of the modem scraper, Harold Holm, that if the modem gets too many errors it reboots!  So that's what was happening.  Which explains why the big outages lasted as long as it typically would take me to reboot it manually.

I get the logic of defensive programming on the cable modem - hey, if there are too many errors, maybe rebooting will fix it! But even with all those errors it worked - until the modem itself decided there were too many errors and rebooted.

Oh my.

I'm back on the Comcast modem, because I wanted to have all their own parts online when the tech came out to analyze my system.  And it turns out that for not much money you rent the modem and also get unlimited internet.  So I need to keep the modem anyway.  

Ideally I would hook up the Netgear modem again, and scrape it for more data, and see how I'm doing on errors, but since it's all working, why bother?



2023-01-08

Comcast - one tiny error

After two years of my family and I getting five-minute internet outages once or two (or three times) a day, I finally decided to put the energy into fixing this problem.

I decided to have Comcast come out until it was fixed.  What happened twice in the preceding two years was a technician would come out, replace a lot of connectors, maybe put in a filter that made things worse, put in a signal booster, measure things, declare it fixed, and leave.  Generally the internet service was great except for these outages.

And now, in July 2022, having made up my mind to just keep calling Comcast until it was fixed ... it was fixed on the first visit.

I believe I mentioned to the Comcast phone rep that I had Starlink as my backup.  Suddenly several people at Comcast were interested in my case and talked to me on the phone.  I talked to a more senior person, and he told me, don't hold back, show the tech everything, walk the neighborhood, whatever.  Normally I feel a little bad telling someone how to do their business, but now I was empowered!

The tech that came out did a terrific job of replacing connectors and simplifying the setup - my MOCA network worked again.  He measured things and showed the measurements to me.  Everything looked great just as it always had.  We walked over to the distribution point down the street a bit, and which doesn't fully close anymore, and is kind of filled with dirt, and talked about how rain affects it.  The tech said he had seen worse and it wasn't the problem.  We went across the street to the look at the new fiber drop, which is a disaster:

and

The tech was pretty sure that wasn't Comcast fiber.  That's another story.

He cleaned up the junction box at the house:

Before


After

That's much nicer than the mess that was in there before.

But I thought ... self, you are empowered.  Maybe ... poke around a bit.

So I traced the cable from that box to where it goes into a big, beautiful conduit that goes under the neighbor's yard and driveway.  The origin of that is another story.

And as I looked ... what to my wondering eyes did appear but another connector that had been there for years!


It had been hidden in these bushes.  I pointed it out to the tech and mentioned that it didn't look like the same waterproofing he had been doing to the other connectors.  He opened it up and said, "Eww."

It was full of ... green stuff.

He replaced it, waterproofed it, and now everything is great.  One frickin' connector.  Auggh!

As to the specific cause of the five-minute outages ...

That is also another story.

2023-01-07

Backup?

Why do I have a backup internet?

When we moved into our house way back in 1995 I had a permanent dial up connection to WorldCom or some such.  It was not supposed to be a permanent connection but nobody was using the local connection point too much, so the vendor didn't care, and so I was basically dialed up 24/7, and using Windows connection sharing to get the internet through the rest of the house.

Then one day enough people were using their service so they suddenly cared and told me I couldn't be dialed up 24/7.  Luckily just then DSL service came to our neighborhood.  But just barely as we were at the outer reaches of how far those telephone lines could carry a signal. But it worked and we went from sort-of 56K on the modem to an actual 64K.  Woohoo!

Then our small local cable company laid fiber in our neighborhood - not "FTTH" (Fiber To The Home) but fiber to distribution points that then came into our home over the cable lines.

Then Comcast bought that company many moons ago and we've had Comcast every since.

Comcast gets a bad rap but they've been pretty great to us:  generally increasing our speeds for less money - what's better than that?

Shortly before the Covid-times I upgraded to Gigabit Comcast and was happy.

But then the Covid-times hit and I was working entirely from home and I became aware that my Comcast connection would go out to lunch for about five minutes once or twice a day.  

During the first two years of Covid I did try to get it fixed.  First, I switched out the modem in case it was the problem (it wasn't); and then I called Comcast, twice during those two years, and a technicians would come out and rotate all the connectors and try some signal boosters and such.  But none of that fixed it.  It would work really well - very fast - faster than promised - but go out to lunch for five minutes.

Those big thick red lines are five minute outages.  Spoiler alert: it's the same amount of time it takes ro reboot the router.



How it looks now.  Beautiful!


It was not good for me to disappear for five minutes in the middle of an online meeting, so I needed a backup.  I went with T-Mobile home internet which was LTE and about 20 megabits down and 2-3 megabits up - but reliable, except during power outages.

A couple of years went by and I finally decided I really needed to get my Comcast connection fixed - it felt like some distribution equipment was broken in the neighborhood which caused the five minute outages.  

And while I was at it, I wanted to make my backup internet systems more reliable too.

Oh, and we got virtually no signal from Verizon, our cell carrier, and most of our phone calls were carried over Comcast via Wi-Fi calling.  So I couldn't use our cell phones data as a backup.

Things were worst during a power outage - Comcast crapped out even if I had my modem on a UPS; and T-Mobile would drop it's connection although it was on a UPS; and Verizon never worked unless we physically drove out of our cell coverage shadow (never mind about a power outage).

My plan to get Comcast fixed was to call them and have them come out again and again until they figured it out.  If things went like they had in the past, a technician would come out, change the connectors, try a new amplifier or two, and one time they swapped out the modem.  Nothing got better., so I assume going forward, a tech would come out, do the same things, and it wouldn't get better, but eventually they would have to escalate the problem inside Comcast.  That was the plan at any rate.

My plan for T-Mobile internet was to switch to Starlink after my friend HB demonstrated how far along they were with satellite deployments.

And, ironically, my plan for Verizon was to switch to Google Fi, which is T-Mobile in our area.  We get a little data over T-Mobile, but I doubt it will work during a power outage.  We haven't had an outage yet long enough to test my hypothesis.  It's got a better chance than Verizon.

It took six months to do these things and now they are all done!  I have slower but more reliable Comcast (400 megabits down); T-Mobile cell service which works (mostly) at our house; and Starlink.

In succeeding posts I'll describe what went right and wrong with my plan.  It was an eventful transition.

2023-01-05

Starlink

Starlink is amazing.  My results are highly variable, with 150 mb down at the higher end, and 20 mb down at the lower end.  I think it's more affected by general usage in the area (since it's a shared resource) as opposed to visibility of satellites but I don't really know.  It's my backup internet.

Think of all the engineering that went into this thing:  reusable rockets; mass production of satellites that can maneuver themselves into position and have highly accurate phased array antennas; and my little dish, also with a phased array antenna that shoots a signal 350 miles into space!  That's twice the distance between Seattle, WA and Portland, OR.

I climbed up on the roof to install Dishy (as it is known) temporarily.


Later, thank goodness, I had it professionally mounted by the same person that installed our roof.


So far it's come through all the interesting weather we've had with flying colors.

If this blog post triggered you because you're mad at Elon, take comfort that SpaceX is run day-to-day by the COO Gwynne Shotwell who appears to be a genius, given the scope of SpaceX operations.

A colleague at work HB put me onto this real-time map of the 3,000 (-ish, as I write this) satellites is what convinced me to take a chance on Starlink.  





We live in an electromagnetic shadow, so cell towers don't work so great, like, at all, well, barely, so my T-Mobile backup internet kind of worked (and got my son through eight weeks of a remote trial where he was a juror), but it never worked during a power outage.  I suspect that cell towers go into a low power mode during an outage so they can provide minimal service for longer.

For Starlink, I'm genuinely lucky.  I wasn't supposed to get a dish until sometime in 2023 and it arrived in 2022.  And my base station ("internet gateway") is SpaceX satellite headquarters nearby in Redmond!  The Redmond office has ten or twelve radomes on the roof which I believe is ... a lot.



Underground!

Speaking of windstorms ...

Let me recommend the "Weather Underground" site.

It lets you see the current stats of your local weather station.  Here's our local weather station:

https://www.wunderground.com/dashboard/pws/KWASAMMA54

Here's our windstorm from yesterday, petering out this morning:



You can (in the plot) see wind gusts up to 40 mph and a general trend of wind from 15 mph trending down to zero.

What's also great is you can get information about yesterday - like, how much did it rain?  Or how fast was the wind yesterday?




2023-01-04

Windy

There's a bit of a windstorm going on as I type this.

Which reminded me of this awesomeness:

Wind Visualization

The link is centered around Puget Sound, but you can scroll around to see anywhere on Earth.