<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>/home/wijet - Home</title>
  <id>tag:wijet.pl,2010:mephisto/</id>
  <generator version="0.8.0" uri="http://mephistoblog.com">Mephisto Drax</generator>
  <link href="http://wijet.pl/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://wijet.pl/" rel="alternate" type="text/html"/>
  <updated>2009-04-30T11:59:18Z</updated>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2009-04-22:65</id>
    <published>2009-04-22T14:05:00Z</published>
    <updated>2009-04-30T11:59:18Z</updated>
    <category term="activesupport"/>
    <category term="rails"/>
    <category term="ruby"/>
    <category term="tips"/>
    <category term="tricks"/>
    <link href="http://wijet.pl/65/quick-tip-2-memoizable" rel="alternate" type="text/html"/>
    <title>Quick tip #2: Memoizable</title>
<content type="html">
            &lt;p&gt;Gdy jakaś metoda wykonuje kosztowne obliczenia, a jej wyniku używamy wielokrotnie, rozsądnym jest obliczenia wykonać raz, a wynik zapamietać, tzw. cachowanie za pomoca zmiennych instancji. W takim wypadku, najczęsciej używamy idiomu &quot;||=&quot;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Bar
  def foo
    @foo ||= lambda {
      # jakies kosztowne obliczenia
      ...
    }.call
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Od railsów 2.2 możemy korzystać z metody :memoize, należy dodać metody z modułu &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveSupport/Memoizable.html&quot;&gt;ActiveSupport::Memoizable&lt;/a&gt; jako metody klasy.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Bar
  extend ActiveSupport::Memoizable

  def foo
    # jakies kosztowne obliczenia
    ...
  end

  memoize :foo
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Spowoduje to że za pierwszym wywołaniem metody :foo, metoda ta faktycznie zostanie wywołana, a wartość przez nią zwrócona zapamiętana (dziala to tak jak cachowanie w zmiennej instancji, czyli tylko w obrebie danego obiektu).&lt;/p&gt;

&lt;p&gt;Każde następne wywołanie metody :foo, na tym konkretnym obiekcie, spowoduje zwrócenie zapamiętanej wartośći.&lt;/p&gt;

&lt;p&gt;Jeśli chcemy wymusić wywołanie metody (tzn. bez cachu), jako ostatni parametr należy podać wartość true.&lt;/p&gt;

&lt;h4&gt;Linki&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveSupport/Memoizable.html&quot;&gt;Module ActiveSupport::Memoizable&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.railway.at/articles/2008/09/20/a-guide-to-memoization&quot;&gt;Memo-what? - A Guide to Memoization&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://railscasts.com/episodes/137-memoization&quot;&gt;Railscasts: Memoization&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ryandaigle.com/articles/2008/7/16/what-s-new-in-edge-rails-memoization&quot;&gt;What's New in Edge Rails: Easy Memoization&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2009-04-11:63</id>
    <published>2009-04-11T19:15:00Z</published>
    <updated>2009-04-11T19:16:48Z</updated>
    <category term="rails"/>
    <category term="ruby"/>
    <category term="tips"/>
    <category term="tricks"/>
    <link href="http://wijet.pl/63/quick-tip-1-tap-i-returning" rel="alternate" type="text/html"/>
    <title>Quick tip #1: tap i returning</title>
<content type="html">
            &lt;p&gt;Tym postem chcę rozpocząć serię którkich wpisów, o konkretnych metodach/konstrukcjach dostępnych w railsach, lub w samym Ruby,
Za pomocą których możemy zrobić coś krócej, ładniej, bardziej ruby way.&lt;/p&gt;

&lt;p&gt;Czasami pojawia się potrzeba wykonania na obiekcie pewnych operacji, a następnie zwrócenie go.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def foo(name)
  product = Product.find_or_initialize_by_name(name)
  # tu cos mieszamy z produktem
  ...
  # zapisujemy
  product.save
  product
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;jak widać na końcu musi być 'product' aby metoda zwracała product, inaczej :foo zwrociła by nam prawde lub fałsz, czyli wynik product.save&lt;/p&gt;

&lt;p&gt;Możemy to bardzo elegancko, zastapić, poniższa konstrukcją&lt;/p&gt;

&lt;h4&gt;returning&lt;/h4&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def foo(name)
  returning Product.find_or_initialize_by_name(name) do |product|
    # tu cos mieszamy z produktem
    ...
    # zapisujemy
    product.save
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;http://api.rubyonrails.org/classes/Object.html#M000275&quot;&gt;:returning&lt;/a&gt; przyjmuje obiekt, przekazuje go do bloku który otrzymuje, a następnie zwraca ten obiekt&lt;/p&gt;

&lt;h4&gt;tap&lt;/h4&gt;

&lt;p&gt;Za pomocą &lt;a href=&quot;http://api.rubyonrails.org/classes/Object.html#M000276&quot;&gt;:tap&lt;/a&gt; możemy zrobić to samo, w troche inny sposob:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def foo(name)
  Product.find_or_initialize_by_name(name).tap do |product|
    # tu cos mieszamy z produktem
    ...
    # zapisujemy
    product.save
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Metoda &lt;a href=&quot;http://api.rubyonrails.org/classes/Object.html#M000276&quot;&gt;:tap&lt;/a&gt; przyjmuje blok do którego przekazuje self (obiekt na którym została wywołana), a następnie po wykonaniu bloku zwraca self.&lt;/p&gt;

