Greita prieiga prie Rails projektų

Viena iš pagrindinių, o gal ir pagrindinė priežastis, kodėl prieš kelis metus pasirinkau Ruby on Rails yra produktyvumas ir paprastumas. Ir jeigu pačiame Rails’e jų pakanka, tai dirbant su keliais projektais vienu metu (that’s life =)) pastebėjau, kad menko pakeitimo padarymas (o veikiau pasiruošimas tam padarymui) užima labai daug laiko. Susimasčiau ar nieko su tuo negalima padaryti – pasirodo galimą, ir atsakymas yra ganėtinai paprastas: batch files =D.

Reikia sukurti bylą server.bat su šiuo turiniu

[code]

@echo off
rem Launches server for specified Ruby on Rails project
rem Usage: server [project_name]

set projects_path=d:work
set project_name=%1
set port=80

if not exist %projects_path%. goto wrong_projects_path
if not exist %projects_path%%project_name%. goto wrong_project_name
chdir /d %projects_path%%project_name%
ruby %projects_path%%project_name%scriptserver -p %port%
goto end

:wrong_projects_path
echo Wrong projects path. Check projects_path variable in this batch file
pause
goto end

:wrong_project_name
echo Wrong project name. Please specify the directory for you Ruby on Rails application
pause
goto end

:end

[/code]

ir išsaugoti kur nors, kur windows’as galėtu ją pasiekti (pvz. windows direktorijoje). Tada projekto paleidimas atrodo taip: paspaudžiame Win+R (t.y. Start -> Run) ir įrašome server [project_name] (akivaizdu, jog project_name yra projekto pavadinimas).

Kitas dalykas, kurio dažnai prireikia yra konsolės paleidimas tam tikram projektui. Vėlgi sukuriame analogišką batch bylą pavadintą console.bat

[code]

@echo off
rem Launches console for specified Ruby on Rails project
rem Usage: console [project_name]

set projects_path=d:work
set project_name=%1
set port=80

if not exist %projects_path%. goto wrong_projects_path
if not exist %projects_path%%project_name%. goto wrong_project_name
chdir /d %projects_path%%project_name%
ruby %projects_path%%project_name%scriptconsole
goto end

:wrong_projects_path
echo Wrong projects path. Check projects_path variable in this batch file
pause
goto end

:wrong_project_name
echo Wrong project name. Please specify the directory for you Ruby on Rails application
pause
goto end

:end

[/code]

Paleidimas yra analogiškas: console [project_name].

Ir, galiausiai, dažnai tenka pasinaudoti projekto generatoriais arba migration’ais. Tam skirtas project.bat

[code]

@echo off
rem Launches console for specified Ruby on Rails project
rem Usage: console [project_name]

set projects_path=d:work
set project_name=%1
set port=80

if not exist %projects_path%. goto wrong_projects_path
if not exist %projects_path%%project_name%. goto wrong_project_name
chdir /d %projects_path%%project_name%
start cmd.exe
goto end

:wrong_projects_path
echo Wrong projects path. Check projects_path variable in this batch file
pause
goto end

:wrong_project_name
echo Wrong project name. Please specify the directory for you Ruby on Rails application
pause
goto end

:end

[/code]

Dirbti tokioje aplinkoje (ypač jei dirbama su daug projektu) ir efektyvu ir malonu.

Lietuvos blogerių konferencija 2007

Vakar teko dalyvauti Lietuvos blogerių konferencijoje 2007. Mano įspūdžiai:

Konferencija vyko 31-ajame verslo centro „Europa“ aukšte (maloni salė, su gražiais vaizdais į Vilnių (buvo graži, saulėta diena)), vienoje “Europos” kavinių (restoranų) buvo užsakyti pietus, visiems dalyviams buvo išdalintos “firminės” tašės su “kuo rašyti”, “ant ko rašyti” ir žinoma reklaminiais lankstinukais, aktyviausiam dalyviui atiteko Nokia n70.

