<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SlackBlog</title>
	<atom:link href="http://blog.scxd.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.scxd.info</link>
	<description>Blog o życiu ze Slackware Linux</description>
	<lastBuildDate>Sun, 25 Oct 2009 19:35:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Synchronizacja zegara systemowego poprzez NTP</title>
		<link>http://blog.scxd.info/2009/10/synchronizacja-zegara-systemowego-poprzez-ntp/</link>
		<comments>http://blog.scxd.info/2009/10/synchronizacja-zegara-systemowego-poprzez-ntp/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 19:29:49 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Otwarte oprogramowanie]]></category>
		<category><![CDATA[czas]]></category>
		<category><![CDATA[NTP]]></category>
		<category><![CDATA[ntpd]]></category>
		<category><![CDATA[zegar]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=275</guid>
		<description><![CDATA[Czas – rzecz niezwykła. Coś, co jest i płynie. Zapewne każdy z nas chce znać go jak najdokładniej, gdyż to według niego cywilizacja ludzka planuje swój każdy dzień. W związku z tym możemy zadbać o to, by nasz systemowy zegar pokazywał godzinę z dokładnością nawet do kilku milisekund. W tym celu stworzony został protokół NTP [...]]]></description>
			<content:encoded><![CDATA[<p>Czas – rzecz niezwykła. Coś, co jest i płynie. Zapewne każdy z nas chce znać go jak najdokładniej, gdyż to według niego cywilizacja ludzka planuje swój każdy dzień. W związku z tym możemy zadbać o to, by nasz systemowy zegar pokazywał godzinę z dokładnością nawet do kilku milisekund. W tym celu stworzony został protokół NTP oraz jego klient/serwer ntpd.<span id="more-275"></span></p>
<p>ntpd działa w naszym systemie jako daemon. Przy uruchomieniu łączy się z serwerami czasu i wstępnie koryguje zegar systemowy pod warunkiem, że różnica nie jest większa niż 1000 sekund (dlatego nie nada się do przestawiania zegara z czasu letniego na zimowy i odwrotnie). Następnie działa w tle i stopniowo przyspiesza albo zwalnia zegar, by uzyskać jak najdokładniejszy czas, uśredniając różnice z podanych serwerów.</p>
<p>Na wstępie powinniśmy ustawić godzinę na tyle dokładnie, żeby różnica nie przekroczyła wspomnianych 1000 sekund. Możemy to zrobić ręcznie bądź poleceniem:<br />
<pre># ntpdate ntp.icm.edu.pl</pre><br />
Następnie upewniamy się, że mamy zainstalowany w systemie pakiet ntp (dostępny w Slackware).</p>
<p>Pora przejść do edycji pliku konfiguracyjnego <em>/etc/ntp.conf</em>. Opcjami <em>server</em> podajemy serwery protokołu NTP, dzięki którym ntpd będzie mógł korygować czas. Jeżeli chcemy mieć dostęp do logów, warto użyć opcji <em>logfile <ścieżka do pliku z logami></em>. Resztę opcji pozostawiamy domyślnie. Pomijając komentarze i puste linie, <em>ntp.conf</em> może wyglądać tak:<br />
<pre>server 150.254.183.15
server 193.110.137.171
server 193.0.71.133
fudge&nbsp;&nbsp; 127.127.1.0 stratum 10
driftfile /etc/ntp/drift
broadcastdelay&nbsp;&nbsp;0.008
restrict default noquery nomodify
restrict 127.0.0.1
logfile /var/log/ntp</pre><br />
Warto zwrócić uwagę na plik <em>/etc/ntp/drift</em>, w którym przechowywana będzie częstotliwość korygowania zegara. Wartość tworzona jest na podstawie obserwacji jego dokładności przez ntpd.</p>
<p>Teraz wypada zdefiniować w pliku <em>/etc/ntp/step-tickers</em> serwery NTP, z którymi będzie łączył się ntpdate przy starcie. Mogą być te same, co w <em>ntp.conf</em>:<br />
<pre>150.254.183.15
193.110.137.171
193.0.71.133</pre></p>
<p>Na zakończenie ustawiamy systemową strefę czasową poprzez skopiowanie odpowiedniego pliku do <em>/etc/localtime</em>. Dla Polski:<br />
<pre># cp -f /usr/share/zoneinfo/Europe/Warsaw /etc/localtime</pre></p>
<p>Ostatni ruch to nadanie skryptowi startowemu atrybutu wykonywalności:<br />
<pre># chmod 755 /etc/rc.d/rc.ntpd</pre></p>
<p>Od następnego uruchomienia systemu daemon ntpd rozpocznie swoją pracę. Ażeby zobaczyć statystyki dotyczące poszczególnych serwerów w porównaniu do naszego zegara, wydajemy polecenie:<br />
<pre># ntpq -p</pre></p>
<p>Pamiętajmy jedynie, by nie mieszać ntpd z innymi synchronizatorami. Po dokładniejszy opis opcji zapraszam do <a href="http://www.eecis.udel.edu/~ntp/ntp_spool/html/ntpd.html">dokumentacji</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/10/synchronizacja-zegara-systemowego-poprzez-ntp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Slackware 13.0</title>
		<link>http://blog.scxd.info/2009/08/slackware-13-0/</link>
		<comments>http://blog.scxd.info/2009/08/slackware-13-0/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 08:18:27 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Slackware]]></category>
		<category><![CDATA[13.0]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=271</guid>
		<description><![CDATA[I oto przed Państwem staje nowa, gotowa do użytku stabilna wersja Slackware oznaczona jako 13.0. Przez te ponad pół roku skupiono się głównie na aktualizacji pakietów, by uczynić system jeszcze stabilniejszym i bezpieczniejszym. Nowe wydanie dotyczy obu obecnie rozwijanych gałęzi, czyli i dla procesorów o architekturze x86 (32-bitowej), i o architekturze x86_64 (64-bitowej). Zamówienia na [...]]]></description>
			<content:encoded><![CDATA[<p>I oto przed Państwem staje nowa, gotowa do użytku stabilna wersja Slackware oznaczona jako 13.0. Przez te ponad pół roku skupiono się głównie na aktualizacji pakietów, by uczynić system jeszcze stabilniejszym i bezpieczniejszym. Nowe wydanie dotyczy obu obecnie rozwijanych gałęzi, czyli i dla procesorów o architekturze x86 (32-bitowej), i o architekturze x86_64 (64-bitowej). Zamówienia na płyty CD lub DVD można składać w <a href="http://store.slackware.com/">Slackware Store</a>, dzięki czemu możemy wesprzeć deweloperów.<span id="more-271"></span></p>
<p>Oto lista najważniejszych zmian, które zaszły od wersji 12.2 (większość z nich opisana już we wcześniejszych artykułach):
<ul>
<li>nowy format paczek .txz, który przyczynił się do zmniejszenia ich rozmiaru,</li>
<li>użycie w instalatorze dystrybucji udev do wykrywania urządzeń,</li>
<li>nowa wersja Xorg pozwalająca na zredukowanie linijek pliku konfiguracyjnego dzięki obsłudze urządzeń poprzez HAL,</li>
<li>przejście z wersji 3 KDE na 4, dzięki czemu to środowisko graficzne zyskało nowe możliwości i wygląd.</li>
</ul>
<p>A to wersje najbardziej sztandarowych składników systemu:
<ul>
<li>kernel Linux &mdash; 2.6.29.6,</li>
<li>kompilator GCC &mdash; 4.3.3,</li>
<li>Binutils &mdash; 2.18.50.0.9,</li>
<li>GNU C Library (glibc) &mdash; 2.9,</li>
<li>KDE &mdash; 4.2.4,</li>
<li>Xfce &mdash; 4.6.1.</li>
</ul>
<p>Przy aktualizowaniu systemu warto przeczytać następujące dokumenty:
<ul>
<li><a href="ftp://ftp.slackware.pl/pub/slackware/slackware-13.0/UPGRADE.TXT">UPGRADE.TXT</a>,</li>
<li><a href="ftp://ftp.slackware.pl/pub/slackware/slackware-13.0/CHANGES_AND_HINTS.TXT">CHANGES_AND_HINTS.TXT</a>.</li>
</ul>
<p>Warto także wspomnieć, że to najlepszy moment na aktualizację pakietów dla użytkowników używających stabilnej wersji Slackware i chcących korzystać ze Slackware Current eXtended Desktop, gdyż teraz wersja stabilna wygląda tak samo jak rozwojowa -current.</p>
<p>Cytując słowa Patricka Volkderdinga<br />
<blockquote>Have fun, and enjoy the new stable release!</p></blockquote>
<p> przyłączam się do życzeń.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/08/slackware-13-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Używanie CMake do budowania projektu</title>
		<link>http://blog.scxd.info/2009/08/uzywanie-cmake-do-budowania-projektu/</link>
		<comments>http://blog.scxd.info/2009/08/uzywanie-cmake-do-budowania-projektu/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 14:00:04 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Otwarte oprogramowanie]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[CMake]]></category>
		<category><![CDATA[CMakeLists.txt]]></category>
		<category><![CDATA[Makefile]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=269</guid>
		<description><![CDATA[Powszechnie używanym narzędziem do konfiguracji i wygenerowania plików potrzebnych do kompilacji projektu w środowisku otwartego oprogramowania na licencjach GNU/GPL stał się skrypt configure. Niestety, ponieważ nie zachodzą w nim żadne przełomowe zmiany, trzeba wiele się napisać, by go wygenerować, a przede wszystkim trudno z jego pomocą obsługiwać projekt bazujący przykładowo na popularnym Qt, powstały nowe [...]]]></description>
			<content:encoded><![CDATA[<p>Powszechnie używanym narzędziem do konfiguracji i wygenerowania plików potrzebnych do kompilacji projektu w środowisku otwartego oprogramowania na licencjach GNU/GPL stał się skrypt <em>configure</em>. Niestety, ponieważ nie zachodzą w nim żadne przełomowe zmiany, trzeba wiele się napisać, by go wygenerować, a przede wszystkim trudno z jego pomocą obsługiwać projekt bazujący przykładowo na popularnym Qt, powstały nowe <a href="http://blog.scxd.info/2008/08/flagi-optymalizacyjne/">narzędzia budujące</a>. Jednym z nich jest postępowy CMake.<span id="more-269"></span></p>
<p>Większość z nas pewnie dotychczas wykonało choć jedną kompilację przy jego użyciu. Na etapie konfiguracji widzimy czytelne komunikaty, a sama kompilacja opatrzona jest procentowym postępem i kolorową oprawą. CMake nie odchodzi jednak od Makefile. Choć używa CMake-owych narzędzi, nadal wpisujemy <em>make</em> w celu rozpoczęcia kompilacji. Generowany jest natomiast przez program cmake, który z kolei opiera się na pliku <em>CMakeLists.txt</em>, tak jak autoconf na <em>configure.ac</em>. I właśnie pisanie tego pliku chcę tu opisać. Opierać się będę na projekcie Qt <a href="http://blog.scxd.info/wp-content/uploads/2009/07/qameoflife.tar.bz2">QameOfLife</a>, który już opublikowałem w poprzednim artykule.</p>
<p>CMakeLists.txt tworzy się we własnym interpretowanym języku (już nie w Bashu jak w configure), który posiada wiele komend. Na szczęście do obsłużenia prostego projektu nie potrzebujemy ich zbyt wielkiego wachlarza. Zaczynamy od nazwy projektu:<br />
<pre>project ( QameOfLife )</pre><br />
Następnie przypisujemy nazwanym zmiennym pliki projektu, jakimi są pliki źródłowe, nagłówkowe, interfejsu użytkownika i źródeł plików.<br />
<pre>set( QAMEOFLIFE_SRCS
&nbsp;&nbsp;&nbsp;&nbsp;main.cpp
&nbsp;&nbsp;&nbsp;&nbsp;mainwindow.cpp
&nbsp;&nbsp;&nbsp;&nbsp;game.cpp
)

set( QAMEOFLIFE_MOC_HDRS
&nbsp;&nbsp;&nbsp;&nbsp;mainwindow.h
&nbsp;&nbsp;&nbsp;&nbsp;game.h
)

set( QAMEOFLIFE_UIS
&nbsp;&nbsp;&nbsp;&nbsp;mainwindow.ui
)

set( QAMEOFLIFE_RCS
&nbsp;&nbsp;&nbsp;&nbsp;files.qrc
)</pre><br />
Definiujemy minimalną potrzebną wersję CMake:<br />
<pre>cmake_minimum_required( VERSION 2.6 )</pre><br />
Szukanie wymaganych pakietów w CMake rozwiązano modularnie. To znaczy, każdy pakiet posiada swój moduł, będący skryptem w języku CMake i właśnie dzięki niemu pakiet zostaje znaleziony i ewentualnie ustawiane są zmienne przechowujące katalogi z include&#8217;ami, bibliotekami itd. Moduły te znajdują się w <em>/usr/share/cmake-*/Modules</em>, aczkolwiek możemy używać własnych poprzez umieszczenie ich w katalogu projektu i zainclude-owanie. Szukamy Qt 4, które jest niezbędne (<em>REQUIRED</em>):<br />
<pre>find_package( Qt4 REQUIRED )</pre><br />
Polecenia obsługujące Qt, odpowiedzialne za wygenerowanie odpowiednich plików na podstawie zawartości zdefiniowanych wcześniej zmiennych:<br />
<pre>include( ${QT_USE_FILE} )

qt4_wrap_ui( QAMEOFLIFE_UI_HDRS ${QAMEOFLIFE_UIS} )
qt4_wrap_cpp( QAMEOFLIFE_MOC_SRCS ${QAMEOFLIFE_MOC_HDRS} )
qt4_add_resources( QAMEOFLIFE_RC_SRCS ${QAMEOFLIFE_RCS} )</pre><br />
Ustawiamy flagi kompilacyjne:<br />
<pre>add_definitions( -O2 -w -D_REENTRANT $(QT_DEFINITIONS) )</pre><br />
Wskazujemy katalogi z plikami nagłówkowymi:<br />
<pre>include_directories(
&nbsp;&nbsp;&nbsp;&nbsp;${QT_INCLUDE_DIR}
&nbsp;&nbsp;&nbsp;&nbsp;${QAMEOFLIFE_BINARY_DIR}
&nbsp;&nbsp;&nbsp;&nbsp;${QAMEOFLIFE_SOURCE_DIR}
)</pre><br />
Ścieżka, w której zostanie utworzona binarka (zwykle obecny katalog):<br />
<pre>set( EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR} )</pre><br />
Pliki źródłowe, na podstawie których powstanie plik wykonywalny <em>qameoflife</em>:<br />
<pre>add_executable( qameoflife
&nbsp;&nbsp;&nbsp;&nbsp;${QAMEOFLIFE_SRCS}
&nbsp;&nbsp;&nbsp;&nbsp;${QAMEOFLIFE_MOC_SRCS}
&nbsp;&nbsp;&nbsp;&nbsp;${QAMEOFLIFE_UI_HDRS}
&nbsp;&nbsp;&nbsp;&nbsp;${QAMEOFLIFE_RC_SRCS}
)</pre><br />
Biblioteki, które linker podlinkuje do pliku wynikowego (tutaj akurat zmienna zdefiniowana przez moduł szukający Qt 4):<br />
<pre>target_link_libraries( qameoflife
&nbsp;&nbsp;${QT_LIBRARIES}
)</pre><br />
Użyteczne pliki projektu, które zostaną zainstalowane w systemie po wydaniu polecenia <em>make install</em> z określeniem ścieżek docelowych:<br />
<pre>install(
&nbsp;&nbsp;&nbsp;&nbsp;TARGETS qameoflife
&nbsp;&nbsp;&nbsp;&nbsp;RUNTIME DESTINATION /usr/bin
)

install(
&nbsp;&nbsp;&nbsp;&nbsp;FILES icons/qameoflife.xpm
&nbsp;&nbsp;&nbsp;&nbsp;DESTINATION /usr/share/pixmaps
)</pre><br />
W tym momencie mamy gotowy plik CMakeLists.txt służący do zbudowania prostego projektu.</p>
<p><strong>Dokumentacja</strong><br />
Przy budowie bardziej skomplikowanego projektu z pewnością będziemy musieli skorzystać z dokumentacji. Zawiera ona szczegółowy opis CMake wraz mnóstwem przydatnych komend.</p>
<ul>
<li><a href="http://www.cmake.org/cmake/help/cmake2.6docs.html">Dokumentacja CMake 2.6</a></li>
</ul>
<p><strong>Używanie</strong><br />
Zbudowanie i zainstalowanie gotowego projektu jest bardzo proste:<br />
<pre>CFLAGS=&quot;$SLKCFLAGS&quot; CXXFLAGS=&quot;$SLKCFLAGS&quot; cmake 
&nbsp;&nbsp;-DCMAKE_INSTALL_PREFIX=/usr
make
make install=$DESTDIR</pre><br />
gdzie <em>$SLKCFLAGS</em> to flagi optymalizacyjne, a <em>$DESTDIR</em> &mdash; katalog docelowy (niezbędne przy tworzeniu paczki).</p>
<p>Mam nadzieję, że przekonałem drogich Czytelników-programistów do korzystania z CMake, gdyż jest to nowoczesny, rozwijający się system budujący z pokaźną ofertą możliwości.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/08/uzywanie-cmake-do-budowania-projektu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pierwsze kroki w Qt</title>
		<link>http://blog.scxd.info/2009/07/pierwsze-kroki-w-qt/</link>
		<comments>http://blog.scxd.info/2009/07/pierwsze-kroki-w-qt/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 12:13:04 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Otwarte oprogramowanie]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Qt Creator]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=258</guid>
		<description><![CDATA[Darmowa biblioteka interfejsu graficznego Qt dzięki swojej innowacyjności, wyglądzie i wygodzie w implementacji stała się jedną z najpopularniejszych. Nierzadko spotyka się ja na zamkniętych, otwartych, a nawet przenośnych platformach. Z tego względu warto nauczyć się tworzyć aplikacje za jej pomocą. Wystarczy znajomość obiektowego C++ i posiłkowanie się dokumentacją.
Narzędziem IDE, które także posiada dizajner interfejsu GUI, [...]]]></description>
			<content:encoded><![CDATA[<p>Darmowa biblioteka interfejsu graficznego Qt dzięki swojej innowacyjności, wyglądzie i wygodzie w implementacji stała się jedną z najpopularniejszych. Nierzadko spotyka się ja na zamkniętych, otwartych, a nawet przenośnych platformach. Z tego względu warto nauczyć się tworzyć aplikacje za jej pomocą. Wystarczy znajomość obiektowego C++ i posiłkowanie się dokumentacją.<span id="more-258"></span></p>
<p>Narzędziem IDE, które także posiada dizajner interfejsu GUI, a wyszło spod skrzydeł zespołu deweloperów Qt, jest Qt Creator (paczka dostępna w SCXD). Właśnie z jego pomocą postawimy pierwsze kroki, co nie oznacza, że nie nadaje się do profesjonalnych zastosowań. Z góry zaznaczam, iż nie mam na celu opisu całości aplikacji, lecz jedynie kilka jej kluczowych elementów mogących wydać się nieoczywiste. Wersja biblioteki, na której opieram opis, to 4. Nie ograniczajmy jednak Qt jedynie do biblioteki graficznej, ponieważ zawiera ona także biblioteki sieciowe i wiele innych będących chociażby odpowiednikami z innych popularnych bibliotek.</p>
<p><strong>Tworzenie nowego projektu</strong><br />
W wyborze rodzaju projektów decydujemy się na <em>Qt4 Gui Application</em>. Z listy modułów zaznaczamy te, które będą nam potrzebne do stworzenia aplikacji. Metody, które zawierają, należy sprawdzić w dokumentacji.</p>
<p>Po lewej pojawi się lista plików będących elementami projektu:</p>
<ul>
<li><em>*.pro</em> &mdash; wylistowanie plików projektu. Na jego podstawie generowany jest Makefile. Zarządzany przede wszystkim przez Qt Creator</li>
<li><em>main.cpp</em> &mdash; zawiera główną funkcję</li>
<li><em>main ()</em>. Ograniczmy się w nim do operacji związanych stricte z C++, typu wygenerowanie zarodka liczb pseudolosowych (<em>srand ()</em>)</li>
<li><em>mainwindow.cpp</em> &mdash; kod klasy <em>MainWindow</em>, tzn. związany z zarządzaniem wyglądem GUI, inicjujący często funkcje znajdujące się poza nim. Do zarządzania samym głównym oknem używamy obiektu <em>MainWindow::MainWindow</em>, np.<br />
<pre>void MainWindow::metoda () {
&nbsp;&nbsp; // ...
&nbsp;&nbsp; MainWindow::resize (width, height);
}</pre><br />
Natomiast do widgetów się w nim znajdujących został skonstruowany obiekt <em>MainWindow::ui</em>:<br />
<pre>void MainWindow::metoda () {
&nbsp;&nbsp; // ...
&nbsp;&nbsp; ui-&gt;napis-&gt;setText (&quot;jakiś tekst&quot;);
}</pre><br />
Początkowe ustawienia obiektów warto umieścić w metodzie <em>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)</em>. Jeżeli chcielibyśmy mieć dostęp do danego elementu <em>ui</em> z innej klasy niż <em>MainWindow</em>, dobrym pomysłem jest utworzenie obiektu dostępnego w niej całej, który z kolei jest typu naszego elementu. Tj. przekazujemy wskaźnik do elementu przez argument funkcji, a funkcja ta funkcja przechowuje go we wskaźniku dostępnym tylko w macierzystej klasie:<br />
<pre>MainWindow::MainWindow(QWidget *parent)
&nbsp;&nbsp;&nbsp;&nbsp;: QMainWindow(parent), ui(new Ui::MainWindow) {
&nbsp;&nbsp; Klasa *obiekt;
&nbsp;&nbsp; obiekt = new Klasa;
&nbsp;&nbsp; // ...
}

MainWindow::funkcja () {
&nbsp;&nbsp; obiekt-&gt;new_ui_table (*ui-&gt;table);
}</pre><br />
Od tej pory jesteśmy w stanie zarządzać elementem GUI nazwanym <em>table</em> z klasy <em>Klasa</em></li>
<li><em>*.h</em> &mdash; zwykłe pliki nagłówkowe</li>
<li><em>mainwindow.ui</em> &mdash; po dwukrotnym kliknięciu otworzy się graficzny edytor interfejsu. Za jego pomocą jesteśmy w stanie umieszczać widgety z listy w oknie <em>MainWindow</em>, a następnie edytować ich początkowe parametry.</li>
<li><em>*.qrc</em> &mdash; po wybraniu otworzy się edytor, w którym możemy dodawać prefiksy (adekwatne do lokalizacji w systemie po instalacji), a w prefiksach pliki będące w użyciu przez nasz projekt, np. ikony. Plikom warto nadać aliasy</li>
</ul>
<p><a href="http://blog.scxd.info/wp-content/uploads/2009/07/edytor.png"><img src="http://blog.scxd.info/wp-content/uploads/2009/07/edytor-300x225.png" alt="Edytor C++" title="Edytor C++" width="300" height="225" class="aligncenter size-medium wp-image-260" /></a></p>
<p><a href="http://blog.scxd.info/wp-content/uploads/2009/07/uiedytor.png"><img src="http://blog.scxd.info/wp-content/uploads/2009/07/uiedytor-300x225.png" alt="Edytor plików *.ui" title="Edytor plików *.ui" width="300" height="225" class="aligncenter size-medium wp-image-259" /></a></p>
<p><strong>Sloty</strong><br />
By mogło nastąpić wywołanie danej funkcji wskutek wykonania jakiejś operacji na danym elemencie interfejsu graficznego przez użytkownika, potrzebny jest slot. Tworzymy go w edytorze <em>*.ui</em>, klikając na drugą ikonkę od lewej nazwaną <em>Edit signals/slots</em> i przeciągając kursorem od widgetu do pustego pola. Otworzy się okno, gdzie wybieramy przy jakiej akcji slot ma zostać uruchomiony (metoda prób bądź dokumentacja) i funkcję, która wtedy zostanie wywołana. Istnieje możliwość dodania własnej. Pamiętajmy o umieszczeniu jej w <em>private slots</em> w pliku nagłówkowym. Definiujemy ją w klasie <em>MainWindow</em>.</p>
<p><strong>Akcje menu</strong><br />
Po dodaniu do listy menu opcji, pojawi się ona w zakładce <em>Action editor</em>. Tam wypada zmienić jej nazwę. Natomiast akcją będzie metoda klasy <em>MainWindow</em> o nazwie &#8220;on_<nazwa opcji>_activated&#8221;:<br />
<pre>void MainWindow::on_wyjdz_activated () {
&nbsp;&nbsp;&nbsp;&nbsp;QCoreApplication::quit ();
}</pre></p>
<p><strong>Przykład</strong><br />
Żeby lepiej zrozumieć, jak to wszystko działa, napisałem prostą implementację Gry w życie Conway&#8217;a do pobrania <a href="http://blog.scxd.info/wp-content/uploads/2009/07/qameoflife.tar.bz2" target="_blank">tutaj</a>. Zapraszam do przejrzenia kodu źródłowego.<br />
<a href="http://blog.scxd.info/wp-content/uploads/2009/07/qameoflife.png"><img src="http://blog.scxd.info/wp-content/uploads/2009/07/qameoflife-300x259.png" alt="QameOfLife" title="QameOfLife" width="300" height="259" class="aligncenter size-medium wp-image-263" /></a></p>
<p><strong>Kompilacja</strong><br />
Kompilujemy w katalogu, gdzie zapisaliśmy projekt:<br />
<pre>$ qmake
$ make</pre><br />
Tutaj Makefile tworzony jest za pomocą narzędzia będącego częścią Qt qmake, lecz niebawem opiszę, jak przygotować projekt tak, aby Makefile generowany był poprzez cmake.</p>
<p><strong>Przydatne adresy</strong></p>
<ul>
<li><a href="http://doc.trolltech.com/qtcreator-1.0/index.html" target="_blank">Przewodnik po Qt Creator</a></li>
<li><a href="http://doc.qtsoftware.com/4.5/index.html">Dokumentacja Qt 4.5</a></li>
</ul>
<p><strong>Podsumowanie</strong><br />
Liczę, że artykuł stanie się przydatny do wkroczenia w świat programowania w Qt dla osób, które nie miały jeszcze z tą biblioteką styczności. Pamiętajmy, że wszystkie możliwości Qt wykraczają poza jakikolwiek artykuł, dlatego najlepszym źródłem wiedzy jest oficjalna dokumentacja.</p>
<p>Za wprowadzenie mnie w opisany świat dziękuję Juzefowi.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/07/pierwsze-kroki-w-qt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>X.Org 1.6 w Slackware</title>
		<link>http://blog.scxd.info/2009/06/xorg-16-w-slackware/</link>
		<comments>http://blog.scxd.info/2009/06/xorg-16-w-slackware/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 09:03:25 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Slackware]]></category>
		<category><![CDATA[HAL]]></category>
		<category><![CDATA[Init-Hotplug]]></category>
		<category><![CDATA[X.Org]]></category>
		<category><![CDATA[xorg.conf]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=255</guid>
		<description><![CDATA[W naszej ukochanej dystrybucji w gałęzi Current wreszcie pojawił się X.Org w wersji 1.6.1. Niesie on ze sobą kilka istotnych zmian i bynajmniej nie są nimi niektóre usunięte paczki obsługujące urządzenia wejścia i sterowniki kart graficznych ani nowa zależność w postaci libpciaccess, lecz ma to ze sobą ścisły związek. Mianowicie od teraz urządzenia wejścia typu [...]]]></description>
			<content:encoded><![CDATA[<p>W naszej ukochanej dystrybucji w gałęzi Current wreszcie pojawił się X.Org w wersji 1.6.1. Niesie on ze sobą kilka istotnych zmian i bynajmniej nie są nimi niektóre usunięte paczki obsługujące urządzenia wejścia i sterowniki kart graficznych ani nowa zależność w postaci libpciaccess, lecz ma to ze sobą ścisły związek. Mianowicie od teraz urządzenia wejścia typu klawiatura, mysz, tablety itd. mogą być wykrywane przy inicjacji serwera X-ów bez potrzeby dopisywania ich do pliku konfiguracyjnego <em>xorg.conf</em>.<span id="more-255"></span></p>
<p>Istnieje możliwość pozostania przy starym <em>/etc/X11/xorg.conf</em>. Wystarczy w sekcji <em>ServerLayout</em> dopisać<br />
<pre>&nbsp;&nbsp;&nbsp;&nbsp;Option &quot;AllowEmptyInput&quot; &quot;false&quot;</pre><br />
co sprawi, że myszka i klawiatura będą nadal bezproblemowo wykrywane na podstawie <em>conf-a</em>. Jednak ja pragnę się bardziej skoncentrować na tzw. Input-Hotplugu, który w oparciu o HAL potrafi je samemu sobie skonfigurować przy inicjacji.</p>
<p>Do tego będziemy potrzebować paczki xf86-input-evdev zawierającą bibliotekę za to odpowiedzialną. Ponadto, jeżeli posiadamy bardziej wyszukany zestaw urządzeń, przyda nam się coś jeszcze, przykładowo xf86-input-synaptics dla touchpadów. Warto także wykonać kopię <em>xorg.conf</em>. Teraz należy przystąpić do usunięcia kilku sekcji z tego właśnie pliku. Niestety, skrypt xorgsetup służący do jego generowania jeszcze nadal pozostaje przy opcji &#8220;wszystko w pliku konfiguracyjnym&#8221;.</p>
<p>Po kolei możemy śmiało usunąć sekcje: <em>Module</em>, <em>ServerFlags</em>, <em>InputDevice</em> (kilka), <em>Monitor</em>, <em>ServerLayout</em>. Warto zostawić <em>Files</em>, gdzie znajdują się katalogi z naszymi czcionkami, <em>Device</em>, gdzie jest określony sterownik karty graficznej, z którego korzystamy i <em>Screen</em>, by zachować dotychczasową rozdzielczość. Mimo wszystko każdy powinien kierować się własną konfiguracją, ponieważ w niektórych sekcjach mogą znajdować się potrzebne wpisy. Oto, jak wygląda mój <em>xorg.conf</em> gotowy do współpracy z Init-Hotplugiem:<br />
<pre>Section &quot;Files&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/share/fonts/TTF&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/share/fonts/OTF&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/share/fonts/Type1&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/share/fonts/misc&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/share/fonts/75dpi/:unscaled&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/misc/&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/75dpi/:unscaled&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/100dpi/:unscaled&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/Speedo/&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/Type1/&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/TTF/&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/OTF/&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/cyrillic/&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/75dpi/&quot;
&nbsp;&nbsp;&nbsp;&nbsp;FontPath&nbsp;&nbsp; &quot;/usr/lib/X11/fonts/100dpi/&quot;
EndSection

Section &quot;Device&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Identifier&nbsp;&nbsp;&quot;card&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Driver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;nvidia&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Option &quot;AllowGLXWithComposite&quot; &quot;true&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Option &quot;AddARGBGLXVisuals&quot; &quot;true&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Option &quot;NoLogo&quot; &quot;true&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Option &quot;RenderAccel&quot; &quot;true&quot;
EndSection

Section &quot;Screen&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Identifier&nbsp;&nbsp;&quot;Screen 1&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Device&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;card&quot;
&nbsp;&nbsp;&nbsp;&nbsp;Monitor&nbsp;&nbsp;&nbsp;&nbsp; &quot;monitor&quot;
&nbsp;&nbsp;&nbsp;&nbsp;DefaultDepth 24

&nbsp;&nbsp;&nbsp;&nbsp;Subsection &quot;Display&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Depth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Modes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;1024x768&quot; &quot;800x600&quot; &quot;640x480&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewPort&nbsp;&nbsp;&nbsp;&nbsp;0 0
&nbsp;&nbsp;&nbsp;&nbsp;EndSubsection
&nbsp;&nbsp;&nbsp;&nbsp;Subsection &quot;Display&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Depth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Modes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;1024x768&quot; &quot;800x600&quot; &quot;640x480&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewPort&nbsp;&nbsp;&nbsp;&nbsp;0 0
&nbsp;&nbsp;&nbsp;&nbsp;EndSubsection
&nbsp;&nbsp;&nbsp;&nbsp;Subsection &quot;Display&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Depth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 24
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Modes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;1024x768&quot; &quot;800x600&quot; &quot;640x480&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewPort&nbsp;&nbsp;&nbsp;&nbsp;0 0
&nbsp;&nbsp;&nbsp;&nbsp;EndSubsection
EndSection
</pre><br />
Pamiętajmy jeszcze, by posiadać skrypt startowy HAL-a <em>/etc/rc.d/rc.hald</em> z prawem do wykonania (<em># chmod 755 /etc/rc.d/rc.hald</em>).</p>
<p>W tym momencie czas zrestartować X-y i sprawdzić efekty naszej pracy. W pliku <em>/etc/inittab</em> warto ustawić domyślny tryb inicjacji na 3, by w razie czego móc z konsoli poprawić, co zepsuliśmy.</p>
<p>Operacje te wymagają podstawowej wiedzy na temat konfiguracji serwera X.Org, dlatego przed ich rozpoczęciem polecam się z nimi zaznajomić. Miejmy nadzieję, że wchodzimy w erę, w której skończą się pytania &#8220;jak zrobić, żeby kuleczka w myszce przewijała Firefoksa?&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/06/xorg-16-w-slackware/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Pierwsze Kroki: Polonizacja Slackware &#8211; UTF-8</title>
		<link>http://blog.scxd.info/2009/05/pierwsze-kroki-polonizacja-slackware-utf-8/</link>
		<comments>http://blog.scxd.info/2009/05/pierwsze-kroki-polonizacja-slackware-utf-8/#comments</comments>
		<pubDate>Sun, 24 May 2009 11:36:42 +0000</pubDate>
		<dc:creator>largo3</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Pierwsze kroki]]></category>
		<category><![CDATA[Slackware]]></category>
		<category><![CDATA[lokalizacja]]></category>
		<category><![CDATA[polonizacja]]></category>
		<category><![CDATA[UTF8]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=245</guid>
		<description><![CDATA[Polonizacja Slackware&#8230; odwieczna walka o polskie znaczki. Powstał już o tym nie jeden poradnik i niejedno FAQ, ale z wersji na wersję teksty te zdezaktualizowały się coraz bardziej aby wreszcie stać się prawie bezużyteczne. 
Ponieważ ostatnio używam Slackware Current x64 i mnie dopadł problem polonizacji. Po niezbyt długiej walce udało mi się osiągnąć sukces. Poniżej [...]]]></description>
			<content:encoded><![CDATA[<p>Polonizacja Slackware&#8230; odwieczna walka o polskie znaczki. Powstał już o tym nie jeden poradnik i niejedno FAQ, ale z wersji na wersję teksty te zdezaktualizowały się coraz bardziej aby wreszcie stać się prawie bezużyteczne. <span id="more-245"></span></p>
<p>Ponieważ ostatnio używam Slackware Current x64 i mnie dopadł problem polonizacji. Po niezbyt długiej walce udało mi się osiągnąć sukces. Poniżej przedstawiam metodę na uzyskanie polskich znaków w Slackware przy kodowaniu UTF-8.</p>
<p>Na początek warto sprawdzić w <em>/etc/lilo.conf</em> cz nie uruchamiamy kernela z parametrem <strong>append=&#8221;vt.default_utf8=0&#8243;</strong>. Jeśli tak to należy zmienić wartość parametru z 0 na 1, aczkolwiek ja po prostu usunąłem wpis pozostawiając opcję append w postaci: <strong>append=&#8221;"</strong>. Należy pamiętać o odświeżeniu konfiguracji LILO poleceniem<em> /sbin/lilo</em>. W przypadku GRUB-a należy sprawdzić w pliku konfiguracyjnym linie zawierające ścieżkę do kernela. Jeśli pierwotnie mieliśmy opcję vt.default_utf8=0 to po zakończeniu konfiguracji potrzebny będzie restart systemu.</p>
<p>Teraz możemy przystąpić do dalszej konfiguracji. Jako root naszym ulubionym edytorem otwieramy plik: <strong>/etc/rc.d/rc.font</strong> i wpisujemy do niego następujące opcje:</p>
<p><pre>#!/bin/sh
setfont -v lat2-16.psfu.gz</pre></p>
<p>Teraz nadajemy plikowi prawa do wykonywania aby był uruchamiany przy starcie systemu:</p>
<p><pre>chmod a+x /etc/rc.d/rc.font</pre></p>
<p>Teraz kolej na plik <strong>/etc/rc.d/rc.keymap</strong>:</p>
<p><pre>#!/bin/sh
loadkeys -u pl2</pre></p>
<p>I znowu nadajemy prawa do uruchamiania się:</p>
<p><pre>chmod a+x /etc/rc.d/rc.keymap</pre></p>
<p>Kolejnym plikiem jest <strong>/etc/profile.d/lang.sh</strong>:</p>
<p><pre>#!/bin/sh
export LANG=pl_PL.utf8
export LC_CTYPE=&quot;pl_PL.utf8&quot;
export LC_NUMERIC=&quot;pl_PL.utf8&quot;
export LC_TIME=&quot;pl_PL.utf8&quot;
export LC_COLLATE=C
export LC_MONETARY=&quot;pl_PL.utf8&quot;
export LC_MESSAGES=&quot;en_US.utf8&quot;
export LC_PAPER=&quot;pl_PL.utf8&quot;
export LC_NAME=&quot;pl_PL.utf8&quot;
export LC_ADDRESS=&quot;pl_PL.utf8&quot;
export LC_TELEPHONE=&quot;pl_PL.utf8&quot;
export LC_MEASUREMENT=&quot;pl_PL.utf8&quot;
export LC_IDENTIFICATION=&quot;pl_PL.utf8&quot;
export LC_ALL=</pre></p>
<p>Tu ciekawostką jest, że w przykładach podane są lokalizacje w formacie np. en_US.UTF-8 natomiast w systemie występują one w formie takiej jak podałem powyżej (można to łatwo sprawdzić wykonując polecenie <strong>locale -a | grep pl</strong>). </p>
<p>To właściwie wszystko&#8230; Pozostaje tylko ponownie uruchomić system (jeśli trzeba) lub przeładować ustawienia:</p>
<p><pre>source /etc/profile.d/lang.sh
/etc/rc.d/rc.keymap restart
/etc/rc.d/rc.font restart</pre></p>
<p>Jeśli jakaś usługa nie było poprzednio uruchomiona i przy parametrze restart zwraca błąd należy spróbować uruchomić ją z opcją start zamiast restart.</p>
<p>Sprawdzone na aktualnych Slackware Current i Slackware Current x64.</p>
<p>Powyższy tekst dostępny jest na licencji <a href="http://www.gnu.org/licenses/fdl.html"> GNU Free Documentation License</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/05/pierwsze-kroki-polonizacja-slackware-utf-8/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Slackware64</title>
		<link>http://blog.scxd.info/2009/05/slackware64/</link>
		<comments>http://blog.scxd.info/2009/05/slackware64/#comments</comments>
		<pubDate>Wed, 20 May 2009 17:47:58 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Slackware]]></category>
		<category><![CDATA[64 bity]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=248</guid>
		<description><![CDATA[I słowo stało się ciałem. Pojawił się Slackware64, to znaczy wersja Slackware skompilowana pod 64-bitowe procesory. Jest to z pewnością wielki przełom, ponieważ poszerza grupę potencjalnych użytkowników tej dystrybucji. Póki co jednak Slackware64 pozostaje dostępny jedynie poprzez gałąź Current slackware64-current równolegle do 32-bitowej gałęzi. Zwolennicy stabilnych wersji są zmuszeni do oczekiwania na Slackware 13.0.
Nic w [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://blog.scxd.info/2008/08/nowa-galaz/">słowo</a> stało się ciałem. Pojawił się Slackware64, to znaczy wersja Slackware skompilowana pod 64-bitowe procesory. Jest to z pewnością wielki przełom, ponieważ poszerza grupę potencjalnych użytkowników tej dystrybucji. Póki co jednak Slackware64 pozostaje dostępny jedynie poprzez gałąź Current <em>slackware64-current</em> równolegle do 32-bitowej gałęzi. Zwolennicy stabilnych wersji są zmuszeni do oczekiwania na Slackware 13.0.<span id="more-248"></span></p>
<p>Nic w tym dziwnego, że Slackware64 nie został wydany od razu w stabilnej wersji, ponieważ wymaga dokładnego przetestowania, chociaż Patrick zapewnia, iż do tej pory również przechodził przez ten proces. Nie zmienia to jednak faktu, że można go wypróbować już teraz. Czysto teoretycznie (nietestowane) wystarczy zaktualizować ostatnią stabilną wersję bądź Current 32-bitowy do 64-bitowego, chociażby podmieniając ścieżkę repozytorium w menedżerze pakietów. Niestety, na dzień dzisiejszy nie są załączone żadne wskazówki dotyczące aktualizacji, a ChangeLog sprowadza się jedynie do inicjacji gałęzi.</p>
<p>Pod znakiem zapytania staje sens istnienia nieoficjalnych 64-bitowych forków Slackware. Przykładowo Slamd64 wydaje się być zszokowane i nie skomentował jeszcze tego wydarzenia w żaden sposób.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/05/slackware64/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nowy format paczek w Slackware &#8211; .txz</title>
		<link>http://blog.scxd.info/2009/05/nowy-format-paczek-w-slackware-txz/</link>
		<comments>http://blog.scxd.info/2009/05/nowy-format-paczek-w-slackware-txz/#comments</comments>
		<pubDate>Sat, 09 May 2009 09:12:06 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Paczki]]></category>
		<category><![CDATA[SCXD]]></category>
		<category><![CDATA[Slackware]]></category>
		<category><![CDATA[kompresja]]></category>
		<category><![CDATA[tgz]]></category>
		<category><![CDATA[txz]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=230</guid>
		<description><![CDATA[Gdy Patrick jakiś czas temu dodał do pkgtools obsługę innych formatów paczek (.tbz, .tlz, .txz), nie spodziewałem się, że postanowi w najbliższym czasie przejść na któryś z nich jako na ten, który będzie widniał na sztandarze dystrybucji. W końcu stare, całkiem dobre .tgz jest jednym z formatów, które wymienia się przy omawianiu Linuksa jako ogółu [...]]]></description>
			<content:encoded><![CDATA[<p>Gdy Patrick jakiś czas temu dodał do pkgtools obsługę innych formatów paczek (<em>.tbz</em>, <em>.tlz</em>, <em>.txz</em>), nie spodziewałem się, że postanowi w najbliższym czasie przejść na któryś z nich jako na ten, który będzie widniał na sztandarze dystrybucji. W końcu stare, całkiem dobre <em>.tgz</em> jest jednym z formatów, które wymienia się przy omawianiu Linuksa jako ogółu dystrybucji. Jednak świat się zmienia.<span id="more-230"></span></p>
<p>Tym szczęściarzem, którego wybrał Patrick, jest <em>.txz</em>. Oczywiście mówiąc format, mam na myśli jedynie sposób kompresji archiwum tar i tak naprawdę tylko to się w paczce zmienia. Wszelka jej struktura wewnętrzna pozostaje taka sama.</p>
<p>Testując poszczególne formaty po ich wprowadzeniu, od razu dostrzegłem wielki potencjał w <em>.tlz</em> i <em>.txz</em>. Oba opierają się na słownikowym algorytmie kompresji LZMA i nie dostrzegłem pomiędzy nimi różnic. Algorytm LZMA przy wykorzystaniu narzędzia xz ma w porównaniu z Gzip i Bzip2 o wiele większy stopień kompresji. Oto przykładowe porównanie rozmiaru paczki Krusadera w tych trzech formatach:<br />
<pre>$ du -hs krusader.*
3,5M&nbsp;&nbsp;&nbsp;&nbsp;krusader.tbz
4,0M&nbsp;&nbsp;&nbsp;&nbsp;krusader.tgz
3,0M&nbsp;&nbsp;&nbsp;&nbsp;krusader.txz</pre><br />
Taką oszczędność zajmowanego miejsca uzyskujemy właśnie dzięki słownikowi. Jednak z tą zaletą idzie w parze też pewna wada. Mianowicie czas kompresji i dekompresji trochę się wydłuża. Jednak nie na tyle, by przeważyć zysk czasowy uzyskany podczas szybszego pobrania paczki. W czasach kiedy przepustowości łącz internetowych stoją w miejscu, a częstotliwości taktowania procesorów idą naprzód jest to bardzo rozsądne rozwiązanie. Ponadto oszczędzając przestrzeń na dysku instalacyjnym Slackware&#8217;a, być może będzie on mieścił większą ilość pakietów.</p>
<p>Jako iż uważam zastąpienie wysłużonego <em>.tgz</em> za całkiem zgodne z ideą postępu i łatwego użytkowania, niedługo nowy format zawita również w Slackware Current eXtended Desktop. To oznacza, że wszelkie aktualizacje i nowe pakiety będą dodawane właśnie w nim. W związku z tym proszę zadbać o aktualne pkgtools, tar, xz i wybrać rozwijający się menedżer pakietów, który obsłuży tą innowację.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/05/nowy-format-paczek-w-slackware-txz/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Lokalne cache-owanie DNS-ów</title>
		<link>http://blog.scxd.info/2009/02/lokalne-cache-owanie-dns-ow/</link>
		<comments>http://blog.scxd.info/2009/02/lokalne-cache-owanie-dns-ow/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 14:22:21 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Otwarte oprogramowanie]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[dnsmasq]]></category>
		<category><![CDATA[nscd]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=221</guid>
		<description><![CDATA[Podczas pojedynczej sesji pobieramy wiele razy wciąż ten sam adres IP zamieniony z hosta z serwera DNS. A co dopiero, gdy w systemie mamy kilku użytkowników, którzy w mniejszej lub większej części odwiedzają te same serwisy. Zapewne nie raz widzieliśmy na dolnym pasku przeglądarki kilkusekundowe &#8220;Ustalanie adresu (&#8230;)&#8221;, nawet gdy korzystaliśmy już z kilku(dziesięciu) stron [...]]]></description>
			<content:encoded><![CDATA[<p>Podczas pojedynczej sesji pobieramy wiele razy wciąż ten sam adres IP zamieniony z hosta z serwera DNS. A co dopiero, gdy w systemie mamy kilku użytkowników, którzy w mniejszej lub większej części odwiedzają te same serwisy. Zapewne nie raz widzieliśmy na dolnym pasku przeglądarki kilkusekundowe &#8220;Ustalanie adresu (&#8230;)&#8221;, nawet gdy korzystaliśmy już z kilku(dziesięciu) stron na tym samym serwerze. Proces ten można nieco przyspieszyć, opierając się na fakcie, że IP serwera nie zmienia się kilka razy na godzinę, tylko jest stałe. Potrzebujemy usługi przynoszącej nam możliwość cache-owania DNS-ów na lokalnym komputerze.<span id="more-221"></span></p>
<p>Adekwatnych do naszej potrzeby cacherów mamy dwóch: dnsmasq i nscd. Ten drugi zawarty w glibc, niestety, może być używany tylko przez aplikacje korzystające z tej biblioteki translacji DNS-ów, której on sam używa, a więc przykładowy Firefox, będący w większości przypadków głównym konsumentem cachera, nie skorzysta na tym. Aczkolwiek nscd możemy użyć do cache-owania lokalnych haseł i grup użytkowników, więc o ile odrzucamy go w kwestii hostów, o tyle warto i tak mu się przyjrzeć.</p>
<p>dnsmasq natomiast pełni rolę serwera DNS-ów, co czyni go zdecydowanie bardziej uniwersalnym, będziemy mogli na nim oprzeć wszystkie internetowe aplikacje. Jest on ponadto serwerem DHCP, lecz w ujęciu desktopowego komputera pod tym kątem on się nam nie przyda, więc pozwolę sobie pominąć tą funkcjonalność w opisie konfiguracji.</p>
<p>Zacznijmy od zainstalowania i konfiguracji. dnsmasq znajduje się w oficjalnym repozytorium Slackware&#8217;a, więc nie będzie problemu ze zdobyciem jego paczki. Konfiguracja jest również prosta, bo polega na odkomentowaniu kilku opcji z jego pliku konfiguracyjnego <em>/etc/dnsmasq.conf</em>. Przedstawiam je poniżej, lecz aby zachować porządek w pliku proponuję ręcznie je odszukać, odkomentować i dodać potrzebne parametry.<br />
<pre>interface=ra0
listen-address=127.0.0.1
expand-hosts
cache-size=1024
no-negcache</pre><br />
W opcji <em>interface</em> podajemy nasz interfejs sieciowy łączący nas z Internetem (w przypadku karty Ethernet będzie to zwykle <em>eth0</em>) &mdash; do sprawdzenia poleceniem <em>ifconfig</em>. <em>listen-address</em> definiuje IP, na którym serwer DNS-ów dnsmasq będzie nasłuchiwał. To z nim będą się łączyć wszelkie aplikacje klienckie, począwszy od ping, skończywszy na przeglądarce. <em>expand-hosts</em> sprawia, że cache-owane będą nie tylko adresy IP zawarte w pliku <em>/etc/hosts</em>, lecz również wszystkie te, z których korzystać będą aplikacje. <em>cache-size</em> to wielkość naszego cache-a, 1024 wydaje się wystarczająca. No i w końcu <em>no-negcache</em>, poprzez które informacja o nieistnieniu danego adresu nie będzie cache-owana, co wybawi nas od problemu fałszywej informacji, gdyby nagle host się pojawił na serwerze DNS.</p>
<p>Teraz wypada nadać uprawnienia wykonywalności skryptowi startowemu, aby dnsmasq był uruchamiany przy starcie systemu, i najlepiej od razu go uruchomić.<br />
<pre># chmod 755 /etc/rc.d/rc.dnsmasq
# /etc/rc.d/rc.dnsmasq start</pre></p>
<p>W końcu musimy sprawić, żeby aplikacje wiedziały, że domyślnie mają się odwoływać nie do globalnych serwerów DNS, tylko do naszego pośredniczącego dnsmasq, który sam odwoła się do globalnych, jeżeli jeszcze dany adres nie będzie się znajdował w cache-u.<br />
W związku z tym na początku pliku <em>/etc/resolv.conf</em> dopisujemy nasz lokalny serwer 127.0.0.1. W przypadku, gdy korzystamy z usług TP, może on wyglądać następująco:<br />
<pre>search .
nameserver 127.0.0.1
nameserver 194.204.152.34
nameserver 194.204.159.1</pre><br />
Jeżeli używamy klienta DHCP, to musimy i go o tym poinformować, dodając do <em>/etc/dhclient.conf</em> linijkę:<br />
<pre>prepend domain-name-servers 127.0.0.1,194.204.152.34,194.204.159.1</pre></p>
<p>Od teraz cache-owanie przy pomocy dnsmasq powinno być w pełni funkcjonalne. Sprawdzić to możemy wywołując translację hosta na IP dig-iem. Najpierw, by IP zostało zapisane w cache-u; drugi raz, żeby sprawdzić, czy cache działa &mdash; odpowiedź serwera nie powinna być dłuższa niż kilka milisekund.</p>
<p>Za cenne wskazówki dziękuję slawulowi, który zresztą zainteresował mnie tym zagadnieniem. <img src='http://blog.scxd.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2009/02/lokalne-cache-owanie-dns-ow/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Świąteczne lampki na parallelu</title>
		<link>http://blog.scxd.info/2008/12/swiateczne-lampki-na-parallelu/</link>
		<comments>http://blog.scxd.info/2008/12/swiateczne-lampki-na-parallelu/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 14:51:44 +0000</pubDate>
		<dc:creator>Zielony</dc:creator>
				<category><![CDATA[Otwarte oprogramowanie]]></category>
		<category><![CDATA[elektronika]]></category>
		<category><![CDATA[iluminofonia]]></category>
		<category><![CDATA[lampki]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[święta]]></category>

		<guid isPermaLink="false">http://blog.scxd.info/?p=213</guid>
		<description><![CDATA[Na kilka dni przed świętami Bożego Narodzenia wpadłem na pomysł, by uatrakcyjnić je odrobiną elektroniki w połączeniu z informatyką. Zacząłem od migających diod na klawiaturze, co jednak wydało mi się zbyt minimalistyczne w porównaniu do ogromnej tajemnicy obchodzonego wydarzenia. Postanowiłem sterować girlandą świąteczną za pomocą układu od starej klawiatury. Jednak po rozmowie z tatą (elektronikiem) [...]]]></description>
			<content:encoded><![CDATA[<p>Na kilka dni przed świętami Bożego Narodzenia wpadłem na pomysł, by uatrakcyjnić je odrobiną elektroniki w połączeniu z informatyką. Zacząłem od migających diod na klawiaturze, co jednak wydało mi się zbyt minimalistyczne w porównaniu do ogromnej tajemnicy obchodzonego wydarzenia. Postanowiłem sterować girlandą świąteczną za pomocą układu od starej klawiatury. Jednak po rozmowie z tatą (elektronikiem) i Kosmą (informatykiem, elektronikiem) pomysł ewoluował.<span id="more-213"></span></p>
<p>Tata wskazał na moją nieużywaną od lat iluminofonię J-50 z zestawu do samodzielnego złożenia, a Kosma zaproponował port LPT (parallel) zamiast układu z klawiatury i uzmysłowił mi, jak i jakimi częściami to wszystko połączyć, jako że o elektronice nie mam większego pojęcia.</p>
<p>Port LPT posiada 8 bitów, 8 czyli sygnałów sterujących. To właśnie one zostały wykorzystane do włączania i wyłączania lampek. Każdy bit odpowiada za jeden odbiornik zasilania, więc musimy zadecydować, ile ich chcemy wykorzystać. Mi wystarczyły 2, dlatego też do pinu 2. i 3. portu za pośrednictwem wtyczki (którą zakupił mi uprzejmy kolega Fbz) przylutowałem oporniki 150 ohmów, a je z kolei do anod transoptorów CNY17 (polecam <a href="http://blog.scxd.info/wp-content/uploads/2008/12/cny17-3.pdf">specyfikację</a>). Każdy z bitów ma wspólną masę, która znajduje się w 25. pinie &mdash; łączymy ją z katodą każdego transoptora. Transoptor służy nam tu jako zabezpieczenie przed przedostaniem się napięcia 230 V w kierunku parallela.</p>
<p>Poniżej przedstawiam fragment schematu iluminofonii, który może przydać się nam do zbudowania tego prostego układu (oczywiste jest, że nie potrzebujemy całej iluminofonii).<br />
<a href="http://blog.scxd.info/wp-content/uploads/2008/12/schemat_j-50.jpg"><img src="http://blog.scxd.info/wp-content/uploads/2008/12/schemat_j-50.jpg" alt="" title="Fragment schematu iluminofonii J-50" class="aligncenter size-medium wp-image-215" /></a><br />
Posłużę się przykładem pierwszego rozgałęzienia, który jest analogiczny do pozostałych. Rzecz jasna takich rozgałęzień możemy stworzyć do 8, by miało to sens.</p>
<p>Tranzystor T1 jest nam tak naprawdę niepotrzebny, więc łączymy się do niego równolegle lub zamiast niego. Kolektor transoptora (patrz: schemat w specyfikacji na 1. stronie) lutujemy do opornika R11, a emiter &mdash; do R12. Zamiast gwintów żarówek na końcu mocujemy gniazdo sieciowe (nie polecam ściennego <img src='http://blog.scxd.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ) i posiadając połączenie bit-opornik-transoptor-oporniki-układ-gniazdo dla pojedynczego odbiornika elektrycznego, elektronikę mamy z głowy.</p>
<p>Sterowanie za pomocą skryptu Perla jest całkiem proste. Oto ten, który napisałem:<br />
<pre>#!/usr/bin/perl

use strict;

use Time::HiRes qw/usleep/;
use Device::ParallelPort;
use Device::ParallelPort::drv::parport;

my $p = Device::ParallelPort-&gt;new(&#039;parport&#039;);

$| = 1;

sub pin {
&nbsp;&nbsp;@_ = grep (($_ != 0), @_);
&nbsp;&nbsp;return $p-&gt;set_data () unless @_;
&nbsp;&nbsp;
&nbsp;&nbsp;my $pins = 1 &lt;&lt; (shift () - 2);
&nbsp;&nbsp;$pins = ($pins | (1 &lt;&lt; ($_ - 2))) for (@_);
&nbsp;&nbsp;return $p-&gt;set_data ($pins);
}

sub off {
&nbsp;&nbsp;pin (0);
&nbsp;&nbsp;exit;
}

$SIG{&#039;INT&#039;} = &#039;off&#039;;

open U, &quot;&lt; $ARGV[0]&quot; or die;
my $t = scalar &lt;U&gt;;
my $l = scalar &lt;U&gt;;
my @u;

while (&lt;U&gt;) {
&nbsp;&nbsp;chomp;
&nbsp;&nbsp;my $pn = 2;
&nbsp;&nbsp;s/1/$pn/g;
&nbsp;&nbsp;push @{$u[0]}, (split / */, $_);
&nbsp;&nbsp;for (my $i = 1; $i &lt; $l; $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;$_ = scalar &lt;U&gt;;
&nbsp;&nbsp;&nbsp;&nbsp;chomp;
&nbsp;&nbsp;&nbsp;&nbsp;$pn = $i + 2;
&nbsp;&nbsp;&nbsp;&nbsp;s/1/$pn/g;
&nbsp;&nbsp;&nbsp;&nbsp;push @{$u[$i]}, (split / */, $_);
&nbsp;&nbsp;}
}
close U;

while (1) {
&nbsp;&nbsp;for my $i (0 .. (scalar @{$u[0]} - 1)) {
&nbsp;&nbsp;&nbsp;&nbsp;pin (map $u[$_][$i], (0 .. ($l - 1)));
&nbsp;&nbsp;&nbsp;&nbsp;usleep ($t);
&nbsp;&nbsp;}
}</pre><br />
Z dodatkowych modułów potrzebujemy Device::ParallelPort i Device::ParallelPort::drv::parport; znajdują się one w rezpozytorium SCXD. Uruchamiamy go w następujący sposób:<br />
<pre>$ ./lamps.pl &lt;układ&gt;</pre><br />
Przez <em>układ</em> rozumiem plik z układem w następującej postaci:<br />
<pre>&lt;tempo w jednostce czasu usleep&gt;
&lt;ilość sygnałów sterujących&gt;
&lt;cyfry 0 i 1 reprezentujące odpowiednio stan włączony i wyłączony 1. sygnału&gt;
&lt;2. sygnału&gt;
...
&lt;1. sygnału&gt;
&lt;2. sygnału&gt;
...</pre><br />
Dla zrozumienia prosty przykład:<br />
<pre>200000
2
11111111 00000111
00000111 11111111</pre><br />
Na tyle krótki, że nie trzeba używać więcej niż 1 linii dla każdego sygnału. Spacje służą jedynie przejrzystości. Budowę tego schematu można przyrównać do zapisu nutowego z klamrą na kilka instrumentów.</p>
<p>Efektem kilkugodzinnej pracy są synchronicznie migające świąteczne światełka. <img src='http://blog.scxd.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Przedstawiam krótkie nagranie z udziałem mojego okna i balkonu przy wykorzystaniu przedstawionego układu.<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/ZaIhxnY8_Xo&#038;hl=pl&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ZaIhxnY8_Xo&#038;hl=pl&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Zastrzegam, że nie odpowiadam za ewentualne szkody wynikające z próby zbudowania tej ekscentrycznej maszyny. Życzę chęci i powodzenia.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.scxd.info/2008/12/swiateczne-lampki-na-parallelu/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
