abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 01:00 | IT novinky

Bylo vydáno RFC 8484 řešící posílání DNS dotazů a získávání DNS odpovědí přes protokol HTTPS (DoH, DNS over HTTPS). V aktuálních verzích Firefoxu je DoH ve výchozím nastavení zakázáno. Povolit jej lze v about:config změnou hodnoty network.trr.mode (Trusted Recursive Resolver). V srpnu zveřejnila Mozilla výsledky experimentu s DNS přes HTTPS ve Firefoxu Nightly.

Ladislav Hagara | Komentářů: 1
19.10. 13:00 | Komunita

Při prvním spuštění Ubuntu 18.04 LTS (Bionic Beaver) je spuštěn nástroj Ubuntu Report. Pokud uživatel souhlasí, jsou pomocí tohoto nástroje odeslány do Canonicalu informace o daném počítači (doba instalace, počet procesorů, rozlišení displeje, velikost paměti, časová zóna, ...). V červnu byly zveřejněny první statistiky. Podrobnější statistiky jsou nově k dispozici na samostatné stránce.

Ladislav Hagara | Komentářů: 11
19.10. 01:00 | Pozvánky

O víkendu probíhá v Košicích pravidelné setkání příznivců otevřených technologií OSS Víkend. Na programu je řada zajímavých přednášek a workshopů.

Ladislav Hagara | Komentářů: 0
19.10. 00:11 | Nová verze

Byla vydána nová verze 1.3 otevřeného, licenčními poplatky nezatíženého, univerzálního ztrátového formátu komprese zvuku Opus (Wikipedie) a jeho referenční implementace libopus. Vylepšena byla například detekce, zda se jedná o řeč nebo o hudbu. Přidána byla podpora prostorového zvuku (immersive audio) dle plánovaného RFC 8486. Podrobnosti a zvukové ukázky na demo stránce.

Ladislav Hagara | Komentářů: 0
18.10. 22:33 | Nová verze

Bylo vydáno Ubuntu 18.10 s kódovým názvem Cosmic Cuttlefish (Kosmická sépie). Ke stažení jsou Ubuntu Desktop a Server, Ubuntu Cloud Images, Ubuntu Netboot, Kubuntu, Lubuntu a Lubuntu Alternate, Ubuntu Budgie, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio a Xubuntu. Podrobnosti v poznámkách k vydání.

Ladislav Hagara | Komentářů: 2
18.10. 18:33 | Nová verze

Byl vydán PostgreSQL ve verzi 11.0. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
18.10. 17:33 | IT novinky

Nadace Raspberry Pi představila na svém blogu Raspberry Pi TV HAT, tj. rozšíření jednodeskového počítače Raspberry Pi umožňující příjem televizního vysílání DVB-T a DVB-T2. Cena rozšíření je 21,50 $.

Ladislav Hagara | Komentářů: 8
18.10. 17:07 | Nová verze

Vychází OpenBSD 6.4. Z řady novinek namátkou: podpora dalších architektur (arm64 např. dostal z Linuxu vypůjčený ovladač radeondrm), hypervizor vmm podporuje i qcow2 disky a šablony, jádro dokáže automaticky přepínat mezi dostupnými bezdrátovými sítěmi, sítě pracují o něco efektivněji, z bezpečnosti „přísaha byla doplněna odhalením“ (pledge(2) lze vhodně doplnit pomocí unveil(2)), SMT je ve výchozím stavu vypnutý, ale lze jej zapnout. Syntaxe nastaveni OpenSMTPD se změnila. S vydáním vychází také nová verze LibreSSL - 2.8.2.

Daniel Čižinský | Komentářů: 5
17.10. 23:15 | IT novinky

Firma Raptor Computing Systems, která stojí také za pracovní stanicí Talos II, představila levnější desku Blackbird s podporou jednoho 4-/8jádrového CPU POWER9 Sforza a formátem microATX; bližší specifikace jsou ve wiki výrobce.

Fluttershy, yay! | Komentářů: 30
17.10. 22:11 | Zajímavý projekt

Byla vydána verze 1.0 svobodné federalizované platformy pro sledování a sdílení videí, alternativy YouTube s podporou P2P, PeerTube (Wikipedie). Za vývojem PeerTube stojí nezisková organizace Framasoft snažící se mimo jiné nahradit svými svobodnými Frama službami služby společnosti Google (De-google-ify Internet).

Ladislav Hagara | Komentářů: 1
Přispíváte osobně k vývoji svobodného softwaru?
 (39%)
 (43%)
 (25%)
 (22%)
 (11%)
 (37%)
Celkem 268 hlasů
 Komentářů: 13, poslední včera 16:39
Rozcestník

Řazení ve sloupcích a základy Ruby

22.11.2017 01:47 | Přečteno: 1535× | Linux | poslední úprava: 22.11.2017 01:46

