Aug 20 2010

Vim – perełki

Pisząć o vimie warto wspomnieć o kilku wbudowanych perełkach. Nie warto wyjaśniać co one robią tylko proszę sprawdzić samemu :)


:set rightleft
:help!
:help 42
:help quotes
:help holy-grail

:D

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Aug 19 2010

Vim – selektory

W poprzednim artykule opisałem jak można poruszać się po edytorze. Teraz chciałbym opisać podstawowe selektory.

Selektor jest obiektem tekstowym, z którym chcemy coś zrobić. Np. w artykule o poruszaniu się poznaliśmy obiekt tekstowy wyraz. Teraz nauczymy się jeszcze kilka innych.

Vim rozpoznaje dwa sposoby zaznaczania : wewnętrzne (inner) i całościowe (a-word). Kolejno odpowiadają one literką i oraz a. Działają one różne od rodzaju zaznaczenia, np. w przypadku wyrazów a-word dodaje białe znaki następujące po wyrazie, natomiast w przypadku zaznaczania nawiasów dodaje także nawiasy (wersja inner zaznacza tylko zawartość nawiasów.

Selektory wykorzystuje się podczas edycji tekstu, którego jeszcze nie poznaliśmy, ale już teraz warto je poznać. Stosuje się jako modyfikator innych komend, np. jeżeli wiemy, że selektor wyrazu to iw to wydanie komendy viw spowoduje wejście w tryb wizualny i zaznaczenie całego wyrazu.

Selektory:
iw – zaznaczenie wyrazu,
iW – zaznaczenie wyrazu ignorując znaki przestankowe
aw – zaznaczenie wyrazu dodając białe znaki aż do początku kolejnego wyrazu
aW – zaznaczenie wyrazu dodając białe znaki aż do początku kolejnego wyrazu ignorując znaki przestankowe

is – zaznaczenie zdania (zdanie to kilka wyrazów zakończonych kropką)
as – zaznaczenie zdania wraz z białymi znakami do początku kolejnego zdania

ip – zaznaczenie paragrafu (kilka zdań otoczonych pustymi linijkami lub znakami początku/końca pliku.)
aP – zaznaczenie paragrafu wraz z białymi znakami aż do początku kolejnego paragrafu.

Należy to zwrócić uwagę, że w przypadku gdy zaznaczamy ostatni wyraz/zdanie/paragraf, który nie ma za sobą białych znaków to zaznaczane są białe znaki PRZED tym wyrazem/zdaniem/paragrafem.

i( lub i) – zaznaczenie zawartości nawiasu
a( lub a) – zaznaczenie zawartości nawiasu wraz ze znakami nawiasu

analogicznie do powyższego:
i< lub i>
a< lub a>
i{ lub i}
a{ lub a}
i"
a"
i'
a'

kilka przykładów:

radme
readme-1
readme

Proszę sobie dla utrwalenia potrenować trochę bo wiedza o selektorach będzie potrzebna w kolejnych rozdziałach.

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Aug 18 2010

Vim – poruszanie się

W poprzednim artykule opisałem najważniejsze podstawy edycji w programie Vim. Dzisiaj zajmiemy się poruszaniem.

Zacznijmy jednak od tego jak Vim rozpoznaje obiekty tekstowe. Najprostrzym takim obiektem jest słowo. Jest to ciąg znaków alfanumerycznych otoczony znakami białymi lub znakami przestankowymi. Jak zobaczymy za chwilkę, możliwe jest aby słowo zaznaczać na dwa sposoby: same znaki alfanumeryczne lub znaki alfanumeryczne i przestankowe.
Kolejne obiekty to zdanie (wyrazy kończące się kropką) i paragraf(zdania kończące się znakiem nowej linii lub pustą linijką.)

Posiadając tą podstawową wiedzę przejdźmy do poruszania się.

W niektórych edytorach najprostrze poruszanie się odbywa się za pośrednictwem kursorów. Natywnie jednak Vim potrzebuje do tego innych klawiszy; h, j, k i l.

h – przesunięcie kursora w lewo
l – przesunięcie kursora w prawo
j – przesunięcie kursora w górę
k – przesunięcie kursora w dół.

Przemieszczanie się wewnątrz linijki:

0 – przesuwa kursor na początek linii,
^ – przesuwa kursor przed pierwszy niebiały znak w linijce,
$ – przesuwa kursor na koniec linijki.
[No Name] + - VIM

Przemieszczanie się po całych wyrazach:
w – przesunięcie kursora na początek następnego wyrazu
e – przesunięcie kursora na koniec obecnego wyrazu
b – cofnięcie kursora do początku wyrazu

Te same komendy wpisane dużymi literami przesuwają kursor tak samo, lecz uznają wyraz wraz ze znakami przestankowymi.

W – przesunięcie kursora na początek następnego wyrazu ignorując znaki przestankowe
E – przesunięcie kursora na koniec obecnego wyrazu ignorując znaki przestankowe
B – przesunięcie kursora na początek wyrazu ignorując znaki przestankowe

[No Name] + - VIM-1

Jeszcze kilka:

ge – przesunięcie na koniec poprzedniego wyrazu,
gE – przesunięcie na koniec poprzedniego wyrazu ignorując znaki przestankowe,
g_ – przesunięcie kursora na ostatni nie biały znak w tej linijce.

Nawiasy okrągłe i zakręcone.

Vim sprawnie rozpoznaje nawiasy i potrafi dopasować je w pary. Jeżeli mamy kursor umieszczony na jednym z nich to możemy się przenieść na drugi pasujący za pośrednictwem komendy %.

% – przeniesienie kursora na pasujący nawias.
[{ lub [( - przeniesienie kursora na nawias otwierający (zakręcony lub okrągły)
]} lub ]) – przeniesienie kursora na nawias zamykający
[No Name] + - VIM-2

Pamiętajmy, że powyższe komendy przenoszą nas do najbliższego OTACZAJĄCEGO nas nawiasu a nie pierwszego napotkanego.
[No Name] + - VIM-3

Przesuwanie w obszarze roboczym.

Wiadomo, że czasem plik ma więcej treści niż jest w stanie pokazać w okienku. Pokaże teraz kilka komend, które pozwalają tekstem w obszarze roboczym.

Przesuwanie kursora w obszarze roboczym:
H – przesunięcie kursora do pierwszej linijki okienka,
M – przesunięcie kursora do środkowej linijki okienka,
L – przesunięcie kursora do ostatniej linijki okienka.

gg – przesunięcie kursora do pierwszej linijki tekstu
G – przesunięcie kursora do ostatniej linijki tekstu

Ctrl-e – przesunięcie tekstu jedną linijkę w górę
Ctrl-d – przesunięcie tekstu w górę o pół obszaru roboczego
Ctrl-f – przesunięcie tekstu w górę o cały obszar roboczy

Ctrl-y – przesunięcie tekstu o jedną linijkę w dół
Ctrl-u – przesunięcie tekstu o pół obszaru roboczego w dół
Ctrl-b – przesunięcie tekstu o cały obszar roboczy w dół

To podstawowe komendy do poruszania się. Warto nauczyć się chociaż kilku, z czasem zdobędziemy pełną wiedzę.

W następnym artykule selektory.

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Aug 18 2010

Ruby 1.9.2 już jest

Yuki (Yugui) Sonoda zapowiedział, że właśnie pojawiła się wersja stabilna ruby 1.9.2. Wersja ta przechodzi testy w 98% i mimo, że zwiększenie wydajności w porównaniu do 1.9.1 jest nieznaczna, to różnica do linii 1.8 jest już spora.

Jeżeli chcemy zainstalować to najprościej skorzystać z RVM:


rvm update --head && rvm reload && rvm install 1.9.2 && rvm 1.9.2 --default

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Aug 18 2010

Vim początek

Vim jest prawie tak stary jak ja. Urodził się w 1976 roku czyli raptem rok po mnie. Mimo, że nie jest jedynym edytorem, którego wykorzystujemy w konsoli – przyzwyczaiłem się do niego. Polecam zate z korzystania, każdego kto mnie o ten temat spyta.

Nauka vima jednak nie jest prosta, z biegiem czasu zauważymy schematyczność działania i nauczymy się instynktownie z niego korzystać jednak pierwsze wrażenie może być wstrząsające. Zwłaszcza dla miłośników okienek, przcisków i menu – tutaj tego nie znajdziecie. W vimie wszystkie komendy się wpisuje.

Znane jest nawet powiedzienie: “Jak wygenerować losowy ciąg znaków? Dać użytkownikowi Windowsa Vima i kazać mu z niego wyjść” ;)

