Monthly Archives: December 2013

Monitoring openSuse with acct and netacct Tools

Monitoring openSuse with acct and netacct Tools

Every admin should know and use acct/psacct and net-acct tools to know is the system is secure. You probably will be forced to download these packages because it’s not included in standard software for operating systems. But it’s very useful, especially if you running Linux servers.

acct/psacct includes some commands:

ac  prints the statistics of users’ logins/logouts (that is connect time) in hours

lastcomm prints the information of previously executed commands of users

accton turns on/off process for accounting

sa summarizes information of previously executed commands

last/lastb presents the listing of last logged in users

To have any information about users activity on operating system, you need to turn on accounting by running:

linux-7tpy:/home/poganin # accton on
Turning on process accounting, file set to the default ‘/var/account/pacct’.
linux-7tpy:/home/poganin #

To turn accounting off, run:

linux-7tpy:/home/poganin # accton off
Turning off process accounting.

While accounting running, you can use a few commands to get information.

ac

let’s see the total the total statistics of connect time in hours

linux-7tpy:/home/poganin # ac
total      449.96
linux-7tpy:/home/poganin #

let’s see the total login time for the all users in the system

linux-7tpy:/home/poganin # ac -p
poganin                            449.99
total      449.99
linux-7tpy:/home/poganin #

let’s the total login time for the user poganin

linux-7tpy:/home/poganin # ac poganin
total      450.01
linux-7tpy:/home/poganin #

sa

let’s see all commands that have been executed by all users in the system

linux-7tpy:/home/poganin # sa
486 6475485.76re       8.76cp         0avio      4852k
8   16018.10re       5.00cp         0avio     48266k   chrome*
31   10543.12re       2.92cp         0avio     12607k   ***other*
3       0.00re       0.00cp         0avio       546k   which

2       0.01re       0.00cp         0avio       952k   xdg-mime*
2       0.00re       0.00cp         0avio       572k   iceauth
2       0.00re       0.00cp         0avio       625k   ip
2       0.00re       0.00cp         0avio       669k   sed
2       0.00re       0.00cp         0avio       655k   readlink
2       0.00re       0.00cp         0avio       712k   getent
linux-7tpy:/home/poganin #

let’s see all commands for each user

linux-7tpy:/home/poganin # sa -u
root       0.00 cpu     1226k mem      0 io bash            *
man        0.00 cpu      984k mem      0 io man             *
root       0.00 cpu      604k mem      0 io kdesu_stub
poganin    0.02 cpu      763k mem      0 io su
poganin    0.04 cpu    13318k mem      0 io QProcessManager *
poganin    0.37 cpu    25024k mem      0 io QInotifyFileSys
poganin    0.00 cpu      919k mem      0 io xdg-su
linux-7tpy:/home/poganin #

lastcomm

let’s see the last executed commands by all users in the system

linux-7tpy:/home/poganin # lastcomm
ip                     root     __         0.00 secs Sat Dec 28 13:24
gpg2             S     root     __         0.05 secs Sat Dec 28 13:24
y2base            F    root     __         0.00 secs Sat Dec 28 13:24
y2base            F    root     __         0.00 secs Sat Dec 28 13:24
linux-7tpy:/home/poganin #

let’s see the last executed commands by poganin user

linux-7tpy:/home/poganin # lastcomm poganin
CachePoolWorker      X poganin  __        99.60 secs Sat Dec 28 13:26
QProcessManager   F  X poganin  __         0.04 secs Sat Dec 28 13:06
su               S     poganin  pts/3      0.02 secs Sat Dec 28 13:06
linux-7tpy:/home/poganin #

let’s see the individual use of the man command

linux-7tpy:/home/poganin # lastcomm man
man              S     man      pts/1      0.10 secs Sat Dec 28 13:20
nroff             F    man      pts/1      0.00 secs Sat Dec 28 13:12
locale                 man      pts/1      0.00 secs Sat Dec 28 13:12
tbl                    man      pts/1      0.00 secs Sat Dec 28 13:12
preconv                man      pts/1      0.00 secs Sat Dec 28 13:12
man               F    man      pts/1      0.00 secs Sat Dec 28 13:12
linux-7tpy:/home/poganin #

last

let’s see the listing of last logged in users

linux-7tpy:/home/poganin # last
poganin  pts/1        :0               Sat Dec 28 15:10   still logged in   
poganin  pts/0        :0               Sat Dec 28 15:08   still logged in  
reboot   system boot  3.11.6-4-pae     Sun Dec  8 08:40 – 09:45  (01:04)    
poganin  pts/1        :0               Sat Dec  7 22:30 – 22:30  (00:00)    
poganin  pts/1        :0               Sat Dec  7 22:29 – 22:29  (00:00)    
poganin  pts/0        :0               Sat Dec  7 21:45 – 22:48  (01:03)    
reboot   system boot  3.11.6-4-pae     Sat Dec  7 21:43 – 22:48  (01:05)    
poganin  console      :0               Sat Dec  7 21:44 – crash  (00:00)    
reboot   system boot  3.11.6-4-pae     Sat Dec  7 21:43 – 22:48  (01:05)    
poganin  pts/3        :0               Sat Dec  7 20:44 – 20:45  (00:00)    
poganin  pts/1        :0               Sat Dec  7 19:48 – 19:48  (00:00)    
poganin  pts/0        :0               Sat Dec  7 19:44 – crash  (01:59)    
reboot   system boot  3.11.6-4-pae     Sat Dec  7 19:42 – 22:48  (03:06)    
poganin  console      :0               Sat Dec  7 19:43 – crash  (00:00)    
reboot   system boot  3.11.6-4-pae     Sat Dec  7 19:42 – 22:48  (03:06)    

wtmp begins Sat Nov 23 12:43:31 2013
linux-7tpy:/home/poganin #

let’s see the reboot information for your system

