|
|
Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano Deutsch Francais Nederlands Russian Turkce |
Stefan Blechschmidt <sb(at)sbsbavaria.de> Yazar hakk�nda: E�itimli bir elektrik teknisyeni olarak 1990 y�l�nda kendimi bir bilgisayar destekli tasar�m ve derleyici program�n kar��s�nda bir switch ve bir kontrol merkezi geli�tirirken buldum. A��k�as�, o zamanlar bilinmeyen bir vir�s taraf�ndan etkilenmi�tim ve bunda bir sorun yoktu. T�rk�e'ye �eviri: Erdal Mutlu <erdal(at)linuxfocus.org> ��erik:
|
Linux ile s�cakl�k izleme (2. B�l�m)�zet:
Kas�m 2003'teki Linux ile s�cakl�k izleme yaz�s�nda, s�cakl�k verilerini Linux'ta toplamaya yarayan bir elektronik devre tan�tm��t�m. Verileri de�erlendirebilmek i�in bir veritaban�na yerle�tirmemiz gereklidir. Bu yaz�n�n tam olarak yararl� olabilmesi i�in, verileri sanaldoku ortam�nda grafiksel olarak g�sterilmesini anlataca��z. |
Bilgisayar�n�zda baz� uygulamalar�n�n �nceden y�klenmi� olmas� gerekmektedir.
Sizin de fark�na vard���n�z gibi, bu yaz� Linux'ta ileri seviye bilgiye sahip olan kullan�c�lar i�indir. Hen�z bu seviyeye ula�mam�� olanlar, bu yaz�y� okuyunca ula�acaklard�r ;-)
MySQL veritaban� i�in, veritaban�na ula�may� sa�layan mysql
buru�u vard�r. mysql -u root -p mysql
buyru�u ile MySQL veritaban�na ba�lanabilirsiniz.
-u
se�ene�i ile veritaban� kullan�c�s�
belirtilmektedir. Son olarak da ba�lan�lmak istenilen
veritaban� ismi belirtilir. Bizim durumumuzda bu, MySQL'in ana veritaban�d�r.
Buyruklar� verebilece�iniz mysql >
imlecini
elde edeceksiniz. �lk olarak veritaban�nda yer alan tablolar� ��renelim.
Bunun i�in show tables;
buyru�u kullan�lmaktad�r.
mysql> show tables; +-----------------+ | Tables_in_mysql | +-----------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +-----------------+ 6 rows in set (0.00 sec)
S�cakl�k verilerimiz i�in bir veritaban� olu�turmam�z gerekiyor.
create database digidb
buyru�u ile digidb ad�ndaki veritaban�m�z� yaratm�� oluruz.
Di�er buyruklar ba�ka bir yoldan verilece�i i�in, exit
buyru�u ile MySQL'in istemci ortam�ndan ��kabiliriz.
MySQL'in genelde root ad�nda bir sistem y�neticisi
kullan�c�s� vard�r. Benimsenmi� de�er olarak bu kullan�c� i�in ge�i�s�zc���
istenmemektedir. mysqladmin -u root -p password gizli
buyru�u ile root kullan�c�s�n�n ge�i�s�zc���n� gizli olarak de�i�tirmi� oluruz.
Bu de�i�ikli�in hayata ge�irilebilmesi i�in ilgili sistem tablosunun
MySQL suncusu taraf�ndan tekrar okunmas� gerekiyor. Bunu ge�ekle�tirmek i�in
mysqladmin -u root -p flush-privileges
buyru�u verilebilir. Bundan b�yle, veritaban�na eri�mek i�in
root kullan�c�s� ge�i�s�zc���n� yazmak zorundad�r.
MySQL'in istemci program�n�n (mysql) yorumlay�c� ortam�ndan buyruklar vermek biraz kar���k olabilir. Bu y�zden MySQL, buyruklar�n�z� verebilece�iniz ba�ka bir y�tem sunmaktad�r.
Bunu yapmak i�in SQL buyruklar bir dosyaya yaz�lmakta ve mysql buyru�una "<" den sonra dosya ad� verililmektedir.
Bunu g�stermek i�in 0. al�c� i�in olan tabloyu yaratmaya yarayan buyru�u bir sensor0.sql dosyas�na yaz�yoruz:
CREATE TABLE sensor0 ( id int(11) NOT NULL auto_increment, monat char(3) NOT NULL default '', tag char(2) NOT NULL default '', dbtime timestamp(14) NOT NULL, zeit time NOT NULL default '00:00:00', messung decimal(4,2) NOT NULL default '0.00', PRIMARY KEY (id) ) TYPE=MyISAM;
Ve a�a��daki buyru�u veriyoruz:
mysql -u digitemp -p digitemp < sensor0.sql
�ki adet alg�lay�c� kulland���m�z i�in yapmam�z gereken
tek �ey, dosyan�n bir kopyas�n� al�p, CREATE TABLE
sensor0
ifadesini CREATE TABLE
sensor1
ile de�i�tirmektir.
SQL buyruklar�n� bir dosyaya yaz�p vermenin yarar�n� farketmi� olmal�s�n�z.
Yeni yarat�lm�� tablolar� g�rebilmek i�in
echo 'show tables' | mysql -u root -p digidb
buyru�unu verebiliriz.
Her�eyi d�zg�n yapt�ysak, buyru�un sonucu a�a��daki gibi olmal�d�r:
Enter password: Tables_in_digidb sensor0 sensor1
Verilerin veritaban�na aktar�lmas�n� k���k bir Perl program� arac�l��� ile yapaca��z. Veritaban� eri�imi i�in Perl'�n DBI mod�l� kullan�lacakt�r.
#!/usr/bin/perl -w # # Digitemp preparing of log file and saving in database # sbs 2003-08-09 # use DBI; use strict; # Initialize database my $datasource = "dbi:mysql:database=digidb"; my $user = "root"; my $pass = "geheim"; my $db = DBI->connect($datasource, $user, $pass) or "Verbindung zur Datenbank nicht möglich: " . $DBI::errstr; # Filtering of Digitemp while(<STDIN>) { chomp; # Skip output program name next if (m/Digi.*/); # Skip output blank line next if (m/^$/); # Skip all to Fahrenheit m/(.*).F.*/; my $templine = $1; # Divide temp line and save in variables my ($monat, $tag, $zeit, $sensor_txt, $sensor_nr, $grad_txt, $grad_wert) = split(/ /,$tempzeile); # Fill database $db->do( "insert into sensor$sensor_nr (monat, tag, zeit, messung) values ('$monat', '$tag', '$zeit','$grad_wert')") or die "do nicht möglich: " . $db->errstr(); }# END- Digitemp filter # close database $db->disconnect;
Asl�nda program�n yapt��� �ok fazla bir �ey yok. Yapt��� i�, veritan�na ba�lanmak, digitemp'den gelen verileri okumak, gerekmeyen verileri atlayarak sadece gerekli olanlar� veritaban�ndaki tabloya yazmakt�r.
Verileri s�rekli olarak toplamak i�in, bir cron i�i tan�mlanmaktad�r:
0-59/15 * * * * root /root/bin/digitemp -a | /root/bin/digipipe.pl
Veri toplama hakk�nda s�yleyeceklerimiz bu kadar. �imdi sanaldoku aray�z�ne ge�ebiliriz.
Bu i� i�in Perl uygun bir ortam sunmaktad�r.
�lk �nce Apache'nin CGI programlar�n�n�n oldu�u
dizini bulmak gerekir. Bunu Apache'nin yap�land�rma
dosyas�na bakarak bulabiliriz.
<Directory /usr/lib/cgi-bin>
�eklinde bir sat�r g�rmeniz gerek.
Grafik ��kt�ya ge�meden �nce, en �ok �l��len verileri elde etmemizi sa�layan program� olu�tural�m.
Bu programlar� bir alt d�z�nde toplamak yararl� olabilir.
Ayr�ca, program� �al��t�r�labilir duruma getirmek i�in eri�im haklar�n�
chmod 755 program_ad�
�eklinde de�i�tirmek gerekir.
Olu�turulacak ��kt�y� son veriyi elde edecek �ekilde s�n�rlamam�z ve bunu bir Perl-CGI program�na yazmam�z gerekmektedir. Bunu a�a��daki SQL sorgusuyla yapabiliriz:
#!/usr/bin/perl use DBI; use strict; # Initialize database my $datasource = "dbi:mysql:database=digidb"; my $user = "root"; my $pass = "geheim"; my $db = DBI->connect($datasource, $user, $pass) or "Verbindung zur Datenbank nicht möglich: " . $DBI::errstr; # database work parameter my $sql; my $sth; # Sensor work parameter my $temp; my $zeit; #Prepare HTML output print "Content-type: text/html\n\n"; # Output of individual sensors measurements $sql = "select messung, zeit from sensor$i order by id desc limit 1;"; $sth = $db->prepare($sql) or die "prepare nicht möglich"; $sth->execute() or die "execute nicht möglich"; ($temp, $zeit) = $sth->fetchrow_array(); $sth->finish(); print "<p>Temperatur Sensor$i: <b>[$temp]</b> $zeit</p>"; } # Close database $db->disconnect;
�rne�imiz en ��k olan� de�ildir. Bu sadece bu i�in Perl ile ne kadar kolay yap�labilece�ini g�stermektedir.
�imdi ��kt� �zerinde dural�m. Program�n (Program� indirmek i�in yaz�n�n sonuna bak�n�z.) olu�turdu�u grafik e�rilerden meydana gelmektedir. Daha farkl� g�sterilimler i�in GD mod�llerine bak�n�z.
Dahas�, program Perl ile HTML ��kt�s� olu�turmaya yarayan CGI mod�l� kullanmaktad�r. Bununla ilgili �nternette bir�ok a��klama vard�r.
Programa geri d�necek olursak, onun bir ana ve iki alt programdan olu�tu�unu g�r�r�z. Alt programlardan biri SQL sorgular�ndan, di�eri de grafiklerden sorumludur.
Ana k�s�mda saedce �� adet sorgu yap�lmakta ve elde etti�i veriler alt programlara aktar�lmaktad�r.
Farkl� grafikler elde edebilmek i�in de�i�tirilmesi gereken sadece sorgulard�r.
Son olarak, �rne�imizin bel kemi�ini olu�turan baz� SQL sorgular� g�stermek istiyorum.
select tag, monat, zeit, DATE_FORMAT(dbtime,'%Y-%c-%d %H:%i:%s') as dbtime, messung from sensor0 order by id desc limit 5;
select tag, monat, zeit, DATE_FORMAT(dbtime,'%Y-%c-%d %H:%i:%s') as dbtime, messung from sensor1 where YEAR(dbtime) = YEAR(NOW()) order by messung asc limit 1
select tag, monat, zeit, DATE_FORMAT(dbtime,'%Y-%c-%d %H:%i:%s') as dbtime, messung from sensor1 where YEAR(dbtime) = YEAR(NOW()) order by messung desc limit 1
select day, month, YEAR(dbtime) as Jahr, sum(messung)/count(*) as Durchschnitt from sensor1 where YEAR(dbtime) = YEAR(NOW()) and DAYOFMONTH(dbtime)= DAYOFMONTH(NOW()) and MONTHNAME(dbtime) = MONTHNAME(NOW()) group by DAYOFMONTH(dbtime)
Ben herzaman Perl ile yaz�lan programlar�n ne kadar basit oldu�una �a��rm��t�m. Asl�nda programalar s�f�rdan yaz�lmam��, biryerlerden al�nm��, kopyalanm��, yani bunlar bir �ekilde bir yerlerden o veya bu �ekilde vard�r.
Umar�m, Perl, CGI ve MySQL konular�na az da olsa bir ���k tutabilmi�imdir.
|
G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Stefan Blechschmidt "some rights reserved" see linuxfocus.org/license/ http://www.LinuxFocus.org |
�eviri bilgisi:
|
2004-11-09, generated by lfparser version 2.48