“No Metadata Classes to process.” w Symfony

Zaczynamy w kilka osób robić mały i szybki projekt. Przy wybieranie frameworka wybór padł na Symfony 2.
Lecę sobie kulturalnie zgodnie z dokumentację a tu nagle zonk

1
2
noose@dev ~/work/$ php app/console doctrine:schema:create
No Metadata Classes to process.

Trochę szukałem, nic nie pomagało:
* podobno pomaga dodanie @ORM\ w adnotacjach, ale ja już miałem
* podobno pomaga dodanie

1
2
3
orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

w app/config/config.yml

A co mi pomogło?

1
2
3
4
5
6
7
8
9
10
11
12
doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8
    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true

Pierwotnie przed orm był enter….

Blokowanie ekranu w OSX

Aby zablokować ekran ( bez wylogowywania! ) należy wcisnąć CTRL+SHIFT+EJECT (^⇧eject)
Długo tego szukałem, więc wolę się podzielić ;)

Locking screen without logout in OSX CTRL+SHIFT+EJECT (^⇧eject)

Bardzo przydatny diff dla mercuriala

Nazywa się extdiff – pozwala pokazywać diffa w vimdiffie (3 panele – dwa z kodem, jeden z listą plików).

w hgrc dopisujemy

[extensions]
hgext.extdiff =

[extdiff]
cmd.vimdiff = vim
opts.vimdiff = -f '+next' '+execute "DirDiff" argv(0) argv(1)'

oprócz tego potrzebujemy DirDiffa do vim’a
http://www.vim.org/scripts/script.php?script_id=102
+

let g:DirDiffDynamicDiffText = 1

w vimrc

Znalezione w http://mercurial.selenic.com/wiki/ExtdiffExtension

Ciekawostki z kodu w korpo

Wiem, dawno nic nie pisałem – postaram się poprawić niedługo.

Dzisiaj wrzucę ciekawostki kodu z korpo :)

1
public function zaloguj_lub_zarejestruj($uzytkownik)

jak to na blipie określili – dobrze, że nie ma wyloguj_lub_usun_konto -.-

1
2
3
4
5
 $czy_nie_wysylac_email = $uzytkownik->pobierz_email_czy_nie_wysylac();
            $czy_wyslac_email = empty($czy_nie_wysylac_email);
            if ($czy_wyslac_email) {
                $this->wyslij_email_rejestracyjny($uzytkownik);
            }

To chyba nie wymaga komentarza :)

Mercurial po sshfs “abort: Operation not permitted”

Przypadek:
dysk podmontowany przez sshfs, eclipse oraz obsługa hg po stronie laptopa. W trakcie robienia hg pull / push wywala błąd.

abort: Operation not permitted

Aby temu zapobiec polecam dodać do sshfs

-o workaround=rename

czyli

sshfs  -o workaround=rename server:/home/ja/projekty projekty

I przechodzi gładko :)

Mercurial – branch w bash prompt

Teraz na szybko ;)
Aby osiągnąć taki efekt:

noose@noose-laptop ~/projekt_1/ (branch)$

należy do .bash_profiles wpisać:

function parse_hg_branch {
    ref=$(hg branch 2> /dev/null) || return
    echo "("${ref#refs/heads/}")"
}
PS1="\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$(parse_hg_branch)$\[\033[00m\] "

źródło: http://railstips.org/blog/archives/2009/02/02/bedazzle-your-bash-prompt-with-git-info/

Mercurial – początki

W robocie zaczynami z mercuriala korzystać (chcemy zakończyć współpracę z svn). Postanowiłem, że spiszę niektóre rzeczy z których korzystamy :)
Teraz będziemy się bawić http://mercurial.selenic.com/wiki/MqExtension (łączenie commitów), więc nie przerażajcie się, że są tutaj totalne podstawy.
A więc zaczynamy od początku:

W katalog domowym tworzymy sobie plik .hgrc (można go także stworzyć w katalogu .hg w projekcie)
Moja aktualna zawartość:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ui]
ignore = /home/pkobylak/.hgignore # plik z warunkami dla ignore
username = Paweł Kobylak <noose@noose.pl> # moja nazwa użytkownika
style = compact # styl na liście - tylko podstawowe informacje

