Skrypt do pobierania pogody w conky cz.1

Piękna tapeta przydatny conky to coś czego pragnie wielu. Możemy wzbogacić nasz pulpit także prognozą pogody jeśli ktoś sobie zażyczy. Wystarczy chwilę pomyśleć albo przeczytać ten artykuł :).
Aby skrypt mógł działać trzeba zainstalować dwa programy sed i lynx. Dzięki lynx pobierzemy sobie do pliku stronę z pogodą aby za pomocą seda wyciągnąć linijki np z temperaturą. Według mnie najlepszą prognozę podaje strona mojapogoda.com . Lynx to przeglądarka plików więc nie łamiemy prawa tylko zapisujemy stronę do pliku 🙂 Skrypt nie został zabezpieczony przed brakiem internetu stąd w nazwie pisze część 1 możemy później sobie dodać zamiast samych napisów obrazki np że pada deszcz albo animowany termometr.

Musimy w ustawieniach zmienić sobie gdzie będziemy zapisywać stronę i utworzyć taki plik oraz podać adres do strony na której ta pogoda wisi. Możemy zmienić też nagłówek. Skyptowi trzeba nadać prawa do uruchomienia czyli:

chmod +x skrypt.sh

można także przetestować sobie go w terminalu.

#!/bin/bash
###############################
## Pobranie pogody ze strony ##
## mojapogoda.com ##
## Tomasz Pachołek ##
## elektronik666@o2.pl ##
###############################
#ustawienia skryptu
plik_strony=”~/.pogoda_conky/strona.txt”
adres_strony=”http://www.mojapogoda.com/pogoda-na-swiecie/pogoda-lokalna/miasto/48X685/tomaszow-lubelski/dzis.html”
naglowek=”Pogoda Tomaszów”

#pobranie strony do pliku
lynx $adres_strony -dump > $plik_strony

#wyłuskanie linijki z datą
dzien=sed -n 86p $plik_strony

#wyłuskanie linijki z temperaturą z pliku i przypisanie do zmiennej itd
temp_rano=sed -n 101p $plik_strony
temp_poludnie=sed -n 105p $plik_strony
temp_wieczor=sed -n 109p $plik_strony

#wyłuskanie stanu pogody – deszcz, pochmurnie, itd
stan_rano=sed -n 103p $plik_strony
stan_poludnie=sed -n 107p $plik_strony
stan_wieczor=sed -n 111p $plik_strony

