Archív pro rubriku “Programování”

Nošení dříví do lesa, ale mě se tuhle „novinku“ povedlo úspěšně minout. Starší verze Prototype (<1.6) neumožňovaly registrovat událost pro načtení DOM stromu dokumentu ($(document).ready() známé z jQuery) a uměly pouze Event.observe(window, ‘load’, function(){ … }), což je prakticky synonymum pro onload událost prvku body. Nevýhoda obou přístupů je stejná – čeká se i na obrázky. To je ale pro spoustu činností zbytečně pozdě, namátkou třeba pro registraci AJAXových volání. Od verze 1.6 je tedy možné používat konstrukci Event.observe(document, ‘dom:loaded’, function(){ … }).

Comments Bez komentářů »

Pokud chcete automaticky mít zobrazená všechna data v českém formátu, tak ideální DRY postup je přidat do config/environment.rb řádky (první pro datum, druhý pro čas):

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS[:default] = '%d.%m.%Y'
ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS[:default] = '%d.%m.%Y %H:%M'

Jenže ouha, tohle vám rozbije zpětnou konverzi dat od uživatele – Rails ve verzi 2.1 totiž dají přednost formátu mm.dd.yyyy před dd.mm.yyyy (08.01.2008 tedy uloží jako 1. srpen 2008) a nenašel jsem žádnou možnost tohle chování změnit. Pokud chcete všechno provést bez použití pluginů, tak můžete předefinovat metody string_to_date a string_to_time v ActiveRecord, které se starají o konverzi textových řetězců na objekty Date resp. DateTime. Vytvořte soubor config/initializers/active_record.rb a vložte do něj:

module ActiveRecord
  module ConnectionAdapters
    class Column
      def self.string_to_date_with_european_format(string)
        begin
          Date.strptime(string, '%d.%m.%Y')
        rescue
          string_to_date_without_european_format(string)
        end
      end
      def self.string_to_time_with_european_format(string)
        begin
          DateTime.strptime(string, '%d.%m.%Y %H:%M')
        rescue
          string_to_time_without_european_format(string)
        end
      end
      class << self
        alias_method_chain :string_to_date, :european_format
        alias_method_chain :string_to_time, :european_format
      end
    end
  end
end

Restartujte webserver a hotovo. Předefinované metody se v případě neúspěchu s konverzí pokusí zavolat svojí původní verzi, takže se nemusíte bát, že by přestaly fungovat konverze z oblíbených formátů yyyy-mm-dd a jiných.

Comments Bez komentářů »

Možná jste narazili na požadavek nějakým způsobem stylovat jednotlivé položky (option) v helperech select nebo select_tag. Princip je jednoduchý – nejde to. Naštěstí v Rails není problém upravit přímo jejich nějakou část, pokud vám nevyhovuje (většinou pomocí vytvoření nové metody a nastavení aliasu pro původní název). Tenhle konkrétní příklad se dá vyřešit krátkým kusem kódu:

module ActionView
  module Helpers
    module FormOptionsHelper
      def options_for_select_with_styles(container, selected = nil)
        container = container.to_a if Hash === container
        options_for_select = container.inject([]) do |options, element|
          text, value = option_text_and_value(element)
          selected_attribute = ' selected="selected"' if option_value_selected?(value, selected)
          css_class = " class=\"#{element[1]}\"" if element[1] && element[1] != value
          options << %(<option value="#{html_escape(value.to_s)}"#{selected_attribute}#{css_class}>#{html_escape(text.to_s)}</option>)
        end
        options_for_select.join("\n")
      end
      alias_method_chain :options_for_select, :styles
    end
  end
end

Kód uložte do souboru s názvem form_options_helper.rb do adresře config/initializers a teď už můžete jednoduše jako druhý parametr přidat požadovanou CSS třídu (value se potom přesouvá na třetí místo).

Comments Bez komentářů »

16. ledna proběhne v Praze jedna z částí Adobe AIR Tour. O co jde? V krátkosti představení Adobe AIR a Flexu 3. Adobe AIR se ještě před nějakou dobou jmenovalo Apollo a jde o prostředí, který umožní spouštění webových aplikací na desktopu. Včetně vestavěné SQLite databáze, možnosti přístupu k souborům atd. A tyhle aplikace můžete psát například v HTML, Flashi nebo… Flexu, což je pro jakýsi „Flash pro programátory“. Registrace je zdarma a probíhá na portálu Flash.cz.

Comments Bez komentářů »

Před měsícem proběhl mojí RSS čtečkou článek na A List Apart ohledně nastavování velikosti fontů pomocí CSS. Pokud ještě řešíte klasické problémy jako „IE6 nemění písmo s výškou udanou v px“ nebo „IE6/IE7 dělá obrovské skoky ve velikosti písma“ (obojí při změně velikosti textu v prohlížeči), tak určitě doporučuji.

Comments Bez komentářů »

Jako vášnivý čtenář všeho možného na internetu včetně diskuzí narážím semtam na názory „Ruby on Rails jsou buzzword, proto je nebudu používat“ (buzzword = „je to IN, móda, prostě TOHLE TEĎ LETÍ!!!“). Nic víc, žádný důvod, který by měl něco společného s kvalitou/nekvalitou samotného frameworku nebo Ruby jako jazyka. A důvody by se samozřejmě najít daly, Rails nejsou dokonalé a ani Ruby není dokonalé. Důvodem navíc může být i „umím skvěle PHP/Python/Javu a efektivnější je pro mě u toho zůstat“.

Způsob uvažování „je to buzzword, to nechci“ mi uniká a naopak považuji popularitu u open-source projektů za extrémně důležitý faktor. Přitahuje vývojáře a komerční firmy, které často vrací výsledek své práce komunitě. Skvěle je to vidět na jakémkoliv projektu, který je dál rozšiřitelný, například pomocí pluginů: velká komunita = víc rozšíření = méně práce pro další uživatele. Firefox, WordPress, Drupal nebo třeba Apache jsou příklady projektů, které tímto způsobem těží z široké komunity. Další výhodou je dokumentace a podpora. Víc hlav víc ví a hlavně víc hlav má víc času poradit.

Když jsem tohle napsal někomu na diskuzi v Rootu, tak jsem dostal odpověď „víc lidí, větší popularita, víc idiotů na jedné kopě, kteří ti dokáží věc znechutit“. Přiznám se, že jsem to nepochopil. Mezi větším množstvím lidí bude samozřejmě absolutní počet idiotů větší, to dává smysl. Ale nikdo mě přece nenutí komunikovat s lidmi, se kterými komunikovat nechci (ti idioti), tak jak by mi mohli něco znechutit? Prostě je vypustím, nebo je začnu brát jako komický doplněk (skvělý příklad je Astor na Živě.cz, modří určitě vědí). Navíc kdybych se tím chtěl řídit, tak musím přestat používat Windows, Firefox, MySQL a servery přeinstalovat na nějaký neznámý klon Unixu. Co ale budu dělat, když i moje nové alternativy začnou být taky populární?

Pokud se podíváme kousek do minulosti, tak podobným buzzwordem bylo XHTML. Spousta lidí v tom vidělo spásu webu, další spousta začalo hrdě ověšovat své weby ikonkami „XHTML 1.0 Strict Valid“ a někteří přestali používat tabulky i pro tabulky. Přiznám se, že mě to nechalo úplně klidným, ne protože jsem byl nějaký vizionář, ale jednoduše protože jsem byl líný a XHTML mi nic nepřinášelo. Pozdější vývoj udělal tvrdou selekci, XHTML pomalu umírá a přichází HTML5. Dalším příkladem, tentokrát úspěšného buzzwordu byl i Linux. Obrovské úspěchy se sice nekonaly, ale Linux se pomalu rozšiřuje a je to už dlouho seriózní projekt.

Pointa z toho je jednoduchá – nezáleží na tom, jestli je něco buzzword, ve výsledku stejně rozhodne kvalita a buď bublina splaskne, nebo se změní v životaschopný projekt. Takže proč se tím řídit?

Comments Bez komentářů »

Prozatím píšu opravdu krátce – vyšla nová hlavní (major) verze frameworku Ruby on Rails. Přináší spoustu změn, o kterých se pokusím v budoucnosti rozepsat. Pro zájemce prozatím dávám odkaz na oficiální informace o vydání.

Comments Bez komentářů »

Před nedávnem jsem psal návod na vytvoření průhledného pozadí pomocí CSS. Později mě napadlo přidat i způsob, jak měnit průhlednost při najetí myší, už jenom protože to není nic složitého. Můj popsaný postup má v tomhle případě jeden problém – jako prvek, který získá mouseover je zde odkaz a <div> s pozadím, který má na starost průhlednost, je ve struktuře dokumentu vedle něj. A jelikož IE6 neumí CSS selektor :hover pro nic jiného než odkazy, tak není možné využít ani :hover pro nadřazený prvek (ke kterému událost „probublá“ z odkazu).

První řešení, který mě klasicky napadlo je JavaScript, pak už jsem dál nepřemýšlel a rovnou ho použil. Tedy samozřejmě ne přímo JavaScript, ale některou z knihoven, které byly vytvořeny, aby trochu pomohly ubohým programátorům vypořádat se s rozdíly mezi prohlížeči a hlavně nepsat tolik kódu. Jelikož poslední dobou dělám pouze v Ruby on Rails, které používají knihovnu Prototype, tak jsem sáhl po ní, ale třeba jQuery nebo cokoliv jiného by se dalo taky bez problémů použít.

Po ujasnění si všeho je výsledný postup jednoduchý – při události mouseover přidat nadřazenému prvku třídu hover a definovat nový CSS selektor .hover div který nastaví průhlednost na 0 (úplně viditelný). Pomocí Prototype toho dosáhnete například takto:

<script src="prototype.js" type="text/javascript"></script>
<script type="text/javascript">
Event.observe(window, 'load', function() {
    $$('.opaque-background').each(function(el){
        Event.observe(el, 'mouseover', function(){
            el.addClassName('hover');
        });
        Event.observe(el, 'mouseout', function(){
            el.removeClassName('hover');
        });
    });
});
</script>

Výsledný kód i s doplněnými styly si můžete prohlédnout zde (otevře se v novém okně), nebo stáhnout včetně Prototype.

Comments Bez komentářů »

Před nedávnem jsem dělal pro známého osobního trenéra menší web. Udělali jsme oboustranně výhodný barter – já jsem s ním chodil cvičit a on měl web včetně hostingu zdarma. Web je statický, ve dvou jazykových verzích a já jsem potřeboval samozřejmě klasické věci jako hezká URL, přepínání aktivních/neaktivních odkazů podle aktuální stránky, jediné místo pro kód Google Analytics, aby se ojevil na všech stránkách atd. Ještě před nedávnem bych si řekl, že použít na to Ruby on Rails je klasický útok s kanónem na vrabce. Teď jsem taky chvilku přemýšlel, jestli neoprášit svoje znalosti PHP, ale potom jsem si řekl DOST! Když už se PHP úspěšně bráním přes půl roku, tak se k němu přece nebudu dobrovolně vracet? Zkusil jsem tedy i pro tenhle miniweb použít Rails a výsledek mě příjemně překvapil.

Výkonově je to stejné, nebo dokonce ještě lepší, než při použití PHP – stačí správně nastavit cachování a všechny stránky se budou generovat pouze jednou. Na pozadí musí samozřejmě stále běžet Mongrel, ale to není velká ztráta, ostatně PHP se taky nahrává do každého procesu Apache. Práce je při použití Rails rozhodně méně – mám spoustu použitelných helperů, nebo generování URL pomocí routes, které je jako stvořené pro SEO. Navíc mám samozřejmě Capistrano – ruční nahrávání webů přes FTP patří do pravěku, líní lidé, kteří neradi dělají chyby, používají automatické nástroje. To hlavní ale samozřejmě je, že nemusím lovit v paměti nebo na Googlu, jaké jsou správné názvy funkcí v PHP nebo pořadí parametrů. Používám stále něco, co mám už velice dobře zažité. Nejde ani tak o časovou úsporu, ale spíš o úsporu nervů – hledat v dokumentaci mě nebaví a jsem rád, že mě ho tohle rozhodnutí definitivně zbavilo.

PHP s radostí přenechávám ostatním.

Comments 2 Komentářů »

Nejdřív jsem byl trochu udivený, že na tuhle typickou činnost neexistuje v Rails žádný plugin, ale pak mi to došlo – není moc potřeba. Google odhalil jeden užitečný kus kódu, který jsem pro větší přehlednost trochu přepsal a celé použil jako metodu třídy Password. V této podobě generuje náhodná hesla obsahující znaky a-z a 0-9, výchozí délka hesla, pokud generátor zavoláte bez parametru, je 8. Pro použití v Rails celý kód zkopírujte do souboru lib/password.rb a potom budete moci z kteréhokoliv místa kódu volat Password.generate.

class Password
 
   ALLOWED_CHARS = ('a'..'z').to_a + ('0'..'9').to_a
 
   def Password.generate(length = 8)
      password = ''
      while password.length < length
         password << ALLOWED_CHARS[Kernel.rand(ALLOWED_CHARS.length)]
      end
      password
   end
 
end

Comments Bez komentářů »