linux-7tpy:/home/poganin # last reboot
reboot   system boot  3.11.6-4-pae     Sat Dec 28 15:07 – 16:58  (01:50)    
reboot   system boot  3.11.6-4-pae     Sat Dec 28 15:07 – 16:58  (01:50)    
reboot   system boot  3.11.6-4-pae     Sat Dec 28 12:48 – 15:06  (02:18)    
reboot   system boot  3.11.6-4-pae     Sat Dec 28 12:48 – 15:06  (02:18)    
reboot   system boot  3.11.6-4-pae     Sat Dec 28 10:03 – 12:48  (02:44)    
reboot   system boot  3.11.6-4-pae     Sat Dec 28 10:03 – 12:48  (02:44)    
reboot   system boot  3.11.6-4-pae     Fri Dec 27 09:52 – 22:34  (12:41)    
reboot   system boot  3.11.6-4-pae     Fri Dec 27 09:52 – 22:34  (12:41)    
reboot   system boot  3.11.6-4-pae     Fri Dec 27 09:46 – 09:52  (00:05)   

wtmp begins Sat Nov 23 12:43:31 2013
linux-7tpy:/home/poganin #

lastb

let’s see all bad login attempts in the system

linux-7tpy:/home/poganin # lastb
poganin  pts/1                         Wed Dec 25 16:30 – 16:30  (00:00)    
poganin  pts/1                         Mon Dec 16 16:07 – 16:07  (00:00)    
poganin  pts/3                         Wed Dec  4 17:41 – 17:41  (00:00)    
poganin  pts/1                         Wed Dec  4 11:19 – 11:19  (00:00)    
poganin  tty1                          Fri Nov 29 16:28 – 16:28  (00:00)    
(unknown tty1                          Mon Nov 25 13:04 – 13:04  (00:00)    
(unknown tty1                          Mon Nov 25 13:04 – 13:04  (00:00)    

btmp begins Mon Nov 25 13:04:03 2013
linux-7tpy:/home/poganin #

netacct package use nacctd daemon to logs all traffic.

After installing the package, you can find it in /usr/sbin/nacctd. So you can start the daemon by running:

/usr/sbin/nacctd

The traffic logs are in /var/log/net-acct, so to see them, run
linux-7tpy:/home/poganin # cat /var/log/net-acct
1388241281      6       212.77.101.145  80      192.168.1.100   33121   260     eth0    unknown                        
1388241281      55      8.0.69.0        0       0.28.80.222     0       24064   wlan0   unknown
linux-7tpy:/home/poganin #

The information in output:

timestamp protocol src-addr src-port dst-addr dst-port count size user interface

It’s all what you need. If you wish to get more, just run

linux-7tpy:/home/poganin # man nacctd

That’s all.

Linphone Configuration on openSuse 13.1

Linphone Configuration on openSuse 13.1

1/ Download Linphone for your operating system from the link:

http://www.linphone.org/eng/download/packages/linphone.html

But when you have Linux installed, you probably will find it on your system ready to use. Check it!

2/ Start Linphone.

3/ If you have no account, you’ll get the wizard (the account assistant) for creating one, for example, let’s create an account for John Smith:

Email: aaa@gmail.com

Username: JohnSmith

Password: oooooo

Confirm your password: oooooo

4/ When you have your account created, wait for the details of your account that will come by e-mail. They will be useful for Linphone configuration.

5/ Go to Linphone window -> Options -> Preferences

6/ Manage SIP Accounts tab

Default identity

It is used when you don’t use a SIP account. In other words, you call in the same network, for example in your office. Good for contacts your friends at work.

Your display name: your name that will be displayed in Linphone and others can see it

Your username: your username you used during creating your account on linphone.org

Your resulting SIP address: your full SIP local address that should be generated by Linphone automatically; if you have dynamic IP address for your computer, it will be changed in Linphone, too.

Proxy accounts

Your SIP address for calling outside your network, across Internet

protocol:username@domain

When you are registered on linphone.org (it’s a domain name), you will get by email such information:

SIP Identity: sip:JohnSmith@sip.linphone.org

Username: JohnSmith

Domain/Proxy: sip.linphone.org

So you have all what you need. Your configuration should look in this way:

Default identity

Your display name: John Smith

Your username: JohnSmith

Your resulting SIP address: “John Smith” <sip:JohnSmith@192.168.1.230>

Proxy accounts

sip:JohnSmith@sip.linphone.org

7/ Configure a SIP account tab

Click on the sip:JohnSmith@sip.linphone.org item -> Click Edit -> write or paste:

Your SIP identity: sip:JohnSmith@sip.linphone.org

SIP Proxy address: <sip:sip.linphone.org>

Route(optional): you can leave it empty

Registration duration (sec): 60

Register Check it

Publish presence information You can check it to show the information about you

Click OK

8/ Go to Network Settings tab

Transport

Check Set Maximum Transmission Unit: 1500

Network protocol and ports

The most important thing is a network protocol. You have three: SIP (UDP), SIP (TCP), SIP (TLS). TLS is probably default because it’s secure, but sometimes it doesn’t work. When you finish the configuration and click Done, you see at the bottom of the Linphone window:

Registration on <…> failed.

or something like that. It should be

Registration on <…> successful.

And the tick on your right.

When you see that it isn’t successful, try to change the protocol. UDP works for me. It isn’t so secure, but sometimes it’s the only way out. Besides, it’s good for streaming.

The main port for Linphone: 5060

Audio RTP/UDP: 7078

Video RTP/UDP: 9078

NAT and Firewall

Usually, the default configuration is good for you.

Direct connection to the Internet checked

If you are behind a very restrictive NAT, sometimes you are forced to use other options.

9/ Multimedia settings, Codecs and User interface tabs may be unchanged

10/ Click Done

11/ At the bottom you should see:

Registration on <…> successful.

And the tick on your right. If you see that, your Linphone is configured well and ready to use.

12/ Add your contacts to Contacts

13/ Now you can call

ClamAV on openSuse

ClamAV on openSuse

ClamAV is a good antivirus software for Linux. Do you need it? Linux is a very safe operating system, but sometimes it’s good to check if everything is OK.

You can find ClamAV in your operating system repository. On openSuse, I just use Apper that is software for managing packages. Click Security, and you have all packages. Search clamav. Click to install it on your system if it has not been installed so far.

The most important command is clamscan. To see the version, just write on the console:

poganin@linux-7tpy:~> clamscan -V
ClamAV 0.98

But when you wish to scan the system and use clamscan (you must be a root!), you will get:

poganin@linux-7tpy:~> sudo clamscan

Ufamy, że lokalny administrator udzielił odpowiedniego szkolenia.
Zwykle sprowadza się ono do tych trzech rzeczy:

    1) należy respektować prywatność innych,
    2) należy myśleć przed pisaniem,
    3) z dużą władzą wiąże się duża odpowiedzialność.