Program načítá jednotlivé řádky z textového souboru, jehož název je na příkazové řádce jako argument, a poté je vypíše seřazené ve sloupcích, jako to dělá například příkaz ls. Pokud bychom měli na každém řádku klíčová slova z jazyku Golang, výpis by vypadal takto:
break       defer       goto        range       var         
case        else        if          return                  
chan        fallthrough import      select                  
const       for         interface   struct                  
continue    func        map         switch                  
default     go          package     type
Zde již samotný program:
TIOCGWINSZ = 0x5413


def get_size
  buf = [0, 0, 0, 0].pack("S4") 

  if STDOUT.ioctl(TIOCGWINSZ, buf) >= 0
    row, col, x, y = buf.unpack("S4")  
  else
    row = 20
    col = 70
  end    
  [row, col]
end


words = []
maxlen = 1

row, col = get_size

ARGF.each do |line|
  if line !~ /^\s+$/
    line.strip!
    if (s = line.size) > maxlen
      maxlen = s  
    end
    words << line
  end
end

words.sort!
maxlen += 1					#mezera

col = col / maxlen
row = (words.size + col) / col
fmt = "%%-%ds" % maxlen

(col*row).times do |i|						
  target = (i % col) * row + (i / col)		#svisle razeni  
  str = sprintf(fmt, (target < words.size) ? 
			words[target] : "")  
  print str
  puts if (i + 1) % col == 0 
end
Následuje několik poznámek.

V Ruby proměnné definované mimo metody nejsou v metodách viditelné. K vytvoření globální proměnné se používá prefix $ ($global). Funkce pack a unpack převádějí hodnoty na proud bajtů, potažmo proud bajtů na jednotlivé hodnoty, stejné funkce nalezneme i v Perlu a Pythonu.
a = [1,2,3,4,5,6,7,8,9,10]
b = a.pack('i10')		# b je proud deseti 4 bajtových cisel
c =  b.unpack('i*')
c == b 				# vraci true
Různé způsoby vytvoření pole
a = [3, 2, 1]
b = []         			# nové, prázdné pole
empty = Array.new		# nové, prázdné pole
nils = Array.new(3)             # nils je [nil, nil, nil]
zeros = Array.new(4, 0)         # zeros je [0, 0, 0, 0]
count = Array.new(3) {|i| i+1 } # count je [1, 2, 3] 

[[1,2],[3,4],[5]]		# pole poli

[1, 2, 3].length		# 3
[].size				# 0, synonymum pro length
Změna prvků v poli
a = [1, 2, 3]
a[0] = 0		# [0, 2, 3]
a[-1] = 4		# [0, 2, 4]
a[3] = 6		# [0, 2, 4, 6]
a[5] = 8		# [0, 2, 4, 6, nil, 8]
a << 10 		# [0, 2, 4, 6, nil, 8, 10]
a << 12 << 14		# [0, 2, 4, 6, nil, 8, 10, 12, 14]
a = [1, 2, 3]		# [1, 2, 3]
a + a			# [1, 2, 3, 1, 2, 3]
a.concat([4, 5])	# [1, 2, 3, 4, 5] a se meni, zadny vykricnik

a = ['a', 'b', 'c']
a.insert(1, 1, 2)	# a je ['a',1,2,'b','c']
Odstranění prvku
a = [1,2,3,4,5,6]
a.delete_at(4)          # vraci 5, a je a = [1,2,3,4,6]
a.delete_at(-1)         # vraci 6, a je [1,2,3,4]
Odstranění podle hodnoty
a.delete(4)		        # 4, a je [1,2,3]
a[1] = 1		
a.delete(1)		        # 1, a je [3]
a = [1,2,3]
a.delete_if {|x| x%2==1 }	# odstrani liche prvky, a je [2]
a.reject! {|x| x%2==0 }		# jako delete_if, a je []
Bloky

Proměnné definované v bloku mají platnost pouze v tom bloku. Bloky mohou být ohraničené buď složenými závorkami, anebo klíčovými slovy do a end, do a end se zpravidla používá u víceřadkových bloků.
5.times  {|i| print i }                    # tiskne "01234"  
0.upto(5) {|i| print i }                   # tiskne "012345"

a = [3, 2, 1]
a.each {|elm| print elm }      	           # tiskne "321"
b = a.map {|x| x*x }         	           # b je [9, 4, 1]
c = a.select {|x| x%2==0 }    	           # c je [2], jen sude
sum = a.inject {|s,x| s+x }                # sum je 6, soucet prvku
a.each_with_index{|e,i| print e,i}         # tiskne 302112

(5..7).each_with_index {|x,i| print x,i }  # tiskne "506172"
Iterace řetězce
s = "¥1000"
s.each_char {|x| print "#{x} " } 	# tiskne "¥ 1 0 0 0"

"hello".each_byte.to_a			# vraci [104, 101, 108, 108, 111]

s = "A\nB"
s.each_line {|l| print l.chomp}		# tiskne "AB"
Blok v bloku
1.upto(10) do |i|
  1.upto(10) do |i|
    print "#{i} "
  end
  print " ==> Row #{i}\n"
end

