poniedziałek, 10 marca 2014

Tworzenie biblioteki dynamicznej - Linux

Chciałbym dzisiaj pokazać jak stworzyć oraz podlinkować stworzoną przez siebie bibliotekę dynamiczną.

Na początek coś na temat statycznej biblioteki (static library) - teoria.
Jest to rodzaj biblioteki, która łączona jest z programem wykonywalnym dopiero w momencie jego wykonania. Aby tego dokonać, system operacyjny komputera musi posiadać pewne funkcje, które umożliwiają łączenie dynamiczne.

Rozważmy pewien prosty przykład. Będziemy mieli łącznie trzy pliki. Dwa z prawie takimi samymi funkcjami oraz jeden plik z main-em programu.

Pierwszy plik - funkcja1.cpp
void funkcja1(int &p_arg1)
{
  p_arg1 = 55;
}
Drugi plik - funkcja2.cpp
void funkcja2(int &p_arg1)
{
  p_arg1 = 77;
}
Main programu - main.cpp
#include 

using namespace std;

void funkcja1(int &p_arg1);
void funkcja2(int &p_arg1);

int main()
{
  int l_liczba = 10;
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja1(l_liczba); 
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja2(l_liczba);
  cout << "l_liczba = " << l_liczba << endl;

  return 0;
}
Gdybyśmy chcieli by zadziałał powyższy przykład należałoby skompilować wszystkie pliki:
g++ main.cpp funkcja1.cpp funkcja2.cpp -Wall -o main
Stwórzmy teraz bibliotekę dynamiczną.

1. Kompilacja programów funkcja1.cpp oraz funkcja2.cpp.
g++ -Wall -fPIC -c funkcja1.cpp funkcja2.cpp
Flaga -Wall wyświetli wszystkie warningi podczas kompilacji. Utworzyły nam się pliki funkcja1.o oraz funkcja2.o.

2. Utworzenie biblioteki.
g++ -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0   *.o
3.
ln -sf libctest.so.1.0 libctest.so.1
4.
ln -sf libctest.so.1.0 libctest.so
5. Kompilacja programu main.
g++ -Wall -L. main.cpp -lctest -o prog
6. Odpalenie.
LD_LIBRARY_PATH=. ./prog

Tworzenie biblioteki statycznej - Linux

Chciałbym dzisiaj pokazać jak stworzyć oraz podlinkować stworzoną przez siebie bibliotekę statyczna.

Na początek coś na temat statycznej biblioteki (static library) - teoria.
Jest to biblioteka funkcji i podprogramów, która łączona jest z programem w momencie konsolidacji. W przypadku narzędzi dostarczonych przez Microsoft dla systemów z rodziny Windows pliki bibliotek mają zazwyczaj rozszerzenia .lib lub .obj, natomiast dla pakietów w systemach z rodziny Unix (np. GCC) i ich portach dla systemu Microsoftu (jakim jest np. MinGW) są to .a lub .o.

Rozważmy na początek pewien prosty przykład. Będziemy mieli łącznie trzy pliki. Dwa z prawie takimi samymi funkcjami oraz jeden plik z main-em programu.

Pierwszy plik - funkcja1.cpp
void funkcja1(int &p_arg1)
{
  p_arg1 = 55;
}
Drugi plik - funkcja2.cpp
void funkcja2(int &p_arg1)
{
  p_arg1 = 77;
}
Main programu - main.cpp
#include 

using namespace std;

void funkcja1(int &p_arg1);
void funkcja2(int &p_arg1);

int main()
{
  int l_liczba = 10;
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja1(l_liczba); 
  cout << "l_liczba = " << l_liczba << endl;
 
  funkcja2(l_liczba);
  cout << "l_liczba = " << l_liczba << endl;

  return 0;
}
Gdybyśmy chcieli by zadziałał powyższy przykład należałoby skompilować wszystkie pliki:
g++ main.cpp funkcja1.cpp funkcja2.cpp  -Wall -o main
Stwórzmy teraz bibliotekę statyczną.

1. Skompilujmy pliki funkcja1.cpp oraz funkcja2.cpp.
g++ -Wall -c funkcja1.cpp funkcja2.cpp
Flaga -Wall wyświetli wszystkie warningi podczas kompilacji. Utworzyły nam się pliki funkcja1.o oraz funkcja2.o.

2. Czas stworzyć bibliotekę wydając komendę:
ar -cvq bibliotekaTestowa.a funkcja1.o funkcja2.o
Dzięki temu zabiegowi utworzył nam się plik/biblioteka:
bibliotekaTestowa.a
3. Można wyświetlić całą zawartość nowo utworzonej biblioteki za pomocą komendy :
ar -t bibliotekaTestowa.a
4. Na sam koniec pozostało przetestować naszą bibliotekę:
g++ -o [plik wykonywalny] main.cpp bibliotekaTestowa.a

g++ -o main main.cpp bibliotekaTestowa.a
Istnieje jeszcze druga możliwość. Jeżeli biblioteka znajduje się w innym katalogu to wystarczy:
g++ -o [plik wykonywalny] main.cpp [sciezka do katalogu]/bibliotekaTestowa.a

