Archiwa kategorii: Programowanie

Perl: komentarze w wyrażeniach regularnych, czyli jak pisać zrozumiałe regexp-y

W przypadku bardziej skomplikowanych zapytań regularnych przydaje się wiedzieć za co odpowiadają poszczególne jego fragmenty. Sztuczką pozwalają to osiągnąć jest skorzystanie z przełącznika x przy wyszukiwaniu oraz komentarzy oznaczonych zwykłym #, wieloliniowości oraz spacji (standardowo ignorowanych właśnie dzięki temu ‚/x’. Spójrzmy na poniższy przykład:

Czytaj dalej Perl: komentarze w wyrażeniach regularnych, czyli jak pisać zrozumiałe regexp-y

Program curl – przykład użycia z linii poleceń

Program nc pozwala przeskanować serwer, sprawdzić czy serwer WWW jest dostępny ale jak łatwo pobrać stronę albo wywować stronę z jakimś parametrem? Jest to bardzo przydatne w przypadku posiadana urządzeń siecowych sterowanych przez przegląrkę.

Więc jak łatwo wywołać stronę internetową? Z wykorzystaniem programu curl:
Czytaj dalej Program curl – przykład użycia z linii poleceń

Perl: własny moduł

Nazwa pliku powinna być taka sama jak nazwa pakietu ale dodajemy rozszerzenie pm (w naszym przypadku Template.pm). Jeżeli chcemy aby jakieś moduły były użyte w kodzie modułu, umieszczamy ich nazwy po słowie package (wcześniej wpisane dotyczyły by głównego programu czyli pakietu main).

Zwyczajowo, jeżeli chcemy odwołać się do funkcji będącej w module, musimy użyć nazwy modułu, dwukropka oraz nazwy funkcji (np. my $Cos = Template::Function(a,b)). Tą kłopotliwą składnie można uprościć dzięki eksportowaniu nazw funkcji i zmiennych (u nas use Export qw(import) i tablica wyeksportowanych elementów).

Moduł zawsze musimy kończyć wartością 1. Oznaczającą że kod został poprawnie załadowany.

#! /usr/bin/perl
package Template;

use strict;
use warnings;
use Data::Dumper;

use Exporter qw(import);
our @EXPORT_OK = qw(Function);

sub Function
{


}

1

W internecie:
http://www.tutorialspoint.com/perl/perl_modules.htm

Perl i używanie DATA

Jednym z lepszych sposobów umieszczania danych w pliku (gdy mamy dużą ich ilość) jest umieszczenie ich na końcu pliku po napisie __END__. Wtedy możemy skorzystać z wbudowanej tablicy <DATA>  jak poniżej:

#! /usr/bin/perl
use strict;
use warnings;

while (<DATA>) {
    print $_;
}
__END__
data1
data2
data3
data4

Wynik będzie następujący:

root@router:~# perl test_data.pl
data1
data2
data3
data4

Expect: Wprowadzenie

Poniższy kod pozwala na połączenie ssh, automatyczne podanie użytkownika i hasła, wykonanie prostej komendy, przejście do katalogu /tmp i oddaje władzę w ręce w użytkownika skryptu. Taka mała wprawka do programowania w tcl/expect…

#!/usr/bin/expect

## usage if no options
if {[llength $argv] != 3} {
        puts "usage: ssh_login   "
        exit 1
}

# setup variables
set timeout 20
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]

# call ssh command
spawn ssh "$user\@$ip"

# give password
expect "password:"
send "$password\r";

# give commands when you see "]#" mean all welcome messages are showed
expect "]#"
send "touch ~/I_was_HERE2.txt\r"
send "cd /tmp\r"

# give control to user
interact

Sed: usuwanie „inline” linii z pliku

Problem:
W pewnym pliku logów miałem stare wpisy i chciałem szybko usunąć. Wzorzeć był znany ale zabawa z tymczasowymi plikami i grepem raczej nie wchodziła w grę (nie chciałem zgubić logów właśnie zapisywanych).
Wpisy do usunięcia miały postać (chodziło o datę):

2013-08-08 11:39:17 temp:21.25

Rozwiązanie:
Sed z opcją -i pozwala zmieniać pliki w locie (inline):

sed -i  "/2013-08-08/d" temperature_all.txt

Sed: zmiana w plikach z wykorzystaniem zapamiętywania wzorców (inline):

Problem:
Piszę sobie hobbystycznie małą aplikację to zarządzania domowymi urządzeniami. Jednym z nich jest Arduino z podczepionymi czujnikami temperatury i natężenia światła. Dane z czujników są zapisywane na karcie SD. Na początku format daty ustaliłem sobie dość dowolnie i wyglądał on tak:

10/07/13-20:03:23 photo:49

Jednak w trakcie pisania aplikacji doszedłem do wniosku iż potrzebuję nastepujący format daty:

2013-10-07 19:53:58 photo:399

Rozwiązanie:
Rozwiązaniem okazała się jednolinijkowa komenda sed-a:


sed -i -r 's/([0-9]+)\/([0-9]+)\/([0-9]+)\-/20\3-\1-\2 /' photo_all_*.txt

Opcja -i powoduje nadpisanie pliku, -r włącza wyrażenia regularne.

PHP: curl oraz logowanie przez login i hasło

W moim projekcie musiałem uzyć curl oraz logowanie przez login i hasło (w przeciwnym wypadku wystarczyło by użycie fopen). Wobec tego użyłem kodu podobnego do tego poniżej:

  protected function UseCurl($url) {

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERPWD, "$this->username:$this->password");
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        $output = curl_exec($ch);
        $info = curl_getinfo($ch);
        curl_close($ch);

        return $output;

  }

Proszę zwrócić uwagę na część z CURLOPT_USERPWD…

PHP i autoload klass

W nowszych wersjach PHP występuje nowa funkcja odpowiedzialna za ładowanie klass spl_autoload_register(‚function_name’) w przeciwienstwie do poczciwego __autoload(). Wobec tego aby móc znowu automatycznie ładować klasy należy stworzyć kod podobny do poniższego:

function my_autoload($class_name) {

        include "lib/class/$class_name".'.class.php';
}

spl_autoload_register('my_autoload');