Iš vienos pusės – nebloga pramoga šimtui žmonių (nes susirinko +- tiek blogerių) kurie nieko ne mokėjo už įėjimą, iš kitos pusės Omnitelis už kokius 5-7 tūkstančius (mano subjektyviais skaičiavimais) gavo 100, vienaip ar kitaip susijusiu su naujausiu jo produktu moblog’u, bei šiokias tokias PR ambicijas turinčių, žmonių dėmesį. Iš šitos pusės žiūrint: ir vilkas sotus ir avys gyvos. Bravo organizatoriams.

Panešėjai:

  • pirmas pranešėjas – wow, aš čia su 100 blogerių viename kambaryje ir kažkas su mikrofonu lietuviškai kažką kalba apie blogus ir interneto ateitį;
  • antras pranešėjas – ir dar kažkas kalba lietuviškai apie blogus ir interneto ateitį;
  • trečias pranešėjas – blogai, interneto ateitis…

Nors konferencijos galo nesulaukiau, perklausius 3/4 pranešėjų susidarė įspūdis, kad jie neturėjo ką pasakyti: kas kalbėjo apie bendras interneto tendencijas, kas nuvalkiotas tiesas apie tai, koks turi būti sėkmingas blogas, kas, labiau ar mažiau vykusiai, pristatinėjo savo produktus. Tačiau įdomesnės, asmeniškesnės temos nebuvo paliestos ir konferencija gavosi “sausoka”.

Dalyviai:

pasijutau kaip 12 klasės kengūros suvažiavime =) Daug jaunimo inteligentiškais veidais su nešiojamais kompiuteriais ant kelių (į kuriuos būtinai reikėjo live rašyti postą apie konferencijos eigą =)) Jei rimtai tai, sutinku su vienu iš pranešėjų nuomone, kad trūko vyresnių, brandesnių blogerių.

Galiausiai, jei ne teisti šios konferencijos pernelyg griežtai ir pasižiūrėti į ją kaip į “pirmą blyną”, manau, kad ji buvo ganėtinai vykusi. Vienoje vietoje surinkti virš 100 žmonių, pakviesti svečius iš Lenkijos bei Estijos, sklandžiai pravesti seminarą, pietus ir (beveik) neatsilikti nuo grafiko nėra labai lengva. Daugiausiai vilčių palieka šilti žmogiški santykiai tiek tarp konferencijos dalyvių tiek organizatorių (pvz. aš į konferenciją patekau be registracijos (per vėlai apie ją sužinojau) ir užteko mano garbės žodžio, jog esu ruby.lt autorius).

Lynda.com – Ruby on Rails Essential Training

Ruby on Rails (essential training)Šiomis dienomis peržiūrėjau Ruby on Rails Essential Training is lynda.com.

Medžiaga susideda iš 17 dalių pateiktu 2 CD. Pradedant nuo 3 dalies prie kiekvieno filmuko yra prikabinta Rails aplikacija, tokia, kokia ji yra filmuko pradžioje ir rekomenduojama visus veiksmus atlikti kartu su autoriumi.

Pirmoje dalyje pasakojama apie Ruby on Rails, DRY, conventions bei MVC architektūrą, kas man asmeniškai buvo visai įdomu.

Antrą dalį – Ruby on Rails instaliaciją sėkmingai praleidau.

Trečioje, ketvirtoje, penktoje bei šeštoje dalyje iš pagrindų pasakojama apie tai kaip Rails’as veikia, aiškinami tokie dalykai kaip view, controllers, file structure, CRUD, routes, (private, public) actions ir panašiai. Šios dalys žiūrėjosi ganėtinai įdomiai, nes nors dirbu su Rails’u kiekviena diena, dažnai tiesiog nesusimastau kodėl tas veikia vienaip ar kitaip, tad išgirsti trumpa lakonišką paaiškinimą buvo ne pro šalį.

