sobota, 12 marca 2011

GIT - kontrowersje i problemy

Jak się okazało nie tylko ja wieszam psy na panu Linusie za wyprodukowanie gigantycznego problemu w postaci GIT'a. Ale do rzeczy.
Wspomniana przeze mnie we wcześniejszych postach książka Pro Git ukazuje w sekcji o cofaniu zmian komendę:
> git commit --amend //nie używaj tego!
jako receptę na zapomniane poprawki. Autor z lekkością motylka zawiadamia czytelnika o pięknych możliwościach git'a. Na litość boską! Nie używaj tego! Mogą Cię za to zaszlachtować inni uczestnicy projektu. Narobisz takiego bigosu w kodzie i tylu problemów dla prowadzącego projekt, że raczej nie rozważy poważnie Twojej kandydatury podczas rozdzielania premii, albo po prostu Cię wyleje i będzie miał spokój.
To co się dzieje w publicznym repozytorium po użyciu tego cholerstwa... Omg!
Najlepiej jest to opisane tutaj:
http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo
ale życzę abyś nie miał z tym nic do czynienia.

piątek, 11 marca 2011

GIT - usuwanie kilku commitów jednym poleceniem

Jak wiadomo usunięcie konkretnego commita w GIT'cie odbywa się komendą:
git revert odcisk_SHA
Całe szczęście, że można wpisywać tylko 7 pierwszych znaków odcisku SHA commita.
Aby sprawdzić ostatnie np. dwa odciski commitów zawołaj:
git log -2
Czasami się tak zdarza, że można zabrnąć w kodzie w ślepą uliczkę nie tworząc do tego gałęzi (branch). Może zaistnieć wtedy potrzeba usunięcia pod rząd kilku commitów. Wpisywanie "z palca" raczej nie wchodzi w rachubę bo można oszaleć. Trzeba więc było coś wymyślić.
Z pomocą przyszła komenda
git rev-list
Ma ona mnóstwo opcji, ale w podstawie wyświetla ona między innymi odciski SHA commitów. Gdy się użyje w takiej składni:
git rev-list f182667 --max-count=5
to wyświetlone zostanie 5 odcisków commitów  począwszy od commita oznaczonego jako f182667. No to już bliziutko do finału, który brzmi:

for i in `git rev-list f182667 --max-count=5`; do git revert --no-edit $i; done
Po co została użyta opcja --no-edit? Ano gdyby jej nie było, to pięć razy git by prosił o opisanie kolejnie wykonywanej operacji revert. Upierdliwe, że hej.

UWAGA! Pułapka: te górne apostrofki to nie są te normalne... To są te po lewej stronie klawisza "1" pod tyldą "~".

Rake spis poleceń

