El framework CakephpherotycA presentation on CakePHP, a few explanation about how it works and an example, written in Catalan.
Una presentació sobre CakePHP, breu explicació sobre les funcionalitats i un petit exemple, en català.
Per Josep Llodrà Grimalt.
http://herotyc.com
Itineraris IT Academy (2020)Barcelona ActivaIT Academy s'adreça a totes aquelles persones que volen reconvertir-se o trobar feina en el món TIC, un dels sectors amb més projecció i millor remunerats. Per això s'han dissenyat dues tipologies de formació presencial per adaptar-se millor a les necessitats i objectius de les possibles participants.
Migració al programari lliure: reptes i oportunitatsIsmael FanloPresentación utilizada para mi ponencia en las "Jornadas Open Source per a Pimes" organizadas por la Fundación IBIT en la Cámara de Comercio de Palma (Baleares - España). En catalán
Comparativa ERPs de programari lliureejordiComparativa ERPs de programari lliure: Abanq, OpenBravo, OpenERP.
Treball de l'assignatura Gestió de Sistemes d'Informació (GESI) de la Universitat Politècnica de Catalunya (UPC). Professor: Jordi Esteve. Gener 2009. Vilanova i la Geltrú. Barcelona. Catalunya.
Cas d’us de Framework web desenvolupat amb llibreries LliuresJordi CatàEl desenvolupament d’aplicacions web està sofrint una evolució constant, actualment apareixen multitut de frameworks de desenvolupament àgil. En aquesta xerrada esposarem el funcionament d’un framework web desenvolupat amb llibreries i components lliures, orientat a arquitectura Model Vista Controlador. El desenvolupament s’ha realitzat utilitzant les llibreries Pear::Dataobject (abstracció de la base de dades), Smarty (aïllament de PHP i HTML).
Local ExploitsCarles MateuThe document discusses computer memory layout and calling conventions. It explains that programs are stored in segments like text, data, bss, heap and stack. The stack grows downward while the heap grows upward. When a function is called, parameters are pushed onto the stack and the instruction pointer is saved. The function then saves the base pointer and allocates space for local variables below it on the stack. A buffer overflow occurs when a program writes more data to a buffer than it was allocated to hold. Shellcode is program code designed to be injected and executed from the stack.
Itineraris IT Academy (2020)Barcelona ActivaIT Academy s'adreça a totes aquelles persones que volen reconvertir-se o trobar feina en el món TIC, un dels sectors amb més projecció i millor remunerats. Per això s'han dissenyat dues tipologies de formació presencial per adaptar-se millor a les necessitats i objectius de les possibles participants.
Migració al programari lliure: reptes i oportunitatsIsmael FanloPresentación utilizada para mi ponencia en las "Jornadas Open Source per a Pimes" organizadas por la Fundación IBIT en la Cámara de Comercio de Palma (Baleares - España). En catalán
Comparativa ERPs de programari lliureejordiComparativa ERPs de programari lliure: Abanq, OpenBravo, OpenERP.
Treball de l'assignatura Gestió de Sistemes d'Informació (GESI) de la Universitat Politècnica de Catalunya (UPC). Professor: Jordi Esteve. Gener 2009. Vilanova i la Geltrú. Barcelona. Catalunya.
Cas d’us de Framework web desenvolupat amb llibreries LliuresJordi CatàEl desenvolupament d’aplicacions web està sofrint una evolució constant, actualment apareixen multitut de frameworks de desenvolupament àgil. En aquesta xerrada esposarem el funcionament d’un framework web desenvolupat amb llibreries i components lliures, orientat a arquitectura Model Vista Controlador. El desenvolupament s’ha realitzat utilitzant les llibreries Pear::Dataobject (abstracció de la base de dades), Smarty (aïllament de PHP i HTML).
Local ExploitsCarles MateuThe document discusses computer memory layout and calling conventions. It explains that programs are stored in segments like text, data, bss, heap and stack. The stack grows downward while the heap grows upward. When a function is called, parameters are pushed onto the stack and the instruction pointer is saved. The function then saves the base pointer and allocates space for local variables below it on the stack. A buffer overflow occurs when a program writes more data to a buffer than it was allocated to hold. Shellcode is program code designed to be injected and executed from the stack.
1. DAI: Módul 9 Ruby on Rails Xavier Noguero Carles Mateu http://carlesm.com Ciències de la Computació i Intel·ligència Artificial Universitat de Lleida
2. Ruby on Rails, què és? Ruby és un llenguatge de programació. Rails és un “framework” modern que fa molt fàcil el desenvolupament i manteniment d'aplicacions web. Molt escollit per crear aplicacions Web 2.0!!
3. Ruby on Rails, perquè? Java? PHP? .NET? Molta feina per a desenvolupar...
4. Rails, és fàcil! Tècniques modernes i professionals. Un exemple: Patró Model-Vista-Controlador En Java: Struts, Tapestry...
5. Amb Ruby i Rails: L'esquelet de ó es crea automàticament.
6. Només ens cal crear el codi just de la lògica de negoci.
12. irb, un shell interactiu de Ruby És intérpret de comandes que es pot utilitzar per a testejar codi ràpidament:
13. rdoc, per a fer documentació És l'eina que ens permet generar la documentació del codi que escrivim: Es pot especificar de quin o quins fitxers volem que es generi la documentació.
15. RubyGems És l'eina per a gestionar el sistema de paquets de Ruby: Un format estàndard per a distribuir programes i llibreries Ruby.
16. Gestiona la instalació de paquets gem (de manera similar com ara yum o apt-get per a distros linux).
17. Rails is Agile L'any 2001, 17 crítics dels models de desenvolupament de programari, van signar l'Agile Manifesto. http://agilemanifesto.org/ Aquest, defineix nous mètodes de desenvolupament de programari com una alternativa a les metodologies formals existents, considerades massa “pesades” i rígides pel seu caràcter normatiu i la seva alta dependència en les planificacions prèvies a l'etapa de desenvolupament.
95. email: Adreça de mail script/generate scaffold critic nom:string email:string rake db:migrate
96. Com funciona? app/ controllers/ restaurants_controller.rb models/ restaurant.rb views/ restaurants/ show.html.erb Segueix REST http://localhost:3000/restaurants/1 Controlador RestaurantsController Vista show Model Restaurant
97. La primera aplicació Els recursos que farem accessibles per REST declarats a config/routes.rb:
100. Les rutes que queden aleshores (rake routes): critics GET /critics(.:format) {:action=>"index", :controller=>"critics"} POST /critics(.:format) {:action=>"create", :controller=>"critics"} new_critic GET /critics/new(.:format) {:action=>"new", :controller=>"critics"} edit_critic GET /critics/:id/edit(.:format) {:action=>"edit", :controller=>"critics"} critic GET /critics/:id(.:format) {:action=>"show", :controller=>"critics"} PUT /critics/:id(.:format) {:action=>"update", :controller=>"critics"} DELETE /critics/:id(.:format) {:action=>"destroy", :controller=>"critics"} restaurants GET /restaurants(.:format) {:action=>"index", :controller=>"restaurants"} POST /restaurants(.:format) {:action=>"create", :controller=>"restaurants"} new_restaurant GET /restaurants/new(.:format) {:action=>"new", :controller=>"restaurants"} edit_restaurant GET /restaurants/:id/edit(.:format) {:action=>"edit", :controller=>"restaurants"} restaurant GET /restaurants/:id(.:format) {:action=>"show", :controller=>"restaurants"} PUT /restaurants/:id(.:format) {:action=>"update", :controller=>"restaurants"} DELETE /restaurants/:id(.:format) {:action=>"destroy", :controller=>"restaurants"} /:controller/:action/:id /:controller/:action/:id(.:format)
101. La primera aplicació Això provoca crides al Controller (app/controllers/restaurants_controller.rb): class RestaurantsController < ApplicationController # GET /restaurants # GET /restaurants.xml def index @restaurants = Restaurant.all respond_to do |format| format.html # index.html.erb format.xml { render :xml => @restaurants } end end # GET /restaurants/1 # GET /restaurants/1.xml def show @restaurant = Restaurant.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @restaurant } end end [....deletia....] end
103. i la db:migrate (db/migrate/....create_restaurants.rb): class Restaurant < ActiveRecord::Base end class CreateRestaurants < ActiveRecord::Migration def self.up create_table :restaurants do |t| t.string :nom t.string :adreca t.timestamps end end def self.down drop_table :restaurants end end
104. La primera aplicació El respond_to crida la vista (apps/views/restaurants/show.html.erb): <p> <b>Nom:</b> <%=h @restaurant.nom %> </p> <p> <b>Adreca:</b> <%=h @restaurant.adreca %> </p> <p> <b>Lng:</b> <%=h @restaurant.lng %> </p> <p> <b>Lat:</b> <%=h @restaurant.lat %> </p> <%= link_to 'Edit', edit_restaurant_path(@restaurant) %> | <%= link_to 'Back', restaurants_path %>
105. Validació de dades ------> app/models/critic.rb class Critic < ActiveRecord::Base validates_presence_of :nom end ------> app/models/restaurant.rb class Restaurant < ActiveRecord::Base validates_presence_of :nom end Validarem ara les dades:
113. Vinculació de dades Declarem les associacions al model: ----> app/models/resenya.rb class Resenya < ActiveRecord::Base belongs_to :restaurant belongs_to :critic end ----> app/models/restaurant.rb class Restaurant < ActiveRecord::Base validates_presence_of :nom has_many :resenyas has_many :critics, :through => :resenyas end ----> app/models/critic.rb class Critic < ActiveRecord::Base validates_presence_of :nom has_many :resenyas has_many :restaurants, :through => :resenyas end
114. Lògica d'aplicació Afegim al model (restaurants) dos funcions: ----> app/models/restaurant.rb class Restaurant < ActiveRecord::Base validates_presence_of :nom has_many :resenyas has_many :critics, :through => :resenyas def mitja_punts resenyas.average(:puntuacio) || BigDecimal("0.0") end def suspes? mitja_punts < 5 end end
115. Tests Rails proporciona entorn de test unitari. Afegim a test/unit/restaurant_test.rb: ----> test/unit/restaurant_test.rb require 'test_helper' class RestaurantTest < ActiveSupport::TestCase def test_notes restaurant = Restaurant.new(:nom=>"Prova") restaurant.resenyas.build(:puntuacio=>0.5) restaurant.resenyas.build(:puntuacio=>0.5) assert restaurant.save assert_equal BigDecimal("0.5"), restaurant.mitja_punts assert restaurant.suspes? end test "the truth" do assert false end end
119. Plantilles parcials Afegim ara el display de la plantilla parcial. Al final de app/views/restaurants/show.html.erb: ----> app/views/restaurants/show.html.erb [....] <h3>Resenyes</h3> <div id="resenyas"> <%= render :partial => 'resenyas', :locals => {:resenyas=> @restaurant.resenyas, :restaurant => @restaurant} %> </div> </table>
120. Sub-Forms Afegirem ara l'entrada de resenyes a la pantalla de restaurants. Modificarem la funció show al controlador. ----> app/controllers/restaurants_controller.rb [....] # GET /restaurants/1 # GET /restaurants/1.xml def show @restaurant = Restaurant.find(params[:id]) @resenya = Resenya.new @critics = Critics.find(:all, :order=>'nom') respond_to do |format| format.html # show.html.erb format.xml { render :xml => @restaurant } end end [...]
122. Això fara que interactuem amb les resenyes sempre via un restaurant. ----> config/routes.rb [....] map.resources :restaurants, :has_many=> :resenyas [...]
123. Sub-Forms Afegim a sota del show de restaurants: ----> app/views/restaurants/show.html.erb [...] <h3>Afegir resenya al restaurant</h3> <p style="color: red"><%= flash[:error] %></p> <% form_for [@restaurant, @resenya] do |f| -%> <p> <%= f.collection_select :critic_id, @critics, :id, :nom%> puntua amb <%= f.text_field :puntuacio, :size => 3 %> <br /> i comenta <%= f.text_field :comentari %> </p> <%= f.submit 'Afegir Resenya' %> <% end -%>
124. Sub-Forms Creem métode per controlar creació: ----> app/controllers/resenyas_controller.rb class ResenyasController < ApplicationController def create @restaurant= Restaurant.find(params[:restaurant_id]) @resenya = @restaurant.resenyas.build(params[:resenya]) respond_to do |format| if @resenya.save flash[:notice] = 'Critica creada OK.' format.html { redirect_to @restaurant } else flash[:error] = @resenya.errors.full_messages.to_sentence format.html { redirect_to @restaurant } end end end end
125. AJAX Farem que la plana no recarregui al afegir crítiques i farem animació.
130. AJAX Canviem l'acció create al controlador de resenyes: ----> app/controllers/resenyas_controller.rb class ResenyasController < ApplicationController def create @restaurant= Restaurant.find(params[:restaurant_id]) @resenya = @restaurant.resenyas.build(params[:resenya]) respond_to do |format| if @resenya.save flash[:notice] = 'Critica creada OK.' format.html { redirect_to @restaurant } format.js # Javascript create.js.rjs else #ELIMINAR flash[:error] = @resenya.errors.full_messages.to_sentence format.html { redirect_to @restaurant } format.js do render :update do |page| page.redirect_to @restaurant end end end end end end
135. http://www.rubyonrails.org.es Programming Ruby 1.9: The Pragmatic Programmers' Guide: http://www.pragprog.com/titles/ruby3/programming-ruby-1-9 Agile Web Development with Rails, Third Edition: http://www.pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition
Editor's Notes
#9: La creació d'una classe ha de comportar aquests tres passos: Escriure la lògica de l'aplicació en pseudo-codi. Escriure els tests. Escriure el codi Java final d'acord amb els tests. Perquè escriure primer els tests? Ens ajuda a saber que ha de fer cada mètode. Permet validar que el codi escrit, funciona. Quan afegim codi nou es passen tots els tests, així assegurem el funcionament del codi previ ja testejat. Nota: podem aprofitar el fet que cada classe pot tenir un mètode main per situar-hi els tests.
#10: La creació d'una classe ha de comportar aquests tres passos: Escriure la lògica de l'aplicació en pseudo-codi. Escriure els tests. Escriure el codi Java final d'acord amb els tests. Perquè escriure primer els tests? Ens ajuda a saber que ha de fer cada mètode. Permet validar que el codi escrit, funciona. Quan afegim codi nou es passen tots els tests, així assegurem el funcionament del codi previ ja testejat. Nota: podem aprofitar el fet que cada classe pot tenir un mètode main per situar-hi els tests.