&lt;p&gt;Obydwie metody sa dostepne w railsach. Warto wiedzieć że metoda :tap została włączona do Ruby w wersji 1.9.&lt;/p&gt;

&lt;p&gt;Za pomocą metody :tap mozemy nawet wiecej poczarować, polecam przejrzenie poniższych linków:&lt;/p&gt;

&lt;h4&gt;Linki&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions&quot;&gt;Eavesdropping on Expressions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.infoq.com/news/2008/02/tap-method-ruby19&quot;&gt;Tapping method chains with Ruby 1.9&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://breakingthebuild.com/2008/08/28/rails-activesupport-returning-method/&quot;&gt;Rails ActiveSupport returning Method&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://weblog.jamisbuck.org/2006/10/27/mining-activesupport-object-returning&quot;&gt;Mining ActiveSupport: Object#returning&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2009-04-02:45</id>
    <published>2009-04-02T18:18:00Z</published>
    <updated>2009-04-30T11:57:19Z</updated>
    <category term="activerecord"/>
    <category term="rails"/>
    <category term="ruby"/>
    <category term="tuts"/>
    <link href="http://wijet.pl/45/named-scopes-w-activerecord" rel="alternate" type="text/html"/>
    <title>Named scopes w ActiveRecord</title>
<summary type="html">&lt;p&gt;Od railsów 2.1 możemy korzystać z dobrodziejstw &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html&quot;&gt;named_scopes&lt;/a&gt;, za pomocą których możemy definiować w łatwy sposób findery.
Mowiąc prościej, możemy budować zapytania do bazy danych. Nie są to jednak zwykłe metody ktore wyszukują nam coś w bazie, zamiast prostego zbioru wyników, zwracany jest scope (zakres).&lt;/p&gt;

&lt;p&gt;Aby rzucić więcej swiatła na sprawę, zacznijmy od przykładu:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Product &amp;lt; ActiveRecord::Base
  named_scope :available, :conditions =&gt; &quot;amount &gt; 0&quot;
  named_scope :featured, :conditions =&gt; {:featured =&gt; true}
end&lt;/code&gt;&lt;/pre&gt;</summary><content type="html">
            &lt;p&gt;Od railsów 2.1 możemy korzystać z dobrodziejstw &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html&quot;&gt;named_scopes&lt;/a&gt;, za pomocą których możemy definiować w łatwy sposób findery.
Mowiąc prościej, możemy budować zapytania do bazy danych. Nie są to jednak zwykłe metody ktore wyszukują nam coś w bazie, zamiast prostego zbioru wyników, zwracany jest scope (zakres).&lt;/p&gt;

&lt;p&gt;Aby rzucić więcej swiatła na sprawę, zacznijmy od przykładu:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Product &amp;lt; ActiveRecord::Base
  named_scope :available, :conditions =&gt; &quot;amount &gt; 0&quot;
  named_scope :featured, :conditions =&gt; {:featured =&gt; true}
end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Od railsów 2.x możemy korzystać z dobrodziejstw &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html&quot;&gt;named_scopes&lt;/a&gt;, za pomocą których możemy definiować w łatwy sposób findery.
Mowiąc prościej, możemy budować zapytania do bazy danych. Nie są to jednak zwykłe metody ktore wyszukują nam coś w bazie, zamiast prostego zbioru wyników, zwracany jest scope (zakres).&lt;/p&gt;

&lt;p&gt;Aby rzucić więcej swiatła na sprawę, zacznijmy od przykładu:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Product &amp;lt; ActiveRecord::Base
  named_scope :available, :conditions =&gt; &quot;amount &gt; 0&quot;
  named_scope :featured, :conditions =&gt; {:featured =&gt; true}
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pierwszy argument to nazwa scopu, drugi to hash taki jak przyjmuje metoda :find, albo lambda która zwraca taki hash.
Mozemy także wywołać named_scope z blokiem, ale o tym poźniej.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;Product.available
# SELECT * FROM &quot;products&quot; WHERE (amount &gt; 0)

Product.featured
# SELECT * FROM &quot;products&quot; WHERE (&quot;products&quot;.&quot;featured&quot; = 't') &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No tak, w sumie mozna by napisac &quot;normalne&quot; metody klasy, ktore zrobia to samo.&lt;/p&gt;

&lt;p&gt;Wygladało by to tak:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def self.available
  all(:conditions =&gt; [&quot;amount &gt; 0&quot;])
end

def self.featured
  all(:conditions =&gt; {:featured =&gt; true})
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dlaczego więc warto stosować named_scopes, zamiast &quot;normalnych&quot; metod ?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ładniejszy, krótszy kod&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mozliwość łaczenia scopów&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Łaczenie scopów&lt;/h4&gt;

&lt;p&gt;Tak, scopy mozemy łaczyć. Aby pobrać produkty, które są dostępne i promowane, napiszemy:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
Product.available.featured
# SELECT * FROM &quot;products&quot; WHERE ((&quot;products&quot;.&quot;featured&quot; = 't') AND (amount &gt; 0))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jak widac, zostało wykonane jedno zapytanie, a warunki obu scopów zostały połączone.&lt;/p&gt;

&lt;h4&gt;Scopy które przyjmują argumenty&lt;/h4&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Product &amp;lt; ActiveRecord::Base
  named_scope :limit, lambda { |limit| {:limit =&gt; limit} }
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wystarczy aby lambda zwracała hash opcji wyszukiwania, taki jak przekazujemy do metody :find.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;Product.available.limit(20)&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Anonimowy scope&lt;/h4&gt;