Udało mi się znaleźć prawie kompletny spis poleceń Rake dla Ruby on Rails.

  • rake gems:install - instaluje gemy zawarte w pliku config/environment.rb
  • rake db:fixtures:load - Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y
  • rake db:migrate - Migrate the database through scripts in db/migrate. Target specific version with VERSION=x
  • rake db:schema:dump - Create a db/schema.rb file that can be portably used against any DB supported by AR.
  • rake db:schema:load - Load a schema.rb file into the database.
  • rake db:sessions:clear - Clear the sessions table.
  • rake db:sessions:create - Creates a sessions table for use with CGI::Session::ActiveRecordStore.
  • rake db:structure:dump - Dump the database structure to a SQL file.
  • rake db:test:clone - Recreate the test database from the current environment's database schema.
  • rake db:test:clone_structure - Recreate the test databases from the development structure.
  • rake db:test:prepare - Prepare the test database and load the schema.
  • rake db:test:purge - Empty the test database.
  • rake doc:appBuild the app HTML Files.
  • rake doc:clobber_app - Remove rdoc products.
  • rake doc:clobber_plugins - Remove plugin documentation.
  • rake doc:clobber_rails Remove rdoc products.
  • rake doc:plugins - Generate documation for all installed plugins.
  • rake doc:rails - Build the rails HTML Files.
  • rake doc:reapp - Force a rebuild of the RDOC files
  • rake doc:rerails - Force a rebuild of the RDOC files
  • rake log:clear - Truncates all *.log files in log/ to zero bytes
  • rake rails:freeze:edge - Lock this application to latest Edge Rails. Lock a specific revision with REVISION=X.
  • rake rails:freeze:gems - Lock this application to the current gems (by unpacking them into vendor/rails)
  • rake rails:unfreeze - Unlock this application from freeze of gems or edge and return to a fluid use of system gems
  • rake rails:update - Update both scripts and public/javascripts from Rails.
  • rake rails:update:javascripts - Update your javascripts from your current rails install.
  • rake rails:update:scripts - Add new scripts to the application script/ directory.
  • rake stats - Report code statistics (KLOCs, etc) from the application.
  • rake test - Test all units and functionals
  • rake test:functionals - Run tests for functionalsdb:test:prepare
  • rake test:integration - Run tests for integrationdb:test:prepare
  • rake test:plugins - Run tests for pluginsenvironment
  • rake test:recent - Run tests for recentdb:test:prepare
  • rake test:uncommitted - Run tests for uncommitteddb:test:prepare
  • rake test:units - Run tests for unitsdb:test:prepare
  • rake tmp:cache:clear - Clears all files and directories in tmp/cache
  • rake tmp:clear - Clear session, cache, and socket files from tmp/
  • rake tmp:create - Creates tmp directories for sessions, cache, and sockets
  • rake tmp:sessions:clear - Clears all files in tmp/sessions
  • rake tmp:sockets:clear - Clears all ruby_sess.* files in tmp/sessions

Źródło na:
http://www.tutorialspoint.com/ruby-on-rails/rails-and-rake.htm
Wszystko w jednym miejscu, krótko i treściwie.

GIT - używanie, czyli codzienne starcia z urojeniami Linusa

Mimo, że używam GIT'a na co dzień, to gdyby mnie ktoś zapytał dlaczego, udzieliłbym nieco wymijającej odpowiedzi. Osobiście nie mam o nim dobrego zdania. System wygląda na projekt, który miał być mały, a stał się za duży. Co ciekawe tak chyba było w istocie. Linus tworząc Linuxa napisał system kontroli wersji dla tego projektu. Zaczęto go używać powszechnie, bo na wolnej licencji , bo tworzył to wielki Linus... Diabli wiedzą dlaczego...
Logiki tam z lupą szukać. Weźmy pierwszy z brzegu przykład. Utworzenie nowej gałęzi wygląda normalnie:
git branch test
ale przełączenie się na nią to już prawą nogą za lewe ucho:
git checkout test
O kurde! COŚ jest nie tak. Sprawdzamy wobec tego co to jest checkout:
http://www.diki.pl/slownik-angielskiego/?q=checkout&x=0&y=0
I dowiadujemy się, że to kasa, bądź wymeldowanie. Na litość boską! Towarzyszu Linusie, skąd ci to wpadło do głowy? Słówko "branch" (gałąź) cię boli? Czyli gałąź niedokładnie opisuje gałąź? Lepiej do przełączenia na gałąź użyć słowa kasa-wymeldowanie? Dlaczego nie "cegła" albo "sznurówka"? Tak samo przypadkowe i tak samo dobre.
Myślisz drogi czytaczu, że to odosobniony przypadek? Można książkę napisać o głupotach GIT'a. Zresztą niech przemówią fakty. Wrzuć w google frazę "git commit", a zaraz potem "bazaar commit". Sprawdź za każdym razem ilość wyników. I co? Tobie też wyszło, że stron wyjaśniających działanie GIT'a jest (uwaga!) stopiętnaścierazywięcej? Albo 115 razy więcej?! Każdy, kto choć chwilę się nad tym zastanowi natychmiast odrzuci kwestię popularności GIT'a versus Bazaar'a. Bazaar jest po prostu prosty :-) Fajnie wyszło: "po prostu prosty". Ale tak jest w istocie. Bazaar jest prosty. W Bazaar aby cofnąć ostatni commit piszesz:
bazaar uncommit
O zgrozo! Jak prosto i domyślnie!
Sprawdźmy więc jak to się robi w GIT:
git revert 1ed35d3
To nie ściema! Tak jest naprawdę. I to jest skrócona wersja! Użyłem klucza tylko w wersji 7-dmio znakowej. A co by było gdybym musiał użyć całego klucza SHA? Drogi Linusie! Brawa za kreatywność.
Pomijam tu kwestię, że na przykład, w skądinąd dobrej książce o Git'cie:
http://progit.org/book/pl/
na próżno będziesz szukał informacji na temat jak cofnąć ostatni commit. Ciekawe no nie? Ciekawym też jest fakt, że w ogóle taka książka jest potrzebna. Wiem, bo ją przeczytałem. Nie dlatego abym był masochistą. Nie zwariowałem. Przeczytałem, bo trzeba się było nauczyć. Ale, jak widać, jej przeczytanie nie daje nawet tak podstawowej wiedzy jak cofnąć commit. A teraz uwaga... aby korzystać bezproblemowo z Bazaara wystarczy poświęcić kwadrans na przeczytanie jednego tutoriala. Więcej tutoriali ani książek nie ma. Nie ma... zgadnij dlaczego? Ano dlatego, że nie potrzeba. Tam wszystko jest prosto i kawa na ławę. Jeden tutorial i po sprawie. Po co się rozpisywać skoro wszystko jest proste?
Już słyszę te pytania: "dlaczego, baranie, nie używasz więc Bazaara?". Ano spuszczę głowę i odpowiem, że dla tego samego co durnych windowsów. Wszędzie do tego coś jest. A to wtyczka do NetBeansów i Idei. A to u naszego dostawcy usług hostingowych pełne wsparcie i tutoriale. Masakra! Uległem wielkości githuba. Stuliłem po sobie uszy, przymknąłem paszczę i używam tej durnoty. Mam nadzieję, że Ty, jak już dotarłeś do końca tych słów, to chociaż obejrzysz Bazaara i zapłaczesz dlaczego takie wspaniałe narzędzie pozostaje w cieniu fantasmagorii wielkiego Linusa.