root’s password:
LibClamAV Error: cli_loaddb(): No supported database files found in /var/lib/clamav
ERROR: Can’t open file or directory

———– SCAN SUMMARY ———–
Known viruses: 0
Engine version: 0.98
Scanned directories: 0
Scanned files: 0
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 0.004 sec (0 m 0 s)

In other words, it doesn’t work. You must update the virus database by running

poganin@linux-7tpy:~> sudo freshclam

as a root. Then, wait for the end of updating. You will see something like that:

ClamAV update process started at Wed Dec 25 13:37:10 2013
Downloading main.cvd [100%]
main.cvd updated (version: 55, sigs: 2424225, f-level: 60, builder: neo)                                                
Downloading daily.cvd [100%]                                                                                            
daily.cvd updated (version: 18284, sigs: 621876, f-level: 63, builder: neo)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 235, sigs: 44, f-level: 63, builder: dgoddard)
Database updated (3046145 signatures) from database.clamav.net (IP: 195.30.97.3)

The databases are in the files:

/var/lib/clamav/daily.cvd
/var/lib/clamav/main.cvd

ClamAV use these files to check if there’s no malware on your operating system.

Now run clamscan again:

clamscan /path/to/the/directory

And all files in the directory will be scanned. Look at the example:

linux-7tpy:/ # clamscan /home/poganin/worksSpring/Mirek/src/main/java/com/linaittech/Mirek
/home/poganin/worksSpring/Mirek/src/main/java/com/linaittech/Mirek/HomeController.java: OK

———– SCAN SUMMARY ———–
Known viruses: 3040793
Engine version: 0.98
Scanned directories: 1
Scanned files: 1
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 11.261 sec (0 m 11 s)

There’s one file in the Mirek directory. It’s status is OK so it’s not infected. At the end of scanning, you see the stats.

To get help and more options, just run the command:

linux-7tpy:/ # clamscan –help

You see that ClamAV is a very useful tool. However, you will be using the most often:

linux-7tpy:/ # clamscan -r –bell -i /

for scanning all files in your system.

-r  – Scan subdirectories recursively
–bell – Sound bell on virus detection
-i – Only print infected files

To remove an infected file, just run:

linux-7tpy:/ # clamscan -r –remove /home/poganin

It will remove all the infected files ClamAV has just found on your operating system. Be careful – the files are gone for good. Instead, better use this command:

linux-7tpy:/ # clamscan -r –move=/home/wirusy /home/poganin

–move=/home/wirusy – Move infected files into the /home/wirusy directory

With this option, all infected files will be moved to the directory during scanning. Then, you can check the infected files again and make a decision what to do with them.

I hope it’s clear.

W czym Linux jest lepszy od Windowsa?

W czym Linux jest lepszy od Windowsa?

Wiele jest artykułów na ten temat w Internecie, a wojna między linuksiarzami i windowsiarzami trwa i jest dotąd nierozstrzygnięta na korzyść jednej ze stron. Chciałbym, aby i mój głos był słyszalny w tym sporze. W końcu jestem użytkownikiem obu rodzin systemów od wielu lat i znam sferę IT doskonale. To daje mi prawo do sądów, które powinny być uznane za obiektywne przez czytelników tego artykułu.

Faktem jest, że dominuje na rynku Windows wśród desktopów, czyli sprzętu, który stoi na naszych biurkach w firmie i domu. I to Linux nie jest w stanie zmienić, chociaż bezsprzecznie dominuje wśród serwerów, mainframów, czy superkomputerów, a nawet urządzeń mobilnych. W sumie taki podział rynku mógł być zaakceptowany przez zwolenników Windowsa i Linuksa. I chociaż żadna ze stron nie porzuciła marzeń o dobiciu konkurencji, to jednak utrzymywało się formalne status quo. Do czasu!

Taki stan rzeczy nie mógł długo się utrzymać. W czasie status quo obie strony “zbroiły się”, a więc to była swoista cisza przed burzą. I tak ostatnio mieliśmy Windows 8 jako atak na pozycje urządzeń mobilnych ze słynnymi kafelkami oraz powstał projekt Ubuntu jako Linuxa, który ma być alternatywą dla desktopów. Obie inicjatywy nie udały się w stu procentach. Ani “kafelki” się nie przyjęły, a wręcz zostały zaatakowane przez masę użytkowników jako najgłupsza rzecz, jaka wyszła ze stajni Microsoft. Tak samo Ubuntu, mimo dużej popularności, został skrytykowanych przez bogów Open Source i GNU/Linuxa za to, że przestał być prawdziwym Linuxem.

Niby nic się nie zmieniło, bo podobne próby podejmowano od lat, aby zawojować rynek konkurencji, a jednak dużo się stało. To pokazało słabe strony tych systemów operacyjnych. Windows nie przyjął się w urządzeniach mobilnych, a Ubuntu w desktopach. W rezultacie Windows 8.2 skłania się do powrotu klasycznego menu z przyciskiem Start i Ubuntu traci na popularności na rzecz prawdziwych Linuxów, które mają błogosławieństwo bogów świata wolnego oprogramowania.

To pokazuje, że rzeczywiście przyzwyczajenie jest drugą naturą człowieka. Mimo nielicznych pozytywnych opinii o “kafelkach”, wypada zostawić przycisk Start, który jest powszechny w prawie wszystkich systemach operacyjnych. “Kafelki” powinny być w urządzeniach mobilnych, a więc powinny być oddzielne wersje dla desktopa i mobile. Desktop powinien mieć przycisk Start, bo nikt nie będzie macał paluchami ekran monitora. Trudne to fizycznie i niehigieniczne, a poza tym taki sprzęt jest kosztowny. Wystarczy to, co się nań napluje i co narobią muchy, plus kurz. Tłuste plamy po paluchach to za wiele. No a Ubuntu powinien wrócić do źródeł Linuxa, bowiem może być tak, że linuksiarze go wyklną i windowsiarze nim się nie zainteresują. A to oznacza śmierć całego projektu.