Septintoje dalyje pristatoma Ruby programavimo kalba. Šiuo atžvilgiu, manau geriau tiesiog apsilankyti try ruby! puslapyje.

Aštunta dalis – troubleshooting nieko naujo nepasakė: write comments, look for the errors in logs ir break problems into pieces.

Devinta dalis – Models patiko labiausiai. Mes, mašinistai , esame pripratę (ir ne be pagrindo), kad Rails’e modelis – tai duombazės lentelės objektinis atvaizdavimas. O čia autorius nusprendžia eiti kitu keliu ir parodyti kaip veikia modelis be duomenų bazės. Paaiškinamos models, attributes, instances, netgi inheritance sąvokos. Be to ši dalis yra svarbi tuo, kad ją pažiūrėjus net ir didžiausias ignorantas turėtu suvokti MVC.

Dešimta dalis – vėlgi interesting approach. Žingsnis po žingsnio pasakojama apie ActiveRecord parašant SQL kodą, panaudojant ActiveRecord, parašant SQL kodą, panaudojant ActiveRecord… Ši dalis turėtu ypač patikti PHP’ninkams .

Vienuolikta – penkiolikta dalys pasakoja apie muzikos krautuvėlės suprogramavimą. Ir čia laukė didžiausias nusivilimas. Visą laiką tikėjausi, kad autorius tik tik įsibėgėja ir pagaliau “Building Application” skyriuje parodys ką sugeba, o šis skyrius pasirodė tiesiog perrašymu (su nedideliais skirtumais) is Agile Web Development with Rails. Labai bandžiau išgirsti bent kažką originalaus – deja. Be to dirbama buvo su versija 1.16, kurioje (jei man nemeluoja atmintis) tokie dalykai kaip start_form_tag jau buvo deprecated, o pavyzdžiuose pateikiami būtent jie. Tad prieš rasant production code remiantis šia medžiaga reikėtu dar dėl viso pikto užsukti i api.rubyonrails.com.

Bent dalinai išgelbeti padėti dar galejo šešiolikta dalis – Deploying. Visgi tiek yra įdomybiu su production environment, caching, Mongrel, Capistrano. Deja nieko iš to pasakyta nebuvo.

Susumuojant viską mano verdiktas butu toks: jei dar neteko dirbti su Rails, o knygos skaityti nesinori (tačiau ankščiau ar vėliau vis vien teks ) tada Ruby on Rails Essential Training yra geras pasirinkimas. Iš kitos pusės, jei jau teko parašyti vieną kitą Rails aplikaciją, geriau praleisti savaitgalį prie Ruby for Rails arba Rubyisms in Rails.

Upto, downto

Jau gan ilgą laiką dirbu su Ruby, o jis vis dar nenustoja stebinti.

Dirbant su Rails’u (ypač kuriant template’us) dažnai tenka įdėti besikartojančius dummy elementus (pvz. naujienos, meniu punktai ir pan.). Pats neefektyviausias būdas yra žinoma copy-paste. Kurį laiką naudojau kažką tokio:

[code]
< % (1..5).each do |i| %>
Dummy text
< % end %>
[/code]

ir jaučiausi kietas hakeris 😉

Tačiau kažkur giliai viduje žinojau, kad kintamasis “i” čia yra nereikalingas, jutau kad aš atvedžiau jį į gyvenimą, kuriame jam nėra skirta nieko nuveikti, visą laiką kol bus rašomas “Dummy text” gyventi su nepilnavertiškumo kompleksu ir galiausiai išnykti taip ir nepalikus jokio pėdsako šiame pasaulyje.

Tvirtai nusprendžiau daugiau nežaloti nekaltų sielų (nors ir skaitmeninių, gyvenančių vos kelias akimirkas) ir surasti būda kaip galėčiau apsieiti be jų. Ir toks būdas yra!

