Mozilla představuje Firefox Enterprise určený jako podnikový prohlížeč pro organizace s přísnými požadavky na bezpečnost, správu a dodržování předpisů. S profesionální podporou. Dostupný je zatím ve Francii, Německu, Rakousku a Švýcarsku.
Kybernetický útok zasáhl nejméně 150 supermarketů Intermarché a několik prodejen řetězců Leclerc a Coopérative U. Chladicí jednotky napadených obchodních domů byly nastaveny na nepřetržité odmrazování a teplota v nich mnohdy vystouala až nad 50°C. Škody napáchané na chlazeném a mraženém zboží budou patrně dosahovat miliónů eur.
… více »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 »1. Komentáře
2. irb jako
kalkulátor
2.1 Základní
aritmetické operace
2.2 Modul
3. Proměnné
3.1 Konstanty
3.2 Lokální proměnné
3.3 Globální proměnné
4. Přiřazení
5. Příště
Poznámka: ve většině příkladů budu k demonstraci jednotlivých
příkazů a konstrukcí využívat interaktivního interpretru
irb, jehož spuštění a základní ovládání jsme si vysvětlili
v minulém díle (Ruby
pro začátečníky - 1). Ukázky kódu tedy obsahují výstupy právě z tohoto
prostředí.
Jednou z velmi důležitých, avšak programátory často opomíjených součástí zdrojového kódu programu, jsou komentáře. Komentář je část kódu, která se neprovádí (interpretr ji přeskočí, v případě kompilovaných jazyků je ignorována překladačem). A k čemu slouží?
Účelem komentářů je zpřehlednit zdrojový kód programu. Je proto třeba nakládat s nimi opatrně a najít správnou míru: příliš mnoho komentářů naopak čitelnost kódu zhoršuje. Správný komentář by měl být stručný a jasný a měl by dokumentovat, co konkrétní část dělá, nikoli jak to dělá. Proč?
Představte si, že programátor stojí před úkolem seřadit posloupnost celých čísel vzestupně. Existuje mnoho řadících algoritmů a ne všechny jsou stejně rychlé nebo náročné na paměť počítače. Časem programátor zjistí, že jím zvolený způsob řazení je příliš pomalý a rozhodne se jej tedy přepsat. Ovšem (a to se stává opravdu často) zapomene už přepsat komentář. Ten se tak stává pro případného čtenáře naopak matoucím a nejspíš napáchá víc škody, než užitku.
Ruby rozeznává dva druhy komentářů, přičemž nejčastěji používaným je
klasický jednořádkový komentář. Ten je zahájen znakem #
(mřížka) a říká, že vše, co za tímto znakem následuje až do konce řádku,
je komentář a má být interpretrem ignorováno:
irb(main):001:0> # Toto je komentar. irb(main):002:0* # Vse za znakem '#' je interpretrem ignorovano: irb(main):003:0* # puts "Ahoj, svete!"
Komentář pochopitelně nemusí začínat na začátku řádku a mohou mu bezprostředně předcházet příkazy:
irb(main):004:0* puts "Ahoj, svete!" # vypise pozdrav Ahoj, svete! => nil irb(main):005:0>
Druhým druhem komentářů je takzvaný blok. Ten začíná příkazem
=begin a končí =end. Cokoli mezi těmito
klíčovými slovy je bráno jako komentář:
irb(main):005:0> =begin irb(main):006:0= Toto je blokovy komentar, presahujici libovolny pocet . irb(main):007:0= radku. Obzvlaste se hodi pro rozsahlejsi sdeleni, jakymi irb(main):008:0= jsou kuprikladu informace o autorskych pravech nebo irb(main):009:0= licenci, pod kterou je kod distribuovan. irb(main):010:0= =end irb(main):011:0>
irb jako kalkulátorKrom toho, že si v něm můžeme nanečisto vyzkoušet chování některých
našich programových konstrukcí, můžeme irb použít i jako
šikovný kalkulátor (bohužel ne vždy je totiž po ruce bc).
Binární aritmetické operátory dostupné v Ruby shrnuje následující tabulka:
| Operátor: | Význam: |
|---|---|
+ |
Součet |
- |
Rozdíl |
* |
Součin |
/ |
Podíl (celočíselný i reálný, viz dále) |
% |
Modulo |
** |
Mocnina |
První tři jsou nejspíše jasné a fungují přesně tak, jak bychom intuitivně očekávali:
irb(main):011:0> 27 + 15 => 42 irb(main):012:0> 7 - 20 => -13 irb(main):013:0> 3 * 6 => 18 irb(main):014:0>
S dělením je to už trošku složitější, neboť záleží na tom, s jakým typem hodnot pracujeme. Výsledkem podílu dvou celých čísel je opět celé číslo:
irb(main):014:0> 7 / 3 => 2 irb(main):015:0>
Celá čísla jsou však ve skutečném životě poměrně vzácný úkaz. Jelikož je Ruby (jak uvidíme později) dynamicky typovaný jazyk, chová se operátor dělení podle hodnot, jež jsou mu zadány:
irb(main):015:0> 7.0 / 3 => 2.33333333333333 irb(main):016:0>
Zapsáním čísla 7 jako 7.0 (k oddělení desetinných míst se
používá tečka) explicitně říkáme, že chceme pracovat s reálnými čísly.
Ačkoli je tento přístup jednoduchý, z vlastní zkušenosti vím, že se toto
chování může stát zdrojem velice nepříjemných chyb. Buďte proto prosím při
psaní vlastních programů obezřetní.
Operátor % (procento) nám dává zbytek po celočíselném
dělení:
irb(main):016:0> 7 % 3 => 1 irb(main):017:0>
A konečně pomocí operátoru ** (dvě hvězdičky) můžeme
čísla umocňovat:
irb(main):017:0> 2**4 => 16 irb(main):018:0>
Nyní nám už nic nebrání směle se pustit i do složitějších matematických konstrukcí. Na jednotlivé operace jsou přitom uplatňována běžná pravidla známá z matematiky (tj. že násobení má přednost před sčítáním a podobně):
irb(main):018:0> 2 + 2 * 2 => 6 irb(main):019:0>
Pro jednoznačné vynucení priorit nám také nic nebrání v použití závorek:
irb(main):019:0> 1.7 * (3.0 + (12.0 - 7.0) / 4.0) => 7.225 irb(main):020:0>
Závorky usnadňují čitelnost zápisu i tam, kde nejsou bezpodmínečně nutné, a doporučuji je proto používat.
MathKdyž už jsme u matematických operací, standardní součástí distribuce
ruby je i modul Math, který obsahuje některé užitečné
matematické funkce. Jejich kompletní výčet a popis naleznete v oficiální
dokumentaci, ty asi nejpoužívanější shrnuje následující tabulka:
| Funkce: | Vysvětlení: |
|---|---|
Math.sqrt(n) |
Vrátí nezápornou druhou odmocninu z čísla n. Je-li n záporné číslo, vyvolá výjimku ArgError. |
Math.log(n) |
Vrátí přirozený logaritmus n. |
Math.log10(n) |
Vrátí logaritmus n při základu 10. |
Math.sin(n) |
Vrátí sinus n, zadaného v radiánech. |
Math.cos(n) |
Vrátí kosinus n, zadaného v radiánech. |
Math.tan(n) |
Vrátí tangens n, zadaného v radiánech. |
O výjimkách si budeme povídat v některém z dalších dílů.
Proměnné jsou jedním ze stavebních kamenů imperativních programovacích jazyků a pravděpodobně je již znáte z algebry. Oproti jazykům, jakými jsou C++ nebo Pascal, není třeba proměnné deklarovat, ani explicitně uvádět jejich typ. Proměnná vzniká v okamžiku, kdy je jí přiřazena nějaká hodnota:
irb(main):020:0> PI = 3.14 => 3.14 irb(main):021:0>
Takto jsme vytvořili proměnnou (resp. konstantu, viz dále)
PI, která obsahuje reálnou hodnotu 3.14. Stejně
jako v matematice ji nyní můžeme použít:
irb(main):021:0> PI * 5**2 => 78.5 irb(main):022:0>
Je však třeba si dát pozor na to, aby proměnná skutečně existovala, použití neexistující proměnné (takové, jíž nebyla předtím přiřazena žádná hodnota) vede k chybě:
irb(main):022:0> 2 * PI * r
NameError: undefined local variable or method `r' for main:Object
from (irb):22
from :0
irb(main):023:0>
Jak už jsem řekl, proměnné nejsou předem typovány. Jejich typ se mění s aktuální hodnotou:
irb(main):023:0> a = 42 => 42 irb(main):024:0> a.class # tohoto se nelekejte=> Fixnum irb(main):025:0> a = 2.75 => 2.75 irb(main):026:0> a.class => Float irb(main):027:0> a = 'Ahojky!' => "Ahojky!" irb(main):028:0> a.class => String irb(main):029:0>
Jak náš program poroste, budeme v něm používat čím dál více proměnných. Stejně jako komentáře, i vhodný název proměnných přispívá k lepší čitelnosti kódu:
a = 2 * b * c
Tento zápis je sice srozumitelný, ale neříká nám nic o operaci, kterou provádíme. Vhodně pojmenované proměnné dokumentují operaci samy:
obvodKruhu = 2 * PI * polomer
Lepší, že? Nabízí se otázka, jak zacházet s víceslovnými názvy proměnných. Běžně se používají dva druhy zápisu:
viceslovnyNazev viceslovny_nazev
Je na vás, který způsob vám vyhovuje lépe. Je však dobré si osvojit jeden a důsledně se ho držet, i to totiž přispívá k lepší srozumitelnosti.
Už jsem trochu nakousl, že naše PI je ve skutečnosti
konstanta. Jaký je rozdíl mezi klasickou proměnnou a konstantou? Vysvětlení
je nasnadě: konstanta nabývá jedné hodnoty při svém vytvoření a ta se již
dále nemění, ba jakákoli změna její hodnoty je nežádoucí. Příkladem budiž
naše PI. To má pevnou hodnotu 3.14, jakákoli jiná
hodnota by v našich dalších výpočtech vedla k chybám.
Z pohledu jazyka Ruby spočívá rozdíl mezi konstantami a klasickými proměnnými v jejich názvu:
a-z nebo _
(podtržítko)A-ZTakto docílíme nejen výrazného optického rozdílu, ale i odlišného přístupu interpretru:
irb(main):029:0> a = 3.14 # promenna => 3.14 irb(main):030:0> a = 3 => 3 irb(main):031:0> PI = 3.14 # konstanta => 3.14 irb(main):032:0> PI = 3 (irb):32: warning: already initialized constant PI => 3 irb(main):033:0>
Nová hodnota sice byla konstantě přiřazena, ale změnu provázelo varování, což nám později při ladění programu ulehčí hledání, kde že se stala chyba.
To, co jsme dosud tiše používali, jsou ve skutečnosti lokální proměnné. To neznamená nic jiného, než že existují jen v rámci určité funkce nebo třídy, jak ukazuje následující příklad:
irb(main):033:0> def pozdravuj irb(main):034:1> pozdrav = 'Nazdarek!' irb(main):035:1> puts pozdrav irb(main):036:1> end => nil irb(main):037:0> pozdrav = 'Ahoj.' => "Ahoj." irb(main):038:0> puts pozdrav Ahoj. => nil irb(main):039:0> pozdravuj Nazdarek! => nil irb(main):040:0> puts pozdrav Ahoj. => nil irb(main):041:0>
Detaily definice funkce se zatím nezabývejme, důležité je, že vidíme
na dvou místech přiřazení různých hodnot do proměnné pozdrav
(dle číslování irb na řádcích 33 až 36). Poté postupně
vypisujeme její hodnotu (řádky 38 až 40). Jak vidíme, proměnné
pozdrav existují lokálně na dvou místech: jedna v rámci
hlavního programu a druhá ve funkci pozdravuj a jsou na sobě
nezávislé.
Pokud jste z výše uvedeného příkladu zmatení, nedělejte si starosti a klidně jej pro tuto chvíli pusťte z hlavy. Více pochopíte, až přejdeme k definicím funkcí.
Co je však třeba si pamatovat, je, že lokální proměnné začínají malým
písmenem a-z nebo znakem _ (podtržítko).
Oproti lokálním proměnným existuje v programu vždy jen jedna globální
proměnná určitého jména. Globální proměnné začínají znakem
$:
irb(main):041:0> def pozdravuj irb(main):042:1> $pozdrav = 'Nazdarek!' irb(main):043:1> puts $pozdrav irb(main):044:1> end => nil irb(main):045:0> $pozdrav = 'Ahoj.' => "Ahoj." irb(main):046:0> puts $pozdrav Ahoj. => nil irb(main):047:0> pozdravuj Nazdarek! => nil irb(main):048:0> puts $pozdrav Nazdarek! => nil irb(main):049:0>
Mírně modifikovaná ukázka z předchozí kapitolky ukazuje chování
globálních proměnných. Proměnné $pozdrav je nejprve přiřazena
hodnota 'Ahoj.' a následně pro kontrolu vypsána. Pak je
zavolána funkce pozdravuj, v níž je hodnota proměnné změněna
na 'Nazdarek!'. Na řádku 39 je již vypsána změněná
hodnota.
Použití globálních proměnných se možná může zdát snadné a logické (vždyť přece chci mít svou uloženou hodnotu přístupnou odevšad, ne?), nicméně je také velmi nebezpečné, a proto se doporučuje s nimi šetřit, ba nejlépe nepoužívat je vůbec. Je až příliš snadné globální proměnnou nechtěně přepsat a zapříčinit tak chybné chování programu. Odhalit výskyt chyby v rozsáhlém zdrojovém kódu složité aplikace může zabrat hodiny nebo dny, které bychom místo toho mohli věnovat tvůrčí činnosti. Jak uvidíme dále, předávání hodnot pomocí parametrů je nejen elegantnější, ale usnadňuje i lokalizaci případných chyb.
Zatím jsme používali jen jednoduché intuitivní přiřazení:
irb(main):049:0> polomer = 5.4 => 5.4 irb(main):050:0>
Jistě jste už pochopili, že na levé straně rovnítka je název proměnné, na pravé straně pak samotná hodnota. Krom prostých číselných hodnot je však možné přiřazovat i výsledky matematických operací:
irb(main):050:0> obsah = 3.14 * 5.4**2 => 91.5624 irb(main):051:0>
Je také možné na levé straně použít jiné proměnné:
irb(main):051:0> obsah = PI * polomer**2 => 91.5624 irb(main):052:0>
Můžeme definovat i několik proměnných naráz:
irb(main):052:0> a = b = c = 4 => 4 irb(main):053:0> a => 4 irb(main):054:0> b => 4 irb(main):055:0> c => 4 irb(main):056:0>
Lze dokonce přiřadit na jednom řádku několika proměnným různé hodnoty:
irb(main):056:0> a, b = 5, 2.3 => [5, 2.3] irb(main):057:0> a => 5 irb(main):058:0> b => 2.3 irb(main):059:0>
Dost často se také stává, že na levé straně stojí shodná proměnná:
irb(main):059:0> pocet = 1 => 1 irb(main):060:0> pocet = pocet + 1 => 2 irb(main):061:0>
Matematici teď určitě kroutí nevěřícně hlavou. Musíte si však uvědomit,
že rovnítko zde plní funkci přiřazení, nikoli porovnání (k tomu slouží
operátor ==, ale o tom až později).
Jelikož změna hodnoty proměnné v závislosti na původní hodnotě je poměrně častým úkolem, nabízí Ruby zkrácení ve formě operátorů následujících operátorů:
irb(main):061:0> a = 9 => 9 irb(main):062:0> a += 1 # ekvivalentni k: a = a + 1 => 10 irb(main):063:0> a -= 3 # ekvivalentni k: a = a - 3 => 7 irb(main):064:0> a *= 4 # ekvivalentni k: a = a * 4 => 28 irb(main):065:0> a /= 2 # ekvivalentni k: a = a / 2 => 14 irb(main):066:0> a %= 9 # ekvivalentni k: a = a % 9 => 5 irb(main):067:0>
V příštím díle se podíváme blíže na jednotlivé datové typy a dostane se i na práci s řetězci, poli a hashi.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Diskuse byla administrátory uzamčena
dir? Ten vrací seznam všech metod a atributu daného objektu, anebo jména v současném jmenném prostoru.
>>> dir(4) ['__abs__', '__add__', '__and__', '__class__', '__cmp__', ... '__truediv__', '__xor__'] >>> dir() ['__builtins__', '__doc__', '__name__']
...Ruby je objektový jazyk a myslím, že by bylo vhodné zdůraznit, že proměnné i konstanty jsou ve skutečnosti objekty...
Máte samozřejmě pravdu a až dojde na objekty (snad
) neopomenu toto uvést. Mám však zkušenost, že je lepší začátečníky z prvu moc nestrašit neznámými pojmy. Ze stejného důvodu například hovořím o fib v prvním díle jako o funkci, ačkoli dle striktní terminologie Ruby je to ve skutečnosti metoda.
Chápu, že ne každý se mnou bude v tomto souhlasit.
Serial som uz precital a pomohol mi zacat s Ruby - DOPORUCUJEM !
p objektnebo vyuziji yaml
require 'yaml' puts objekt.to_yamlco se tyce vylistovani metod,
p objekt.methods puts objekt.methods.to_yamla konstant
p Module.constantslze tez vyuzit grepovani v nazvech
p objekt.methods.grep /get_/Osobne bych si z toho sestavil vlastni metodu pro listovani objektu, pojmenoval ji treba show a rozsiril ji na zacatku modul Kernel, aby byla dostupna uplne vsude.
module Kernel
def show obj
STDERR.puts obj
STDERR.puts obj.methods.to_yaml
...
end
end
objekt = 123123
objekt.show