g++ -o main main.cpp yy/bibliotekaTestowa.a

Na zakończenie:-)

Nota historyczna:
Kiedyś po utworzeniu biblioteki było konieczne, aby uruchomić polecenie: ranlib ctest.a. Ten stworzył tabelę symboli w archiwum. Ranlib jest teraz wbudowany w polecenie "ar".

Uwaga dla programistów MS / Windows: "." Linux / Unix biblioteka jest koncepcyjnie taka sama jak w Visual Studio C++ statyczne biblioteki "lib".

niedziela, 9 marca 2014

Instalacja Roota na linuxie.


Co to jest Root?

Jest to framework wspomagający pisanie programów do analizy danych. Powstał w 1994 roku w laboratorium CERN na potrzeby analizy danych fizyki wysokich energii i jest od tego czasu stale rozwijany.

Coś więcej na temat samego frameworka:

http://root.cern.ch/drupal/

Tematem posta jest instalacja roota. Chciałbym podzielić się wiedzą jak zainstalować narzędzie root na Ubuntu.
Niestety nie wystarczy wpisać sudo apt-get install root.

Instalacja Root-a krok po kroku:

Tutaj są informacje jak można to zrobić. Jednak nie jest wszystko zbyt jasno opisane.
http://root.cern.ch/drupal/content/installing-root-source

Link do stronki gdzie możemy ściągnąć framework.
http://root.cern.ch/drupal/content/downloading-root
Ja osobiście ściągnąłem wersje:
Old, version 5.32/04
ponieważ najnowsza (recommended) nie działała:-(
Najnowsza nie działająca:
Pro, version 5.34/17

Po ściagnięciu rozpakowuje komendą (tak jak jest na stronce napisane) lub graficznie. Wchodzę do folderu, gdzie ściągnąłem framework i wpisuje komendę:
gzip -dc root_<version>.source.tar.gz | tar -xf -
czyli przykładowo:
gzip -dc root_v5.32.04.Linux-slc5-gcc4.3.tar.gz | tar -xf -
lub prawym rozpakuj tutaj:-).
Później trzeba skopiować rozpakowanego roota do /usr/local za pomocą komendy:
sudo mv root /usr/local
Potem dodać do ".bashrc" linijki:
// w home otwarcie pliku
sudo nano .bashrc
Dodanie odpowiednich flag:
export ROOTSYS=/usr/local/root
export PATH=$ROOTSYS/bin:$PATH
export LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH
Na sam koniec :
source ~/.bashrc
Inne przydatne linki:
https://particle.phys.uvic.ca/~keeler/teaching/phys521a/Tools/rootInstall.html

niedziela, 2 marca 2014

Instalacja i uruchomienie pierwszego testu z Google Test Framework (GTest) na Linuxie (Ubuntu)

Google Test jest to framework służący do pisania testów jednostkowych w C++. W tym poście wyjaśnię w jaki sposób zainstalować oraz uruchomić Google Test na Linuxie (Ubuntu).

1. Pierwszym krokiem jest instalacja gtest development package:
sudo apt-get install libgtest-dev
2. Należy pamiętać, że ten pakiet instaluje pliki źródłowe. Kod musisz skompilować samemu, tzn. stworzyć niezbędne pliki biblioteki. Pliki źródłowe powinny być umieszczone w katalogu /usr/src/gtest. Przejdź do tego folderu i używając cmake skompiluj bibliotekę:
sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make

# copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder
sudo cp *.a /usr/lib
3.Teraz wypadałoby przetestować jakiś prosty kod:
//codeToTest.cpp
#include 
 
double add(const double a, const double b) 
{
    return a + b;
}
4. W poniższym kodzie, tworzymy dwa testy, które umożliwiają testowanie funkcji za pomocą prostego makra "assertion". Istnieje wiele innych makr w tym framework-u (patrz http://code.google.com/p/googletest/wiki/Primer#Assertions). Kod zawiera główną funkcję, która automatycznie uruchomia wszystkie testy. Prosto i szybko.
// tests.cpp
#include "codeToTest.cpp"
#include 

TEST(addTest, positiveInput) 
{ 
    ASSERT_EQ(3., add(1., 2.));
    ASSERT_EQ(35., add(10., 25.));
}

TEST(addTest, nagetiveInput) 
{
    ASSERT_EQ(1., add(-1., 2.));
    ASSERT_EQ(-1., add(1., -2.));
}
 
int main(int argc, char **argv) 
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
5. Następnym krokiem jest kompilacja kodu. Należy stworzyć mały plik CMakeLists.txt, żeby skompilować testy. Plik ten lokalizuje bibliotekę testową Google Test i łączy go z aplikacją testową. Należy pamiętać również o tym, żeby zlinkować biblioteke pthread.
cmake_minimum_required(VERSION 2.6)

# Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

# Link runTests with what we want to test and the GTest and pthread library
add_executable(runTests tests.cpp)
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)
6. Skompiluj i uruchom testy:
cmake CMakeLists.txt
make
./runTests
Powodzenia w testowaniu kodu.

