[LinuxFocus-icon]
<--  | Ana Sayfa  | Eri�imd�zeni  | ��indekiler  | Arama

Duyumlar | Belgelikler | Ba�lant�lar | LF Nedir
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  

Stefan Blechschmidt
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)

Ba�l�k resmi

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


_________________ _________________ _________________

 

�n �artlar

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

 

Veritaban�n�n y�klenmesi

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.

Not:

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.

Denetleme :

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
 

Veritaban�m�za veri gir�i yapmak

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.

Not:

Hert�rl� uygulama i�in olan Perl mod�llerini 'Comprehensive Perl Archive Network (Geli�mi� Perl ar�iv a��) (CPAN, http://www.cpan.org/)' dan elde edebilirsiniz. Bunlar�n y�klenmesini anlatmayarak size
http://www.pro-linux.de/news/2002/0070.html
ve
http://www.linux-magazin.de/Artikel/ausgabe/1997/10/CPAN/cpan.html
adreslerini �neriyorum.
#!/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;

Program�n a��klanmas�:

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.

 

Perl ve CGI

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.

 

Grafik ��kt�

chart

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

  1. X ekseninin �l�eklendirilmesi
  2. �lk alg�lay�c�n�n (sensor0) verileri
  3. �kinci alg�lay�c�n�n (sensor1) verileri

Farkl� grafikler elde edebilmek i�in de�i�tirilmesi gereken sadece sorgulard�r.

 

SQL Sorgular�

Son olarak, �rne�imizin bel kemi�ini olu�turan baz� SQL sorgular� g�stermek istiyorum.

 

En son be� �l��m

    select tag, monat, zeit,
     DATE_FORMAT(dbtime,'%Y-%c-%d %H:%i:%s') as dbtime, messung
       from sensor0
       order by id desc
         limit 5;
 

Y�l�n en so�uk g�n�

    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
 

Y�l�n en s�cak g�n�

    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
 

G�n i�in ortalama de�er hesaplanmas�

   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)
 

Sonu�

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.

 

�ndirebileceklereniz

 

Ba�lant�lar ve Referanslar

 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

<--, Bu say�n�n ana sayfas�na gider

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:
de --> -- : Stefan Blechschmidt <sb(at)sbsbavaria.de>
de --> en: Jürgen Pohl <sept.sapins(Q)verizon.net>
en --> tr: Erdal Mutlu <erdal(at)linuxfocus.org>

2004-11-09, generated by lfparser version 2.48