Frågor och svar

I den sista föreläsningen svarade vi på frågor som studenterna skickade in:

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:

Vilka verktyg skulle ni prioritera att lära er först?

Några områden som är värda att prioritera:

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:

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.

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:

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:

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:

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.


Edit this page.

Licensed under CC BY-NC-SA.