Společnost Valve publikovala na svém GitLabu nákresy a schémata zapojení headsetu Steam Frame. Pro nekomerční účely.
Soutěž Pwn2Own Ireland 2026 skončila 9. října. Bezpečnostní výzkumníci získali celkem 1 262 000 dolarů na odměnách. Během soutěže bylo předvedeno zneužití 98 zero-day zranitelností. Testování zahrnovalo různé kategorie zařízení a software. Výzkumníci předváděli prakticky fungující útoky podle pravidel soutěže. Výsledky následně slouží výrobcům při přípravě oprav. Mezi pokořenými jsou: Samsung Galaxy S26, OpenAI Codex, Oracle Autonomous AI Database, Google Pixel 10, u iPhone 17 neuspěli.
Programovací jazyk Python byl vydán v nové verzi 3.15.0. Podrobný přehled novinek v aktualizované dokumentaci.
BIGWORDS.PAGE je open-source webová aplikace, která po otevření odkazu v prohlížeči vykreslí přes celou obrazovku jednoduché informační sdělení. Zpráva i její nastavení jsou uložené v části URL za znakem #, například odkaz https://bigwords.page/#abclinuxu zobrazí jako velký bílý nápis 'abclinuxu' na černém pozadí. Obsah odkazu lze upravovat i vestavěným editorem, ten umožňuje nastavovat formátování a vizuální efekty textu, časovače, QR kódy a obrázky. Zdrojový kód je dostupný pod licencí MIT na GitHubu.
V neděli 11. října proběhne rotace klíče kořenové zóny. Podruhé v historii. Ondřej Filip na blogu CZ.NIC: "Pokud je pro Vás DNS protokol spíše výzva, ale přesto spravujete nějakou síť či DNS resolver, zkuste si jednoduchý test, který připravila firma Cloudflare na této adrese. Obzvláště zbystřit byste měli, pokud uvidíte nějaká červená políčka."
Vláda Spojených států se rozhodla vyřadit americkou softwarovou společnost Microsoft a několik dalších velkých technologických podniků z programu, který umožňuje kvalifikovaným zahraničním pracovníkům získat povolení k trvalému pobytu. Oznámila to včera administrativa amerického prezidenta Donalda Trumpa. Opatření zdůvodnila rozsáhlým zneužíváním programu, který je dlouhodobě terčem kritiky ze strany Trumpových příznivců, neboť prý znevýhodňuje americké pracovníky.
Datové centrum největší ruské technologické společnosti Jandex v Rjazaňské oblasti se stalo cílem dronového útoku a zastavilo provoz. Jandexu se někdy přezdívá „ruský Google“. Provozuje nejoblíbenější internetový vyhledávač v Rusku nebo aplikace pro objednávky jídla a taxi. Využívají jej desítky milionů lidí v rusky mluvících zemích.
Francouzská společnost Mistral AI představila Mistral Large 4 (interně přezdívaný 'le Chonk', volně přeloženo 'pořádný macek'), 'open-weight multimodální hybridní instruct-and-reasoning model s architekturou granulárního MoE, nativně podporující více jak 160 jazyků'. Model má přes jeden bilión parametrů, z nichž při práci využívá 49 miliard, kontextové okno o délce milion tokenů a obrazový enkodér o 1,6 miliardách parametrů.
… více »Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.20. Díky 227 přispěvatelům.
Simon Long oznámil Raspberry Pi Desktop pro PC a Mac s Intelem postavený na aktualizovaném Debianu 13 Trixie. S klientem Raspberry Pi Connect pro vzdálenou správu. Ke stažení je vedle Raspberry Pi OS pro Raspberry Pi.
1. Dynamické datové typy
2. Fixnum a Bignum
3. Float
4. String
5. Array
6. Hash
Už jsem se několikrát zmínil, že je Ruby dynamicky typovaný jazyk. Nyní si vysvětlíme, co to znamená.
Jak jsme viděli, proměnná může uchovávat nejrůznější druhy hodnot - celá a reálná čísla, řetězce, ba dokonce pole a hashe. Chceme-li kteroukoli z těchto hodnot uložit do proměnné, musí dojít k vyhrazení určitého místa v paměti počítače. V nízkoúrovňových jazycích, jako je C, proto před použitím nějaké proměnné musíme explicitně uvést, jakého bude typu (co do ní hodláme uložit). Tomuto se říká statické typování.
Naproti tomu v dynamicky typovaných jazycích proměnná nabývá typu až podle přiřazené hodnoty a tento typ se navíc může v průběhu jejího života libovolně měnit.
Základními datovými typy v Ruby jsou Fixnum,
Bignum, Float, String,
Array a Hash. Pojďme si je tedy postupně
probrat.
Fixnum a Bignum označují celá čísla a jsou v
podstatě ekvivalenty typů integer a long integer, známých z
jiných jazyků. Jaký je mezi nimi rozdíl?
Fixnum je určen pro menší čísla a zabírá i méně
místa v paměti. Chceme-li uchovávat čísla větší, přijde na řadu
Bignum, který může nabývat teoreticky nekonečných hodnot
(omezením je pochopitelně velikost dostupné paměti počítače). Jak se s nimi
pracuje? Jednoduše. Interpretr sám pozná, který typ má použít:
irb(main):001:0> a = 10 => 10 irb(main):002:0> a.class => Fixnum irb(main):003:0> a = 10_000_000_000 => 10000000000 irb(main):004:0> a.class => Bignum irb(main):005:0>
Jelikož čitelnost větších čísel je obtížná, umožňuje Ruby oddělovat
řády pomocí znaku _ (podtržítko). Podtržítka jsou interpretrem
ignorována (vidíme, že návratová hodnota je 10000000000), programátoři je
však jistě ocení.
Druhou zajímavou věcí je metoda class. O metodách si toho
řekneme více, až přejdeme k objektově orientovanému přístupu; zatím nás
zajímá jen výsledek, a tím je právě typ proměnné.
S typem Float jsme se už taky setkali a označuje reálná
čísla (čísla s plovoucí desetinnou čárkou, angl. floating point).
Stejně jako ve většině programovacích jazyků je místo u nás běžné čárky
používána k oddělení desetinných míst tečka:
irb(main):005:0> a = 3.14159 => 3.14159 irb(main):006:0> a.class => Float irb(main):007:0>
Marně bychom v Ruby hledali typ double, Float bez
obtíží pojme i obrovská čísla.
String, neboli řetězec, je už poněkud komplikovanější a
běžně se vytváří uzavřením skupiny znaků mezi apostrofy ('), nebo do
uvozovek ("):
irb(main):007:0> pozdrav = 'Ahoj!' => "Ahoj!" irb(main):008:0> den = "Streda" => "Streda" irb(main):009:0>
Na první pohled se zdá, že je zcela jedno, jestli použijeme apostrofů, nebo uvozovek. To však není pravda. Asi první, co vás napadne, je použít apostrofy tam, kde v našem řetězci chceme mít uvozovky, a naopak:
irb(main):009:0> pozdrav = '"No nazdar," usklibl se.' => "\"No nazdar,\" usklibl se." irb(main):010:0> titul = "Blackened's Ruby tutorial" => "Blackened's Ruby tutorial" irb(main):011:0>
Je zde ale ještě jeden podstatnější rozdíl: v řetězci uzavřeném v
uvozovkách se berou v potaz speciální znaky, uvozené znakem \
(zpětné lomítko) a vyhodnocují se výrazy uzavřené v #{}. V
řetězci uzavřeném v apostrofech se těmto znakům nepřipisuje žádný zvláštní
význam a je s nimi zacházeno jako s jakýmikoliv jinými. Více nám ukáží
následující příklady:
irb(main):011:0> puts "Ahoj\nsvete!" Ahoj svete! => nil irb(main):012:0> puts 'Ahoj\nsvete!' Ahoj\nsvete! => nil irb(main):013:0>
Příkazem puts se budeme detailněji zabývat v některém z
dalších dílů, prozatím nám stačí vědět, že slouží k vypsání hodnot na
obrazovku.
Z příkladu je jasně vidět odlišné chování - speciální sekvence
\n zastupuje zalomení řádku a podle toho byla v prvním případě
vyhodnocena. V případě druhém se s ní zacházelo jako s běžným řetězcem.
Možná vás napadlo, jak docílit třeba vypsání znaku zpětného lomítka v řetězci s uvozovkami. Použije-li se zpětné lomítko zdvojeně, je vypsáno jako standardní znak:
irb(main):013:0> puts "Toto je zpetne lomitko: \\" Toto je zpetne lomitko: \ => nil irb(main):014:0>
Zpětné lomítko totiž stejně jako dovede znakům speciální význam dávat, umí ho i brát:
puts "\"No nazdar,\" pravil a zatvaril se kysele." "No nazdar," pravil a zatvaril se kysele. => nil irb(main):015:0>
Když se podíváte o pár příkladů zpátky na návratovou hodnotu přiřazení do proměnné pozdrav, zjistíte, že Ruby dělá vlastně při použití apostrofů totéž.
Druhou zajímavou vlastností je vyhodnocování výrazů uzavřených v
#{}:
irb(main):015:0> puts "5 x 5 = #{5*5}"
5 x 5 = 25
=> nil
irb(main):016:0>
Lze pochopitelně použít i proměnných:
irb(main):016:0> jazyk = "Ruby"
=> "Ruby"
irb(main):017:0> puts "#{jazyk} je muj nejoblibenejsi jazyk!"
Ruby je muj nejoblibenejsi jazyk!
=> nil
irb(main):018:0>
Kdybychom se o totéž pokusili s apostrofy, moc bychom neuspěli:
irb(main):018:0> puts '#{jazyk} je muj nejoblibenejsi jazyk!'
#{jazyk} je muj nejoblibenejsi jazyk!
=> nil
irb(main):019:0>
Avšak jeden zápis přeci jen vyhodnocuje jinak, a to když chceme vypsat právě apostrof:
irb(main):019:0> puts 'Blackened\'s Ruby Tutorial' Blackened's Ruby Tutorial => nil irb(main):020:0>
Řetězce se také dají velmi snadno spojovat:
irb(main):020:0> 'Ahoj ' + 'svete!' => "Ahoj svete!" irb(main):021:0>
... a to i v případě proměnných typu String:
irb(main):021:0> jmeno = 'Bilbo' => "Bilbo" irb(main):022:0> prijmeni = 'Pytlik' => "Pytlik" irb(main):023:0> celeJmeno = jmeno + ' ' + prijmeni => "Bilbo Pytlik" irb(main):024:0>
Co je však ještě zajímavější, řetězce se dají i násobit:
irb(main):024:0> 'la'*3 => "lalala" irb(main):025:0>
Krom toho se dají s řetězci vyvádět psí kusy:
# vypise delku retezce irb(main):025:0> 'Ahoj, svete!'.length => 12 # prevede vsechna pismena na velka irb(main):026:0> 'Ahoj, svete!'.upcase => "AHOJ, SVETE!" # prevede vsechna pismena na mala irb(main):027:0> 'Ahoj, svete!'.downcase => "ahoj, svete!" # zameni velka pismena za mala a naopak irb(main):028:0> 'Ahoj, svete!'.swapcase => "aHOJ, SVETE!" # vypise retezec pozpatku irb(main):029:0> 'Ahoj, svete!'.reverse => "!etevs ,johA" irb(main):030:0>
O metodách si budeme povídat důkladněji, až přejdeme k objektově orientovanému přístupu a třídám. Vidíte však už teď, že se s nimi dá užít pořádné legrace :-).
Použijeme-li jednu z výše uvedených metod na nějaký řetězec, jeho původní hodnota se nezmění:
irb(main):030:0> pozdrav = 'Ahoj, svete!' => "Ahoj, svete!" irb(main):031:0> pozdrav.upcase => "AHOJ, SVETE!" irb(main):032:0> pozdrav => "Ahoj, svete!" irb(main):033:0>
Dost často by se nám ale hodilo naši změnu do proměnné uložit. Běžným způsobem se to dá provést následovně:
irb(main):033:0> pozdrav = pozdrav.upcase => "AHOJ, SVETE!" irb(main):034:0> pozdrav => "AHOJ, SVETE!" irb(main):035:0>
Ruby však nabízí elegantnější řešení, a tím je použití metody s vykřičníkem na konci:
irb(main):017:0> pozdrav.downcase! => "ahoj, svete!" irb(main):018:0> pozdrav => "ahoj, svete!" irb(main):019:0>
Hezké, ne? Pochopitelně ne všechny metody mají definovaný ekvivalent
s vykřičníkem, například v souvislosti s metodou length
v tom ani mnoho užitku nevidím.
Typ Array bývá česky překládán jako pole a v některých
jazycích je označován taky jako list (seznam). Pole je zvláštní datový typ,
který může oproti výše uvedeným nabývat více hodnot:
irb(main):019:0> cisla = [1, 2, 3] => [1, 2, 3] irb(main):020:0>
Takto jsme vytvořili proměnnou cisla typu
Array, obsahující tři prvky typu Fixnum.
Důležitou vlastností polí v Ruby je, že mohou obsahovat i prvky různých
typů:
irb(main):020:0> pelmel = [3, "Ahoj", -12.4] => [3, "Ahoj", -12.4] irb(main):021:0>
Pole může dokonce obsahovat další pole:
irb(main):021:0> pelmel = [3, "Ahoj", -12.4, cisla] => [3, "Ahoj", -12.4, [1, 2, 3]] irb(main):022:0>
Stejně jako tomu bylo u typu String, lze mezi sebou pole
sčítat, nebo je násobit:
irb(main):022:0> pelmel + cisla => [3, "Ahoj", -12.4, [1, 2, 3], 1, 2, 3] irb(main):023:0> cisla * 3 => [1, 2, 3, 1, 2, 3, 1, 2, 3] irb(main):024:0>
Takto můžeme vytvářet seznamy nejrůznějších prvků. Ale jak s nimi
pak pracovat a k jednotlivým prvkům přistupovat? Pole je vlastně seznam
prvků, indexovaných od nuly - obsah naší proměnné cisla tedy
vypadá nějak takto:
+---+---+---+
hodnota: | 1 | 2 | 3 |
+---+---+---+
index: 0 1 2
Chceme-li vypsat 2. prvek pole cisla (tedy prvek s indexem
1), uděláme to takto:
irb(main):024:0> cisla[1] => 2 irb(main):025:0>
Pole lze indexovat i odzadu:
+---+---+---+
hodnota: | 1 | 2 | 3 |
+---+---+---+
index: 0 1 2
index: -3 -2 -1
irb(main):025:0> cisla[-1] => 3 irb(main):026:0> cisla[-3] => 1 irb(main):027:0>
Pokusíme-li se zobrazit neexistující prvek pole, bude nám vrácena
prázdná hodnota nil:
irb(main):027:0> cisla[10] => nil irb(main):028:0>
Kromě zobrazování jednotlivých prvků má Ruby i další možnosti:
irb(main):028:0> cisla = [1, 2, 3, 4, 5, 6] => [1, 2, 3, 4, 5, 6] irb(main):029:0> cisla[0,3] # vypise 3 prvky, pocinaje indexem 0 => [1, 2, 3] irb(main):030:0> cisla[0..3] # vypise prvky s indexem 0 az 3 vcetne => [1, 2, 3, 4] irb(main):031:0> cisla[0...3] # vypise prvky s indexem 0 az 2 => [1, 2, 3] irb(main):032:0> cisla[-3,2] # vypise 2 prvky, pocinaje indexem -3 => [4, 5] irb(main):033:0>
Prvky lze podle indexů i přidávat, nebo nahrazovat:
irb(main):033:0> jmena = ['Jaromir', 'Lukas', 'Radek'] => ["Jaromir", "Lukas", "Radek"] irb(main):034:0> jmena[3] = 'Jiri' => "Jiri" irb(main):035:0> jmena => ["Jaromir", "Lukas", "Radek", "Jiri"] irb(main):036:0>
V případě, že přidáme prvek na index větší než je dosavadní rozsah,
jsou "chybějící" prvky nahrazeny prázdnou hodnotou nil:
irb(main):036:0> jmena[7] = 'Martin' => "Martin" irb(main):037:0> jmena => ["Jaromir", "Lukas", "Radek", "Jiri", nil, nil, nil, "Martin"] irb(main):038:0>
Stejně jako String, má i Array spoustu
užitečných metod:
# vrati pocet prvku pole irb(main):038:0> jmena.length => 8 # vrati pole s obracenym poradim prvku irb(main):039:0> jmena.reverse => ["Martin", nil, nil, nil, "Jiri", "Radek", "Lukas", "Jaromir"] # zkrati pole o prazdne hodnoty irb(main):040:0> jmena.compact => ["Jaromir", "Lukas", "Radek", "Jiri", "Martin"] irb(main):041:0>
Další zajímavou možností je převod pole na řetězec a naopak:
irb(main):041:0> retezec = jmena.join(';')
=> "Jaromir;Lukas;Radek;Jiri;;;;Martin"
irb(main):042:0> retezec.split(';')
=> ["Jaromir", "Lukas", "Radek", "Jiri", "", "", "", "Martin"]
irb(main):043:0>
V závorce obou metod uvádíme řetězec, který má být použit/rozpoznán jako oddělovač prvků. Převod z řetězce na pole však není 100% - bez ohledu na prapůvodní typ jsou všechny prvky převedeny na řetězec.
K vymazání prvku z pole slouží metoda delete:
irb(main):043:0> jmena.delete("Jaromir")
=> "Jaromir"
irb(main):044:0> jmena
=> ["Lukas", "Radek", "Jiri", nil, nil, nil, "Martin"]
irb(main):045:0>
Pomocí správných metod lze pole využít jako frontu s filozofií fifo (first in, first out - první dovnitř, první ven):
# vytvorime prazdnou frontu
irb(main):045:0> buffer = []
=> []
# pridame prvek na konec fronty
irb(main):046:0> buffer.push("Jaromir")
=> ["Jaromir"]
# pridame prvek na konec fronty
irb(main):047:0> buffer.push("Lukas")
=> ["Jaromir", "Lukas"]
# pridame prvek na konec fronty
irb(main):048:0> buffer.push("Radek")
=> ["Jaromir", "Lukas", "Radek"]
# odebereme prvek na zacatku fronty a vratime jeho hodnotu
irb(main):049:0> buffer.shift
=> "Jaromir"
# na prvni misto se dostal nasledujici prvek
irb(main):050:0> buffer
=> ["Lukas", "Radek"]
irb(main):051:0>
Další užitečné metody lze nalézt v referenci jazyka Ruby, v části o třídě Array.
Hash nebo taky asociativní pole slouží také k ukládání více
hodnot. Namísto číselných indexů však používá k označení prvků takzvaných
klíčů. Hash je uzavřen ve složených závorkách:
irb(main):051:0> udaje = {"jmeno" => "Jaromir", "prijmeni" => "Hradilek"}
=> {"jmeno"=>"Jaromir", "prijmeni"=>"Hradilek"}
irb(main):052:0>
Hodnoty se zadávají vždy ve dvojici klíč => hodnota a
navzájem jsou oddělené čárkou. K jednotlivým hodnotám se pak přistupuje
pomocí klíče:
irb(main):053:0> udaje["jmeno"] => "Jaromir" irb(main):054:0> udaje["prijmeni"] => "Hradilek" irb(main):055:0>
Nový údaj lze do hashe snadno přidat:
irb(main):055:0> udaje["pohlavi"] = "muz"
=> "muz"
irb(main):056:0> udaje
=> {"jmeno"=>"Jaromir", "prijmeni"=>"Hradilek", "pohlavi"=>"muz"}
irb(main):057:0>
I typ Hash má definovanou spoustu metod:
irb(main):057:0> udaje.length # vrati pocet prvku
=> 3
irb(main):058:0> udaje.keys # vrati pole vsech klicu
=> ["jmeno", "prijmeni", "pohlavi"]
irb(main):059:0> udaje.values # vrati pole vsech hodnot
=> ["Jaromir", "Hradilek", "muz"]
irb(main):060:0> udaje.index("Jaromir") # vrati klic k dane hodnote
=> "jmeno"
irb(main):061:0> udaje.invert # zameni klice s hodnotami
=> {"Hradilek"=>"prijmeni", "Jaromir"=>"jmeno", "muz"=>"pohlavi"}
irb(main):062:0>
Dost často by se nám hodilo zjistit, zdali náš hash obsahuje určitý klíč:
irb(main):062:0> udaje.has_key?("prijmeni")
=> true
irb(main):063:0>
Návratovou hodnotou metody je buď true (pravda)
v případě, že daný klíč existuje, nebo false (nepravda)
v případě, že ne. Podobně lze zjišťovat i přítomnost hodnot:
irb(main):063:0> udaje.has_value?("Pavel")
=> false
irb(main):064:0>
Z hashe lze prvky i odebírat:
irb(main):064:0> udaje.delete("pohlavi")
=> "muz"
irb(main):065:0> udaje
=> {"jmeno"=>"Jaromir", "prijmeni"=>"Hradilek"}
irb(main):066:0>
Jako parametr je metodě delete předán klíč mazané položky,
návratovou hodnotou je její hodnota. Chceme-li smazat všechny prvky, můžeme
použít metodu clear:
irb(main):066:0> udaje.clear
=> {}
irb(main):067:0> udaje
=> {}
irb(main):068:0>
Úplný přehled metod najdete v referenci jazyka Ruby.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
udaje.has_key?("prijmeni")Ten otazník je součástí názvu funkce? Není to trochu zvláštní, mít interpunkční znaménka v názvech funkcí?
Hash z principu neuchovává pořadí položek (jako php Array),
h = Hash.new
h['z'] = 1
h['a'] = 2
h['x'] = 3
p h # { 'a'=>2, 'x'=>3, 'z'=>1 }
Jak vidíte, prvky jsou seřazené podle abecedy, nikoli v pořadí,
jak byly do hashe přidány.
Pokud byste chtěli simulovat chování php pole, zkuste OrderedHash.