&lt;p&gt;Za pomocą metody scoped, moźemy tworzyć anonimowe scopy.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;Product.scoped(:conditions =&gt; &quot;name ~* 'tv'&quot;).limit(100)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nie zaleca się jednak stosowania tego typu konstrukcji gdzie popadnie, gdyż możemy poprostu napisać scope nazwany w modelu, tam gdzie powinnismy trzymac nasze zapytania.&lt;/p&gt;

&lt;p&gt;Są  miejsca gdzie przydaje się anonimowy scope, tutaj jest przykład ciekawego wykorzystania &lt;a href=&quot;http://railscasts.com/episodes/112-anonymous-scopes&quot; title=&quot;Railscasts - Anonymous Scopes&quot;&gt;Railscasts - Anonymous Scopes&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Rozszerzenia dla named_scopes&lt;/h4&gt;

&lt;p&gt;Podobnie jak w przypadku associacji, możemy tworzyć rozszerzenia dla scopów.
Dodajmy metode która zamówi wszystkie produkty, których brakuje.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;named_scope :unavailable, :conditions =&gt; {:amount =&gt; 0} do
  def order
    each { |product| Order.create(:product =&gt; product) }
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;Product.unavailable&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Zwraca wszystkie produkty ktorych brakuje&lt;/p&gt;

&lt;p&gt;natomiast&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;Product.unavailable.order&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tworzy zamowienia, dla kazdego z tych produktów.&lt;/p&gt;

&lt;h3&gt;Rails 2.3&lt;/h3&gt;

&lt;p&gt;W railsach 2.3 został wprowadzony scope dynamiczny i domyslny.&lt;/p&gt;

&lt;h4&gt;Dynamiczny scope&lt;/h4&gt;

&lt;p&gt;Możemy używac dynamicznych scopow, podobnie jak dynamiczynych finderow, czyli:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;Product.scoped_by_amount_and_featured(100, true)&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Domyślny scope&lt;/h4&gt;

&lt;p&gt;Nastepną bardzo użyteczna konstrukcją, jest możliwość zdefiniowania domyślnego scopu dla modelu. Bardzo często konkretna tabele sortujemy
po konkretnej kolumnie/kolumnach.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Product &amp;lt; ActiveRecord::Base
  default_scope :order =&gt; &quot;name DESC&quot;
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Przydaje się też, gdy chcemy ukryc pewne rekordy, np. produkty które nie są aktualnie odstępne:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;default_scope :conditions =&gt; &quot;amount &gt; 0&quot;&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Linki&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html&quot;&gt;Module ActiveRecord::NamedScope::ClassMethods&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://railscasts.com/episodes/108-named-scope&quot;&gt;Railscasts named_scope&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality&quot;&gt;What's New in Edge Rails: Has Finder Functionality&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ryandaigle.com/articles/2008/11/18/what-s-new-in-edge-rails-default-scoping&quot;&gt;What's New in Edge Rails: Default Scoping&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ryandaigle.com/articles/2008/12/29/what-s-new-in-edge-rails-dynamic-scope-methods&quot;&gt;What's New in Edge Rails: Dynamic Scope Methods&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-12-14:13</id>
    <published>2007-12-14T14:23:00Z</published>
    <updated>2009-03-21T14:23:31Z</updated>
    <category term="opensource"/>
    <link href="http://wijet.pl/13/daj-si-policzy" rel="alternate" type="text/html"/>
    <title>Daj si&#281; policzy&#263;!</title>
<content type="html">
            &lt;p&gt;Firma OpenLogic przeprowadza pierwszy na świecie spis programów open source. Jak wiadomo trudno jest policzyć wolne oprogramowanie, jest masa mirrorów, bardzo często oprogramowanie jest dostarczane razem z systemami operacyjnymi np linuksem, rozdawane na wszelakich konferencjach. Aby wdziąć udział w akcji należy ściągnąć &lt;a href=&quot;http://ossdiscovery.opensource.collab.net/servlets/ProjectProcess?pageID=ImMsTo&quot;&gt;program&lt;/a&gt; który przeskanuje nasz komputer w poszukiwaniu oprogramowania open source. Aplikacja wymaga interpretera Ruby przynajmniej w wersji 1.8.5. Pozostaje tylko czekać na pierwsze analizy wyników.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-11-04:12</id>
    <published>2007-11-04T13:26:00Z</published>
    <updated>2009-03-22T00:22:43Z</updated>
    <category term="ruby"/>
    <link href="http://wijet.pl/12/dziwne-zachowanie" rel="alternate" type="text/html"/>
    <title>Dziwne zachowanie ||=</title>
<content type="html">
            &lt;p&gt;Do tej pory myślałem o boo ||= &quot;foo&quot; jako naturalnym(lepszym) zamienniku dla instrukcji&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;boo = &quot;foo&quot; if boo.nil?
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Czyli do zmiennej boo przypisujemy &quot;foo&quot; jeśli boo jest nil'em.
Fakt ten jest opisany na wielu stronach, także w książce &quot;Programowanie w Języku Ruby&quot; czytamy:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;words[key] ||= []&lt;/p&gt;
    
    &lt;p&gt;&quot;...jeśli wpis w tablicy asocjacyjnej words dla klucza key nie istnieje(nil), wartością zwracaną przez || będzie drugi operand, &gt; czyli nowa pusta tablica. Dlatego ten wiersz kodu przypisze tablice elementowi tablicy asocjacyjnej który nie ma jeszcze &gt; wartości...&quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I w takiej świadomości dość długo żyłem, dlatego metoda typu&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def foo(options = {})
  options[:boo] ||= true
  options[:bar] ||= &quot;r&quot;
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;wydawała mi się całkowicie poprawna.&lt;/p&gt;