Używałem XP (Home i Pro) przez wiele, wiele lat. To był dobry system i rzeczywiście to był milowy skok dla Microsoftu. Ciągle jest używany i myślę, że przez wielu będzie nadal stosowany, mimo zapowiadanego końca wsparcia w kwietniu 2014 roku. Również siła przyzwyczajeń. Przycisk Start, ładny niebieski kolor i wiele innych zalet, które w praktyce nie są aż takie ważne dla użytkownika, ale cieszą oko. No właśnie i tu dochodzimy do sedna sprawy.

Aby system operacyjny osiągnął sukces, musi spełniać pewne kryteria. Jakieś osiemdziesiąt procent użytkowników systemów to, przepraszam za wyrażenie, idioci i lenie. Dosadne, ale prawdziwe. Taki punkt odniesienia powinni założyć ci, co mają wpływ na rozwój systemu operacyjnego. Te wszystkie wrzaski windowsiarzy, że Linux jest taki trudny. Nic nie można zainstalować, wszystkiego trzeba długo szukać w internecie i już nawet gdy to coś się znajdzie, to i tak brak jakieś biblioteki w systemie. Prawda, Linux jest trudniejszy niż Windows. Ale tylko dlatego, że ma nieco inną filozofię, architekturę i inne rzeczy niż produkt giganta z Redmont. Inny tak naprawdę nie oznacza gorszy, czy tym bardziej trudny. A ta cała “trudność” Linuxa to po prostu brak przyzwyczajenia. I taki windowsiarz lamentuje i płacze zamiast ruszyć główką, czasem trochę poczytać w necie. Naprawdę Linux dokonał wręcz “cywilizacyjnego” skoku od magicznego czarnego okienka. Z racji pracy (darmowej!) zapaleńców na całym świecie Linux nie stoi w miejscu. Dlatego oczekujcie kolejnych “cywilizacyjnych” skoków, które sprawią, że pingwinki szybko prześcigną rozwiązania konkurencji. Zwłaszcza widoczne są wielkie postępy w grafice. Tymczasem Windows to filozofia mniej za więcej, czyli mniej softu za większą kasę, jakby ktoś nie wiedział. Podstawową zasadą są zyski. Myśleli, że zarobią na “kafelkach”, a tu… lipa! Dlatego w panice zaczęto rozważania do powrotu menu Start. Nie oszukujmy się, Windows 8 się nie sprzedaje, jakby tego w Microsoft chcieli. Ciągle rynek jest trzymany przez XP. No i oczywiście Windows 7, który jest godnym następcą słynnego xpeka. Jednak ciągle ma wady typowe dla rodziny Windows. W końcu to nieco unowocześniony XP, architektura podobna, tylko interfejs graficzny ulega zmianie. Bo w końcu grafika w systemie jest dla przeciętnego użytkownika najważniejsza. Taki ktoś nie myśli o bezpieczeństwie systemu czy jego stabilności.

Bezpieczeństwo zawsze było piętą achillesową okienek. To jest wręcz banał, klepany od lat. Każdy o tym wie. A może nie każdy? I niewiele się tu zmienia. Zrobiono sporo, ale ciągle sprawa bezpieczeństwa Windows pozostawia wiele do życzenia. I nie chodzi tu o jakieś durne wyskakujące okienka z potwierdzaniem każdej czynności w systemie – to jest wręcz irytujące. Tu chodzi o odporność całego systemu na ataki, a to sprawa architektury systemu. I tu jest nadal źle. Serfowanie po internecie z Windowsem to spore ryzyko. Dlatego mądrzy ludzie używają do tego Linuxa. System ten ma dużą odporność na malware, bo ma inną architekturę wynikającą z długich doświadczeń UNIXa. Nie jest bezpieczny w stu procentach, bowiem to właśnie sam użytkownik jest najsłabszym ogniwem. Na głupotę tego ostatniego trudno poradzić. Faktem jest, że ponad 90% malware pisanych jest na Windows. Wpływ na to mają takie czynniki jak:

– popularność systemu

– znienawidzenie polityki Microsoft przez większość szanujących się hakerów

– niska odporność systemu na ataki

Popularność Windowsa to istotny czynnik mający wpływ na tworzenie wirusów. Zrobię sobie trojana. I tak w końcu trafi na źle zabezpieczone komputery. W końcu mamy miliony systemów Windows i iluś tam właścicieli zawsze okaże się naiwniakami. Linuksowych desktopów jest dużo mniej i dlatego trudniej trafić ofiarę.

Kto lubi Microsoft? Chyba tylko ci, co tam pracują. A i tam pojawiają się głosy krytyczne. Część użytkowników lubi, bowiem ta część ma radochę z fajnego systemiku, ale nic nie wie o polityce giganta z Redmont. Windows robił, robi i prawdopodobnie będzie robić wszystko, aby zdobyć monopol na świecie i dyktować ceny softu. Wszelkie działania zmierzają do tego, aby być niekompatybilnym z czymkolwiek. Nakładane są ogromne kary finansowe, ale to za bardzo nie zraża Microsoftu. Utrudniają współpracę i robią to iście po chamsku. Przypomina mi się tu słynna sprawa z Sambą i współdzieleniem plików i drukarek. Na tym cierpi użytkownik, czyli TY, a pewnie nie jesteś tego świadom. Wolność wyboru jest podstawowym prawem człowieka, a ci z Redmont chcą ten wybór nam odebrać. Nieładnie!

Każdy, kto używa okienek, wie, że Windows bez antywirusa nie powinien być podpinany do internetu. To tylko podstawowa ochrona, a skuteczność jej nie jest zadowalająca. Ja na moim XP miał kilkadziesiąt różnych programów, które dbały o bezpieczeństwo systemu. Dzięki temu miałem bezpieczne środowisko pracy. I to zawsze coś wlazło w system. Raz miałem słynnego trojana udającego policję i wcale nie byłem na stronie porno. Ale to podobno wina dziurawej Javy. Nie ważne, istotne jest, że mnóstwo czasu spędzałem skanując komputer i badając ruch sieciowy. Strata czasu!

Są  jednak i tacy, co mają ambicje napisać coś niedobrego na Linuksa. Naprawdę podziwiam ich umiejętności, bowiem muszą być nieprzeciętne. Są także odważni, gdyż:

– stosunkowo niewielka popularność systemu

– ukochane dziecko hakerów, dopieszczone do granic fizycznych możliwości