Ach... byłbym zapomniał... kolejny z milionów tutoriali o GIT'cie:
http://marioosh.5dots.pl/2009/06/27/gitowy-system-kontroli-wersji.html
tam chociaż jest coś o cofnięciu commita...

devPytania.pl - serwis dla programistów

Ciekawy jestem jak to się będzie rozwijać...

Póki co jest to dobrze zrobiony serwis pod względem programistycznym. Wyglądem nieco przypomina StackOverflow.
http://devpytania.pl
W skrócie: pytania i odpowiedzi programistów.  Blogi programistów.

czwartek, 10 marca 2011

Vim - kompletny plik _vimrc, lub _gvimrc

Okazało się, że publikacja kilku wpisów wywołała żywe zainteresowanie Vim'em jako hiper-szybkim edytorem tekstu. Zdaję sobie sprawę, że na początku ciężko jest przebrnąć przez ogrom możliwości konfiguracyjnych. Zamieszczam więc tutaj jedną z wersji naszego pliku _gvimrc jako przykład:
set nocompatible
source $VIMRUNTIME/vimrc_example.vim

"Nie chcę aby gvim był podobny do windowsów
"source $VIMRUNTIME/mswin.vim
"behave mswin

"nie zawijaj wierszy
set nowrap

"wcięcia
set tabstop=4
set shiftwidth=4

"poprawne odkodowywanie plików wraz zautomatycznym ich rozpoznawaniem
set fileencodings=utf-8,latin2
set enc=utf-8

"chcę zachować pliki przed zmianą, tyle że w tym katalogu
set backupdir=d:/Archiwum/vim_backups

"schemat kolorów
"colorscheme desert
colorscheme murphy

"wielkość okna
set columns=120
set lines=60
winp 0 0

"ignorowanie wielkości liter podczas wyszukiwania
set ignorecase

"ukrywanie wskaźnika myszy gdy się pisze
set mousehide
set linebreak

"autocomplete po naciśnięciu Ctrl-P lub Ctrl-N
set completeopt=longest,menuone
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
inoremap <expr> <C-n> pumvisible() ? '<C-n>' :
  \ '<C-n><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'
