Największą zaletą otwartego oprogramowania jest dostępność źródeł i możliwość samodzielnej kompilacji programów. Twórcy takich dystrybucji jak Fedora czy Ubuntu nie zachęcają użytkowników do samodzielnej kompilacji, gdyż w podstawowych wersjach domyślnie nie oferują pakietów potrzebnych do tworzenia oprogramowania. Można zaryzykować stwierdzenie, że jeśli czegoś nie ma w repozytorium używanej dystrybucji, to większość użytkowników bezradnie rozkłada ręce i czeka aż deweloperzy przygotują paczkę z programem, czy naniosą poprawki w przypadku błędów. Czasem jednak przychodzi ten moment, że trzeba samodzielnie spróbować przygotować pakiet.

W systemie Slackware, a także dystrybucjach pochodnych typu Salix OS, dosyć łatwo przekompilować program, gdyż twórcy zadbali o dostępność narzędzi programistycznych oraz skryptów ułatwiających budowanie pakietów. Zademonstrujemy to na przykładzie apletu xfce4-weather-plugin dla środowiska Xfce.

Wspomniany wcześniej xfce4-weather-plugin, to aplet Pogody. Wyświetla on dane z dokładnością do jednego miejsca po przecinku, co powinno zazwyczaj cieszyć. Jednakże tutaj dane dotyczące prognozy są orientacyjne i podawanie ich z dużą dokładnością nie ma sensu. Co gorsza ten ogonek po przecinku sprawia, że wartości są mniej wyraziste i trudniej dostrzec to co istotne.

xfce4-weather-plugin

Można oczywiście zasugerować autorom programu nasze wątpliwości na bugzilla.xfce.org, ale wdrożenie poprawek może zająć troszkę czasu, o ile w ogóle zostaniemy wysłuchani, bo być może wszyscy oprócz nas cieszą z takiego stanu rzeczy a tylko nam taka dokładność się nie spodobała. Spróbujmy zatem samodzielnie dokonać zmian.

Po sprawdzeniu wersji pakietu, wiemy że mamy zainstalowany xfce4-weather-plugin 0.8.1. Poszukajmy źródeł i skryptu do zbudowania tego pakietu na jakimś serwerze, który udostępnia takie pliki dla systemu Slackware, np. ftp://ftp.osuosl.org/pub/slackware/slackware_source/. Domyślamy się, że szukany program znajdziemy w podkatalogu xfce i dalej xfce4-weather-plugin. Pobieramy stamtąd 3 pliki:

  • xfce4-weather-plugin-0.8.1.tar.xz – źródła programu,
  • xfce4-weather-plugin.SlackBuild – skrypt do kompilacji i budowania pakietu
  • slack-desc, który jest po prostu opisem programu.

Rozpakowujemy źródła i wchodzimy do podkatalogu panel-plugin. Jest tam sporo plików i początkowo możemy mieć problem ze stwierdzeniem, w którym mogą być dane dla nas istotne. Trzeba zdać się na intuicję lub na systematyczne poszukiwanie. Autorowi udało się w miarę szybko ustalić, że interesuje nas plik weather-data.c, a w nim funkcja get_data, a konkretnie ten fragment kodu w języku C:

case TEMPERATURE:
val = g_ascii_strtod(loc->temperature_value, NULL);
if (unit_system == IMPERIAL &&
(!strcmp(loc->temperature_unit, "celcius") ||
!strcmp(loc->temperature_unit, "celsius")))
val = val * 9.0 / 5.0 + 32.0;
else if (unit_system == METRIC &&
!strcmp(loc->temperature_unit, "fahrenheit"))
val = (val - 32.0) * 5.0 / 9.0;
return g_strdup_printf("%.1f", val);
case PRESSURE:
if (unit_system == METRIC)
return LOCALE_DOUBLE(loc->pressure_value, "%.1f");
val = g_ascii_strtod(loc->pressure_value, NULL);
if (unit_system == IMPERIAL)
val *= 0.01450378911491;
return g_strdup_printf("%.1f", val);
case WIND_SPEED:
val = g_ascii_strtod(loc->wind_speed_mps, NULL);
if (unit_system == IMPERIAL)
val *= 2.2369362920544;
else if (unit_system == METRIC)
val *= 3.6;
return g_strdup_printf("%.1f", val);