– wysoka odporność na ataki

Mimo wielu zalet i niewielu wad, Linux nie jest zbyt popularny jako system desktopowy i nieprędko będzie w obliczu nieuczciwych praktyk Microsoftu (np. sprzedawanie komputerów razem s systemem). Niektórzy wręcz twierdzą, że w ogóle nie będzie, ale ja z tym się nie zgadzam. Spodziewam się, że Linux w końcu na tyle dojrzeje, iż zaspokoi tych najbardziej wymagających. Póki co, celów do trafienia jest więc niewiele. Liczbę aktywnych Linuksów można sprawdzić na ciekawej stronce: http://linuxcounter.net/. Z moich obserwacji i doświadczenia wynika, iż desktopowych systemów operacyjnych bazujących na technologii UNIX jest w użyciu od 20 do 30%. Większość z nich jest jednak używana równocześnie z Windows.

Zwykle to krakerzy, czyli ta gorsza część hakerów, pisze wirusy po to, aby komuś zaszkodzić. Trzeba powiedzieć jasno: to przestępcy. Mają takie umiejętności. Jednak dla nich Linux to świętość, bowiem często sami go współtworzą. Niewielu renegatów ośmiela się podnieść rękę na ten system. Poza tym reszta hakerów, tych dobrych, wie jak zabezpieczyć system, aby ci źli niewiele mogli zdziałać. Jak w strategii wojennej, środki obrony zdecydowanie przeważają nad środkami ataku. Na szczęście. Dla użytkownika oczywiście.

I stąd właśnie wynika ta słynna odporność Linuksa na ataki krakerów. Admini wiedzą, że nawet zainfekowany Linux daje się używać. Nikt jednak nie powiedział, że można spać spokojnie, bowiem nie ma siły na Linuksa. Czasami urodzi się geniusz albo głupi użytkownik i zdarzy się skuteczny atak. Bardzo rzadko, nie każdego dnia jak pod Windowsem. Generalnie wirusy są niegroźne na Linuksa. Tak samo robaki czy trojany. Jednak taki Linux może zainfekować Windowsy w sieci. Co do samego Linuksa, to dosyć groźne są botnety. Tutaj zalety Linuksa mogą okazać się jego wadami, gdyż pingwinek doskonale nadaje się do bycia groźnym zombie. Na szczęście mamy wiele poziomów bezpieczeństwa w Linuksie i przejście ich jest dosyć trudne dla intruza. Ale niestety możliwe. Wystarczy zachować zdrowy rozsądek i używać dobrego hasła do roota. O odporności pingwinka na ataki niech świadczy to, iż przytłaczająca większość serwerów chodzi na Linuksie. Admini i projektanci sieci komputerowych po prostu wiedzą, co dobre. Nawet podobno Microsoft używa do tego Linuksa…

Inną ważną kwestią jest to, że kod Windowsa jest zamknięty. My nie wiemy, co tam jest zawarte. Wiele gigabajtów kodu, a tak niewiele użytecznego softu w systemie. Nie zastanawiało Was to? Po co, do cholery? Ano po to, aby zainstalować tam parę “fajnych” rzeczy, przed którymi rozsądny człowiek się broni. Szpiegostwo! Mówi Wam to coś? Nie od dziś wiadomo, że Microsoft ma układy z agencjami wywiadowczymi USA. To nie mit. Windows na każdym komputerze w każdym kraju i w każdej rodzinie. Grzech tego nie wykorzystać. Użytkownicy Windows dostarczają mnóstwa pożytecznych informacji dla FBI, CIA, NSA i innym potworkom. Nie każdy jest terrorystą, ale do licha ich to nie obchodzi. Chcecie ujawniać wszystko to, co robicie w wirtualnym świecie? Już fejsbuk jest wystarczającą kopalnią wiadomości o Was i Waszym życiu. Na pewno nie będzie przesady jak powiem, że głównym celem giganta z Redmont jest szpiegowanie, a nie dostarczenie dobrego oprogramowania. Płacicie za system i w nagrodę macie wszechstronnego trojana. To samo dotyczy Maca. No i chyba Ubuntu. Tylko Open Source daje dużą gwarancję, że nie będziecie szpiegowani. Kod w prawdziwym Linuksie powinien być otwarty. Każdy może zajrzeć do środka, aby sprawdzić, co instaluje na komputer. Społeczność wspierająca Linuksa kontroluje sama siebie. Tu nie ma miejsca na jakieś nieczyste zagrywki. I dlatego ta idea się sprawdza.

Windowsiarze argumentują, że na Linuksa nie ma tyle oprogramowania, co na Windowsa. W pewnym sensie jest to prawda, ale na Maca jest jeszcze mniej i są tacy, co płacą słono za ten system. Chyba tylko dla szpanu, bowiem Mac to nie żadna rewelacja. To po prostu przerobiony UNIX. Tak, OS X, którego używasz, jest pokrewny Linuksowi. To nie jest Linux, ale mają wspólnego zacnego przodka. A skoro tak, to dlaczego nie wybrać darmowego Linuksa? Oprogramowanie? Są tysiące pakietów dla Linuksa i liczba ich rośnie. Każdy sobie coś znajdzie. Nawet sam system tuż po zainstalowaniu zawiera mnóstwo pożytecznego softu. 90 czy nawet 100% tego, czego potrzebujesz i wymagasz od nowoczesnego systemu. W porównaniu do tego Windows po zainstalowaniu jest “goły”, nawet w wersji Ultimate. To, że czegoś na Linuksa nie ma, to nie wina samego Linuksa. To firma, która nie produkuje wersji na Linuksa, ponosi za to pełną odpowiedzialność. Dobrym tego przykładem jest Unity3D. Mnóstwo ludzi prosi o edytor na pingwina. I jak dotąd prośby nie odnoszą skutku. Czyni tak wiele firm. Czyżby byli przekupieni przez Microsoft?