#usunięcie spacji z początku stringu
temp_rano=”${temp_rano#”${temp_rano%%[![:space:]]*}”}”
temp_poludnie=”${temp_poludnie#”${temp_poludnie%%[![:space:]]*}”}”
temp_wieczor=”${temp_wieczor#”${temp_wieczor%%[![:space:]]*}”}”
stan_rano=”${stan_rano#”${stan_rano%%[![:space:]]*}”}”
stan_poludnie=”${stan_poludnie#”${stan_poludnie%%[![:space:]]*}”}”
stan_wieczor=”${stan_wieczor#”${stan_wieczor%%[![:space:]]*}”}”

#usunięcie spacji z końcu stringu
temp_rano=”${temp_rano%”${temp_rano##*[![:space:]]}”}”
temp_poludnie=”${temp_poludnie%”${temp_poludnie##*[![:space:]]}”}”
temp_wieczor=”${temp_wieczor%”${temp_wieczor##*[![:space:]]}”}”
stan_rano=”${stan_rano%”${stan_rano##*[![:space:]]}”}”
stan_poludnie=”${stan_poludnie%”${stan_poludnie##*[![:space:]]}”}”
stan_wieczor=”${stan_wieczor%”${stan_wieczor##*[![:space:]]}”}”

echo $naglowek
echo $dzien
echo ” ——————– “
echo “Temperatura”
echo “Rano: $temp_rano”
echo “Południe: $temp_poludnie”
echo “Wieczór: $temp_wieczor”
echo ” ——————– “
echo “Warunki pogodowe”
echo “Rano: $stan_rano”
echo “Południe: $stan_poludnie”
echo “Wieczór: $stan_wieczor”
echo ” ——————– “

Pozostaje jeszcze dodanie tego do conky. Przykładowy config:

background yes

# y-szerokość x-wysokość punktu zazczęcia rysowania conky
gap_x 260
gap_y 500

# maksymalna szerokość
maximum_width 190

# wyrównywanie punktu rozpoczęcia
alignment top_right

# marinesy
#border_margin 8
#border_width 8

#Sprawia że conky działa cały czas
total_run_times 0

# co ile sekund będzie odświerzany
update_interval 2.0

#Ustawienia okna
own_window yes
own_window_type normal
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager

# domyślne kolory
default_color white
default_shade_color black
default_outline_color black

# kodowanie znaków
override_utf8_locale yes

#podwójne buforowanie
double_buffer yes

# Wyświetlanie cieni
draw_shades yes
draw_outline no

# Używać Xft
use_xft yes

# Domyślna czcionka Xft jeśli ten jest aktywny
xftfont DejaVu Sans Mono:size=7.5

# Przeźroczystość tekstu Xft (0-1)
xftalpha 0.8 

TEXT
${image /home/tomek/.conky/tlo.png -p -4,-4 -s 500×1000}
Pogoda ${hr 3}

${execi 60 ~/.conky_pogoda/skrypt.sh}

Pliki do pobrania: skrypt pogody i conky pogoda

Zamiana kolumn i wierszy miejscami w c++

Aby cokolwiek ze sobą zamienić w języku c++ mamy do pomocy funkcję swap dostępną w głównej bibliotece języka.
Zilustruję to na poniższych przykładach:

Zamiana kolumn miejscami:

#include<iostream> //tyle nam wystarczy, czyli podstawa

using namespace std; //przestrzenie nazw by sie nie bawić niepotrzebnie

int main(){

 cout<<“PROGRAM ZAMIENIA KOLUMNY W TABLICY MIEJSCAMI “<<endl;

// Definicja tablicy – 4 kolumny, 5 wierszy
int tab[5][4] =
{
    {2,3,4,5},//wiersz numer 1 a w nim w kolumnie pierwszej liczba 2
    {5,6,7,8},//wiersz numer 2 a w nim w kolumnie drugiej jest liczba 6
    {9,0,1,2},//itd…….   pamiętajmy że pierwszy element wiersza lub 
    {3,4,5,6},// kolumny jest oznaczany jako 0 – język c tak ma i już
    {7,8,9,0}
};
//powiedzmy co posiadamy
cout<<endl<<“===========================”<<endl;
cout<<“W tablicy mamy 4 kolumny oraz 5 wierszy, liczone sa one od zera”;
cout<<endl<<“===========================”<<endl;

 

//wyświetlam tablicę
cout<<endl<<“———————-“<<endl;
cout<<“Wyglad tablicy na wstepie”<<endl;
int i=0, n=5, m=4;
  //wypisanie tablicy poprzez pętle, nie będę się rozpisywał :p
  for (int i=0 ; i<n ; i++)
  {
      cout<<“Wiersz numer: “<<i<<”     |”; 
      for (int j=0 ; j<m ; j++)
      {
          cout<<tab[i][j]<<”  “;
      }
      cout<<endl;
  }
  cout<<“———————-“<<endl<<endl;

//zamiana – formularz – pytamy co chcemy zamienić

int z1,z2;
cout<<“Podaj numery kolumny pierwszej ktora podlega zamianie”<<endl;
cout<<“Numeracje kolumn przyjmij od zera: “<<endl;

//wprowadzenie kolumny pierwszej do zamiany

cin>>z1;
//no i druga kolumna
cout<<endl<<“Podaj numery kolumny drugiej ktora podlega zamianie: “<<endl;
cin>>z2;
cout<<endl<<“———————-“<<endl;

//sprawdzenie poprawności wielkości podanych ponieważ może ktoś dać do zamiany kolumne której nie ma 😀

if(z1>4||z2>4)
{
    cout<<“ERRRRROR!!!! ZLE PODALES NUMER KOLUMNY – TAKOWY NIE ISTNIEJE!!!”;
    return 0;
}
/*do dzieła:
-używamy do obsługi pętli, zmiennej  i, dlatego bo zaczynamy od przyrównania jej do zera – możemy znów ją wykorzystać
-posiadamy 5 wierszy więc w kolejnych obiegach pętli zamieniamy kolejne elementy z wiersza –
-używamy funkcji swap(element1, element2) która zamienia miejscami wartości elementu1 i elementu2 – takie czary mary
-dla pierwszego obiegu pętli mamy tak :    
    zamiana elementu tablicy z wiersza numer 0 i kolumny podanej jako pierwsza – z1
    z elementem z wiersza numer 0 i kolumny podanej jako druga – z2
-analogicznie aż do spełnienia warunku pętla sobie śmiga
*/
for(i=0;i<5;i++){
    swap( tab[i][z1],tab[i][z2]); 
}

 

//wyświetlam tablicę po zamianie żeby ujrzeć rezultaty

cout<<endl<<“———————-“<<endl;
cout<<endl<<“Wyglad tablicy po zmianie”<<endl;

  //wypisanie tablicy
  for (int i=0 ; i<n ; i++)
  {
      cout<<“Wiersz numer: “<<i<<”     |”;  
      for (int j=0 ; j<m ; j++)
      {
          cout<<tab[i][j]<<”  “;
      }
      cout<<endl;
  }
  cout<<endl;
cout<<endl<<“===========================”<<endl;
cout<<“Nacisnij dowolny klawisz enter by zakonczyc”;

return 0;
}

 

 

Zamiana wierszy miejscami:

#include<iostream>
using namespace std;

int main(){

cout<<“PROGRAM ZAMIENIA WIERSZY W TABLICY MIEJSCAMI “<<endl;

// Definicja tablicy – 4 kolumny, 5 wierszy
int tab[5][4] =
{
{2,3,4,5},//wiersz numer 1 a w nim w kolumnie pierwszej liczba 2
{5,6,7,8},
{9,0,1,2},
{3,4,5,6},
{7,8,9,0}
};
//powiedzmy co posiadamy
cout<<endl<<“===========================”<<endl;
cout<<“W tablicy mamy 4 kolumny oraz 5 wierszy, liczone sa one od zera”;
cout<<endl<<“===========================”<<endl;
//wyświetlam tablicę
cout<<endl<<“———————-“<<endl;
cout<<“Wyglad tablicy na wstepie”<<endl;
int i=0, n=5, m=4;
//wypisanie tablicy
for (int i=0 ; i<n ; i++)
{
cout<<“Wiersz numer: “<<i<<”     |”;
for (int j=0 ; j<m ; j++)
{
cout<<tab[i][j]<<”  “;
}
cout<<endl;
}
cout<<“———————-“<<endl<<endl;
//zamiana formularz – pytamy co chcemy zamienić
int z1,z2;
cout<<“Podaj numer wiersza pierwszego ktory podlegnie zamianie”<<endl;
cout<<“Numeracje wierszy przyjmij od zera: “<<endl;
//wprowadzenie wiersza pierwszego do zamiany
cin>>z1;
cout<<endl<<“Podaj numery wiersza drugiego ktora podlega zamianie: “<<endl;
cin>>z2;
cout<<endl<<“———————-“<<endl;
//sprawdzenie poprawności wielkości podanych ponieważ może dać do zamiany wiersza którego nie ma 😀
if(z1>5||z2>5)
{
cout<<“ERRRRROR!!!! ZLE PODALES NUMER WIERSZA – TAKOWY NIE ISTNIEJE!!!”;
return 0;
}

/*do dzieła
wszystko jak poprzednio lecz zamieniamy miejscami zmienne “z1” i “i” oraz “z2” i “i”
ponieważ teraz zamieniamy wiersze
*/

for(i=0;i<4;i++){
swap( tab[z1][i],tab[z2][i]);
}

 

//wyświetlam tablicę po zamianie
cout<<endl<<“———————-“<<endl;
cout<<endl<<“Wyglad tablicy po zmianie”<<endl;

  //wypisanie tablicy
for (int i=0 ; i<n ; i++)
{
cout<<“Wiersz numer: “<<i<<”     |”;
for (int j=0 ; j<m ; j++)
{
cout<<tab[i][j]<<”  “;
}
cout<<endl;
}
cout<<endl;
cout<<endl<<“===========================”<<endl;
cout<<“Nacisnij dowolny klawisz enter by zakonczyc”;


return 0;
}

 

Programy do pobrania KLIK

Dostępne są tam programy .cpp oraz skompilowane pod debiana Skrypty można stosować także do tablic podawanych przez użytkownika trzeba by wtedy sprawdzać wielkość tablicy i przypisać ją do zmiennej lecz to drobnostka przy w/w programie.

C++ biblioteka Boost – regex

Boost – regex w c++

Biblioteka BOOST to kolekcja bibliotek programistycznych poszerzających możliwości języka C++, objętych liberalną licencją, która umożliwia użycie ich w dowolnym projekcie.
Oferuje multiplatformowość(obsługuje mac,linux,windows) jednakże trzeba ją najpierw zainstalować.
Ceną za jakość bibliotek jest konieczność stosowania nowoczesnego kompilatora, w jak najpełniejszym zakresie zgodnego ze standardem języka, a także dość długi czas kompilacji programów.
Biblioteka boost ze wszystkimi możliwościami waży około 1,5GB, A wersja do podstawowych zastosowań do kompilacji – 64MB.
Jedną zasadniczą funkcją którą opiszę jest wyszukiwanie regex’ów czyli wyrażeń regularnych występujących w tekście co poszerza znacznie możliwości naszych programów. Sprawa regex jest dosyć trudna do implementacji samemu ponieważ ciężko o dobry alorytm wyszukiwania zawiłych zdań, zwrotów. W podstawowych bibliotekach c++ nie ma możliwości wyszukania regex’ów więc opiszę to z wykorzystaniem biblioteki boost.

Strona projektu boost: http://www.boost.org/

Kompilacja

Całość kompilowałem pod linuxem w środowisku geany. Może się zdarzyć że program się nie kompiluje ponieważ jest nie zainstalowana biblioteka boost lub w kompilatorze brak opcji -lboost_regex.

Znaki specjalne

są to znaki których możemy użyć by sformułować wzorzec dotyczący czego wyszukujemy.

\\w    wyszukiwanie liter

.    dowolny pojedyńczy znak

[[:klasa:]]    klasa znakowa

{n}    licznik

(wyr)    grupa

\znak    następny znak ma specjalne znaczenie

wyr*    0 lub więcej znaków po wyrazie

wyr+    1 lub więcej znaków po wyrazie

wyr?    opcjonalność(0 lub 1) znaków po wyrazie

wyr|wyr    lub (alternatywa) czyli: wyraz1 lub wyraz2

^wyr    negacja

$    koniec wiersza

(wyr = wyrażenie)

prosty przykład: “(.+) | (ads){2}” Wzorec ten oznacza “zero lub więcej znaków, albo ciąg ‘adsads’ “

Rodzaje znaków

\d    cyfra dziesiętna

\l    mała litera

\s    biały znak(spacja, tabulator itd.)

\u    wielka litera

\w    litera, cyfra lub “_”

\D    nie \d czyli rozróżnianie wielkich i małych liter

Przykład

np. “\l\l\d” czyli “dwie małe litery, po których następuje cyfra dziesiętna”

Powtórzenia

{n}    dokładnie n razy

{n,}    n lub więcej razy

{n,m}    przynajmniej n i najwyżej m razy

*    to samo co {0,}

+    to samo co {1,}

?    to samo co {0,1}

Przykład

np. “0x*”, co znaczy “cyfra ‘0’, po której następuje jedna lub więcej liter ‘x’ ”

Program który obrazuje wykorzystanie (w załączniku jako plik1.cpp oraz skompilowany plik1.sh):

#include <iostream>

#include <boost/regex.hpp> // jeśli nie mamy kompilatora zgodnego z standardem C++0x, musimy sami zainstalować bibliotekę boost

using namespace boost; //narzędzia biblioteki boost znajdują się w przestrzeni nazw boost, definiujemy by mieć mniej pisania

using namespace std;

int main(){

cout<<“Program regex”<<endl<<“——–“<<endl;

string tekst;//deklarujemy zmienną typu sting

tekst=”Nasz ukochany blip wyraz tekst bla to bla wielki to wybryk wyobcowanego programisty”;

cout<<“nasz ciag”<<endl<<tekst<<endl<<“———-“<<endl;//wyświetli wartość zmiennej tekst

regex wzorzec( “\\w* to \\w*” );//czyli reguła którą będziemy wyszukiwać

smatch wynik;//Tworzymy zmienną typu smatch, która będzie przechowywała wyniki.

// zasada użycia funkcji regex – regex_search(tekst_w_ktorym_wyszukujemy, zmienna_do_wyswietlenia_wyniku, regula_jakiej_wyszukujemy)

if( regex_search(tekst,wynik,wzorzec) ) //if służy do tego by sprawdzić czy coś znaleziono, bo jak nie to po co wyświetlać?

{

cout << “co znalazl: ” << wynik[0] << endl; //używamy wynik[0] ponieważ odnosi się do całego wyszukiwanego wyrażenia, jeśli damy wynik[1] wyszuka nam pierwszą część wyrażenia – dotyczy to dzielenia na podzbiory wyrarzeń

}

return 0;

};

W przypadku w którym chcemy wyszukać adres email(plik2.cpp i plik2.sh):

#include <iostream>

#include <string>

#include <boost/regex.hpp> // jeśli nie mamy kompilatora zgodnego z standardem C++0x, musimy sami zainstalować bibliotekę boost

using namespace boost; //narzędzia biblioteki boost znajdują się w przestrzeni nazw boost, definiujemy by mieć mniej pisania

using namespace std;

int main(){

cout<<“Program regex znajdujemy maila”<<endl<<“——–“<<endl;

string tekst; //deklarujemy zmienną typu sting

tekst=”W moim Tekscie teraz tusk@donald.com jest wiele john@deer.pl adresow email kropka@dot.org”;

cout<<“nasz ciag”<<endl<<tekst<<endl<<“———-“<<endl; //wyświetli wartość zmiennej tekst

regex wzorzec( “\\w*[@]\\w*[.]\\w*” ); //czyli reguła którą będziemy wyszukiwać [@] to pojedyńczy znak specjalny

smatch wynik;//Tworzymy zmienną typu smatch, która będzie przechowywała wyniki.

// zasada użycia funkcji regex – regex_search(tekst_w_ktorym_wyszukujemy, zmienna_do_wyswietlenia_wyniku, regula_jakiej_wyszukujemy)

if( regex_search(tekst,wynik,wzorzec) ) //if służy do tego by sprawdzić czy coś znaleziono, bo jak nie to po co wyświetlać?

{

cout << “co znalazl: ” << wynik[0] << endl;

}

return 0;

};

pliki dostępne  pod adresem: http://chomikuj.pl/tomek99007/boost+c*2b*2b

Apostrofy w zapytaniu Mysql

Jeśli mamy w zapytaniu problem z apostrofami, czy chcemy je zapisać w polu bądź chcemy zabezpieczyć się przed atakami sql injection, najłatwiej każdy przesyłany parametr zawrzeć w funkcji, która “zahaszuje”(czytaj wyłączy) apostrofy by nie zepsuły nam bazy danych lub też nie zmieniły treści zapytania:

$ mysql_escape_string

dla phpowców link do dokumentacji:

http://pl.php.net/mysql_escape_string