Sunday, 7 July 2013

[Git] Experimenting with git ls-files. Show ignored files in git.

This post describes, my experiments with git ls-files command.

 In repository, we have files:

.DS_Store (Mac OS X, folder settings file)
.git (Git repository file)
.gitignore (Git ignore file)
ignoredFile (Some file, that should be ignored)
inRepo (File in repository)
untracked (Som untracked file)
staged (Staged file)


This command show us, all committed files and staged files.
$ git ls-files
.gitignore
inRepo
staged


This command show us, all files that are ignored or untracked. Those files are called 'other'.
$ git ls-files --others
.DS_Store
ignoredFile
untracked


This command show us, all others files, without ignored files. Option exclude-standard means that standard git exclusion files are included.
$ git ls-files --others --exclude-standard
untracked


This command show us, all files that are ignored.
$ git ls-files --ignored --others --exclude-standard
.DS_Store
ignoredFile

In my global git ignore file, there is a rule to ignore all .DS_Store files. In my local git ignore file, there is a rule to ignore ignoredFile file.

Wednesday, 17 April 2013

Fest Assert

9 kwietnia 2013 roku wygłosiłem Flashtalk na temat FestAssert na Warszawa JUG.
Udostępniam:
- Nagranie
- Slajdy

Sunday, 24 February 2013

Trigger Jenkins build from BitBucket

W tym poście przedstawię jak zrobić, aby natychmiast po wypchnięciu zmian do BitBucket.org serwer ciągłej integracji rozpoczął proces budowania aplikacji.

Konfiguracja Jenkinsa

1. W związku z tym, że nasz Jenkins musi być dostępny publicznie, warto go trochę zabezpieczyć. Dostęp do Jenkinsa ograniczymy tylko dla zarejestrowanych użytkowników. Opcje konfiguracji zabezpieczeń powinny być ustawione tak jak na screenie poniżej. 

2. Nazwa użytkownika w tym przypadku to "lewy". Następnie musimy pobrać nasz "user API token". Znajdziemy go tutaj:

3. Następnie musimy włączyć dla naszego projektu, możliwość zdalnego triggerowania budowania:

4. Aby przetestować konfigurację Jenkinsa wywołaj zapytanie do serwisu:
http://lewy:USER_KEY@klkl.pl:8081/job/WorkTracker/build?token=PROJECT_KEY
Po wykonaniu tej operacji, nasz serwer Jenkinsa powinien ruszyć z nowym procesem budowania.

Konfiguracja BitBucketa

BitBucket'a konfigurujemy tak jak na screenie przedstawionym poniżej:

Jeżeli tak skonfigurujemy nasze środowisko, po pchnięciu zmian, serwer ciągłej integracji, powinien automatycznie rozpocząć budowanie aplikacji. 
Niestety BitBucket nie udostępnia żadnych logów, więc jeżeli coś nie działa, to pozostaje nam próbować zmieniać coś w ciemno, aż zadziała.




Saturday, 23 February 2013


Dnia 22 lutego, odbył się hackaton o nazwie NameCollision. Impreza zaczęła się punktualnie. FlashTalki dobrze nastawiły ludzi, do zrobienia czegoś fajnego.

Jest trochę po 19. W tym momencie mój film się urywa, gdyż z nowo poznaną osobą przystąpiliśmy do realizacji naszego projektu. Atmosfera ludzi kodujących coś w około powodowała, że jeszcze bardziej skupiałem się na tym co chcieliśmy osiągnąć.
Przegapiłem ciepły posiłek, posiliłem się tylko kilkoma kanapkami. Udało się wykonać to co z kolegą sobie założyliśmy, że zrobimy.
Dochodzi północ, moje bezpieczniki wysiadły, po całym dniu wstawania o 6 rano i chodzenia spać około 11, padłem. Jedyne o czym myślałem to sen.
Miłą niespodzianką na koniec były nagrody dla osób twardo kodujących :)

Po powrocie do domu około 3 w nocy, mój organizm powiedział, że ty już nie musisz spać i możesz kodować dalej ;p
Chciałbym podziękować organizatorom i sponsorom za tak świetnie przygotowany wieczór. Było ekstra. Więcej takich wydarzeń !

PS. Internet był niesamowity. 100Mbitów symetrycznego łącza, które działało bez zarzutu. Brawo dla organizatorów :)

Saturday, 22 December 2012

Replace with Regex

Ostatnio przechodziłem z HibernateSessionFactory konfigurowanego w kodzie na dobre hibernate.cfg.xml.
Wiąże się to z zamianą mapowań, których może być w dość dużo w projekcie:
configuration.addAnnotatedClass(pl.myproject.MyClass.class);
Każda klasa reprezentująca encje musi zostać zamieniona na coś takiego:
Najprostsze rozwiązanie jakie przychodzi to użycie zamiany z użyciem wyrażenia reguralnego. W naszych pięknych cudnych lśniących IDE należy włączyć tryb zamiany z użyciem wyrażenia reguralnego. W polu "find" definiujemy:
configuration.addAnnotatedClass\((.*).class\);
W polu "replace" definiujemy:
Klikamy "Replace All" i zrobione. Nie ma tutaj nic trudnego. Wybranie pierwszego podzbioru za pomocą dwóch nawiasów i wstawienie tego za pomocą $1.
Proste,a nawet banalne.
Za pewne każdy edytor tekstu potrafi takie rzeczy, jednak odnoszę wrażenie, że zbyt często próbujemy robić takie rzeczy ręcznie.