&lt;p&gt;Niestety tak nie jest,
przekazanie do metody :boo =&gt; false i tak powodowało ustawienie options[:boo] na true, z początku myślałem ze w nocy ktoś mi podmienił interpreter. Zajrzałem na strone (bardzo dobre źródło wiedzy o idiomach ruby) &quot;Ruby: idmioms&quot;:http://www.rubygarden.org/ruby/page/show/RubyIdioms i moje wątpliwosci zostaly rozwiane&lt;/p&gt;

&lt;p&gt;bq. You can also use the ||= operator to assign a value to a variable if it evaluates to false.&lt;/p&gt;

&lt;p&gt;Do tej pory dałbym sobie rękę uciąć że ||= przypisuje wartość tylko gdy zmienna jest nil'em, i &quot;...bym teraz k&lt;em&gt;*&lt;/em&gt;* ręki nie miał&quot;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-08-15:8</id>
    <published>2007-08-15T23:38:00Z</published>
    <updated>2009-03-22T01:15:29Z</updated>
    <category term="ruby"/>
    <category term="screencasts"/>
    <category term="tricks"/>
    <link href="http://wijet.pl/8/latwe-pobieranie-screencastow-z-railscasts-com" rel="alternate" type="text/html"/>
    <title>&#321;atwe pobieranie screencastow z Railscasts.com</title>
<content type="html">
            &lt;p&gt;Na stronie &lt;a href=&quot;http://railscasts.com&quot;&gt;Railscasts&lt;/a&gt; znajduje się masa screencastów o railsach, trochę irytowało mnie osobne ściąganie plików, sprawdzanie które już mam a których nie, wiec napisałem kawałek kodu. Skrypt pakujemy do katalogu w którym chcemy gromadzić filmiki, odpalamy, dostajemy listę dostępnych na stronie screencastow (pobrane są oznaczane na zielone, niepobrane na czerwono), następnie wpisujemy oddzielone spacjami numery screencastow do pobrania. Może komuś przypadkiem się przyda :)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;#!/usr/bin/ruby
require 'open-uri'
require 'rss/2.0'
 
