Frågor och svar
I den sista föreläsningen svarade vi på frågor som studenterna skickade in:
- Några rekommendationer för att lära sig operativsystemsrelaterade ämnen som processer, virtuellt minne, avbrott, minneshantering osv?
- Vilka verktyg skulle ni prioritera att lära er först?
- När ska jag använda Python jämfört med Bash-skript jämfört med något annat språk?
- Vad är skillnaden mellan
source script.shoch./script.sh? - Var lagras olika paket och verktyg, och hur fungerar referenser till dem?
Vad är egentligen
/bineller/lib? - Ska jag köra
apt-get installför ett python-paket, ellerpip installför paketet? - Vilka är de enklaste och bästa profileringsverktygen för att förbättra prestanda i min kod?
- Vilka webbläsartillägg använder ni?
- Vilka andra verktyg för datahantering är användbara?
- Vad är skillnaden mellan Docker och en virtuell maskin?
- Vilka är för- och nackdelarna med varje operativsystem, och hur väljer man mellan dem (t.ex. bästa Linux-distribution för sitt syfte)?
- Vim eller Emacs?
- Några tips eller tricks för maskininlärningsapplikationer?
- Fler Vim-tips?
- Vad är 2FA och varför ska jag använda det?
- Några kommentarer om skillnader mellan webbläsare?
Några rekommendationer för att lära sig operativsystemsrelaterade ämnen som processer, virtuellt minne, avbrott, minneshantering osv?
Först och främst är det inte självklart att du faktiskt behöver vara väldigt insatt i alla de här områdena eftersom det är låg-nivåämnen. De blir viktiga när du börjar skriva mer låg-nivåkod, som att implementera eller modifiera en kärna. Annars är de flesta ämnen inte så relevanta, med undantag för processer och signaler som vi kort berörde i andra föreläsningar.
Några bra resurser för att lära sig mer:
- MIT:s kurs 6.828 - forskarnivåkurs i operativsystemteknik. Kursmaterialet är publikt.
- Modern Operating Systems (4:e upplagan) av Andrew S. Tanenbaum är en bra översikt över många av de nämnda begreppen.
- The Design and Implementation of the FreeBSD Operating System - en bra resurs om FreeBSD (obs att det inte är Linux).
- Andra guider som Writing an OS in Rust där man implementerar en kärna steg för steg i olika språk, främst i undervisningssyfte.
Vilka verktyg skulle ni prioritera att lära er först?
Några områden som är värda att prioritera:
- Lär dig använda tangentbordet mer och musen mindre. Det kan handla om kortkommandon, gränssnittsanpassning osv.
- Lär dig ditt redigeringsverktyg ordentligt. Som programmerare går större delen av tiden åt till att redigera filer, så det lönar sig mycket att bli bra på det.
- Lär dig automatisera och/eller förenkla repetitiva delar av ditt arbetsflöde, eftersom tidsvinsten blir enorm.
- Lär dig versionshanteringsverktyg som Git och hur de används tillsammans med GitHub för samarbete i moderna programvaruprojekt.
När ska jag använda Python jämfört med Bash-skript jämfört med något annat språk?
Generellt är Bash-skript bra för korta och enkla engångsskript där du bara vill köra en viss sekvens av kommandon. Bash har dock flera egenheter som gör det svårt att arbeta med i större program eller skript:
- Bash är lätt att få rätt i enkla fall men kan vara mycket svårt att få rätt för alla möjliga indata. Till exempel har mellanslag i skriptargument orsakat otaliga buggar i Bash-skript.
- Bash lämpar sig dåligt för kodåteranvändning, så det kan vara svårt att återanvända delar av tidigare program. Mer generellt finns inget tydligt bibliotekstänk i Bash.
- Bash förlitar sig på många magiska strängar som
$?eller$@för specifika värden, medan andra språk ofta använder explicita namn, somexitCodeellersys.args.
Därför rekommenderar vi mer mogna skriptspråk som Python eller Ruby för större och/eller mer komplexa skript. Du hittar mängder av bibliotek på nätet där andra redan löst vanliga problem i de språken. Om du hittar ett bibliotek som implementerar den funktionalitet du behöver i ett visst språk är det oftast bäst att använda just det språket.
Vad är skillnaden mellan source script.sh och ./script.sh?
I båda fallen läses och körs script.sh i en Bash-session, men skillnaden är vilken session som kör kommandona.
Med source körs kommandona i din nuvarande Bash-session, och därför ligger förändringar i miljön kvar efteråt, som katalogbyte eller funktionsdefinitioner.
När du kör skriptet fristående med ./script.sh startar din nuvarande Bash-session en ny Bash-instans som kör kommandona i script.sh.
Därför kan den nya instansen byta katalog, men när den avslutas och kontrollen går tillbaka till föräldersessionen ligger föräldersessionen kvar i samma katalog som tidigare.
På samma sätt gäller att om script.sh definierar en funktion som du vill använda i terminalen behöver du source-köra den för att funktionen ska definieras i din aktuella session.
Annars definieras funktionen i den nya Bash-processen i stället för i ditt aktuella skal.
Var lagras olika paket och verktyg, och hur fungerar referenser till dem? Vad är egentligen /bin eller /lib?
När det gäller program du kör i terminalen hittas de i katalogerna som listas i miljövariabeln PATH.
Du kan använda kommandot which (eller type) för att se var skalet hittar ett visst program.
I allmänhet finns konventioner för var olika filtyper ligger.
Här är några av dem vi nämnde, och se Filesystem Hierarchy Standard för en mer komplett lista.
/bin- viktiga kommandobinärer./sbin- viktiga systembinärer, vanligtvis avsedda att köras av root./dev- enhetsfiler, specialfiler som ofta är gränssnitt mot hårdvara./etc- värdspecifika systemomfattande konfigurationsfiler./home- användarnas hemkataloger./lib- gemensamma bibliotek för systemprogram./opt- valfri applikationsprogramvara./sys- information och konfiguration för systemet (täcks i första föreläsningen)./tmp- temporära filer (även/var/tmp). Rensas ofta mellan omstarter./usr/- skrivskyddad användardata./usr/bin- icke-essentiella kommandobinärer./usr/sbin- icke-essentiella systembinärer, vanligtvis avsedda att köras av root./usr/local/bin- binärer för användarkompilerade program.
/var- föränderliga filer som loggar eller cache.
Ska jag köra apt-get install för ett python-paket, eller pip install för paketet?
Det finns inget universellt svar på den frågan. Det hänger ihop med den mer generella frågan om du ska använda systemets pakethanterare eller en språkspecifik pakethanterare för att installera programvara. Några saker att väga in:
- Vanliga paket finns ofta i båda, men mindre populära eller nyare paket kanske inte finns i systemets pakethanterare. I det fallet är det bättre med den språkspecifika lösningen.
- Språkspecifika pakethanterare har ofta mer uppdaterade paketversioner än systemets pakethanterare.
- När du använder systemets pakethanterare installeras bibliotek systemomfattande. Om du behöver olika versioner av ett bibliotek för utveckling räcker det därför ofta inte. För det scenariot erbjuder de flesta språk någon form av isolerad eller virtuell miljö så att du kan installera olika biblioteksversioner utan konflikter. För Python finns virtualenv, och för Ruby finns RVM.
- Beroende på operativsystem och hårdvaruarkitektur kan paket komma som binärer eller behöva kompileras. På ARM-datorer som Raspberry Pi kan systemets pakethanterare vara bättre än den språkspecifika om den första levererar binärer och den andra kräver kompilering. Det beror mycket på din miljö.
Du bör försöka använda antingen den ena eller den andra vägen, inte båda, eftersom blandning kan ge svårdebuggade konflikter. Vår rekommendation är att använda språkspecifik pakethanterare när det går, och isolerade miljöer (som Pythons virtualenv) för att undvika att smutsa ner den globala miljön.
Vilka är de enklaste och bästa profileringsverktygen för att förbättra prestanda i min kod?
Det enklaste och samtidigt ganska användbara verktyget för profilering är tidmätning med utskrifter. Du beräknar manuellt tiden mellan olika delar av koden. Genom att upprepa detta kan du i praktiken göra en binärsökning genom koden och hitta segmentet som tar längst tid.
För mer avancerade verktyg låter Valgrinds Callgrind dig köra programmet och mäta hur lång tid allt tar samt hela anropsstackar, alltså vilken funktion som anropat vilken.
Det producerar sedan en annoterad version av programmets källkod med tidsåtgång per rad.
Det saktar dock ner programmet ungefär en storleksordning och stödjer inte trådar.
För andra fall kan perf och andra språkspecifika sampling-profilerare snabbt ge användbar data.
Flamegraphs är en bra visualisering av utdata från sådana sampling-profilerare.
Du bör också försöka använda verktyg som är specifika för språket eller uppgiften du jobbar med.
För webbutveckling har till exempel utvecklarverktygen i Chrome och Firefox utmärkta profilerare.
Ibland är den långsamma delen i koden att systemet väntar på en händelse, som en diskläsning eller ett nätverkspaket.
I de fallen är det värt att kontrollera att överslagsräkningar av teoretisk hastighet utifrån hårdvarans kapacitet stämmer med faktisk mätdata.
Det finns också specialverktyg för att analysera väntetider i systemanrop.
Dit hör verktyg som eBPF som utför kärnspårning av användarprogram.
Särskilt bpftrace är värt att titta på om du behöver den typen av låg-nivåprofilering.
Vilka webbläsartillägg använder ni?
Några av våra favoriter, främst för säkerhet och användbarhet:
- uBlock Origin - en bred blockerare som inte bara stoppar annonser utan även många former av tredjepartskommunikation som en sida försöker göra. Det inkluderar även inline-skript och andra typer av resursladdning. Om du är villig att lägga tid på konfiguration för att få saker att fungera, testa medium mode eller till och med hard mode. Det kommer att göra att vissa sajter inte fungerar förrän du justerat inställningarna tillräckligt, men det förbättrar också din säkerhet på nätet markant. Annars är easy mode redan ett bra standardläge som blockerar de flesta annonser och spårare. Du kan också definiera egna regler för vilka webbobjekt som ska blockeras.
- Stylus - en förgrening av Stylish (använd inte Stylish, det visade sig stjäla användares webbhistorik) som låter dig sidladda egna CSS-stilmallar till webbplatser. Med Stylus kan du enkelt anpassa och ändra utseendet på webbplatser. Det kan vara att ta bort en sidopanel, ändra bakgrundsfärg eller textstorlek och typsnitt. Det är fantastiskt för att göra webbplatser du ofta besöker mer lättlästa. Stylus kan dessutom hitta stilar som andra användare skrivit och publicerat på userstyles.org. De flesta vanliga webbplatser har till exempel en eller flera mörka teman där.
- Full Page Screen Capture - inbyggt i Firefox och finns även som Chrome-tillägg. Låter dig ta skärmdump av en hel webbplats, ofta mycket bättre än utskrift för referensändamål.
- Multi Account Containers - låter dig separera cookies i “containrar” så att du kan surfa med olika identiteter och/eller säkerställa att webbplatser inte kan dela information mellan varandra.
- Integrering med lösenordshanterare - de flesta lösenordshanterare har webbläsartillägg som gör inmatning av inloggningsuppgifter både smidigare och säkrare. Jämfört med att bara kopiera och klistra in användarnamn och lösenord kontrollerar dessa verktyg först att domänen matchar den som finns i posten, vilket skyddar mot nätfiskeattacker.
- Vimium - ett webbläsartillägg som ger tangentbordsbaserad navigering och styrning av webben i Vim-anda.
Vilka andra verktyg för datahantering är användbara?
Några verktyg för datahantering vi inte hann ta upp i föreläsningen är jq och pup, som är specialiserade parserverktyg för respektive JSON- och HTML-data.
Programsproket Perl är också ett bra verktyg för mer avancerade datahanteringspipelines.
Ett annat knep är kommandot column -t som kan användas för att omvandla blankstegstext (inte nödvändigtvis justerad) till korrekt kolumnjusterad text.
Mer generellt är vim och Python två något mer okonventionella men kraftfulla datahanteringsverktyg. För vissa komplexa transformationer över flera rader kan vim-makron vara ovärderliga. Du kan spela in en serie åtgärder och upprepa dem så många gånger du vill. I anteckningarna om redigerare (och förra årets video) finns till exempel ett exempel där en XML-fil omvandlas till JSON med enbart vim-makron.
För tabellformad data, ofta i CSV-format, är Python-biblioteket pandas ett utmärkt verktyg. Inte bara för att det gör det enkelt att definiera komplexa operationer som group by, joins eller filter, utan också för att det gör det enkelt att plotta olika egenskaper i datan. Det stödjer även export till många tabellformat, inklusive XLS, HTML och LaTeX. Alternativt har programspråket R (ett möjligen dåligt språk) mycket funktionalitet för statistik över data och kan vara användbart som sista steg i din pipeline. ggplot2 är ett mycket bra plottbibliotek i R.
Vad är skillnaden mellan Docker och en virtuell maskin?
Docker bygger på ett mer generellt koncept som kallas containrar. Den viktigaste skillnaden mellan containrar och virtuella maskiner är att virtuella maskiner kör en hel OS-stack, inklusive kärnan, även om kärnan är samma som på värdmaskinen. Till skillnad från VM:ar undviker containrar att köra en extra kärninstans och delar i stället kärna med värden. I Linux görs detta via en mekanism som kallas LXC, och den använder en serie isoleringsmekanismer för att starta ett program som tror att det kör på egen hårdvara, fast det i verkligheten delar hårdvara och kärna med värden. Containrar har därför lägre overhead än en full VM. Å andra sidan har containrar svagare isolering och fungerar bara om värden kör samma kärna. Om du till exempel kör Docker på macOS behöver Docker starta en Linux-VM för att få en Linux-kärna, och därför blir overheaden fortfarande betydande. Till sist är Docker en specifik containerimplementation anpassad för programvarudistribution. Därför har den vissa egenheter, till exempel att Docker-containrar som standard inte bevarar någon lagring mellan omstarter.
Vilka är för- och nackdelarna med varje operativsystem, och hur väljer man mellan dem (t.ex. bästa Linux-distribution för sitt syfte)?
När det gäller Linuxdistributioner gäller att även om det finns väldigt många så beter sig de flesta ganska likt för de flesta användningsfall. Det mesta av Linux- och UNIX-funktioner och intern mekanik kan läras i vilken distribution som helst. En grundläggande skillnad mellan distributioner är hur de hanterar paketuppdateringar. Vissa, som Arch Linux, använder en rullande uppdateringsmodell där du får det senaste men där saker ibland går sönder. Andra, som Debian, CentOS eller Ubuntu LTS, är mycket mer konservativa med uppdateringar i sina kodförråd, vilket oftast ger mer stabilitet men färre nya funktioner. Vår rekommendation för en enkel och stabil upplevelse på både desktop och server är Debian eller Ubuntu.
macOS är en bra mellanpunkt mellan Windows och Linux med ett välpolerat gränssnitt. macOS bygger dock på BSD i stället för Linux, så vissa delar av systemet och vissa kommandon skiljer sig. Ett alternativ värt att titta på är FreeBSD. Även om vissa program inte körs på FreeBSD är BSD-ekosystemet mindre fragmenterat och bättre dokumenterat än Linux. Vi avråder från Windows för allt utom utveckling av Windows-applikationer eller om du behöver en avgörande funktion, som bra drivrutinsstöd för spel.
För dual-boot-system tycker vi att den mest fungerande implementationen är macOS Boot Camp, och att andra kombinationer kan bli problematiska över tid, särskilt i kombination med till exempel diskkryptering.
Vim eller Emacs?
Vi tre använder vim som primär redigerare, men Emacs är också ett bra alternativ, och det är värt att prova båda för att se vad som passar dig bäst. Emacs följer inte Vims modala redigering som standard, men det kan aktiveras via Emacs-tillägg som Evil eller Doom Emacs. En fördel med Emacs är att tillägg kan implementeras i Lisp, ett bättre skriptspråk än vimscript, som är Vims standardskriptspråk.
Några tips eller tricks för maskininlärningsapplikationer?
Flera av lärdomarna från den här kursen går att tillämpa direkt på ML-applikationer. Som i många vetenskapliga discipliner gör man inom ML ofta en serie experiment och vill se vad som fungerade och inte. Du kan använda skalverktyg för att snabbt söka igenom experiment och aggregera resultaten på ett vettigt sätt. Det kan handla om att välja ut alla experiment inom ett visst tidsintervall eller de som använder en viss datamängd. Om du loggar relevanta experimentparametrar i en enkel JSON-fil kan detta bli väldigt enkelt med verktygen vi gått igenom i kursen. Om du dessutom inte jobbar i ett kluster där du skickar in GPU-jobb bör du se över hur den processen kan automatiseras, eftersom den annars kan bli både tidskrävande och mentalt dränerande.
Fler Vim-tips?
Några ytterligare tips:
- Tillägg - ta dig tid att utforska tilläggsekosystemet. Det finns många bra tillägg som åtgärdar begränsningar i vim eller lägger till ny funktionalitet som passar bra i befintliga vim-arbetsflöden. Bra resurser är VimAwesome och andra programmerares dotfiles.
- Markeringar - i vim kan du sätta en markering med
m<X>för en bokstavX. Du hoppar tillbaka till markeringen med'<X>. Det gör det enkelt att snabbt navigera till specifika positioner inom en fil eller mellan filer. - Navigering -
Ctrl+OochCtrl+Iflyttar dig bakåt respektive framåt mellan nyligen besökta positioner. - Undo tree - Vim har en avancerad mekanism för att hålla reda på ändringar. Till skillnad från andra redigerare lagrar vim ett träd av ändringar, så även om du ångrar och sedan gör en annan ändring kan du fortfarande gå tillbaka till ursprungsläget genom att navigera i trädet. Tillägg som gundo.vim och undotree visar trädet grafiskt.
- Tidsbaserad ångra - kommandona
:earlieroch:laterlåter dig navigera filer via tidsreferenser i stället för en ändring i taget. - Persistent undo är en fantastisk inbyggd vim-funktion som är avstängd som standard.
Den bevarar ångrahistorik mellan vim-sessioner.
Genom att sätta
undofileochundodiri.vimrcsparar vim filspecifik ändringshistorik. - Leader key - leader-tangenten är en specialtangent som ofta lämnas till användaren för egna kommandon.
Mönstret är vanligtvis att trycka och släppa den tangenten (ofta mellanslag) och sedan en annan tangent för ett visst kommando.
Ofta använder tillägg den här tangenten för egen funktionalitet, till exempel använder UndoTree
<Leader> Uför att öppna undo tree. - Avancerade textobjekt - textobjekt som sökningar kan också kombineras med vim-kommandon.
Till exempel tar
d/<pattern>bort text fram till nästa träff av mönstret, ochcgnändrar nästa förekomst av den senaste söksträngen.
Vad är 2FA och varför ska jag använda det?
Tvåfaktorsautentisering (2FA) lägger till ett extra skyddslager för dina konton ovanpå lösenord. För att logga in behöver du inte bara kunna ett lösenord, utan också på något sätt “bevisa” att du har tillgång till en fysisk enhet. I enklaste fallet kan det vara ett SMS till mobilen, även om det finns kända problem med SMS-baserad 2FA. Ett bättre alternativ som vi rekommenderar är en U2F-lösning som YubiKey.
Några kommentarer om skillnader mellan webbläsare?
Webbläsarlandskapet runt 2020 var att de flesta i praktiken liknade Chrome eftersom de använder samma motor (Blink). Det betyder att Microsoft Edge, som också bygger på Blink, och Safari, som bygger på WebKit (en liknande motor), i praktiken var sämre varianter av Chrome. Chrome är en rimligt bra webbläsare både vad gäller prestanda och användbarhet. Om du vill ha ett alternativ är Firefox vår rekommendation. Den är jämförbar med Chrome på nästan alla punkter och utmärker sig av integritetsskäl. En annan webbläsare, Flow, var inte redo för användare ännu men implementerade en ny renderingsmotor som lovade högre prestanda än de dåvarande.
Licensed under CC BY-NC-SA.