Temat 3: Powtórzenie

Wstecz; Ostatnia modyfikacja: 19.03.2015
  • Organizacja pracy, alternatywne podejścia:
    1. programujemy bezpośrednio na serwerze.
      • Zalety: nie tracimy czasu na wysyłanie kodu; piszemy kod w środowisku w którym będzie uruchamiany.
      • Wady: problematyczna praca gdy nie mamy internetu; zwykle konieczność korzystania z tekstowych IDE (vi, vim).
    2. programujemy lokalnie, wysyłamy kod na serwer tylko na potrzeby uruchomienia obliczeń.
      • Zalety: pracujemy w ulubionym IDE.
      • Wady: dodatkowy krok wysyłania kodu na serwer.
  • Systemy kontroli wersji. Obecnie popularne są SVN i git, przy czym rośnie popularność git - jądro Linuxa jest na GitHubie. Darmowe repozytoria prywatne git na BitBucket.
  • Powtórzenie: przykładowe rozwiązanie wykorzystujące textutils:
  • #curl "http://scop.berkeley.edu/astral/subsets/?ver=2.05&get=sc&seqOption=0&item=verbose&cut=sp" > astral.txt
    #curl "http://scop.berkeley.edu/downloads/parse/dir.des.scope.2.05-stable.txt" > scop.txt
    
    cat scop.txt | cut -f 3-4 --output-delimiter=" " | grep -v "[-#]" | sort -k 2 > sc_fam.txt
    cat astral.txt | cut -c 6- |grep -v "^$" | cut -d ")" -f 1 | cut -d " " -f 1,4 | sort -k 1 | cut -d " " -f 1,2 > as_fam.txt
    join -1 2 -2 1 sc_fam.txt as_fam.txt > join.txt
    cat join.txt | sort -r -k3 | sort -sru -k2,2 > final.txt
    
    #time ./sol.sh 
    
    #real	0m3.371s
    #user	0m3.473s
    #sys	0m0.086s
    
  • Przystępne wprowadzenie do narzędzi unixowych: grymoire
  • Przykład kodu w Pythonie rozwiązującego to samo zadanie (przeanalizować):
  • def readAstral(input_fn):
    	input_fh = open(input_fn)
    	lines = input_fh.readlines()
    	input_fh.close()
    	astral = {}
    	for line in lines:
    		line = line.strip()    #usuwamy znak konca linii
    		line = line.strip(")") #usuwamy nawias
    		tokens = line.split()
    		if len(tokens) < 1: 
    			continue
    		domain_id = tokens[-4]
    		score = float(tokens[-1])
    		astral[domain_id] = score
    	return astral
    
    def readSCOP(input_fn):
    	input_fh = open(input_fn)
    	lines = input_fh.readlines()
    	input_fh.close()
    	scop = {}
    	for line in lines:
    		line = line.strip()
    		if line.startswith("#"): #pomijamy linie komentarza
    			continue
    		tokens = line.split("\t")
    		fam_id, domain_id = tokens[2:4]
    		if domain_id == "-":
    			continue
    		if not fam_id in scop:
    			scop[fam_id] = set([])
    		scop[fam_id].add(domain_id)
    	return scop
    
    def combine(astral, scop):
    	res = []
    	MIN = -100000
    	for fam_id in scop.keys():
    		best_domain_id = ""
    		best_score = MIN
    		for domain_id in scop[fam_id]:
    			score = astral.get(domain_id, MIN)
    			if score > best_score:
    				best_score = score
    				best_domain_id = domain_id 
    		if len(best_domain_id) > 0:
    			res.append((fam_id, best_domain_id, best_score))
    	return res
    
    astral = readAstral("astral.txt")
    scop = readSCOP("scop.txt")
    
    result = combine(astral, scop)
    
    for (fam_id, domain_id, score) in result:
    	print(" ".join([domain_id, fam_id, str(score)]))
    
    # time python sol2.py > final_py.txt
    
    # real	0m0.625s
    # user	0m0.596s
    # sys	0m0.028s
    
  • Dyskusja wad i zalet obu podejść.
  • Przykładowe zalety bash:
    • szybka implementacja prostych programów
    • szybkie prototypowanie
    • możliwość szybkiej weryfikacji hipotez
    Przykładowe wady basha względem Pythona:
    • kod trudny do zrozumienia dla innych i siebie po pewnym czasie (brak sugestywnych nazw zmiennych)
    • problematyczna re-używalność kodu - zwykle nie robimy backapu wpisywanych komend bashowych
    • brak wieloplatformowości
  • Generalna konkluzja: im więcej znamy technik programowania, tym lepiej.
  • Python: rozsądna alternatywa pomiędzy bashem a językami jak Java czy C++.