Bibliografia:

https://code.google.com/p/googletest/wiki/Documentation

sobota, 1 marca 2014

Kolorowanie składni kodu - syntax highlighter & blogger

Jakiś czas temu zacząłem używać Blogger-a, jako serwisu blogowego. Jestem pod wrażeniem w jak łatwy sposób można tworzyć posty oraz modyfikować istniejące, edytować layout itp. Jedna rzecz, która jest dość ważna w szczególności dla programistów, chcących wklejać swoje kawałki kodu, jest taka, że Blogger nie posiada na chwilę obecną narzędzia do wklejania kodu, który ładnie by się wyświetlał. W tym poście chciałbym opisać, jak w łatwy, szybki i ładny sposób wyświetlać kody w postach na bloggerze (kolorować składnie kodu). W tym celu potrzeba będzie wykorzystać SyntaxHighlighter Javascript Library.

Następujące rzeczy należy wykonać:

1. Skopiuj poniższy kod:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


2. Wejdź do zakładki "Szablon":


3. Następnie kliknij w przycisk "Edytuj plik HTML":



4. Tuż przed znacznikiem </head> wklej skopiowany wyżej kod.
5. Zapisz szablon.
6. Następnie można rozpocząć tworzenie, bądź edytowanie starych postów z ładnie podświetlanym kodem. Należy wejść do sekcji "Posty". Następnie już w konkretnym formatowaniu danego posta należy przejść do sekcji "HTML"



7. W momencie, gdy chcemy wkleić jakiś kod należy przed, jak i po nowo wstawianym kodzie wstawić odpowiedni znacznik dla C++ będzie <pre class="brush: cpp"> jakiś kod w C++ </pre>, natomiast dla np. csharp <pre class="brush: csharp"> jakiđ kod w csharpie </pre>


int main(int argc, char **argv)
{
std::cout << "Hello world!" << std::endl;
return 0;
}


Efekt pokazy został poniżej:

int main(int argc, char **argv)
{
std::cout << "Hello world!" << std::endl;
return 0;
}

Istnieje kilka rzeczy na, które należy zwrócić uwagę:

- Java script używa <code> Tag. Tak więc wiele szablonów posiada styl dla tego tagu. Może więc zaistnieć sytuacja, żeby będziesz musiał usunąć styl, że kod ładnie się formatował.

- Czasem klikając w podgląd kod wyświetli się nie sformatowany. Jednak, gdy później damy "Opublikuj" wszystko powinno być ok.

poniedziałek, 24 lutego 2014

Widoczność partycji po sformatowaniu dysku

Problem polega na tym, że po sformatowaniu, a następnie instalacji Windows-a wchodząc w "Mój komputer" nie widać wszystkich partycji. Problem ten można rozwiązać w następujący sposób. Należy wejść w "Panel sterowania", następnie w sekcji "Narzędzia administracyjne" wybrać "Utwórz i sformatuj partycje dysku twardego". Po wykonaniu tych kroków powinno pojawić się poniższe okno:


Następnie należy wybrać (kliknąć) wolumin dysku, który chcemy, aby się pojawił. Kolejną rzeczą jest przejście przez kilka okienek. Wybranie nazwy nośnika itp. Po zatwierdzeniu zmian oczekiwany wolumin dysku powinien być widoczny.

Klawiatura maszynisty - programisty, problem, zamiana 'z' z 'y'

Często występującym problemem jest zamiana 'z' z 'y'. Jest to wynikiem naciśnięcia klawiszy "ctrl"+"shift" w wyniku czego zmienia się układ klawiatury z "Polski (programisty)" na "Polski (maszynistki)". Aby tego uniknąć, czyli żeby po naciśnięciu klawiszy "ctrl"+"shift" układ klawiatury się nie zmieniał należy:


1. Wejść do ustawień językowych w Windowsie.
- Jeśli masz pasek języka na pasku zadań to kliknij na niego "prawym przyciskiem myszy" i wybierz "Ustawienia". Rysunek poniżej przedstawia to:



- Jeśli go tam nie masz to należy wejść do "Panel sterowania", następnie do "Zegar, język i region" wybierz: "Zmień klawiatury lub inne metody wprowadzania danych", następnie w zakładce "Klawiatury i języki" kliknij przycisk "Zmień klawiatury...". Po przejściu przez te kroki powinno pojawić się poniższe okno:



2. W okienku, które się pojawi wejdź w zakładkę "Zaawansowane ustawienia klawiszy",
zaznacz na liście "Między językami" i następnie kliknij na dole przycisk "Zmień sekwencję klawiszy...".
W sekcji "Przełączanie języka" wybierz "Nieprzypisane" oraz w sekcji "Przełączanie układu klawiatury", także wybierz "Nieprzypisane". Następnie potwierdź zmianę ustawień poprzez "OK".


Po wykonaniu powyższych kroków problem z zamianą 'z' z 'y' powinien się zakończyć.