inoremap <expr> <M-,> pumvisible() ? '<C-n>' :
  \ '<C-x><C-o><C-n><C-p><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'

"Włączam pokazanie numerów wierszy
set number
set numberwidth=4 "ale nie więcej niż 9999

"na dole i na górze zostawiam 5 linijek żeby coś widzieć
set scrolloff=5

"set cursorcolumn " highlight the current column
set cursorline " highlight current line
set incsearch " BUT do highlight as you type you search phrase

"Obsługa foldingu czyli zwijania i rozwijania wierszy
set foldmethod=manual
let Tlist_Auto_Open=0 " let the tag list open automagically
let Tlist_Compact_Format = 1 " show small menu
let Tlist_Ctags_Cmd = 'ctags' " location of ctags
let Tlist_Enable_Fold_Column = 0 " do show folding tree
let Tlist_Exist_OnlyWindow = 1 " if you are the last, kill yourself
let Tlist_File_Fold_Auto_Close = 0 " fold closed other trees
let Tlist_Sort_Type = "name" " order by
let Tlist_Use_Right_Window = 1 " split to the right side of the screen
let Tlist_WinWidth = 40 " 40 cols wide, so i can (almost always) read my functions

"Ideą, która przyświecała mi przy tworzeniu rozwinięć były dwie literki i "#".
"Wszystko po to aby się nie myliło z normalnym pisaniem. Ten # całkowicie to
"separuje.
ab <ph# <?php echo; ?><left><left><left><left>
ab fo# for($i=0; $i<10; ++$i) {
}<up>A
ab if# if() {
}<Esc><up><End>3<Left>
"W poniższym rozwinięciu ciekawostka jest spacja na końcu wyrażenia.
"Denerewującą cechą rozwinięć jest to, że na końcu każdego wstawiają ten biały znak,
"który je rozwija (np. CR albo spacja). Dzięki temu, że na końcu jest spacja
"poszukiwanie w linii (f) szuka właśnie spacji i dostawia na końcu biały znak
"znajdując się dokładnie na nazwie funkcji.
ab fu# function nazwa_funkcji() {
}<Esc><Up><Home>f
ab $th# $this-><Esc>F-

"Rozwinięcia dla html
ab <ht# <html>
<head>
<title></title>
</head>
<body>

</body>
</html><Esc>3<up>
ab <di# <div class=""></div><Esc><Home>f>
ab <p# <p></p><Esc><Home>f>
ab <fo# <form>
</form><Esc>kFm
ab <ta# <table>
<tr>
<td></td>
</tr>
</table><Esc>2<Up><Home>f>
ab <ul# <ul>
<li></li>
</ul><Esc><Up><Home>f>
ab <li# <li></li><Esc><Home>f>
ab <h1# <h1></h1><Esc><Home>f>
ab <h2# <h2></h2><Esc><Home>f>
ab <h3# <h3></h3><Esc><Home>f>
ab <in# <input id="" name="" type="text" class="" /><Esc>F<3f"
ab <a# <a href="" title=""></a><Esc>4F"
ab cl# class=""<Esc>2F"