[extensions]
hgext.graphlog = # pozwala pokazywać graficzny log commitów

# potrzebne do mergy - otworzy się vimdiff
[merge-patterns]
** = filemerge

[merge-tools]
filemerge.executable = vim
filemerge.args = -d $local $other

Kilka komend (poniżej jeszcze stawianie serwera):

1
hg init

W miejscu w którym odpalamy – zakłada się repozytorium

1
hg add plik1 plik2

Dodaje plik1 i plik2 do repozytorium

1
hg commit -m 'Komentarz' plik1

Commituje (lokalnie) plik1. Można podać samo hg commit – wtedy spyta się o komentarz oraz zrobić commit wszystkich zmian

1
hg clone http://....

Klonuje repozytorium (taki svn checkout). Przy czym można zrobić clone chociażby z katalogu obok ;)

1
hg pull

Pobiera zmiany ze zdalnego repozytorium (z tego z którego clone robiliśmy)

1
hg pull http://....

Pobiera zmiany z podanego repozytorium (w robocie robimy hg pull ~user/projekt)

1
hg pull -b BRANCH

Pobiera zmiany z repo z danego brancha

1
hg push

Wysyła zmiany do zdalnego repo

1
hg branch NAZWA

Tworzy nowy branch o nazwie NAZWA i wciąga wszystkie zmodyfikowane pliki do niego

1
hg up NAZWA

Robi switch z jednego brancha do drugiego (jeśli istnieje)

1
hg resolve

Rozwiązuje konflikty (odpala przy okazji hg merge)

1
hg glog

Pokazuje graficznie commity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@  6[tip]:3   afa542a627b0 (branch1)   2010-05-20 15:44 +0200   Paweł Kobylak
|    Commit6
|
| o  5   11f79fb03f4b (branch2)   2010-05-20 15:43 +0200   Paweł Kobylak
| |    commit 5
| |
| o  4:1   eb05044a9a79 (branch2)   2010-05-20 15:41 +0200   Paweł Kobylak
| |    commit 4
| |
o |  3   8c6c0b277b88 (branch2)   2010-05-20 15:37 +0200   Paweł Kobylak
| |    commit 3
| |
o |  2   8a7bc16edebf (branch1)   2010-05-20 15:16 +0200   Paweł Kobylak
| |    commit2
| |
| o  1   069476d6234e (branch2)   2010-05-18 14:28 +0200   Paweł Kobylak
|/     commit1
|
o  0   e0f21d6412e7   2010-05-18 10:28 +0200   Paweł Kobylak
     Inicjalizacja

Fajne :)

Stawianie serwera (podstawowego). Nie jest to zalecane bo nie ma autoryzacji itp… Ale jak ma się serwerek w domu czy w małej firmie to w sam raz będzie.

Robimy sobie nowy katalog np ~/repos, zassysamy do niego wszystkie repozytoria do których chcemy mieć dostęp. Następnie tworzymy plik hgweb.config o następującej zawartości:

1
2
3
4
5
6
[collections]
/home/noose/repos/ = /home/noose/repos/ # sciezka do kolekcji repozytoriów

[web]
push_ssl = false # push będzie bez ssl'a
allow_push = * # zezwalamy na push - standardowo jest tylko odczyt

następnie:

1
hg serve --webdir-conf ~/repos/hgweb.config -p 8001 -A /sciezka/do/access_logu -E /sciezka/do/error_logu -d

i wchodzimy na http://localhost:8001 :) następnie się cieszymy, że wszystko chodzi ;]
Każdy developer klonuje z tego miejsca repozytorium:

1
hg clone http://host:8001/projekt

i jest centralne repo :)

niedługo więcej tekstów ;)

Montowanie $HOME (ecryptfs) z backupu

Jak pisałem wcześniej – miałem problemy z dyskiem. Dzisiaj tutka część dalsza – dzisiaj montujemy szyfrowany home z backupu :)
W sumie zamiast się rozpisywać – dam linka. Mi pomógł: http://blog.dustinkirkland.com/2009/03/mounting-your-encrypted-home-from.html