[code]
< % 1.upto 5 do %>
Dummy text
< % end %>
[/code]

Update: kaip ir buvo pažymėta komentaruose dar gėriau naudoti “times” (kas beje parašyta pačioje Agile Web Development with Ruby on Rails pradžioje =))
[code]
< % 5.times do %>
Dummy text
< % end %>
[/code]

Gera yra žinoti, kad pakeitei kažkam gyvenimą 😉

Great hackers

Šiandien internete aptikau Paul’o Graham’o audio įrašą apie tai kaip surasti, motyvuoti bei išlaikyti neeilinius programuotojus. Šis mp3 tikrai vertas dėmesio. Ar ne vertas? =)

Rašykite savo nuomonę komentaruose.

Getting real

Prieš kurį laiką 37 signals išleido knygutę kurioje aprašomi principai kaip kurti mažesnį, greitesnį, geresnį programinį produktą.

Dabar galima ją nemokamai pasiskaityti internete šiuo adresu: getting real .

Malonaus skaitymo, bei siūlau pasidalinti savo mintimis (jei tokių iškils) komentaruose.

Reikalingas IT administratorius

Faberlic Baltija SIA – tarptautinė įmonė, užsiimanti prekyba kosmetikos priemonėmis ieško IT administratoriaus.

Darbo pobūdis: programinės įrangos bei geležies priežiūra, iškilusių problemų šalinimas. Be to įmonėje veikia Ruby on Rails pagrindu sukurtas extranetas – reikėtu sugebėti jį perimti ar bent jau mokėti palaikyti.

Kontaktiniai duomenys: tel. 2133203 , f.info@lt.faberlic.com

P.S. Veiksmo vieta – Vilnius.

Dinamiškas thumbnail ‘o generavimas

Vakar vienam iš vystomų projektų reikėjo sukurti foto galerijos funkcionalumą. Nieko ypatingo: tiesiog “thumbnail’ai”, kuriuos paspaudus iššoka naujas langas su originalaus dydžio nuotrauka. Kiek panaršius internete sukūriau testinį variantą, kuris rašė dvi bylas: originalą bei thumbnail’ą, tačiau kiek pamąsčius nusprendžiau, jog to paties paveikslo (nors ir skirtingo dydžio) saugojimas bei juo manipuliavimas neatitinka DRY principų =) Tad beliko tik parašyti kodą, kuris dinamiškai formuotu thumbnailą.

Veikimo principas: žemiau pateiktas kodas keliauja į application.rb, ir išbandyti jį galima taip: [jūsų controllerio pavadinimas] / img?src=rails.png

Update: dado1945 prašymu pateikiu sprendimą su thumbnail’ų kešavimų =) (Daugiau apie http kešavimą)
Update2: ištaisiau tikrai kvailą klaidą kai paveiksliukas nekeitė dydžio dėl vienodų matmenų =)
Update3: Rimanto dėka calc_size funkcijos kodas tapo daug gražesnis. Ačiū.
Tikiuosi kažkam padės sutaupyti laiko =)
[ruby]
BASE_SIZE = 200.0

def calc_size(width, height)
ratio = [width, height].max / BASE_SIZE
[width, height].map { |s| s.div ratio }
end

def img
require ‘RMagick’

file = “public/images/#{params[:src]}”
if file and File.exists?(file)

req_last_modified = Time.rfc2822(@request.env[“HTTP_IF_MODIFIED_SINCE”]) rescue nil
last_modified = File.mtime(file)

@response.headers[‘Last-Modified’] = last_modified.rfc2822
if req_last_modified and last_modified < = req_last_modified render_text '', '304 Not Modified' else image = Magick::Image.read(file)[0] width, height = calc_size(image.columns, image.rows) image.resize!(width, height) send_data(image.to_blob, :disposition => ‘inline’, :type => image.mime_type, :filename => file)
end
else
render_text “Image not found!”
end
end
[/ruby]