Showing posts tagged ruby

Timeout rendes StandardError-t is dobhat

Többünk számára érthetetlen okból a Ruby Standard Library Timeout Module-ja nem StandardError-ból származó exception-t dob az idő lejártakor. Vélhetően az Interrupt téves éretelmezése miatt a Timeout::Error-t abból származtatták, amit a sima rescue nem kapja el.

Az alábbi monkey patch segít, hogy az elvárható módon működjön a timeout.

Rspec

Nem elsődleges feladata, hogy megmondja hol a hiba, hanem hogy minél biztosabban jelezze, ha hiba van a rendszerben.

A module és a class is konstans az adott névtérben

Mivel egy namespace-ben egy konstans csak egyszer szerepelhet, ezért nem lehet pl egy module-nak és egy class-nak is ugyan az a neve egyazon namespace-ben.

Erre érdemes ügyelni, amikor az ember csinál egy Client namespace-t a controller-ek között, de szeretne Client model-t is.

Aranymetszés

Az aranymetszés bűvös értékét a Fibonacci sorozat segítségével lehet közelíteni. Az alábbi ruby kód ezt teszi:

#!/usr/bin/env ruby

base, prev, curr = 10000000, 0, 1
prev, curr = curr, (curr + prev) while curr

puts curr.to_f / prev

A sorozat zárt alakban is felírható, de úgy most nem érdekes.

két érdekes írás

TextMate

Ebben a postban fogom összefoglalni azokat a tippeket, amiket a TextMate használata közeben derítettem ki.

1. Komment sor elején állva fn + Enter új komment sort hoz létre.

2. Kijelölsz egy részt, aztán cmd + shift + 6 kommentbe teszi a kijelölést.

12 / nil.to_f

Ruby-ban, ha egy osztásban 0.0 (Float) a nevező, akkor nem “division by zero” exception-t kapsz az arcodba, hanem elosztja, de az eremény Infinity lesz (az infinity constans osztálya Float).

Float 0.0 értéket kapsz pl. nil.to_f, 0.to_f stb konverziókra.

Ezzel nem lenne baj, de pl. ha az így kapott értéket adatbázisba mentenéd, akkor NaN-t akar beírni, amitől el fog szállni (MySQL alatt), az alábbihoz hasonló üzenettel:

Mysql::Error: Unknown column 'NaN' in 'field list': UPDATE site_costs SET `min_mp_index` = 0.0, `fix_cost` = 10000.0, `payoff_period_id` = 9, `dina_percent` = 15.0, `u_visits` = 0, `mp_index` = 0.0, `base_of_support` = 'visit', `support_money` = 100.0, `u_visitors` = 0, `mp_money` = NaN, `site_id` = 5, `author_value_on_sites_count` = 0, `site_name` = 'Éva', `customer_payoff_id` = NULL, `min_power` = 10.0, `traffic_cost_maximum` = 0, `traffic_cost` = 0.0 WHERE `id` = 12

Egészségére!