Stát Kalifornie zažaloval výrobce 3D tiskových filamentů Polymaker. Vrchní soud San Diego County tvrdí, že firma propagací svých výrobků mezi příznivci 3D tištěných zbraní podporovala výrobu takzvaných 'ghost guns' (DIY zbraní) a že její PLA filament pro 3D tiskárny lze za těchto okolností považovat za součást určenou k výrobě střelné zbraně. Žaloba požaduje mimo jiné finanční sankce a soudní zákaz činnosti, Polymaker se hájí tím, že filament je běžný a sám o sobě legální produkt. Celý text žaloby (PDF na Google Drive).
V červnu byla představena aplikace Myna pro převod řeči na text v prostředí desktopu Ubuntu. Včera byla Myna zpřístupněna širší komunitě Ubuntu formou technologické ukázky dostupné v Ubuntu 24.04 LTS, Ubuntu 26.04 LTS a Ubuntu 26.10 s GNOME na Waylandu.
Ubuntu 27.04 bude Tenacious T-Rex.
Byla vydána nová verze 2026.4.0 "Never-slop" svobodného softwaru ScummVM (Wikipedie) umožňujícího bezproblémový běh mnoha klasických adventur na zařízeních, pro které nebyly nikdy určeny. Přehled novinek v poznámkách k vydání a na GitHubu. ScummVM oslavil 25 let. Verze 0.0.1 vyšla 8. října 2001.
Kanadský vývojář Anthony Sistilli vytvořil ironický DIY projekt parodující kamerové systémy Flock, s cílem názorně demonstrovat rizika masového sledování jaké provozují tyto komerční ALPR systémy. Z levné IP kamery a vlastního ML softwaru (napsaného s pomocí SI circa za 20 minut, kód se mi bohužel nepodařilo dohledat) běžícího v laptopu sestavil jednoduchý systém, který detekuje výhradně policejní vozidla, zaznamenává jejich SPZ a
… více »Část údajů uživatelů internetového supermarketu Rohlík byla odcizena. Kyberútočníci napadli nástroj zákaznické podpory Rohlíku, odcizili tak jména, e-mailové adresy, v některých případech také telefonní čísla nebo přepisy komunikace mezi klienty a zákaznickou podporou. Rohlík incident nahlásil příslušným orgánům a přijal příslušné opatření, aby zamezil podobným případům v budoucnosti, uvedla firma.
Aplikace eDoklady fungovala v obou volebních dnech stabilně a prakticky bez front. Digitální a informační agentura (DIA) odhaduje, že se digitálním dokladem prokázalo více než 100.000 voličů. Aplikaci si před volbami či během nich aktualizovalo 247.517 uživatelů. Nových registrací bylo 19.431 a do aplikace se přihlásilo 357.879 lidí. Největší nápor přišel bezprostředně po otevření volebních místností mezi 14. a 16. hodinou, kdy si
… více »Začal semestr, začal i podzim a kromě hub rostou jako po dešti i veřejné dílny v Praze. Nedávno strahováci referovali o hackerspacu Bordel, nyní se otevřela dílna Dejvice Lab jen kousek od ČVUT. Na blížící Virtuální Bastlírně tak uslyšíte nejen report z návštěvy dílny HWLab, ale i řadu novinek, událostí a úsměvných momentů, které se za poslední měsíc ve světě techniky, ale i vědy udály. Připojte se tedy již v úterý 13.10. od 20:00 a zapojte se do
… více »Byl vydán LineageOS 24 (Mastodon). LineageOS (Wikipedie) je svobodný operační systém pro chytré telefony, tablety a set-top boxy založený na Androidu. Jedná se o nástupce CyanogenModu. LineageOS 24 je založený na Androidu 17.
Společnost Valve publikovala na svém GitLabu nákresy a schémata zapojení headsetu Steam Frame. Pro nekomerční účely.
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.