"wstawianie nawiasików
map \( <Esc>a('')<Esc><Left>i
map \[ <Esc>a['']<Esc><Left>i
map \{ <Esc>a{
}<Esc><Up>A


"otaczanie
map \h1 <Esc>bi<h1><Esc>ea</h1><Esc>F<
map \h2 <Esc>bi<h2><Esc>ea</h2><Esc>F<
map \h3 <Esc>bi<h3><Esc>ea</h3><Esc>F<
map \sp <Esc>bi<span><Esc>ea</span><Esc>F<
map \a <Esc>bi<a href="" title=""><Esc>ea</a><Esc>3F"

"zakomentowanie linii znaczkiem # (dla Ruby)
map <C-K> mkI#<Esc>`k

"zakomentowanie linii znaczkiem //
map <C-L> mkI//<Esc>`k

"usunięcie wyrazu, na którym stoi kursor
map <C-D> bdw
W następnych wpisach wyjaśnię co ciekawsze fragmenty.

Vim autocomplete czyli autouzupełnianie tekstu podobne do środowisk IDE

W Vim'ie, co może wielu zdziwić, też da się autouzupełniać kod. Jest to doskonała funkcja zapobiegająca powstawaniu trudnych do znalezienia błędów w kodzie.

Ten kod poniżej należy wstawić do pliku _vimrc albo _gvimrc
"autocomplete po naciśnięciu Ctrl-P lub Ctrl-N
set completeopt=longest,menuone
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
inoremap <expr> <C-n> pumvisible() ? '<C-n>' :
  \ '<C-n><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'
inoremap <expr> <M-,> pumvisible() ? '<C-n>' :
  \ '<C-x><C-o><C-n><C-p><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>'
Gwoli wyjaśnienia dodam, że Ctrl-P przeszukuje Poprzednio napisany kod, a Ctrl-N Następnie (dalej) napisany kod. Oczywiście wciska się to w normalnym trybie edycji.

środa, 9 marca 2011

PHP - powrót danych z formularza jako listy

Ciekawostką, jak się okazało, w php jest możliwość pobrania danych z formularzy jako tablic. Wystarczy do nazwy kontrolki na formularzu dodać nawiasy "[]".

Na przykład:

przed zmianą:
<select name="lista"></select>


po zmianie:
<select name="lista[]"></select>

wtorek, 8 marca 2011

Co to jest ||= czyli dziwna notacja w Ruby

Sformułowanie ||= może wyglądać dziwnie, ale jest użyteczne.
Zapis
foo ||= "hello"
znaczy, że jeśli zmienna foo nie jest zainicjowana (lub ma wartość nil) to przypisz jej string "hello".

Serwis dla programistów do kolorowania składni

Czasami trzeba przesłać komuś trochę kodu. Może wstawić do jakiegoś forum... Bez wcinek i kolorów czyta się to ciężko. Autorzy tej strony:
http://pastebin.com/
domyślili się jak wielu ludzi przesyła swoje źródła i postanowili pomóc programistom w przekazywaniu czytelnego kodu. Wklej tam swój kod i odbierz pokolorowany.
Okazało się jednak, że wiele fragmentów kodu to po prostu perełki. Warto się nimi dzielić na szerszym forum. Skoro ludzie już używają Pastebin to tylko krok aby Pastebin stał się naturalnym centrum prezentacji wartościowego kodu. Można z niego korzystać okazyjnie, a można założyć tam konto i dzielić się z innymi swoim kodem.

Strony pod iPhone'a i Androida - jak robić

Wygląda na ciekawy turial:
http://blog.piotrnalepa.pl/2011/02/07/jquery-html5-jak-zrobic-mobilna-wersje-strony-internetowej-pod-iphonea-i-androida/

poniedziałek, 7 marca 2011

Vim - katalog TEMP oraz litery w UTF-8

Vim posiada arcyprzydatną opcję generowania przy każdej zmianie pliku z jego poprzednią wersją. Jest to o tyle przydatne, co denerwujące na dłuższą metę. Przy edycji dużej ilości plików powstaje ich nadmierna ilość, co w końcu może denerwować.
Wystarczy jednak ustawić zmienną systemową, aby pliki backupowe były automatycznie przerzucane do wybranego katalogu. Dane konfiguracyjne znajdują się w pliku konfiguracyjnym (jak to tajemniczo brzmi).
Dla Windows ten plik to
C:\Program Files\Vim\_vimrc 
zaś dla Linuxa wystarczy
~/.vimrc
Należy tam wpisać:
:set backupdir=c:/Windows/temp
Oczywiście ścieżka jest dowolna.

Osobnym problemem to kodowanie polskich liter. Polecanym jest UTF-8, ale w Windows oczywiście tak nie jest :-(
Wrzucamy więc do pliku konfiguracyjnego:
:set fileencodings=utf-8,latin2
i po kłopocie.

Nieco szerzej jest to opisane tutaj: http://automaciej.jogger.pl/2006/07/18/vim-utf-8-i-iso-8859-2/