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

    Byla vydána nová verze 24.04.28 s kódovým názvem Time After Time svobodného multiplatformního video editoru Shotcut (Wikipedie) a nová verze 7.24.0 souvisejícího frameworku MLT Multimedia Framework. Nejnovější Shotcut je vedle zdrojových kódů k dispozici také ve formátech AppImage, Flatpak a Snap.

    Ladislav Hagara | Komentářů: 0
    včera 16:33 | Nová verze Ladislav Hagara | Komentářů: 0
    včera 03:22 | Zajímavý článek

    V aktuálním příspěvku na blogu počítačové hry Factorio (Wikipedie) se vývojář s přezývkou raiguard rozepsal o podpoře Linuxu. Rozebírá problémy a výzvy jako přechod linuxových distribucí z X11 na Wayland, dekorace oken na straně klienta a GNOME, změna velikosti okna ve správci oken Sway, …

    Ladislav Hagara | Komentářů: 0
    včera 00:11 | Nová verze

    Rakudo (Wikipedie), tj. překladač programovacího jazyka Raku (Wikipedie), byl vydán ve verzi #171 (2024.04). Programovací jazyk Raku byl dříve znám pod názvem Perl 6.

    Ladislav Hagara | Komentářů: 4
    27.4. 17:44 | Nová verze

    Společnost Epic Games vydala verzi 5.4 svého proprietárního multiplatformního herního enginu Unreal Engine (Wikipedie). Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    26.4. 17:11 | Nová verze

    Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.

    Ladislav Hagara | Komentářů: 12
    26.4. 13:33 | Nová verze

    Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.

    Pavel Křivánek | Komentářů: 9
    26.4. 04:55 | Zajímavý software

    Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.

    Ladislav Hagara | Komentářů: 44
    25.4. 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 14
    25.4. 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 3
    KDE Plasma 6
     (75%)
     (8%)
     (2%)
     (15%)
    Celkem 875 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

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

    22.11.2017 01:47 | Přečteno: 1736× | 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.