Zaczynamy.

Początek, czyli zamykanie Vima

Jak otworzyć to chyba każdy wie, wystarczy wpisać “vim” w konsoli i po sprawie. Gorzej jest zamknąć edytor. Do zamykania służą poniższe komendy:

:q – wyjście z vima
:q! – wyjście z vima bez zapisu
:w – zapisanie
:wq – zapis i wyjście
:w NAZWA – zapisanie pliku jako NAZWA
:e NAZWA – edycja pliku NAZWA

Może trochę dziwi, że tego typu komendy poznajemy na początku, ale z doświadczenia wiem, że czasem najlepiej jest wyjść i zacząć od nowa. Zwłaszcza podczas nauki tego edytora.

Trzy tryby Vima

W Vim’ie są trzy tryby pracy:
1. Tryb komend (zwany także trybem normalnym) – służy do wprowadzania komend,
2. Tryb wprowadzania – wszystko co wpiszemy zostaje wprowadzone do edytowanego pliku,
3. Tryb wizualny – tryb ten służy do zaznaczania fragmentów tekstu – można go traktować jako podtryb trybu komend.

Przechodzenie pomiędzy trybami

Przejście do trybu komend z obu pozostałych następuje po naciśnięciu klawisza ESC.

ESC – przejście do trybu komend.