1 2 3 4 5 6 7 8 9 10  ==> Row 1
1 2 3 4 5 6 7 8 9 10  ==> Row 2
1 2 3 4 5 6 7 8 9 10  ==> Row 3
1 2 3 4 5 6 7 8 9 10  ==> Row 4
1 2 3 4 5 6 7 8 9 10  ==> Row 5
1 2 3 4 5 6 7 8 9 10  ==> Row 6
1 2 3 4 5 6 7 8 9 10  ==> Row 7
1 2 3 4 5 6 7 8 9 10  ==> Row 8
1 2 3 4 5 6 7 8 9 10  ==> Row 9
1 2 3 4 5 6 7 8 9 10  ==> Row 10
Ve starší verzi Ruby 1.8 by byl vnější index překryt a číslo řádku by zůstávalo na deseti. Kvůli lepší kompatibilitě existuje v Ruby 1.9 přepínač -w, který varuje, pokud má parametr bloku stejný název jako již existující proměnná.
#!/usr/bin/ruby -w
Soubory
File.open(filename) do |f|	     # otevre soubor
  f.each {|line| print line }	     # tiskne vsechny radky
end				     # zavre soubor

File.open(filename) do |f|
  f.each_with_index do |line,number|
    print "#{number}: #{line}"
  end
end
V Ruby samozřejmě existují i běžné cykly jako while, until nebo for/in.
while line = gets.chomp do      # do lze vynechat, pokud nasleduje \n 
  case line
  when /^\s*#/			# komentar
    next
  when /^quit$/i
    break
  else
    puts line.reverse
  end
end
Řetězce jsou v Ruby změnitelné (mutable).
"Ruby" + " rocks!" 		# "Ruby rocks!"
"Ruby! " * 3			# "Ruby! Ruby! Ruby! "
"%d %s" % [3, "rubies"]		# "3 Rubies"

greeting = "Hello"
greeting << " " << "World"
puts greeting   		# tiskne "Hello World"


s = "hello"
s.length			# vraci 5, pocet znaku v 1.9, bajtu v 1.8
s.size				# synonymum pro length
s.concat(" world")              # synonymum pro <<
				# meni se s a vraci nove s
s.empty?			# vraci false

s = "hello\n"			
s.chomp!			# vraci "hello", odstranen \n, meni se s 
s.chomp				# vraci "hello", nic se neodstranuje
s.chomp!			# vraci nil, nic se neodstranuje
s.chomp!("o")			# vraci "hell", meni se s

s = "hello\n"
s.chop!				# vraci "hello", odstranen \n, meni se s 				
s.chop				# vraci "hell", s se nemeni

s = "\t hello \n"
s.strip				# vraci "hello"
s.lstrip			# vraci "hello \n"
s.rstrip			# vraci "\t hello"
Metody strip, lstrip a rstrip mají i verze s vykřičníky, takže mění objekty volající tyto metody.

Metoda puts tiskne řetězec a na rozdíl od print jej ukončí \n, lze ji použit i bez argumentů, jen k odřádkování.

K rychlému otestování kódu můžete použít interaktivní interpreter irb.

Až budu umět Ruby lépe, tak sem dám třeba něco o objektech, asociativních polích a dalších operacích s řetězci a poli, protože tohle bylo jen několik výpisků z knihy The Ruby Programming Language.

Zdroj: The Ruby Programming Language a Perl Cookbook.        

Hodnocení: 80 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

22.11.2017 11:08 ttt
Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
Ještě ti chybí trochu lenosti :) Pomalé to bude tak jako tak, tak proč si např. nespočítat délku dalším cyklem, je to kratší a přehlednější.

Práce se soubory jde zkrátit na:
File.open(filename).each do |line|
  print line
end

Zápis blocku jde zkrátit pomocí '&':
[1,2,3].inject(&:+) # 6

S použitím pár dalších knihovních metod:
TIOCGWINSZ = 0x5413

def terminal_size
  buf = [0, 0, 0, 0].pack('S4')

  if STDOUT.ioctl(TIOCGWINSZ, buf) >= 0
    buf.unpack('S4')[0..2]
  else
    [20, 70]
  end
end

words = ARGF.readlines.map(&:strip).sort
width = words.map(&:length).max + 1

col = terminal_size[1] / width
row = words.size / col + 1
padding = row - words.size % row
words.fill('', words.size, padding)

puts words.each_slice(row).to_a.transpose
  .map { |ws| ws.map { |w| w.ljust(width) }.join }
  .join("\n")
22.11.2017 12:29 sad
Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
Pěkné. Díky za tipy.
22.11.2017 12:56 RM
Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
pěknej příklad :)
23.11.2017 18:47 ehm
Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
Máš ten kód celý na ruby.
xsubway avatar 23.11.2017 20:06 xsubway | skóre: 13 | blog: litera_scripta_manet
Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
alespoň to není na JavaScript .-)
4.12.2017 06:48 s.b.
Rozbalit Rozbalit vše Re: Řazení ve sloupcích a základy Ruby
A tohle nedostane tučňáka?

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.