Nie trafia do mnie tłumaczenie, że zbyt mało jest użytkowników Linuksa. Wszelkie dane na ten temat podawane w internecie są mało wiarygodne. Trudno jest policzyć użytkowników Linuksa. Jednak, jak już pisałem, z moich obserwacji i doświadczeń wynika, że ok. 20-30%. Część z tych ludzi używa i Windowsa, i Linuksa. I to jest rozsądne wyjście. Rzeczywiście Windows w pewnych dziedzinach jest po prostu lepszy. Jeszcze lepszy, bo kto wie, co będzie jutro. Branża IT rozwija się błyskawicznie, a w tym dystrybucje Linuksa. Widać to po częstych aktualizacjach systemu. Ciągle pracują nad ulepszeniami. Dobrym tego przykładem jest openSuse.

Z tą dystrybucją mam do czynienia od lat i właściwie byłem jej wierny przez ten czas. Eksperymentowałem trochę z innymi pingwinkami, ale jednak openSuse jakoś jest najbardziej przekonywający. Być może i są lepsze Linuksy, jednak ten system ma wiele zalet, które cenię. I tutaj z wersji 12.2 przeskoczyłem do 13.1. Zostałem pozytywnie zaskoczony. Zachowano niezawodność i stabilność dawnego suska i dodano wspaniałą grafikę, w tym tą 3D. Istotnie, kiedyś openSuse odstawał graficznie od Windowsa, ale teraz wraz z dystrybucją 13.1 wszystko się zmieniło. Dzisiaj Linux to nie tylko czarne okienko straszące windowsiarzy, ale też i wspaniała grafika. Niewątpliwie jest to krok w dobrym kierunku, co zostało zapoczątkowane przez Ubuntu. Po prostu postawiono na perfekcyjną grafikę. W ten sposób droga do zdobycia rynku desktopów została otwarta. Bez żalu wywaliłem mojego starego xpeka. Przede mną nowoczesny system, który jest w stanie spełnić oczekiwania najbardziej wymagających windowsiarzy. Problem polega tylko na tym, czy zechcą lekko nagiąć swoje przyzwyczajenia. Pewnie z czasem to nastąpi. Odpływ użytkowników od Windowsa jest możliwy. Jednak Linux musi jeszcze popracować nad pewnymi niedociągnięciami.

Wiele zrobiono, ale ciągle trzeba popracować nad wyszukiwaniem i instalowaniem oprogramowania dla Linuksa. To musi być łatwość zbliżona do tego, co mamy pod Windowsem, aby przyciągnąć nowych użytkowników. Nie może być biegania po internecie, bo ludzie są za leniwi. I wielu ma problemy z licznymi dystrybucjami i tymi numerkami od wersji. Muszą jakoś społeczności linuksowe się porozumieć i nieco ujednolicić cały system oprogramowania, aby każdy pakiet można było zainstalować na każdym Linuksie. To byłby ideał. Bez tego windowsiarze będą wiecznie narzekać.

Linux jest w stanie zastąpić Windows prawie we wszystkim. Prawie, ponieważ jest jedna dziedzina, która ciągle kuleje. Tak, to są gry. Dla mnie to nie jest koniec świata, bowiem nigdy wielkim graczem nie byłem. Jednak wiem, że wielu by chciało widzieć platformę linuksową idealną do gier. To jest bastion Windowsa, niezdobyty, ale pojawiają się pierwsze wyłomy. I tak udało się nam uruchomić Unity3D z Wine i PlayOnLinux. Na openSuse 13.1 działa doskonale (napisałem o tym artykuł na tym blogu). Ale to za mało, czekamy na powstanie prawdziwych silników do tworzenia gier na Linuksa, łatwych do instalacji i w obsłudze, bez kombinowania i bez emulacji. Tutaj mamy przede wszystkim inicjatywę Valve i Steam. Nie będę w to wnikał, zainteresowanych odsyłam do internetu. Na Linuksie mamy wspaniałą akcelerację 3D, a OpenGL jest nawet lepsza niż słynny DirectX. No to, gamedeveloperzy, do dzieła!

I windowsiarze jeszcze powiedzą, że Photoshop i parę innych programików nie działa na Linuksie. To fakt, ale — powtórzę jeszcze raz — brak jakiegoś programu dla Linuksa to nie wina samego Linuksa. Mamy linuksowe zastępniki, czasami lepsze od oryginałów. I darmowe. Dokonał się tu znaczny postęp i ciągle przybywa tego softu. Sprawdzajcie zatem repozytoria. Być może GIMP okaże się dla Was lepszy niż produkt Adobe. Z drugiej jednak strony, ilu ludzi używa tego Photoshopa czy innego programu niedostępnego na Linuksa? Garstka. Czy to może dyskwalifikować Linuksa jako system. Dla jednych pewnie może, ale dla większości to nie jest powód, aby nie poświęcić trochę czasu i trudu i nie zainstalować darmowego, eleganckiego i przyjaznego użytkownikowi Linuksa. Wybór dystrybucji pozostawiam Wam, ponieważ sami najlepiej wiecie, czego Wam trzeba. Macie wybór. To zupełnie inna polityka niż to, co robi Microsoft

Miłego linuksowania,

Tomasz “Tomza” Zackiewicz

Lina IT Technologies

P.S. Wszystkim windowsowym niedowiarkom proponuję openSuse 13.1 ze środowiskiem KDE. To system, który nigdy nie zawodzi i ma największe szanse być prawdziwą konkurencją dla Windowsa na rynku desktopów.

An “ApplicationException: Unable to find a suitable compiler” Error in Unity3D

An “ApplicationException: Unable to find a suitable compiler” Error in Unity3D

When we try to manipulate our assets, we can get the error:

ApplicationException: Unable to find a suitable compiler

UnityEditor.Scripting.ScriptCompilers.CreateCompilerInstance (MonoIsland island, Boolean buildingForEditor, BuildTarget targetPlatform) (at C:/BuildAgent/work/xxxxxxxxxxxxxxxx/Editor/Mono/Scripting/ScriptCompilers.cs:XX)

And you can’t run “Play” button.

Of course, we can use

Assets -> Reimport All

But does it help you every time you run this command? You wait, wait, and wait for the end of importing. And always the same! You see the error.

I got the error too. And I started to search the problem in my assets. And now I know that if you see such an error, just look into your Assets folder in your Unity project. Remember:

No libraries (that are .dll files in Windows) should be in the Assets folder!!!

And you should remove all directories that contain libraries from the Assets folder. It’s the problem that cause this error. All the libraries must be outside this folder. It’s only for assets.

Java Collections for Beginners

Java Collections for Beginners