Tryb wprowadzania:
Najbardziej popularne sposoby wejścia do trybu wprowadzania:

i – wejście w tryb wprowadzania przed obecną pozycją kursora
a – wejście w tryb wprowadzania za obecną pozycją kursora
I – przejście do pierwszego niebiałego znaku w tej linijce i uruchomienie trybu wprowadzania
A – przejście do ostatniego znaku w tej linijce i uruchomienie trybu wprowadzania
o – dodanie pustej linijki powyżej bieżącego wiersza i przejście do niej w trybie wprowadzania
O – dodanie pustej linijki poniżej bieżącego wiersza i przejście do niej w trybie wprowadzania

Przejście do trybu wizualnego:
v – przejście do trybu wizualnego (zaznaczanie znakowe)
V – przejście do trybu wizualnego (zaznaczanie linijkowe)
Ctrl+v – przejście do trybu wizualnego (zaznaczanie blokowe)

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Aug 7 2010

Capture model w Pickle

Używam Machinist i Pickle jako wspaniałe dodatki do Cucumbera uzupełniające jego możliwości. Wczoraj jednak natrafiłem na dziwny problem: jeden ze stepów wykonywał się w jednym teście a w drugim nie. Nie rozpoznawało modelu, który wygenerowałem – tylko jednego, wszystkie inne rozpoznawało.

Problemem był Pickle. Okazuje się, że capture_model rozpoznaje modele po zdefiniowanych fabrykach lub blueprintach a nie po bazie danych, czy schemie. Po stworzeniu blueprinta dla mojego modelu wszystko zaczęło działać ponownie.

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Aug 5 2010

Bash completion for RVM

Jeżeli korzystacie z RVM to warto zapoznać się z gemem RVM-Completion. Podpowiada on nam zansstalowane wersje interpretatora lub gemsety.

Szczegóły można poznać na stronie projektu.

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Jul 30 2010

Logi gita i kolorowe głowice

Pracując z Systemem Kontroli Wersji GIT, wyświetlając logi możemy użyć opcji --decorate aby przy każdym commicie była wyświetlana informacja o głowicy (szczyt gałęzi).
W najnowszej wersji GIT’a poprawiono wyświetlanie i teraz gałęzie są w różnych kolorach. Mocno to polepsza czytelność logów.

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Jul 29 2010

Tips & Tricks

Utworzyłem nową kategorię na swoim blogu. Będę w niej umieszczał krótkie tricki i ściągawki dotyczące programowania. Czasami przypomni mi się coś, albo długo szukam prostego rozwiązania, wszystkie te drobinki będę wrzucał w ten dział.

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Jul 29 2010

Routing w Rails 3, nowości