Monday, 16 January 2012

Tomcat cluster with mod_jk sticky session session replication

Przewodnik o tym jak zrobić klaster złożony z dwóch instacji tomcata połączonego load balancerem apache mod_jk i jak uruchomić replikację sesji oraz sticky-session. System operacyjny to lubuntu 11.10.

Z góry przepraszam, za dość surowe komendy. Nie jest to tutorial krok-po-korku ani książka, żeby rozlegle wszystko opisywać. Jest to tylko ściągawka na przyszłość, lub ekstrakt z tego co trzeba zrobić.

Adres IP należy zmienić z 10.0.0.90 na localhost czy gdzie tam wasz serwerek się znajduje.

1. Do zainstalowania:
apt-get install apache2 libapache2-mod-jk2-mod-jk

2. Utworzyć katalog:

/tcluster/instance1

3. Pobrać Tomcata i rozpakować zawartość do tego katalogu.

4. Konfiguracja Apache mod_jk
- utwórz plik /etc/apache2/workers.properties:

worker.list=loadbalancer,mystat

worker.worker1.type=ajp13
worker.worker1.host=10.0.0.90
worker.worker1.port=8881
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

worker.worker2.type=ajp13
worker.worker2.host=10.0.0.90
worker.worker2.port=8882
worker.worker2.lbfactor=50
worker.worker2.cachesize=10
worker.worker2.cache_timeout=600
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=300

worker.loadbalancer.type=lb
worker.loadbalancer.sticky_session=true
worker.loadbalancer.balance_workers=worker1,worker2

worker.mystat.type=status
Ważna jest nazwa workera ( worker1 oraz worker2 ) adres IP oraz port.

- do pliku /etc/apache2/ports.conf dodaj:
Listen 8585

- zmień zawartość pliku:
/etc/apache2/mods-enabled/jk.conf na:
JKWorkersFile /etc/apache2/workers.properties

JkLogFile /var/log/apache2/mod_jk.log

JkLogLevel debug

JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

JkRequestLogFormat "%w %V %T"


- dodaj nasłuch na porcie 8585 dla mod_jk:
/etc/apache2/sites-enabled/000-default
<VirtualHost *:8585>
        JkMount /* loadbalancer
        JkMount /jkstatus mystat
</VirtualHost>



5. Konfiguracja instancji nr 1:
- Zmień plik /tcluster/instance1/conf/server.xml tak aby przypominał:
...
<Connector port="8871" protocol="HTTP/1.1" /> 
...
<Connector port="8881" protocol="AJP/1.3" redirectPort="8443" />
.... <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1"> .... <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
Connectora się odkomentowywuje, jvmRoute trzeba dopisać, pole cluster się odkomentowywuje.

- Ściągnij z internetu http://code.google.com/p/psi-probe/ plik war i umieść go w katalogu webapps. Jest to aplikacja która może się później przydać.

-Dodaj użytkowników do tomcata:

/tcluster/instance1/conf/tomcat-users.xml
<tomcat-users>
...
  <role rolename="manager"/>
  <user username="admin" password="jakieshaslo" roles="manager"/>
</tomcat-users>



- Przejdź do katalogu: /tcluster/instance1/webapps
Zmodyfikuj examples/WEB-INF/web.xml dodając distributable:
<web-app ....>
  <distributable/>
</web-app>

6. Konfiguracja instancji nr 2:
- Skopiuj zawartość pliku /tcluster/instance1 do /tcluster/instance2
- Zmień plik /tcluster/instance2/conf/server.xml tak aby zmienić:

<Server port="8006" shutdown="SHUTDOWN">
...
<Connector port="8872" protocol="HTTP/1.1" /> 
...
<Connector port="8882" protocol="AJP/1.3" redirectPort="8443" />
....
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2">

6. Testowanie
Uruchamiamy wszystko:


/etc/init.d/apache start
/tcluster/instance1/bin/startup.sh
/tcluster/instance2/bin/startup.sh


Testy przeprowadzić najlepiej za pomocą aplikacji z przykładów:
W moim przypadku jest to:

http://10.0.0.90:8871/examples/servlets/servlet/SessionExample

Mamy trzy porty HTTP:
- 8871 - instancja nr 1
- 8872 - instancja nr 2
- 8585 - load balancer

Po dodaniu jakiegoś aktrybutu sesji i zmianie portu z 8871 na 8872 powinniśmy mieć ten sam SessionID (Sticky-session) oraz te same atrybuty(Replikacja sesji).

7. Dodatkowa analiza:
- Panel z informacja o mod_jk:

http://10.0.0.90:8585/jkstatus

-Probe (narzędzie do monitorowania) dostępne na danej instancji:


http://10.0.0.90:8871/probe
http://10.0.0.90:8872/probe

Tuesday, 3 January 2012

Komenda WC

Rekurencyjne liczenie linii kodu w danym katalogu:

wc -l `find . -type f`