Dla kogoś kto nigdy nie programował wygląda to jak zaklęcie czarnej magii. Jeśli jednak ktoś doczytał aż dotąd, to znaczy, że być może właśnie chce przygodę z programowaniem rozpocząć. Wyjaśniamy zatem, że fragment ten wylicza temperaturę, ciśnienie i prędkość wiatru, przelicza odpowiednio Celsjusze na Fahrenheity i vice-versa oraz zaokrągla dane do jednego miejsca po przecinku. Ktoś kto już programował w C (lub języku o składni pochodnej jak Java) zauważy, że dokładność wyniku uzyskano za pomocą formatowania %.1f. I to nam wystarcza, żeby nanieść pierwszą w życiu poprawkę do źródła w języku C. Zamieniamy %.1f na %.0f. W ten sposób zmuszamy program, żeby zamiast jednej cyfry stosował zero cyfr po przecinku:

case TEMPERATURE:
val = g_ascii_strtod(loc->temperature_value, NULL);
if (unit_system == IMPERIAL &&
(!strcmp(loc->temperature_unit, "celcius") ||
!strcmp(loc->temperature_unit, "celsius")))
val = val * 9.0 / 5.0 + 32.0;
else if (unit_system == METRIC &&
!strcmp(loc->temperature_unit, "fahrenheit"))
val = (val - 32.0) * 5.0 / 9.0;
return g_strdup_printf("%.0f", val);
case PRESSURE:
if (unit_system == METRIC)
return LOCALE_DOUBLE(loc->pressure_value, "%.0f");
val = g_ascii_strtod(loc->pressure_value, NULL);
if (unit_system == IMPERIAL)
val *= 0.01450378911491;
return g_strdup_printf("%.0f", val);
case WIND_SPEED:
val = g_ascii_strtod(loc->wind_speed_mps, NULL);
if (unit_system == IMPERIAL)
val *= 2.2369362920544;
else if (unit_system == METRIC)
val *= 3.6;
return g_strdup_printf("%.0f", val);

Nie jest to może zbyt rozbudowany przykład, ale przecież od czegoś trzeba zacząć zanim na poważnie zapuścimy się w gąszcz wskaźników, zmiennych i funkcji. Teraz zapisujemy plik i możemy skompilować program ręcznie wydając sakramentalne ./configure; make; make install; ale prościej będzie skorzystać ze skryptu slackbuild, który zawiera w sobie opcje konfiguracji i budowania pakietu. Spakujmy zatem katalog z programem do formatu i nazwy wymaganej przez skrypt: xfce4-weather-plugin-0.8.1.tar.xz; jeśli ręcznie to można np. tak:

tar cvfJ xfce4-weather-plugin-0.8.1.tar.xz xfce4-weather-plugin-0.8.1/

Dalej umieszczamy pobrane wcześniej pliki slack-desc i xfce4-weather-plugin.SlackBuild w tym samym katalogu i z poziomu administratora wykonujemy:

bash xfce4-weather-plugin.SlackBuild

co po wypisaniu wielu linii z informacjami o kompilacji powinno zakończyć się komunikatem:

Slackware package /tmp/xfce4-weather-plugin-0.8.1-i486-1.txz created

Następnie uaktualniamy nasz pakiet w systemie:

upgradepkg --reinstall /tmp/xfce4-weather-plugin-0.8.1-i486-1.txz

Po wylogowaniu i ponownym zalogowaniu, mamy to czego oczekiwaliśmy. Prognoza oraz ikonka na panelu jest od razu bardziej czytelna:

xfce4-weather-plugin

W innych dystrybucjach niż Slackware poprawienie i zbudowanie tego pakietu jest być może trudniejsze, ale na pewno możliwe i jeśli kogoś temat zainteresował, to może poszukać odpowiedniej metody samodzielnie. Tak czy inaczej warto czasami wrócić do źródeł – dosłownie oraz w przenośni – i w ten sposób rozpocząć przygodę z programowaniem.

  • Dont Slack me!

    Jestem jak najbardziej za takimi wpisami/poradnikami.
    My, lud.. Prosimy o więcej takich artykułów.

    • Witek

      W sumie tytuł trochę odstrasza czytelników sugerując, że sprawa tyczy sie wyłącznie Slackware, ale przecież dostępność źródeł i możliwość nanoszenia poprawek oraz samodzielnej kompilacji programów jest największą zaletą otwartego oprogramowania i chyba trochę niedocenianą przez większośc użytkowników, którzy bazują na repozytoriach dystrybucyjnych. Tak czy inaczej nam, autorowi tego wpisu, jest bardzo miło że ktoś go przeczytał. :-)