Memory leaky ve standardní knihovně Ruby?
Při hledání memory leaku v mém programu jsem narazil na to, že leakuje dost pravděpodobně stadardní knihovna Ruby. Pro detekci objektů, které zůstavají v paměti, jsem použil memory leak detektor dike.
[Update: Leaky způsobovala chyba v diku! Více na mém blogu zde.]
require 'rubygems'
require 'dike'
Dike.logfactory './log/'
class Leak
def http_call
puts 'making http call'
url = URI.parse('http://www.google.com')
Net::HTTP.start(url.host) do |http|
puts http.get('/').code
end
''
end
end
5.times {
leak = Leak.new
leak.http_call
GC.start
Dike.finger
}
V tomto případě leakuje metoda get, zanechává Net::HTTPFound (HTTPResponse) objekty v paměti. Zaměnění get za request_get leak odstraní.
require 'rubygems'
require 'dike'
Dike.logfactory './log/'
class Leak
def http_call
url = URI.parse('http://www.google.com')
puts 'making the call'
Net::HTTP.start(url.host) {|http|
http.request_get('/') do |response|
response.read_body do |segment|
end
end
}
return ''
end
end
5.times {
leak = Leak.new
leak.http_call
GC.start
Dike.finger
}
V tomto příkladě metoda read_body zanechává v paměti ReadAdapter objekty a kvůli nim tam pak zůstanou i další. Tento problém nastává pouze v případě, že se metodě předá blok. Jinak se ReadAdapter objekt nevytváří a žádný memory leak nenastává.
Nevidím na první, druhý, ani třetí pohled v uvedených příkladech nic podezřelého. Ve zdrojácích knihovny mě také do očí nic nepraštilo. Nic zajímavého jsem ani nevygooglil. Někdo je schopen mi tuhle věc objasnit (co, Davide?:). Další zastávkou bude Ruby mailing list.
Btw,
ruby leak.rb && dike log
Videa z RubyConf 2007
Na stránkách Confreaks se již objevila videa z RubyConf 2007, alespoň tedy většina z nich. Doporučuji především přednášku Jima Weiricha o třech zajímavých Ruby-pokročilých technikách, prezentaci Rubinia Evana Phoenixe, povídání o efektivitě a síle správných nástrojů od Phil Hagelberga a Erica Hodela a v neposlední řadě keynote Matze Matsumota.
Pro mě osobně nejlepší přednáška konference - totiž ta od Ryana Davise - pořád ještě chybí, ale snad již brzy..
Tečky v URL
Měl jsem problém s tím, že "novější" Railsy interpretují tečku v URL jako oddělovač významné části URL a specifikátor požadovaného formátu odpovědi (tj. ".xml" na konci URL by bylo interpretováno jako požadavek na vrácení dat v XML formátu).
Pokud ale vaše URL obsahují tečky bez ohledu na formát, nebude vám mapování fungovat dobře. Tj. /attachment/:file nezachytí /attachment/file.txt. Řešení je ale snadné a to zeslabit omezeni na proměnnou file, aby akceptoval všechny znaky:
/attachment/:file/, :requirements => { :file => /.*/ }
Tohle jsou víc jak rok staré zprávy a řešení se dají poměrně slušně najít, ale třeba jsem vám právě ušetřil půlhodinku bádání (+ se hodí lidem, kteří googlují v češtině).
RubyConf 2007: Videa, RejectConf a poslední den
Tímto zakončujeme sérii reportáží z letošní RubyConf konající se Charlotte v Severní Karolíně. Přecházejícím článkem byl report o Matzově keynote, v něm najdete i odkazy na předchozí příspěvky.
Zdá se, že videa z přednášek se objeví na příslušné stránce Confreaks, zatím tam je ale jenom Q&A session s Matzem na konci prvního dne. Buďme trpěliví. Co tam ale již je, jsou videa z letošní RejectConf, což jsou pidi-konference v rámci RubyConf nebo RailsConf, které - jak již název napovídá - dávají prostor všem, kteří to nedotáhli na hlavní pódium. Kdokoliv se může během pár hodin přihlásit o slovo a pokud přednáška nebude moc dlouhá, je téměř stoprocentní šance, že dostane prostor k prezentaci čehokoliv s Ruby souvisejícího.
Neviděl jsem úplně všechno, ale zaujal mě hlavně monitorovací nástroj skromně pojmenovaný God. Také MonkeyBars - knihovna umožňující vývoj GUI v Ruby pomocí Swingu - stojí za zmínku. Pak snad jen že PDF-Writer má zas někoho, kdo ho bude udržovat. Pro zasmání ale doporučuji zmínku o rozšíření IRB historie ("If you're like me - and I certainly am").
Teď v cuku letu posledním dnem. Dr. Nic Williams ukázal vtipnou variaci úvodní znělky seriálu A-team (v době psaní tohoto článku je YouTube nefunkční, kam ten svět směřuje??), kde zaměnil původní hrdiny známými příslušníky Ruby scény. Poté výpravěl o různých generátorech všeho a generátorech generátorů všeho. Pokud vás zajímá, zkuste Nicův screencast.
Dave Astels (který čerstvě doplnil řady inženýrů Googlu - evidentně tam také dělají Ruby) a David Chelimsky poté představili TDD, BDD a RSpec. TDD neboli Test Driven Development je podle Astelse zaměření na design (Test Driven Design), dokumentaci a chování, ne koncentrací na testy. Tj. nejde ani tak o to mít napsané testy, ale o fakt, že psaním testů dřív, než samotný výkonný kód, dosahujeme přehlednějšího a čistšího designu.
Také to znamená, že nepíšeme žádný kód zbytečně, ale pouze na základě selhávajícího testu (tj. nesplněného požadavku na chování). Odsud se dostáváme k BDD (Behavior Driven Development), tedy vývoji řízeném popisem chování. Při BDD nejprve napíšete specifikaci velmi malé části systému ve formě programu (testu) a pak dopíšete co nejmenší množství kódu tak, aby specifikaci splňoval (test uspěl). Pak pokračujete implementací dalšího požadavku na chování.
RSpec je implementace BDD a co přináší oproti obyčejnému test-first přístupu je především odlišný slovník. Porovnejte dva stejné "testy" a posuďte sami, který se víc hodí na to být napsaný dřív, než kód, který testuje (specifikuje).
describe "Controller" do
it "should have a session hash accessible" do
@controller.session.should.be.an.instance_of Hash
end
end
class Controller < Test::Unit::TestCase
def test_controller_should_have_a_session_hash_accessible
assert @controller.session.instance_of?(Hash)
end
end
Ke konci přednášky byly předneseny nové vlastnosti RSpec, nějaké user stories, které byly napsány jakoby přirozeným jazykem a nějak se překládaly do těch popisů chování. Tam mi to přišlo hodně přehnané, zbytečně komplexní a přinášející duplicity. Vrcholem byla úvaha, že takové specifikace budou psát uživatelé (či jejich podpora). To mi přišlo jako naprostá hloupost. Teď když nad tím ale přemýšlím, možná by je mohl psát znalec dané domény (např. fyzik, chemik) pro programátory. Ještě to tedy neztracuji.
Další přednáška byla o Adhearsion, též známým jako "nové Rails", hehe. Adhearsion je v Ruby napsaný framework pro VoIP aplikace. Není to napsané od nuly, jedná se o vrstvu nad starší knihovnou Asterisk, ve které psát přímo nebude podle výjadření autora a předvedených ukázek žádný med. Pokud děláte cokoliv s telefony/telefonií, neváhajte Adhearsion alespoň prozkoumat (a dát nám vědět).
Pokud máte více aplikací vyžadující autentikaci, může se vám hodit představený RubyCAS server. Co je ale mnohem podstatnější (že?) je informace, že toto dílko je napsáno ve frameworku Camping. A pak že je jen na hraní. Pokud zas potřebujete samostatný server na full-text prohledávání vaší databáze s API, které umí vracet Ruby, třeba se vám bude hodit Solr.
Den a celou konferenci pro mě zakončila přednáška Bena Scofielda na téma DSL (doménově specifický jazyk). Jedním z jeho sdělení bylo, že v Ruby napsané DSL vlastně žádné jazyky nejsou, jsou to pouze dialekty Ruby, neboť nemají odlišnou gramatiku, pouze jinou slovní zásobu. Navrhoval nazývat je tedy DSD (dialects). To bylo poněkud nešťastné, neboť jak poznamenali diskutující, nemusíme být zas takoví puntičkáři; slovo "language" nemusí být chápáno jako tak striktně definující. O tom se bohužel diskutovalo poměrně dlouho, a tak asi zapadla pro mě důležitější myšlenka prezentace. Totiž že slova, která používáme, ovlivňují, jak o věcech přemýšlíme. Hodně záleží na tom, jaké si zvolíme jména proměnných, protože a, b, x nás myšlenkově drží v abstraktním programování, kdežto today_flights, return_fligths apod. nám umožňuje přemýšlet v doméně, pro kterou programujeme. A to je přesně to, čeho chceme dosáhnout, protože pak náš design dává daleko větší smysl. Zmíněno bylo i to, že test máme ze školy zafixované jako něco, co přichází na konec (nejprve studujeme, pak se píše test a toť vše), kdežto specifikace je vždy na začátku. Podnětné. Než bude k dispozici video, můžete zkusit více pochytit ze slajdů.
A to je vše přátelé o RubyConf 2007. Setkání to bylo velmi inspirující. Příští ročník bych doporučil všem, kteří budou mít možnost za moře vyrazit. Ostatní to budou mít (snad!) velmi blízko na RubyConf Europe 2008.
Co je nového v Rails 2?
Pokud to také chcete vědět a nechcete vše dolovat z různých blogů (nebo z poznámek ke commitům, hehe), možná jako já nepohrdnete mini-knihou o Rails 2, dostupnou přes Peepcode.