Innhold
1 Python/Cerebrum oppsett
1.1 En mulig måte er å bruke envtoolkit fra Cerebrum devutils
Kjør følgende:
git@github.uio.no:IT-CEREBRUM/crb-devutils.git
Les devutils/envtoolkit/INSTALL.rst
Et fint triks for å koble via gt-auth automatisk, er å legge følgende i ~/.ssh/config:
Host cere-utv04
ProxyCommand ssh <gtauth user>@gt-auth nc %h %p
Et annet fint triks, er å legge din offentlige ssh-nøkkel inn i ~/.ssh/authorized_keys, på både gt-auth og cere-utv04, som gjør det betraktelig mindre smertefritt samt raskere å få logget inn.
2 Utviklingsmiljø
- cere-utv04: Nytt utviklingsmiljø. Bruk denne.
- OS: RHEL7
- Lokal lib: /usr/lib/python2.7/site-packages/
3 Øvrig oppsett
3.1 Setup.py
Installasjonsskriptet som set opp filene til Cerebrum-prosjektet. Den vanlegaste måten å køyre Cerebrum-kode i test på er ved å legge git-repoet i $PYTHONPATH, men om ein treng å teste installasjonsopplegget så er det setup.py som set opp dette. Mest brukt av Cerebrum drift. Du trengs altså ikkje å bruke setup.py for testing, med mindre det er sjølve setup.py du skal teste.
Døme på kommandoen:
$ python setup.py install --prefix /site/$USERNAME/cerebrum/
Dette legg ut alle filene under til dømes /site/jokim/.
#TODO: meir info!
3.2 makedb.py
Dette skriptet er for å opprette og vedlikeholde Cerebrum-databasen. Det kan sette opp ein ny, tom database, og når nye Cerebrum-konstantar vert definerte køyrast denne for å opprette dei i databasen. Den brukast også til å opprette nye tabellar ut frå nye design-filer. Migreringar vert derimot gjort av eit anna verktøy.
3.3 Ny database
For å opprette tom, ny database:
$ python makedb.py --extra-file design/mod_changelog.sql --extra-file ...
Opsjonen --extra-file legg til ekstra design-filer med funksjonalitet som ikkje er ein del av core, til dømes change-log. Det er vanleg å bruke denne mange ganger, sidan dei fleste instansar brukar ein del ekstra.
Kommandoen oppretter då alle tabellar som trengs. Konstantar må du legge inn etterpå.
3.4 Nye konstantar
Kvar gang du definerer ein ny konstant i Cerebrum-koden må denne leggast inn i databasen så du kan bruke den.
For å opprette nye konstantar:
$ python makedb.py --only-insert-codes # oppretter
For å opprette nye konstantar, oppdatere innhaldet i eksisterande og slette konstantar som ikkje lenger eksisterer:
$ python makedb.py --update-codes # oppretter, sletter og endrer
Kommandoen går gjennom Cerebrum etter alle definerte konstantar (henta frå cereconf.CLASS_CONSTANTS) og samanliknar dei med databasen.
3.5 Ny design-fil
Om du har ei ekstra design-fil du vil ha kjapt lagt til i databasen:
python makedb.py design/mod_new_file.sql
Kommandoen les då inn design-fila og gjer alt den vil av opprettingar, typisk oppretting av nye databasetabellar. Eventuelt nye konstantar må du legge inn etterpå, i ei eiga køyring med til dømes --only-insert-codes.
3.6 migrate
Dersom databasen må oppdaterast, til dømes at tabellar skal endrast på, må du migrere databasen. Dette gjerast med filer under design/migrate_to_*.
Følgende kommando migrerer dns-modulen fra versjon 1.3 til 1.4. (Det kan være fortrinnsmessig å kjøre makedb.py --only-insert-codes før migrering, hvis du har definert nye konstanter):
~/src/cerebrum/contrib/migrate_cerebrum_database.py --component=dns --from=dns_1_3 --to=dns_1_4 --makedb-path=~/src/jcerebrum --design-path=~/src/cerebrum/design
#TODO: beskriv kommando og kva som skjer!
3.7 psql
Dette er den vanlegaste postgresklienten for å få shell-tilgang til ein postgres-database.
cere-utv04.uio.no $ psql -h dbpg-cere-utv.uio.no -U cerebrum cerebrum_uio_ro Password for user cerebrum: cerebrum_uio_ro=>
Den støtter halvvegs autofullføring av kommandoar, databasar, tabellnamn og radnamn ved hjelp av tabbing.
Nokre greie hjelpe-kommandoar:
- \? - gir deg meir info om bruk av psql.
- \h kommando - gir deg informasjon om og formatet til ein sql-kommando.
- \d [tabellnamn] - gir ei beskriving av ein tabell, med liste over element
og constraints. Om du ikkje oppgir noko tabellnamn får du ei liste over
alle tabellar.
- \c [database] - kobler til gitt database. I testmiljøet kan du hoppe
mellom dei ulike databasane på denne måten. Om du ikkje oppgir noko
database koblar du til på nytt til databasen du allereie er i. Dette
er praktisk til dømes når ein database har blitt oppdatert med ein ny
kopi frå produksjonsmiljøet.
3.7.1 Tilgjengelege databasar
Nokre databasar vert automatisk oppdaterte med ein kopi av produksjonsmiljøet:
- cerebrum_<instans>_ro
Dette er ein kopi av produksjonsmiljøet for kvar instans. Desse er i utgangspunktet ReadOnly, og du bør lage ein kopi av ein slik database når du skal teste, og ikkje jobbe mot denne databasen direkte. Ikkje bruk denne databasen når du tester noko. Ikkje ver tilkobla denne databasen, då ingen får laga ein kopi av den om nokon bruker den.
- cerebrum_uio_no_pq
Dette er ein kopi av UiO sitt produksjonsmiljø, men der tabellen paid_quota_printjob er tømd. Dette fordi denne tabellen er svær, og som oftast unødvendig for testing. I oktober 2012 innehaldt denne tabellen 35'871'822 rader!
- Andre databaser:
- cerebrum_<instans>_<brukarnamn>
- Dette er det vanlege namneformatet for databasar du oppretter for testing.
3.7.2 Opprette test-database
Kvar natt får vi ein kopi av databasen til instansane Cerebrum drifter. Du bør ikkje gjere testar og endringar mot desse test-databasane, men heller lage deg ein lokal kopi. For å lage din eigen kopi av databasen:
cerebrum_uio_ro=> CREATE DATABASE cerebrum_uio_jokim WITH OWNER cerebrum TEMPLATE cerebrum_uio_no_pq; CREATE DATABASE cerebrum_uio_ro=> \c cerebrum_uio_jokim SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) You are now connected to database "cerebrum_uio_jokim" as user "cerebrum". cerebrum_uio_jokim=> ANALYZE ; WARNING: skipping "pg_authid" --- only superuser can analyze it WARNING: skipping "pg_database" --- only superuser can analyze it WARNING: skipping "pg_tablespace" --- only superuser can analyze it WARNING: skipping "pg_pltemplate" --- only superuser can analyze it WARNING: skipping "pg_auth_members" --- only superuser can analyze it WARNING: skipping "pg_shdepend" --- only superuser can analyze it WARNING: skipping "pg_shdescription" --- only superuser can analyze it WARNING: skipping "pg_db_role_setting" --- only superuser can analyze it ANALYZE cerebrum_uio_jokim=>
Vi har ein database per instans, på formatet cerebrum_INST_ro. For UiO har vi også ein skrivbar test-database - cerebrum_uio_rw, som du kan køyre små testar mot, samt ein database utan utskriftskvoter, cerebrum_uio_no_pq. Tabellen for utskriftskvoter er svær, så du kan bruke denne databasen for å få ein kjappare database.
3.7.3 Bruke database i utviklingsmiljø
For at utviklingsmiljøet ditt skal kunne ta i bruk din nyopprettede test-database, må du kopiere/symlinke en allerede eksisterende passord-fil på cere-utv04, som ligger i mappen:
/site/cerebrum/<instans>/etc/passwords
Din passord-fil må ligge i samme mappe, og ha navn etter følgende format:
passwd-cerebrum@<database-navn>@dbpg-cere-utv.uio.no
Dette må gjøres for alle nye instanser du etterhvert begynner å arbeide på.
3.7.4 Sjå aktive tilkoblingar
For å feilsøke i databasetilkoblingar kan ein få ei liste over aktive db-tilkoblingar mot ein database i psql:
SELECT * FROM pg_stat_activity WHERE datname = 'cerebrum_uio_ro'; datid | datname | procpid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | xact_start | query_start | waiting | current_query ---------+----------------------------+---------+----------+----------+------------------+---------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+---------+------------------------------------------------------------------------ 3619295 | cerebrum_uio_jokim | 16407 | 16785 | cerebrum | | 129.240.2.119 | | 37019 | 2012-10-11 10:32:23.459898+02 | | 2012-10-11 10:42:50.120591+02 | f | <IDLE> 3604719 | cerebrum_nmh_jokim | 10484 | 16785 | cerebrum | | 129.240.2.119 | | 54544 | 2012-10-10 14:39:28.170159+02 | 2012-10-10 14:39:32.639194+02 | 2012-10-10 14:40:12.574372+02 | f | <IDLE> in transaction 3590201 | cerebrum_uio_jokim_studaut | 937 | 16785 | cerebrum | | 129.240.2.119 | | 38321 | 2012-10-11 09:59:36.114355+02 | 2012-10-11 10:02:36.55046+02 | 2012-10-11 10:02:36.572672+02 | t | DELETE FROM posix_user WHERE account_id = 1808175
Du kan sjå i kolonna current_query kva for kall som køyrast, for å sjå kva som tek tid.
Dersom du lurer på kva eller kven transaksjonen tilhøyrer, er kolonna client_port vesentleg. På maskina som er nemnd i client_addr (vanlegvis cere-utv01) kan du køyre bash-kommandoen:
# netstat -pa --numeric-ports --inet | grep CLIENT_PORT tcp 0 0 cere-utv04.uio.no:CLIENT_PORT dbpg-cereutv2.uio.no:DB_PORT ESTABLISHED PROCESS_ID/python /* Til dømes: */ tcp 0 0 cere-utv04.uio.no:37019 dbpg-cereutv2.uio.no:5432 ESTABLISHED 30499/python # ps aux | grep PROCESS_ID root 22560 0.0 0.0 61148 732 pts/1 S+ 11:06 0:00 grep PROCESS_ID USERNAME PROCESS_ID 0.0 0.5 198960 23756 pts/25 S+ 10:32 0:00 COMMAND /* Til dømes: */ jokim 30499 0.0 0.5 198960 23756 pts/25 S+ 10:32 0:00 python /usit/platon/gt-u1/jokim/src/cerebrum-head/servers/bofhd/bofhd.py -c /usit/platon/gt-u1/jokim/jobb/config/uio/config.dat --unencrypted -p 10001 -h localhost
Ein ser då både kva skript som køyrast og kven det tilhøyrer.
3.7.5 Grave frem hva som låser en tabell
Finn databasens oid:
SELECT oid from pg_database WHERE datname = 'cerebrum_uio_ro';
Finn locks på denne databasen:
SELECT * FROM pg_locks WHERE database = 5643667;
Her vil du klassisk lete etter ekslusive låser. Hvis du finner en lås du vil titte på, kan du ta verdien i pid-feltet, og stappe det inn i:
SELECT * FROM pg_stat_activity WHERE procpid = 12765;
Med dette kan du spore opp sesjonen videre til klienten.
Hvis du ønsker å se hvilken tabell låsen er satt på, kan du f.eks. gjøre:
SELECT relname FROM pg_class WHERE oid = 5644075;
Her er oid verdien du finner i relation-feltet ved spørring mot pg_locks.
3.7.6 Finne fram i koden
For å enklare vite korleis klassar, metodar og variablar er definerte kan du bruke tags. Dette er ei fil som inneheld ei liste over alt som er definert i kodetreet, som gjer at du kan slå opp eit namn og finne ut kva det, kor det er definert, og evt. med kva parameter det er definert.
For vim, gå til cerebrum-mappa di:
ctags --recurse --exclude=".git" --exclude="clients/cweb" \
--exclude="*~" \
--exclude="contrib/no/ntnu/*" --exclude="contrib/no/uit/*" \
--exclude="Cerebrum/modules/no/uit/*" --exclude="Cerebrum/modules/no/ntnu/*" \
--languages="Python,PHP,Java"
For å bruke dette:
- Start opp vim i cerebrum-mappa di. Dette for at den leiter berre etter
tags-fila i den mappa du er i (pwd).
Gå til namnet som du vil slå opp.
Trykk CTRL+}.
- Du vil bli sendt til fila der namnet er definert. Dersom namnet er definert
fleire stader vil du få opp ei liste over alle, og må velge ein av dei med å skrive inn eit tal.
Du kan hoppe til neste definisjon ved å fortsette med punkt 2.
- Når du vil hoppe tilbake eit hakk trykker du CTRL+T, ein gang for kvart
hopp du har utført.
Meir info, køyr: :help tags-and-searches
For emacs, gå til cerebrum-mappa di:
etags --recurse --exclude=".git" --exclude="clients/cweb" \
--exclude="*~" \
--exclude="contrib/no/ntnu/*" --exclude="contrib/no/uit/*" \
--exclude="Cerebrum/modules/no/uit/*" --exclude="Cerebrum/modules/no/ntnu/*" \
--languages="Python,PHP,Java"
TODO: Kva kommandoar brukast i emacs?
3.7.7 Minnebruk
Av og til kan det vere greit å vite kor mykje minne eit skript bruker.
Dette kan ein finne under /proc/$PID/status. Fila /proc/self/status vil alltid gi deg status for den prosessen du køyrer i.
Kva du kan legge inn på slutten av skriptet ditt:
for line in open('/proc/self/status'):
if line.startswith('Vm'):
print line.strip()
Som gir deg output av typen:
VmPeak: 757028 kB VmSize: 756876 kB VmLck: 0 kB VmHWM: 571316 kB VmRSS: 571080 kB VmData: 564060 kB VmStk: 192 kB VmExe: 4 kB VmLib: 13556 kB VmPTE: 1416 kB VmSwap: 0 kB
Det som gjerne er mest interessant er VmPeak som viser deg kva skriptet har brukt maksimalt på samme tid gjennom køyringa si. VmSize gir deg kor mykje minne du bruker i det du las inn fila frå proc.
3.7.8 Tidsbruk
Dersom du har behov for å sjå kva som gjer skriptet ditt treigt, kan cProfile vere smart å bruke. Dette er funksjonalitet som ser på kva python-koden din køyrer, og kan gje deg statistikk på slutten.
For å køyre det utan å endre skriptet:
python -m cProfile -o /tmp/cprofile.$USER.data -s cumulative ~/src/cerebrum/contrib/...
Ein kan deretter lese ut all informasjonen etterpå:
TODO
TODO: skriv meir om dette.
4 Øvrige verktøy
4.1 Søking i kode
Installer først the_silver_searcher.
For å raskt søke i kode (raskere enn ack) så er ag (the_silver_searcher) et hendig verktøy.
Her er et mulig alias:
alias ag="ag --color-line-number '1;32' --color-match '1;37' --color-path '1;34' -U"
4.2 Formattering av Python-kode (slik at den følger PEP8)
Installer først autopep8.
Her er et mulig alias:
alias pep8fix='autopep8 --jobs=-1 -i -v -a --ignore=W602 --max-line-length=99'
PEP8 krever ikke lenger at linjene må være max 80 karakterer lange, 99 er nå også ok. Vi har fra før mange linjer som er lenger enn 80.
Test at endringene fra autopep8 fungerer! Vanligvis fungerer det veldig bra.
4.3 Konvertering frå Vortex til RST
Dersom du har behov for å konvertere gamal dokumentasjon, som ligg i Vortex i HTML-format, over til cerebrum-dokumentasjon, som er i RST-format, kan du til dømes bruke pandion. Døme:
pandion --from HTML --to RST -o OUTPUT.rst INPUT.html pandoc --from HTML --to RST -o OUTPUT.rst INPUT.html
Obs: Merk at du mest sannsynleg må endre på RST-fila manuelt etterpå, då den genererer ikkje alltid gyldig RST-syntaks. Du kan teste for feilmeldingar med:
rst2html FILE.rst > /dev/null
Sidan feilemeldingar kjem til stderr og ikkje stdout vil du då stå att med alle feilmeldingar. UiO-spesifikke feilmeldingar om uio-meta kan ignorerast.
4.4 Videoopptak av desktop
For Sprint Review kan det av og til vere nyttig å ta opp det du vil vise fram. Så kan demo-trollet berre komme!
Det er veldig enkelt, og tek eit halvt minutt å sette opp, i alle fall på Fedora 22: http://www.instructables.com/id/How-to-capturerecord-desktop-video-using-VLC-medi/