Java Collections are objects that can include many other objects. And these objects can be treated as one set of data.

Collection interfaces (and their most popular implementations)

– List (ArrayList, LinkedList)

– Queue (PriorityQueue):      Deque (ArrayDeque)

– Set (HashSet):     SortedSet              NavigableSet

Let’s look at using List interface (and its ArrayList and LinkedList implementations) that is the most popular.

We could write the code in this way:

package com.linaittech;

import java.util.*;

public class Kolekcje {

public static void main(String args[]) {

List list = new ArrayList();

list.add(“Ela”);
list.add(“Ula”);
list.add(“Ola”);
list.add(“Iza”);
list.add(“Mika”);

System.out.println(list);
System.out.println(“2: ” + list.get(4));
System.out.println(“0: ” + list.get(0));
System.out.println(“1: ” + list.get(1));

LinkedList queue = new LinkedList();

queue.addFirst(“Benek”);
queue.addFirst(“Olek”);
queue.addFirst(“Bolek”);
queue.addFirst(“Tolek”);
queue.addFirst(“Gienek”);
queue.addFirst(“Gienek”);

System.out.println(queue);

queue.removeLast();
queue.removeLast();

System.out.println(queue);

queue.removeFirst();
queue.removeFirst();

System.out.println(queue);

}

}

We have the output:

[Ela, Ula, Ola, Iza, Mika]
2: Mika
0: Ela
1: Ula
[Gienek, Gienek, Tolek, Bolek, Olek, Benek]
[Gienek, Gienek, Tolek, Bolek]
[Tolek, Bolek]

But it’s a bad way. We should write in this way:

package com.linaittech;

import java.util.*;

public class Kolekcje {

public static void main(String args[]) {

List<String> list = new ArrayList<String>();

list.add(“Ela”);
list.add(“Ula”);
list.add(“Ola”);
list.add(“Iza”);
list.add(“Mika”);
list.add(“Wiki”);

System.out.println(list);
System.out.println(“2: ” + list.get(4));
System.out.println(“0: ” + list.get(0));
System.out.println(“1: ” + list.get(1));

LinkedList<String> queue = new LinkedList<String>();

queue.addFirst(“Benek”);
queue.addFirst(“Olek”);
queue.addFirst(“Bolek”);
queue.addFirst(“Tolek”);
queue.addFirst(“Gienek”);
queue.addFirst(“Gienek”);

System.out.println(queue);

queue.removeLast();
queue.removeLast();

System.out.println(queue);

queue.removeFirst();
queue.removeFirst();

System.out.println(queue);

}

}

We have the output:

[Ela, Ula, Ola, Iza, Mika, Wiki]
2: Mika
0: Ela
1: Ula
[Gienek, Gienek, Tolek, Bolek, Olek, Benek]
[Gienek, Gienek, Tolek, Bolek]
[Tolek, Bolek]

The output is the same, so what’s the problem? Because there can some problems with implementing some interfaces using the first example, you should use the second method, in which we see some generics. We use simply generic types here. Compare

List list = new ArrayList();

and

List<String> list = new ArrayList<String>();

The difference is that we know that we will deal with String type. References to generic types should be parametrized. It’s a safer way for us. We can also use Integer, for example.

package com.linaittech;  
 
import java.util.*;  
 
public class Kolekcje {  
 
    public static void main(String[] args) {  
        List <Integer> firstList = new ArrayList<Integer>();  
        List <Integer> secondList = new ArrayList<Integer>();
        
        firstList.add(1);  
        firstList.add(2);  
        firstList.add(3);  
        firstList.add(4);  
        firstList.add(5);  
      
          
        secondList.add(10);  
        secondList.add(20);  
        secondList.add(30);  
        secondList.add(40);  
        secondList.add(50);  
          
        System.out.println(“Our First List-“+ FirstList);  
        System.out.println(“Our Second List-“+ SecondList);
        
        Collections.copy(SecondList, FirstList );
        
        System.out.println(“Our First List After Having Copied-“+ FirstList);
        System.out.println(“Our Second List After Having Copied-“+ SecondList);
        
        Collections.shuffle(FirstList);
        Collections.shuffle(SecondList);
        
        System.out.println(“Our First List After Having Copied-“+ FirstList);
        System.out.println(“Our Second List After Having Copied-“+ SecondList);
    }  
}

Now, we have

List <Integer> FirstList = new ArrayList<Integer>(); 

and

List <Integer> SecondList = new ArrayList<Integer>();

Thanks to generics we know we will deal with Integer type. We can’t add a type that isn’t Integer, for example String. Thanks to that, we can use all methods that are in the Integer class,  and there won’t any complaints during compilation (in Eclipse IDE, for example).

Spring Application with Dependency Injection – Setter (Inner Beans)

Spring Application with Dependency Injection – Setter (Inner Beans)

Let’s see how to write a simple Spring application with DI using constructor. This time we are going to use inner beans. We have the following files in our project:

MainApp.java

package com.linaittech;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext(“Beans.xml”);

Mirek mireczek = (Mirek) context.getBean(“mirek”);
mireczek.mirekMethod();

}

}

Mirek.java

package com.linaittech;

public class Mirek {

private Murek mureczek;
private Burek bureczek;

   public void setMureczek(Murek mureczek) {
System.out.println(“We are inside the setMureczek.” );
this.mureczek = mureczek;
}

 public void setBureczek(Burek bureczek){
System.out.println(“We are inside the setBureczek.” );
 this.bureczek = bureczek;
}

public Murek getMureczek() {
return mureczek;
}

public Burek getBureczek(){
return bureczek;
}

public void mirekMethod() {
mureczek.murekMethod();
bureczek.burekMethod();
}

}

Murek.java

package com.linaittech;

public class Murek {

public Murek(){
System.out.println(“We are inside the Murek constructor.” );
}

public void murekMethod() {
System.out.println(“We are inside the murekMethod.” );
}

}

Burek.java

package com.linaittech;

public class Burek {

public Burek(){
System.out.println(“We are inside the Burek constructor.” );
}

public void burekMethod() {
System.out.println(“We are inside the burekMethod.” );
}

}

Beans.xml

<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns=”http://www.springframework.org/schema/beans&#8221; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd”&gt;

<!– definitions with using inner beans –>
 