Jednym z ważniejszych plików konfiguracyjnych aplikacji napisanej w Ruby on Rails jest plik routes.rb. Plik zawiera mapowania do wszystkich zasobów aplikacji, aby były (lub nie były) dostępne przez URL. W rails 3 wprowadzono sporo zmian w tej kwestii, chciałbym po krótce opisać chociaż najważniejsze z nich.

Po pierwsze zniknęło słowo map, dobrze znane z poprzedniej wersji frameworka. Uprościło to trochę zapis. Np. w poprzedniej wersji taki zapis:

map.resources :posts do
    map.resource :comments
end

można teraz zapisać jako:

resources :posts do
    resources :comments
end

Routing podstawowy i nazwany

map.connect został zastąpiony w rails 3 metodą match. Dodatkowo w routingach nie podaje się już oddzielnie nazwy kontrolera i akcji. Zamiast tego oddziela się je znakiemm #. Dla przykładu routing z poprzedniej wersji frameworka wyglądający w ten sposób:

map.connect 'posts/:id', :controller => "posts", :action => "view"

przyjmie taką postać:

match 'posts/:id', :to => 'posts#view'

Jak widać zapis jest o wiele czytelniejszy. Pojawił się także nowy paramert :to, który został wprowadzony po połączeniu :action i :controller.

Metoda match została także użyta przy nazwanych routingach.
Routingi nazwane są to takie, które tworzą automagicznie helpery do wyświetlania odpowiednich adresów URL. Dla przykładu zapis:

map.logout '/logout', :controller => 'sessions', :action => 'destroy'

będzie wyglądał teraz tak:

match 'logout', :to => 'sessions#destroy', :as => 'logout'

Parametr :as oznacza nazwę, która zostanie użyta podczas tworzenia helperów. W powyższym przypadku: logout_path i logout_url.

Inny przykład użycia :as:

match 'users/show/:id', :as => 'profile'
# zapis w kontrolerze:
profile_path(current_user.id)

Drugim parametrem, którego można użyć wraz z match jest :via. Parametrem tym, określamy, które metody żądania HTTP są dostępne dla danego routingu.

match 'account/setup', :via => [:post, :get]

.
W przypadku, gdy ograniczamy wejście tylko do jednej metody, możemy użyć jej nazwy zamiast match

match 'account/setup', :via => :get
#jest jednoznaczne z:
get 'account/setup'

Rails 3 wprowadził także kilka skrótów, które możemy wykorzystać w jednoznacznych sytuacjach. Dla przykładu, możemy pominąć wspomniany wyżej parametr :to zamieniając oba parametry w mapę.

match 'logout', :to => 'sessions#destroy'
match 'logout' => 'sessions#destroy'

Oba powyższe przypadki są jednoznaczne.
Jeszcze większy skrót jest gdy mapowany url jest analogiczny do nazwy kontrolera i akcji, wtedy wogóle nie musimy określać punktu docelowego.

match 'sessions/destroy', :to => 'sessions#destroy'
match 'sessions/destroy' => 'sessions#destroy'
match 'sessions/destroy'

Wszystkie powyższe zapisy są analogiczne. Kierują wejście na ’sessions/destroy’ do kontrolera SessionsController i akcji destroy.

Route domyślny i segmenty opcjonalne

Ciekawostką wprowadzoną w Rails 3 są opcjonalne segmenty w routingu. Są to takie fragmenty adresu URL, które mogą wystąpić lecz nie muszą. Opcjonalne fragmenty są w zapisie umieszczone w nawiasach.
Najlepszym przykładem ich użycia jest route domyślny, który zmienił postać z:

map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'

na:

match ':controller(/:action(/:id(.:format)))'

Jak widać powyżej parametry :action, :id i :format są opcjonalne.

Dodatkową przydatną informacją na temat domyślnego routingu jest fakt, że został on domyślnie wyłączony w Rails 3. Jeżeli chcemy użyć tego domyślnego mapowania musimy je odkomentować jednak nie jest to zalecane.

Routing główny

Routing główny jest często określany także pustym. Jest to mapowanie, które jest wyświetlane po wpisaniu w przeglądarce samej nazwy domeny, bez żadnych parametrów.
W rails 2 takie mapowanie jest określane za pomocą metody map.root. W obecnej wersji, pominięto map, więc wystarczy użycie metody root.
Stary zapis:

map.root :controller => "posts", :action => "index"

można w nowej wersji przedstawić w ten sposób:

root :to => 'posts#index'

Ponownie widać uproszczenie zapisu.

Zagnieżdżone zasoby

Niektóre modele w tworzonej aplikacji posiadają referencje do innych, referencje te są zdefiniowane poprzez użycie has_many lub has_one w definicji modelu. Na przykład:

class Post < ActiveRecord::Base
  has_many :comments
end
 
class Comment < ActiveRecord::Base
  belongs_to :post
end

Zagnieżdżony routing pozwala na dostęp do “niższych” zasbów bezpośrednio z URL’a, na przykład: /posts/2/comments/3 dostarczy komentarz o ID=3, który należy do postu o id = 2.
Aby taki routing był możliwy musimy go zdefiniować. Robimy t w ten sposób:

resources :posts do
  resources :comments
end

Po takiej deklaracji zostaną także utworzone odpowiednie helpery, np.:post_comments_path, edit_post_comment_path.

W przypadku jednak gdy helpery te są za długie, lub nie chcemy korzystać z modelu nadrzędnego możemy użyć opcji shallow, która pozwoli nam na bezpośredni dostęp do zagnieżdżonych zasobów.

resources :posts do
  shallow do
    resources :comments
  end
end

Od tej pory możemy używać /comments/2 zamiast /posts/2/comments/2.
Dla przypomnienia w rails 2 z tej opcji korzystało się w ten sposób:

map.resources :posts, :shallow => true do |post|
  post.resources :comments
end

Zasoby

Od czasów wprowadzenia definicji resources do routes, zaleca się z korzystania z tej metody. Tworzy ona helpery oraz zarządza odpowiednimi RESTowymi połączeniami z zasobami.
Aplikacja mapuje odpowiednio wszystkie CRUD’owe metody dla takiego zasobu(index, new, create, delete, update, show, edit).
W rails 3 możemy zrezygnować z niektórych (except), lub wskazać tylko te z których chcemy skorzystać (only):

resources :comments, :except => [:index]
resources :sessions, :only => [:new, :create, :destroy]

Więcej niż REST

Czasem wprowadzamy do naszych kontrolerów inne akcje, do których chcielibyśmy mieć dostęp z zewnątrz. Dodatkowe akcje definiujemy za pomocą metod collections i member zależnie czy chcemy manipulować zbiorem obiektów czy jedną sztuką.
W rails 2 pisaliśmy coś takiego:

map.resources :orders, 
  :collection => {
    :only_new => :get,
    :accepted => :get 
  },
  :member => {
    :change_status => :put
  }

teraz możemy pisać tak:

resources :posts do
  collection do
    get :only_new, :accepted
  end
  member do
    put :change_status
  end
end

lub tak:

resources :posts do
  get :only_new, :on => :collection
  get :accepted, :on => :collection
  put :change_status, :on => :member
end

Zmiana nazwy parametru żądania

W niektórych przypadkach, zwłaszcza w aplikacjach nieanglojęzycznych przydatna jest opcja zmiany nazwy akcji. Np. Chcielibyśmy ze względu na SEO aby w URL było używane “aktualizuj” zamiast “edit”. Możemy tego dokonać za pośrednictwem opcji path_names

resources :users, :path_names => {:edit => 'aktualizuj'}

Przekierowanie żądania

W rails 3 jest możliwe przekierowanie wejścia z jednego żądania na inne

match '/profile', :to => redirect('/users/show')
#albo
match '/profile/:username' => redirect('/users/show/%{username})

Ograniczenia

W routes.rb jest możliwość wprowadzenia ograniczeń co do żądania, np. ID może składać się tylko z pięciu cyfr lub podobne.

resources :users, :constraints => { :id => /\d{5}/ }
#lub w przypadku gdy takie ograniczenia są wspólne dla kilku zasobów:
constraints(:id => /\d{5}/) do
  resources :users
  resources :posts
end

To nie wszystkie nowości, które zostały wprowadzone w Rails 3, pozostały do opisania np. uruchamianie aplikacji bezpośrednio na racku lub inne perełki. Mam nadzieję jednak, że da to ogólny wgląd w nadchodzące zmiany.

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark