|
|
| 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