module RSS
  class Rss
    class Channel
      class Item
        def file_name
          @file_name ||= self.enclosure.url.split(/\//).last
        end
        def file_number
          file_name.split(/_/).first.to_i
        end
        def file_size
          self.enclosure.length.to_f / 1024 / 1024
        end
      end
    end
  end
end
 
rss_content = &quot;&quot;
open(&quot;http://feeds.feedburner.com/railscasts&quot;) do |f|
  rss_content = f.read
end
 
rss = RSS::Parser.parse(rss_content,false)
rss.items.reverse.each do |item|
  if File.exists?(item.file_name)
    printf &quot;\e[32m%s (%.2f MB)\e[0m\n&quot;, item.title, item.file_size
  else
    printf &quot;\e[31m%s (%.2f MB)\e[0m\n&quot;, item.title, item.file_size
  end
end
 
puts &quot;Podaj numery screencastow do pobrania&quot;
numbers = STDIN.gets
 
numbers.split(' ').each do |n|
  item = rss.items.detect{|i| i.file_number == n.to_i}
  unless item.nil? or File.exists?(item.file_name)
    system &quot;wget -c #{item.enclosure.url}&quot; 
  end
end&lt;/code&gt;&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-08-07:7</id>
    <published>2007-08-07T00:20:00Z</published>
    <updated>2009-03-22T01:14:46Z</updated>
    <category term="ruby"/>
    <category term="tuts"/>
    <link href="http://wijet.pl/7/symbole-w-ruby" rel="alternate" type="text/html"/>
    <title>Symbole w Ruby</title>
<summary type="html">&lt;p&gt;W dobrze napisanym kodzie Ruby często możemy spotkać symbole, nic dziwnego &#8211; w wielu miejscach użycie symboli zamiast stringów wpływa pozytywnie na wydajności programu a także należy do dobrego stylu programowania. Na początku przygody z Rubim zrozumienie symboli może sprawić kłopot.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;W dobrze napisanym kodzie Ruby często możemy spotkać symbole, nic dziwnego &#8211; w wielu miejscach użycie symboli zamiast stringów wpływa pozytywnie na wydajności programu a także należy do dobrego stylu programowania. Na początku przygody z Rubim zrozumienie symboli może sprawić kłopot.&lt;/p&gt;
Symbol jest identyfikatorem który odpowiada łańcuchowi znaków, możemy go traktować jako “lżejszą” odmianę stringa. Symbole możemy definiować na kilka sposobów.
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;:foo
:'foo'
:&quot;foo&quot;
&quot;foo&quot;.to_sym
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Symbol posiada zarówno reprezentacje liczbową jak i znakową. Dla nas bardziej znacząca jest reprezentacja znakowa. Faktycznie symbole możemy traktować jako stringi, ale stringi niemodyfikowalne tzn. nie mogą występować po lewej stronie operatora przypisania. Wiec jeśli nie potrzebujemy modyfikować napisu ani używać metod z klasy String, możemy skorzystać z symboli. Kolejnym dobrym zastosowaniem jest użycie symboli w charakterze stałych np: jako przełącznik, tak jak poniżej.&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def read_file(file_name,user_mode)
  case user_mode
    when :nobody
      #....
    when :user
      #....
    when :admin
     #....
  end
end
read_file(&quot;config.txt&quot;,:user)&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Bardzo ważna właściwością symboli jest to, że podczas działania programu takie same symbole są zawsze odwołaniem do jednego obiektu w pamięci, który jest tworzony tylko raz. Przeanalizujmy wyniki działania poniższego skryptu, który wyświetla id utworzonych obiektów.&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;puts &quot;foo&quot;.object_id
puts &quot;foo&quot;.object_id
puts :foo.object_id
puts :foo.object_id&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Wyniki:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;-608242448
-608245628
335378
335378&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Jak widać “foo” i “foo” to tak naprawdę dwa różne obiekty (zajmują różne miejsca w pamięci) natomiast w przypadku symboli :foo i :foo widzimy że id jest takie same, a wiec stosując symbole oszczędzamy pamięć. Dlatego świetnym zastosowaniem dla symboli jest użycie ich jako kluczy w haszu.&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;foo = {:boo =&amp;gt; 12,:bar =&amp;gt; &quot;ble&quot; }&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;odwołanie&lt;br /&gt;
foo[:bar]&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;W tym przypadku zysk w postaci zaoszczędzonej pamięci będzie znikomy, ale warto zauważyć ze jeśli mielibyśmy np. tablice użytkowników typu&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;users = [{:login =&amp;gt; &quot;abc&quot;,:pass =&amp;gt; &quot;qaz&quot;,:email =&amp;gt; :email =&amp;gt; &quot;abc@domain.pl&quot;},
              {:login =&amp;gt; &quot;qwe&quot;,:pass =&amp;gt; &quot;rty&quot;,:email =&amp;gt; :email =&amp;gt; &quot;eee@domain.pl&quot;}
             ]
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;zawierająca 100 użytkowników i zamiast symboli używali stringów jako kluczy. Zamiast 3 obiektów (kluczy) mielibyśmy 300 obiektów, które zwykle nie są nam do niczego potrzebne i tylko pożerają pamięć.&lt;/p&gt;
&lt;p&gt;Jak już pisałem symbole posiadają także reprezentacje liczbową którą możemy otrzymać wywołując metodę to_i.&lt;br /&gt;
Jest ona używana podczas porównywania symboli, tzn. porównywana jest reprezentacja liczbowe czyli liczby. Jeżeli dwa symbole maja taką sama reprezentacje liczbowa to znaczy że są to te same symbole. W przypadku stringów sytuacja wygląda inaczej porównując dwa stringi na pewny poziomie abstrakcji tak naprawdę dochodzi do porównywania znak po znaku, co jest bardziej czasochłonne niż porównywanie dwóch liczb.&lt;/p&gt;
&lt;p&gt;Symbole są powszechnie używane do przekazywania nazw metod i zmiennych, np przy tworzeniu setterów i getterów. W klasie poniżej tworzony jest getter dla zmiennej @foo aby można było odczytać ją z poza obiektu.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Boo
  attr_reader :foo
end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Metoda attr_reader zadziała tak samo jeśli przekażemy nazwę zmiennej jako string, wynika to z jednak z jej implementacji a nie z jakiejś “magi” symboli.&lt;br /&gt;
W następnym przykładzie używamy metody send z klasy Object, uruchamia ona metodę przekazaną jej jako symbol.&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;obj.send(:foo)&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;W obu przykładach ponownie pojawia się pytanie, po co symbole? Gdybyśmy przekazali nazwy atrybutów, metod jako stringi wszystko by działało, w tych przypadkach użycie symboli (oprócz tego że jest bardziej optymalne) jest bardziej naturalne. Nie obchodzi nas tak naprawdę nazwa jako sekwencja znaków,nie interesuje nas treść tylko to co ona symbolizuje(identyfikuje).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-07-11:6</id>
    <published>2007-07-11T00:14:00Z</published>
    <updated>2009-03-22T01:08:47Z</updated>
    <category term="ruby"/>
    <category term="tuts"/>
    <category term="yaml"/>
    <link href="http://wijet.pl/6/postawy-yaml-a-czyli-latwe-serializowanie-i-deserializowanie-obiekt-ow" rel="alternate" type="text/html"/>
    <title>Postawy YAML&#8217;a, czyli &#322;atwe serializowanie i deserializowanie obiekt&#243;w</title>
<summary type="html">&lt;p&gt;&lt;a href=&quot;http://www.yaml.org/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt;&lt;/a&gt; jest prostym językiem służącym do opisu danych. Obiekty są przedstawiane za pomocą czystego tekstu, łatwego do czytania i edycji. &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt; pozwala na składowanie zarówno pojedynczych obiektów jak i różnych zbiorów obiektów. Istnieje wiele implementacje YAML’a m.in. dla &lt;a href=&quot;http://spyc.sourceforge.net/&quot;&gt;php&lt;/a&gt;, &lt;a href=&quot;http://pyyaml.org/&quot;&gt;python&lt;/a&gt;, &lt;a href=&quot;http://yaml4r.sourceforge.net/&quot;&gt;ruby&lt;/a&gt;, pozwala to na przenoszenie danych pomiędzy aplikacjami napisanymi w rożnych językach. Dzięki formatowi plików &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt; nadaje się przede wszystkim do przechowywania konfiguracji, logów a także tworzenia prostych raportów.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;&lt;a href=&quot;http://www.yaml.org/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt;&lt;/a&gt; jest prostym językiem służącym do opisu danych. Obiekty są przedstawiane za pomocą czystego tekstu, łatwego do czytania i edycji. &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt; pozwala na składowanie zarówno pojedynczych obiektów jak i różnych zbiorów obiektów. Istnieje wiele implementacje YAML’a m.in. dla &lt;a href=&quot;http://spyc.sourceforge.net/&quot;&gt;php&lt;/a&gt;, &lt;a href=&quot;http://pyyaml.org/&quot;&gt;python&lt;/a&gt;, &lt;a href=&quot;http://yaml4r.sourceforge.net/&quot;&gt;ruby&lt;/a&gt;, pozwala to na przenoszenie danych pomiędzy aplikacjami napisanymi w rożnych językach. Dzięki formatowi plików &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt; nadaje się przede wszystkim do przechowywania konfiguracji, logów a także tworzenia prostych raportów.&lt;/p&gt;
&lt;p&gt;Obsługa YAML’a jest banalnie prosta i w zasadzie ogranicza się do wczytania lub zapisania danych.&lt;br /&gt;
Zapisujemy zawartość zmiennej config do pliku.&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'yaml'
config = {
 :max_users=&amp;gt;200,
 :db=&amp;gt;
    {:host=&amp;gt;&quot;localhost&quot;,
      :user_name=&amp;gt;&quot;shop&quot;,
      :db_name=&amp;gt;&quot;shop&quot;,
      :password=&amp;gt;&quot;shop123&quot;
    },
 :timeout=&amp;gt;10
}
 
File.open(&quot;config.yaml&quot;,&quot;w&quot;) { |file| YAML.dump(config,file) }&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Dane można konwertować to formatu &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt; również za pomocą metody to_yaml, która po załadowaniu biblioteki yaml jest dodawana do obiektów w programie.&lt;br /&gt;
Plik config.yaml:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;---
:max_users: 200
:db:
    :host: localhost
    :user_name: shop
    :db_name: shop
    :password: shop123
:timeout: 10&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Jak widać format pliku jest bardzo czytelny i łatwy do edycji. Wczytywanie danych z pliku również jest proste.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'yaml'
config = YAML.load_file(&quot;config.yaml&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Warto wspomnieć że za pomocą YAML’a możemy zachować dane z dowolnego obiektu, a gdy zajdzie taka potrzeba zainicjować obiekt tymi danymi.&lt;/p&gt;
&lt;p&gt;Kawałek przykładu:&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'yaml'
class Student
  def initialize(id,name,last_name)
    @id, @name, @last_name = id, name,last_name
    @marks = {}
  end
  def add_mark(subject,mark)
    @marks[subject] = mark
  end
end
 
o1 = Student.new(32124,&quot;Tomek&quot;,&quot;Kowalski&quot;)
o1.add_mark(&quot;Matematyka&quot;,3)
o1.add_mark(&quot;Fizyka&quot;,4)
o1.add_mark(&quot;Biologia&quot;,5)
#zachowujemy zawartość obiektu
File.open(&quot;student.yaml&quot;,&quot;w&quot;) { |file| file.write(o1.to_yaml) }
#tworzymy nowy obiekt inicjalizując go zachowanymi danymi
o2 = YAML.load_file(&quot;student.yaml&quot;)&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-06-27:5</id>
    <published>2007-06-27T20:24:00Z</published>
    <updated>2009-03-22T01:06:42Z</updated>
    <category term="gems"/>
    <category term="ruby"/>
    <category term="tips"/>
    <link href="http://wijet.pl/5/wlasne-gemy-jak-instalowa-c-gemy-bez-laski-root-a" rel="alternate" type="text/html"/>
    <title>W&#322;asne gemy - jak instalowa&#263; gemy bez &#322;aski root&#8217;a</title>
<content type="html">
            &lt;p&gt;Najlepszym sposobem używania bibliotek ruby są gemy, bardzo prosta instalacja aktualizacja, rubygems także rozwiązuje problem zależności miedzy bibliotekami. Standardowo tylko administrator może dokonywać operacji na gemach. Możemy tak skonfigurować rubygems by korzystać z tych zainstalowanych już w systemie, a także instalować własne.&lt;/p&gt;
&lt;p&gt;Tworzymy katalog dla gemów, następnie sprawdzamy gdzie w systemie są instalowane gemy domyślnie.&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;gem environment&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Spisujemy ścieżki pod &lt;span class=&quot;caps&quot;&gt;GEM&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt;. Tworzymy w katalogu domowym plik .gemrc do którego pakujemy te ścieżki plus ścieżkę w której chcemy instalować własne gemy, plik będzie wyglądać mniej więcej tak:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;gempath:
 - /usr/lib/ruby/gems/1.8
 - /home/wijet/gems&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Istotny jest format pliku, ponieważ jest interpretowany jako plik &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Już możemy instalować własne gemy:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;gem install rails -i /home/wijet/gems&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Bardzo często wychodzą nowe wersje gemów, możemy hurtem przeprowadzać update gemów bez zawracania głowy adminowi.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem update -i /home/wijet/gems&lt;/code&gt;&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-05-03:22</id>
    <published>2007-05-03T19:11:00Z</published>
    <updated>2009-03-22T01:05:49Z</updated>
    <category term="markaby"/>
    <category term="ruby"/>
    <category term="tuts"/>
    <link href="http://wijet.pl/22/markaby-pisz-w-ruby-wy-wietlaj-html" rel="alternate" type="text/html"/>
    <title>Markaby - pisz w Ruby, wy&#347;wietlaj html</title>
<summary type="html">&lt;p&gt;Pisząc mój serwer http w rubym, chciałem skorzystać z jakiegoś systemu szablonów, wybrałem ERB który jest chyba najprostszy i był najbliżej, bo w standardowej bibliotece języka. Pliki templatow ERB to wymieszany HTML z kodem ruby umieszczonym miedzy znacznikami, który następnie jest wykonywany. Taki format templatow jest średnio czytelny.
Przeglądając kod micro frameworka Camping’a natknąłem się na &quot;Markaby&quot;:http://code.whytheluckystiff.net/markaby/ (Markup as Ruby), czyli szablony w czystym ruby!. &lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Pisząc mój serwer http w rubym, chciałem skorzystać z jakiegoś systemu szablonów, wybrałem ERB który jest chyba najprostszy i był najbliżej, bo w standardowej bibliotece języka. Pliki templatow ERB to wymieszany HTML z kodem ruby umieszczonym miedzy znacznikami, który następnie jest wykonywany. Taki format templatow jest średnio czytelny.
Przeglądając kod micro frameworka Camping’a natknąłem się na &quot;Markaby&quot;:http://code.whytheluckystiff.net/markaby/ (Markup as Ruby), czyli szablony w czystym ruby!. &lt;/p&gt;
&lt;p&gt;Przyjrzałem się trochę możliwością Markaby i stwierdziłem to jest to czego potrzebuje, jak rozwiniecie nazwy wskazuje markaby pozwala nam pisać szablony w czystym ruby, po przetworzeniu otrzymujemy gotowy do wyświetlenia kod HTML. Jest doskonała alternatywa dla ERB i innych systemów szablonów opartych na znacznikach i jakiejś nowej składni, można go używać w railsach. Co więcej Markaby tworzy kod zgodny z XHTML 1.0 Strict lub Transitional, potrafi wyłapywać nasze niektóre pomyki, a także znaczniki które są niedozwolone w danym standardzie.&lt;/p&gt;

&lt;p&gt;Markaby jest dostępne w postaci gemu i paczki tgz  &quot;http://rubyforge.org/projects/markaby&quot;:http://rubyforge.org/projects/markaby. Instalowanie czegokolwiek za pomocą rubygems jest banalnie proste wiec tak zrobimy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install markaby -y&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cała praca z Markaby to tak naprawdę wywoływanie metod(tu małe kłamstwo) i przekazywanie im bloków kodu. Nazwy metod które wywołujemy to nazwy tagów HTML. Przejdźmy do przykładu by zobaczyć jak to wygląda.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'markaby'
output = Markaby::Builder.new(:indent=&gt;1) do
  html do
    head { title &quot;To jest jakis tytul&quot; }
    body { &quot;Jakis napis w ciele dokumentu&quot; }
  end
end
puts output.to_s&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta content=&amp;quot;text/html; charset=utf-8&amp;quot; http-equiv=&amp;quot;Content-Type&amp;quot;/&amp;gt;
    &amp;lt;title&amp;gt;To jest jakis tytul&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    Jakis napis w ciele dokumentu    
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Parametr :indent określa o ile spacji będzie wcinany każdy blok kodu wynikowego. Domyślnie ma on wartość zero, która powoduje ze otrzymamy kod html w jednej linii.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;xhtml_strict do
    head { title &quot;Strona numer 2&quot; }
    body do
      h1 &quot;Naglowek strony numer 2&quot;
      div do
        p &quot;Pierwszy akapit&quot;
        strong &quot;tu pogrubione&quot;
        div { blockquote &quot;a tu kawalek cytatu w div'e&quot; }
      end
    end
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;meta content=&amp;quot;text/html; charset=utf-8&amp;quot; http-equiv=&amp;quot;Content-Type&amp;quot; /&amp;gt;
&amp;lt;h1&amp;gt;Naglowek strony numer 2&amp;lt;/h1&amp;gt;
&amp;lt;div&amp;gt;
  &amp;lt;p&amp;gt;Pierwszy akapit&amp;lt;/p&amp;gt;
  &amp;lt;strong&amp;gt;tu pogrubione&amp;lt;/strong&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;blockquote&amp;gt;a tu kawalek cytatu w div'e&amp;lt;/blockquote&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jak widać aby zagnieżdżając coś pomiędzy tagami html wystarczy przekazać to jako blok kodu. Jest bardzo intuicyjne, robimy to tak samo jak w przypadku zwykłego kodu html. Możemy także manipulować parametrami tagów, umieszczając odpowiedni parament w postaci symbolu po argumencie metody będącym zawartością tagu, jeśli ten argument jest podany.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;a &quot;Ruby!&quot;,:href=&gt;&quot;http://ruby-lang.org&quot;
p &quot;To bedzie na zielono&quot;,:style=&gt;&quot;color:green&quot;
div :style=&gt;&quot;color:red;font-weight:bolder&quot; do
  &quot;Tu cos w div'ie&quot;
end&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&amp;quot;http://ruby-lang.org&amp;quot;&amp;gt;Ruby!&amp;lt;/a&amp;gt;
&amp;lt;p style=&amp;quot;color: green&amp;quot;&amp;gt;To bedzie na zielono&amp;lt;/p&amp;gt;
&amp;lt;div style=&amp;quot;color: red; font-weight: bolder&amp;quot;&amp;gt;Tu cos w div'ie&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Gdy używamy stylów css przydaje się aby elementy naszej strony należały do jakiejś klasy i/albo posiadały jakiś identyfikator, markaby łatwo pozwala je nadawać, spójrzmy na przykład.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;div.spis! do
  ul do
    [&quot;abc&quot;,&quot;123&quot;,&quot;a2c&quot;].each do |var|
      li.wartosci var
    end
  end
end
p.zielony { &quot;Tu powinno byc zielono&quot; }&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&amp;quot;spis&amp;quot;&amp;gt;
  &amp;lt;ul&amp;gt;
    &amp;lt;li class=&amp;quot;wartosci&amp;quot;&amp;gt;abc&amp;lt;/li&amp;gt;
    &amp;lt;li class=&amp;quot;wartosci&amp;quot;&amp;gt;123&amp;lt;/li&amp;gt;
    &amp;lt;li class=&amp;quot;wartosci&amp;quot;&amp;gt;a2c&amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;p class=&amp;quot;zielony&amp;quot;&amp;gt;Tu powinno byc zielono&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jak widać kod szablonu jest bardzo przejrzysty, łatwy do czytania i interpretacji (w końcu to ruby!).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-04-28:4</id>
    <published>2007-04-28T15:21:00Z</published>
    <updated>2009-03-22T00:23:33Z</updated>
    <category term="algorytmy"/>
    <category term="fun"/>
    <category term="ruby"/>
    <link href="http://wijet.pl/4/sortowanie-prawie-optymalne" rel="alternate" type="text/html"/>
    <title>Sortowanie prawie optymalne</title>
<summary type="html">&lt;p&gt;Temat sortowania aktualny ponieważ na zajęciach z algorytmów i struktur danych omawiamy właśnie sposoby sortowania. Dowiedziałem sie jakoś,czy ktoś mi powiedział, czy usłyszałem gdzieś o głupim sortowaniu, jako przykład chyba najbardziej nieefektywnego sposobu sortowania. Z ciekawości poszukałem i napisałem trochę kodu.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Temat sortowania aktualny ponieważ na zajęciach z algorytmów i struktur danych omawiamy właśnie sposoby sortowania. Dowiedziałem sie jakoś,czy ktoś mi powiedział, czy usłyszałem gdzieś o głupim sortowaniu, jako przykład chyba najbardziej nieefektywnego sposobu sortowania. Z ciekawości poszukałem i napisałem trochę kodu.&lt;/p&gt;
&lt;p&gt;Znalazłem trochę informacji w sieci, pierwszy sposób to Bogosort, algorytm bardzo prosty można przedstawić na przykładzie sortowania tali kart&lt;br /&gt;
tasujemy karty sprawdzamy czy są posortowane jeśli nie tasujemy jeszcze raz i tak aż do momentu kiedy talia będzie posortowana. Pesymistyczna złożoności obliczeniowa to O(n*n!), korzystamy z losowych permutacji zbioru co powoduje ze możemy nigdy nie otrzymać posortowanego zbioru. W najlepszym przypadku możemy otrzymać posortowany zbiór po jednym losowaniu permutacji zbioru.&lt;/p&gt;
&lt;p&gt;Podobnym algorytmem sortowania do Bogosort jest Bozo sort, także opiera się na losowych permutacjach zbioru. Sprawdzamy czy zbiór jest posortowana jeśli nie wybieramy dwa losowe elementy zbioru i zamieniamy ze sobą i znowu sprawdzamy czy zbiór jest posortowany.&lt;br /&gt;
Oba algorytmy są wysoce nieefektywne, i raczej nie przydadzą sie w jakich kolwiek zastosowaniach. W wolnej chwili w ramach ćwiczenia rubiego napisałem kawałeczek kodu realizującego te dwa algorytmy.&lt;br /&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Array
  def bogosort!
    shake until is_sorted?
    self
  end
 
  def bozosort!
    until is_sorted?
      a = rand(size-1)
      b = rand(size-1)
      self[a], self[b] = self[b], self[a]
    end
    self
  end
 
  def is_sorted?
    for i in 0..size-2
      if self[i] &amp;gt; self[i+1]
        return false
      end
    end
    true
  end
 
  def shake
    for i in 0..size-1
      a = rand(size-1)
      self[i], self[a] = self[a], self[i]
    end
    self
  end
 
end&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://wijet.pl/">
    <author>
      <name>wijet</name>
    </author>
    <id>tag:wijet.pl,2007-04-05:2</id>
    <published>2007-04-05T14:58:00Z</published>
    <updated>2009-03-04T20:06:13Z</updated>
    <category term="webdesign"/>
    <category term="znalezione"/>
    <link href="http://wijet.pl/2/dobierz-sobie-kolor" rel="alternate" type="text/html"/>
    <title>Dobierz sobie kolor</title>
<content type="html">
            &lt;p&gt;
&lt;div&gt;
Ostatnio przeglądając  &lt;a href=&quot;http://forum.php.pl&quot;&gt;forum.php.pl&lt;/a&gt; przypadkowo znalazłem bardzo przydatna stronkę &lt;a href=&quot;http://colorblender.com/&quot;&gt; ColorBlender &lt;/a&gt;. Jestem totalny antytalenciem jeśli chodzi o grafikę i dobieranie kolorów, a tu mieszając suwakami mam 6 dobranych do siebie kolorów, pewnie nie jest to idealne dobranie barw, ale jest na pewno lepsze niż zdał bym się na własny gust.&lt;/div&gt;&lt;/p&gt;
          </content>  </entry>
</feed>