Montowanie szyfrowanego LVM pod Ubuntu

Witam,

Dzisiaj będzie bez PHP, za to będzie linux ;) Siadł mi dysk z szyfrowaną partycją lvm2 i miałem problem, żeby się do tego dostać. Szybkie todo, może komuś się przyda

aptitude install lvm2 libpam-mount cryptsetup
sudo cryptsetup luksOpen /dev/sdb5 crypt1 # po tym wpisujemy hasło
lvmdisplay

i wyskakuje nam coś takiego

--- Logical volume ---
LV Name                /dev/noose-laptop/root
VG Name                noose-laptop
LV UUID                X2iug7-AbTR-YJ2L-zC43-jiUj-B9dH-x2tG9G
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                143,07 GB
Current LE             36627
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           252:1

--- Logical volume ---
LV Name                /dev/noose-laptop/swap_1
VG Name                noose-laptop
LV UUID                l2xKTx-i6HU-1j1j-V9ok-ub3O-8zer-Glxzga
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                5,73 GB
Current LE             1468
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           252:2

(interesuje nas LV name), następnie:

mount /dev/noose-laptop/root /media/usb/

i podmontowane :)

mam nadzieję, że komuś się przyda ;)

btw, w razie problemów przed cryptsetupem wpiszcie

sudo modprobe dm-crypt

Mongo replikacja – testy

logo mongodbW końcu się zabrałem za napisanie notki na blogu :)

Jakiś czas temu potrzebowaliśmy zrobić testy wydajnościowe mongodb. Muszę powiedzieć, że wyniki wyszły zadowalająco :)

Dane które były wrzucane do bazy miały ok 76kB / wiersz. Dla wyjaśnienia:

1 połączenie to 100 000 operacji (jakie i w jakiej ilości – opisane jest w drugiej tabeli). Wszystkie operacje były wykonywane po kluczach głównych lub innych zdefiniowanych.

Mongo - czasy

Ilość równoległych połączeń Czas [sek] (SSD) Czas [sek] (SAS) Czas na połączenie [sek] (SSD) Czas na połączenie [sek] (SAS)
1 2,05 2,76 2,05 2,76
100 101,42 133,46 1,01 1,34
200 213,28 293,36 1,07 1,47
300 324,51 440,45 1,08 1,47
400 444,32 621,17 1,11 1,55
500 559,72 788,71 1,12 1,58
600 729,28 1 040,53 1,22 1,73
700 851,77 1 237,30 1,22 1,77
800 1 024,33 1 462,43 1,28 1,83
900 1 146,72 1 732,19 1,27 1,93
1000 1 306,4 1 998,83 1,31 2,00

Mongo - ilość operacji w jednym połączeniu

Typ % Ilość
Insert (+status) 6,5% 6 500
Update (+status) 3% 3 000
Delete (+status) 3% 3 000
Select 87,5% 87 500
Razem 100% 100 000


Maszyny na których przeprowadzane były testy (SSD i SAS miały identyczne konfiguracje jako master i slave)

  • SSD
    • Dual Quad Core
    • 12GB ram
    • 4x SSD 50GB (RAID 10)
    • 1gbps LAN
  • SAS
    • Dual Quad Core
    • 12GB ram
    • 6x SSD 143GB 10k rpm (RAID 10)
    • 1gbps LAN
  • Klient
    • Dual Quad Core
    • 12GB ram
    • 6x SSD 143GB 10k rpm (RAID 10)
    • 1gbps LAN
I jeszcze dwa wykresiki (wieczorem zrobię je jeszcze raz – będą lepiej wyglądać):

Jak widać wydajność rośnie liniowo :) Dodatkowo na master i slave są identyczne dane (jest chyba sekundowy lag), ale jest to zasługą tego, że inserty i reszta lecą z sprawdzaniem statusu. Zapuściłem jeszcze test dla 35 000 równoległych połączeń – baza zdechła… Ale była to wina tego, że system nie wytrzymał ilości połączeń i maszyny zdechły :)
Jak ma ktoś pytania – piszcie w komentarzu.
btw, nie mam już dostępu do tych maszyn, więc ciężko ze zrobieniem dodatkowych testów :(