<bean id=”mirek”>

<property name=”mureczek”>
<bean id=”murek”/>
</property>

<property name=”bureczek”>
<bean id=”burek”/>
</property>

</bean>

</beans>

You can run it and see the output:

gru 12, 2013 3:10:32 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@44a541: startup date [Thu Dec 12 15:10:32 CET 2013]; root of context hierarchy
gru 12, 2013 3:10:32 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Beans.xml]
gru 12, 2013 3:10:33 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@91762: defining beans [mirek]; root of factory hierarchy
We are inside the Murek constructor.
We are inside the Burek constructor.
We are inside the setMureczek.
We are inside the setBureczek.
We are inside the murekMethod.
We are inside the burekMethod.

The red lines is the most important for us. We injected two methods (murekMethod and burekMethod) from two beans (Murek and Burek) into the Mirek bean. We used the setters in the Mirek bean, and all was managed by Beans.xml. However, here we have beans defined in another bean that is between <property> and </property> elements.

Spring Application with Dependency Injection – Setter

Spring Application with Dependency Injection – Setter

Let’s see how to write a simple Spring application with DI using constructor. We have the following files in our project:

MainApp.java

package com.linaittech;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext(“Beans.xml”);

Mirek mireczek = (Mirek) context.getBean(“mirek”);
mireczek.mirekMethod();

}

}

Mirek.java

package com.linaittech;

public class Mirek {
    
    private Murek mureczek;
    private Burek bureczek;
    
    public void setMureczek(Murek mureczek) {
        System.out.println(“We are inside the setMureczek.” );
        this.mureczek = mureczek;
    }
    
    public void setBureczek(Burek bureczek){
        System.out.println(“We are inside the setBureczek.” );
        this.bureczek = bureczek;
    }
    
    public Murek getMureczek() {
        return mureczek;
    }
    
    public Burek getBureczek(){
        return bureczek;
    }
    
    public void mirekMethod() {
        mureczek.murekMethod();
        bureczek.burekMethod();
    }

}

Murek.java

package com.linaittech;

public class Murek {
    
    public Murek(){
        System.out.println(“We are inside the Murek constructor.” );
        }
    
    public void murekMethod() {
        System.out.println(“We are inside the murekMethod.” );
        }

}

Burek.java

package com.linaittech;

public class Burek {
    
    public Burek(){
        System.out.println(“We are inside the Burek constructor.” );
        }
    
    public void burekMethod() {
        System.out.println(“We are inside the burekMethod.” );
        }

}

Beans.xml

<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns=”http://www.springframework.org/schema/beans&#8221; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd”&gt;

<!– mirek bean definition –>

<bean id=”mirek”>
<property name=”mureczek” ref=”murek”/>
<property name=”bureczek” ref=”burek”/>
</bean>

<!– murek bean definition –>

<bean id=”murek”>
</bean>

<!– burek bean definition –>

<bean id=”burek”>
</bean>

</beans>

You can run it and see the output:

gru 11, 2013 2:36:39 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1f1bf46: startup date [Wed Dec 11 14:36:39 CET 2013]; root of context hierarchy
gru 11, 2013 2:36:39 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Beans.xml]
gru 11, 2013 2:36:39 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1203fe5: defining beans [mirek,murek,burek]; root of factory hierarchy
We are inside the Murek constructor.
We are inside the Burek constructor.
We are inside the setMureczek.
We are inside the setBureczek.
We are inside the murekMethod.
We are inside the burekMethod.

The red lines is the most important for us. We injected two methods (murekMethod and burekMethod) from two beans (Murek and Burek) into the Mirek bean. We used the setters in the Mirek bean, and all was managed by Beans.xml.

Spring Application with Dependency Injection – Constructor

Spring Application with Dependency Injection – Constructor

Let’s see how to write a simple Spring application with DI using constructor. We have the following files in our project:

MainApp.java

package com.linaittech;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {

    public static void main(String[] args) {
        
        ApplicationContext context = new ClassPathXmlApplicationContext(“Beans.xml”);
        
        Mirek mireczek = (Mirek) context.getBean(“mirek”);
        mireczek.mirekMethod();

    }

}

Mirek.java

package com.linaittech;

public class Mirek {
    
    private Murek mureczek;
    private Burek bureczek;
    
    public Mirek(Murek mureczek, Burek bureczek) {
        
        System.out.println(“We are inside the Mirek constructor.” );
        this.mureczek = mureczek;
        this.bureczek = bureczek;
    }
    
    public void mirekMethod() {
        mureczek.murekMethod();
        bureczek.burekMethod();
        }

}

Murek.java

package com.linaittech;

public class Murek {
    
    public Murek(){
        System.out.println(“We are inside the Murek constructor.” );
    }
    
    public void murekMethod() {
        System.out.println(“We are inside the murekMethod.” );
        }

}

Burek.java

package com.linaittech;

public class Burek {
    
    public Burek(){
        System.out.println(“We are inside the Burek constructor.” );
    }
    
    public void burekMethod() {
        System.out.println(“We are inside the burekMethod.” );
        }

}

Beans.xml

<beans xmlns=”http://www.springframework.org/schema/beans&#8221; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd”&gt;

<!– mirek bean definition –>

<bean id=”mirek” class=”com.linaittech.Mirek”>
<constructor-arg ref=”murek”/>
<constructor-arg ref=”burek”/>
</bean>

<!– murek bean definition –>

<bean id=”murek” class=”com.linaittech.Murek”>
</bean>

<!– burek bean definition –>

<bean id=”burek” class=”com.linaittech.Burek”>
</bean>

</beans>

You can run it and see the output:

gru 09, 2013 1:19:57 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1f1bf46: startup date [Mon Dec 09 13:19:57 CET 2013]; root of context hierarchy
gru 09, 2013 1:19:57 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Beans.xml]
gru 09, 2013 1:19:57 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@19039f5: defining beans [mirek,murek,burek]; root of factory hierarchy
We are inside the Murek constructor.
We are inside the Burek constructor.
We are inside the Mirek constructor.
We are inside the murekMethod.
We are inside the burekMethod.

The red lines is the most important for us. We injected two methods (murekMethod and burekMethod) from two beans (Murek and Burek) into the Mirek bean. We used the constructor in the Mirek bean, and all was managed by Beans.xml.