oskarj.wordpress.com blog

marzec 24, 2009

Język Ruby – lekkie i krótkie wprowadzenie :)

Zaszufladkowany do: 1, Academic, Recenzja, przemyślenia, ruby — oskarj @ 2:00 am
Tags:

Inspiracja rozdziałem 29-tym, Joel Spolsky, „Sztuka pisania oprogramowania”

W zamieszłych czasach, których wielu z nas zapewne nie zaznała (aczkolwiek nie tak bardzo odległych, nie mówię tutaj o epoce gdy składano komputer Odra z części przywiezionych wagonem, około 10-15 lat później), istniał taki komputer Apple II (8-bitowy komputer domowy z lat 70-tych), który to dostarczany był z podręcznikiem napisanym w iście artystycznym stylu.

Nie chciałbym się rozpisywać o historii informatyzacji, w tym celu można sprawdzić na Wiki takie hasła, jak: Odra, Apple, Commodore (na którym zresztą znajomy rodzinny podobno pisał pracę dyplomową), a pragnąłem pokazać, w jaki sposób zmienił się styl pisania wszelkiej maści książek użytkownika, podręczników i tutoriali.

Chwytano się iście Monty-Pythowskiego humoru, historyjek komiksowych, anegdot, przede wszystkim aby zaciekawić użytkownika i łagodnie wprowadzić go w temat z danej dziedziny, który mógł być następnie poszerzony już w różnej innej technicznej literaturze.

Dzisiaj? Niektórzy powiedzieliby, że dominują książki o możliwie grubym grzbiecie i koncentracji faktów w jednym. Niech spojrzę na swoją półkę: „Java 2 Podstawy”, „Thinking In Java”, „SCJP..” (ta jeszcze zachowała odpowiednią dozę humoru), „EJB 3.0”, „PHP Programming”.. każdą z tych pozycji można z sukcesem nastawić bark w przychodni (tak jak to kiedyś ujrzałem w filmie, ale tam użyto Tołstoja „Wojna i pokój”).

Ale w temacie wyraźnie jest napisane że miało być o Rubym.

Ruby nie koniecznie jest językiem komputerowym, jest po prostu językiem. Językiem programowania zrozumiałym również dla szarych ludzi (aczkolwiek nie od razu). Spójrzcie na składnię:

5.times { print „Odelay!” }
co można przeczytać jako:
Five times print “Odelay”

exit unless „restaurants”.include? „aura”
czyli:
Exit unless the word restaurant includes the word aura

[toast, cheese, wine].each { |food| eat food }
to chyba trudniejsze:
With toast, cheese, and wine, take each type of food and eat that food.

thefoxes-3

Zaciekawiłem?
Do sprawdzenia:
http://whytheluckystiff.net/

komiksowy humor w służbie edukacji

http://poignantguide.net/ruby/

w jaki sposób można w przyjemny sposób przedstawić język z 1995 roku stworzony przez Yukihiro Matsumoto, czyli RUBY

styczeń 29, 2009

Niech żyją informatycy..

Zaszufladkowany do: 1 — oskarj @ 5:49 pm

Nałogowcowi komputerowemu spadła na ulicy na głowe cegła.
- Tetris – pomyslał nałogowiec komputerowy.
- Nałogowiec – pomyslała cegła.
- Level 2 – pomyslał Bóg.

Impreza . Wódka leje się szerokopasmowym strumieniem. Dwóch adminów
pije bruderszafta:
- To co? Mówmy sobie po IP!

Prawdziwy student informatyki ma więcej jedzenia na klawiaturze niż
w lodówce.

Przychodzi Informatyk do lekarza:
- Panie Doktorze wątroba mi nawala…
- Dziwne, u mnie działa…

Komputerowiec podrywa dziewczynę:
- Chcesz herbaty?
- Nie.
- Kawy?
- Nie!
- Hm, może wódki?
- NIE!!!
- Dziwne, standardowe sterowniki nie pasują…

Ludzie dzielą się na tych, którzy robią backupy i na tych, którzy
będą robili backupy.

Napis na grobie informatyka: “kowalski.zip”

- Ostatnie stadium znudzenia w pracy?
- Zaczynasz czytać spam.

Jaka jest różnica między informatykiem 1 i 5 roku?
- informatyk 1 roku myśli, że 1 kB to 1000 B.
- informatyk 5 roku myśli, że kilometr to 1024 metry.

Na pracowniczy bal maskowy przyszli:
- sekretarka w masce kota,
- księgowa w masce królika,
- dyrektor w masce lwa,
- informatyk w masce 255.255.255.0.

- Co to jest patch?
Program usuwający drobne błędy w programie i dodający nowe.
- Co to jest upgrade?
Program usuwający poważniejsze błędy i dodający nowe, równie uciążliwe.
- Co to jest nowa wersja programu?
Jest to zmodyfikowany program zawierający błędy, których nie można
było dodać przez patch lub upgrade.

- Dlaczego w Microsofcie nigdy nie napiszą wirusa?
- Bo zajmowałby 3 dyskietki.

Honorowy programista wiesza się razem ze swoim programem…

Jak guru unixowy uprawia seks?
- unzip; strip; touch; finger; mount; fsck; more; yes; umount;
sleep;

Co jest najszybsze w 286?
- Wiatraczek.

Przychodzi administrator rano do pracy, siada do komputera, aby
zobaczyć co się działo w nocy i śpiewa:
- Chcę oglądać twoje logi, logi, logi, logi.

Dzwoni klient do serwisu, odbiera obsługa:
- Używam Windows…
- Tak.
- No i komputer nie działa poprawnie.
- To już pan powiedział…

Wsiada informatyk do taksówki. Taksiarz pyta:
- Dokąd jedziemy?
- 192.168.4.1.

Oprogramowanie jest jak katedra.
- Budujesz, budujesz, budujesz, budujesz, a potem… już tylko się
modlisz!

Na egzaminie na uczelnie o profilu informatycznym pytaja się nowego
kandydata jakie zna komendy jakiegoś języka programowania.
- Góra, dół, lewo, prawo i fajer…

Siedzi kilku informatyków na imprezie i cały czas nawijają o
komputerach. W końcu jeden mówi:
- Słuchajcie, pogadajmy o czyms innym np. o dupach…
Nastąpiła chwila ciszy i konsternacja… jeden się odzywa:
- Moja karta graficzna jest do dupy…

Parser SQL w C – Flex, Bison czyli YACC problem

Zaszufladkowany do: Academic, Kod, linux, parser, program, sql, unix — oskarj @ 2:30 pm
Tags: , , , , ,

Ktoś by pewnie spytał się po co generować własny parser plików zapytań SQL, skoro są one walidowane w każdym silniku bazodanowym. Jedne z możliwych odpowiedzi to: hobbistycznie, lub też dla celów akademickich, czyli aby pokazać zasadę działania uniksowych parserów.

Bison (generator utworzony w ramach projektu GNU) zazwyczaj jest używany razem z programem flex (program podobny do lex, też wolny). Te dwa narzędzia pozwolą również na napisanie pretty-printera, a w zasadzie nieograniczona ilość na kod C w instrukcji main() pozwala pisać całkiem przyzwoite programy.

Pliki z gramatyką, które będziemy tworzyć, są to pliki tekstowe składające się z trzech części oddzielonych od siebie podwójnym znakiem procentu (“%%”) w kolejności: deklaracje, reguły gramatyczne, kod w języku C. Plik z rozszerzeniem .y jest to program dla bisona, natomiast plik z rozszerzeniem .l jest to program flex’a.

Pisanie parserów w C++ jest dużo trudniejsze (z wykorzystaniem g++ a nawet flex++), tutaj można znaleźć przykładowy tutorial:
http://tldp.org/HOWTO/Lex-YACC-HOWTO-5.html

sql.l:

%{
#include “sql.tab.h” //<>
#include <stdlib.h>
#include <string.h>

/*prototypy funkcji*/
void lexError(const char *);
static int getToken(const char *);

%}

%option yylineno

single_line_comment        “//”.*|”///”.*
white_space                [ \t\n\r]

%%

“select” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return SELECT;}
“from” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return FROM;}
“where” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return WHERE;}
“order” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return ORDER;}
“group” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return GROUP;}
“by” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return BY;}
“like” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return LIKE;}
“as” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return AS;}
“insert” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return INSERT;}
“update” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return UPDATE;}
“delete” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return DELETE;}
“set” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return SET;}
“into” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return INTO;}
“values” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return VALUES;}
“join” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return JOIN;}
“on” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return ON;}

“primary” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return PRIMARY;}
“foreign” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return FOREIGN;}
“references” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return REFERENCES;}
“key” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return KEY;}
“grant” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return GRANT;}
“create” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return CREATE;}
“alter” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return ALTER;}
“to” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return TO;}
“with grant option” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return WITHGRANT;}

“table” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return TABLE;}
“database” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return DATABASE;}

“–” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return SC;}

“(” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return START;}
“)” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return END;}

=|==|=!|<=|>=|<|> {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return ZNAK;}

“;” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return SR;}
“*” {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return AST;}

[0-9]+ {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext));  return LICZBA;}
[0-9A-Za-z"',]+ {yylval=(char*) malloc (strlen(yytext)); strncpy(yylval, yytext, strlen(yytext)); return TEXT;}

[:space:]+    ;
[ \n|\t]+     ;
“/*”(.|\n)*”*/”  ;

%%

/*metoda zwraca opis bledu leksykalnego*/
void lexError(const char *msg)
{
fprintf(stderr,”LINE:%d:lexical error (%s) [TEXT: %s]\n”, yylineno, msg, yytext);
}

sql.y:

%{
#include <stdio.h>
#include <stdlib.h>
#include “lex.yy.c”

typedef char* string;

int test = 1;
char* beg;

int yyerror(char *s){
printf(“Linia nr %d\nBlad %s\n”, yylineno, s);
fprintf(yyout, “Linia nr %d\nBlad %s\n”, yylineno, s);
test = 0;
};

int yylex(void);

#define YYERROR_VERBOSE
#define FALSE 0
#define TRUE 1

/*Numer linii parsera.*/
extern int yylineno;

/*Plik wejscia i wyjscia.*/
extern FILE *yyin, *yyout;

struct Intern{
string pl;
string en;
};

%}

%token SELECT
%token FROM
%token WHERE
%token ORDER
%token GROUP
%token BY
%token LIKE
%token AS
%token INSERT
%token UPDATE
%token DELETE
%token SET
%token INTO
%token VALUES
%token JOIN
%token ON

%token PRIMARY
%token FOREIGN
%token KEY
%token GRANT
%token CREATE
%token DROP
%token ALTER
%token REFERENCES
%token TO
%token WITHGRANT

%token DATABASE
%token TABLE

%token START
%token END
%token SR
%token AST
%token ZNAK
%token LICZBA
%token TEXT

%token SC

/*poczatek programu*/

%%

/* SQL 1992 */

statement_sql92: statement_sql92 SELECT TEXT FROM TEXT SR {
printf(“select %s from %s;\n”, $3, $5);
fprintf(yyout, “select %s from %s;\n”, $3, $5);
}
| statement_sql92 select_ast_st
| statement_sql92 select_where_st
| statement_sql92 delete_st
| statement_sql92 insert_st
| statement_sql92 update_st
| statement_sql92 statement_ddl
| statement_sql92 grant_st
| statement_sql92 other_statement {printf(“\n”);}
| ‘\n’
|
;

select_ast_st: SELECT AST FROM TEXT
{
printf(“select * from %s;\n”, $4);
fprintf(yyout, “select * from %s;\n”, $4);
}
| select_ast_st WHERE TEXT ZNAK TEXT
| select_ast_st ORDER BY TEXT
| select_ast_st SR
;

select_where_st: SELECT TEXT FROM TEXT WHERE TEXT ZNAK TEXT {
printf(“select %s from %s where %s %s %s”, $2, $4, $6, $7, $8);
fprintf(yyout, “select %s from %s where %s %s %s”, $2, $4, $6, $7, $8);
}
| select_where_st ORDER BY TEXT {
printf(” order by %s”, $4);
fprintf(yyout, ” order by %s”, $4);
}
| select_where_st SR {
printf(“;\n”);
fprintf(yyout, “;\n”);
}
;

delete_st: DELETE FROM TEXT SR {
printf(“delete from %s;\n”, $3);
fprintf(yyout, “delete from %s;\n”, $3);
}
| DELETE FROM TEXT WHERE TEXT ZNAK TEXT SR {
printf(“delete from %s where %s %s %s;\n”, $3, $5, $6, $7);
fprintf(yyout, “delete from %s where %s %s %s;\n”, $3, $5, $6, $7);
}
;

insert_st: INSERT INTO TEXT START TEXT END VALUES START TEXT END SR {
printf(“insert into %s (%s) values (%s);\n”, $3, $5, $9);
fprintf(yyout, “insert into %s (%s) values (%s);\n”, $3, $5, $9);
}
;

update_st: UPDATE TEXT SET TEXT ZNAK TEXT WHERE TEXT ZNAK TEXT SR {
printf(“update %s set %s %s %s where %s %s %s;\n”, $2, $4, $5, $6, $8, $9, $10);
fprintf(yyout, “update %s set %s %s %s where %s %s %s;\n”, $2, $4, $5, $6, $8, $9, $10);
}
;

/* DATABASE DESIGN LANGUAGE – DLL */

statement_ddl: drop_st
| create_st
| alter_st
;

drop_st: DROP TABLE TEXT SR {
printf(“drop table %s;\n”, $3);
fprintf(yyout, “drop table %s;\n”, $3);
}
;

create_st: CREATE create_table
| CREATE create_database
;

create_table: TABLE TEXT START TEXT {
printf(“create table %s(%s”, $2, $4);
fprintf(yyout, “create table %s(%s”, $2, $4);
}
| create_table TEXT {
printf(” %s”, $2);
fprintf(yyout, ” %s”, $2);
}
| create_table END SR {
printf(“);\n”);
fprintf(yyout, “);\n”);
}
;

create_database: DATABASE TEXT SR {
printf(“create database %s;\n”, $2);
fprintf(yyout, “create database %s;\n”, $2);
}
;

alter_st: ALTER TEXT START TEXT END SR {
printf(“alter %s (%s);\n”, $2, $3);
fprintf(yyout, “alter %s (%s);\n”, $2, $3);
}
;

/* STATEMENTS DATA CONTROL LANGUAGE */

grant_st: GRANT TEXT ON TEXT TO TEXT WITHGRANT SR {
printf(“grant %s on %s to %s with grant option;\n”, $2, $4, $6);
//fprintf(yyout, ” on %s to %s with grant option;”, $3, $5);
}
;

/* OTHER STATEMENTS LIKE SINGLE LINE COMMENTS AND BLOCK COMMENTS */

other_statement: SC {
printf(“– “);
fprintf(yyout, “– “);
}
| other_statement TEXT {
printf(” %s”, $2);
fprintf(yyout, ” %s”, $2);
}
;

%%

main(int argc, char *argv[]) {

int revokeL = TRUE;

struct Intern lang[] = { {“1) Wybierz standard jezyka zapytan\n”, “1) Choose SQL standard\n”},
{“2) Wybierz jezyk\n”, “2) Choose language\n”},
{“3) Waliduj skrypt SQL\n”, “3) Validate SQL file\n”},
{“4) Formatuj skrypt SQL\n”, “4) Pretty-print SQL script\n”},
{“5) Wyjscie\n”, “5) Exit from program\n” }
};

FILE *fp = NULL;
fpos_t dlugosc;
char stringInput;
if(argc != 3) {
printf(“Uzycie: %s <nazwa pliku wejscia> <nazwa pliku wyjscia>\n”, argv[0]);
do{
printf(“Czy chcesz przejsc do trybu interaktywnego (menu programu) ? [T/N]“);
stringInput = getchar();
__fpurge(stdin);
}while(stringInput != ‘T’ && stringInput != ‘N’);
if(stringInput == ‘N’)
return 1;
}
int choice = 0;

yyin = stdin;
yyout = stdout;

/* Jezeli zostal zdefiniowany plik wejscia i/lub wyjscia */
if (argc >= 2)
{
/* Otworz plik do czytania */
yyin = fopen(argv[1], “r”);

/* Jezeli nie udalo sie otworzyc pliku */
if(yyin == NULL)
{
fprintf(stderr, “ERROR: Input file not exists.\n”);
return 1;
}

/* Jezeli zostal zdefiniowany plik wyjscia */
if(argc >= 3)
{
/* Otworz plik do zapisu */
yyout = fopen(argv[2], “w”);
}

/* Jezeli nie udalo sie otworzy pliku wyjscia */
if(yyout == NULL)
{
fprintf(stderr, “ERROR: Output file not exists.\n”);

return 1;
}
}

while(choice != 4)
{
printf(“\nSQL miniStudio:\n”);
if(revokeL) printf(lang[0].pl); else printf(lang[0].en);
if(revokeL) printf(lang[1].pl); else printf(lang[1].en);
if(revokeL) printf(lang[2].pl); else printf(lang[2].en);
if(revokeL) printf(lang[3].pl); else printf(lang[3].en);
if(revokeL) printf(lang[4].pl); else printf(lang[4].en);

scanf(“%d”,&choice);

switch(choice)
{
case 1:
{ // wybierz standard
break; }

case 2:
{ // wybierz jezyk
if(revokeL){
revokeL = FALSE;
printf(“\nLanguage changed to ENGLISH!\n”);
} else{
revokeL = TRUE;
printf(“\nZmieniono jezyk na POLSKI!\n”);
}

break; }

case 3:
{ // waliduj skrypt

yyparse();
if(test){
printf(“Test OK!\n”);
fprintf(yyout, “Test OK!\n”);
}

break; }

case 4:
{ // formatuj
break; }

case 5:
{ // wyjscie
exit(0);
break; }

default:
{ break; }
}

}

}

dane wejściowe:

select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select
fasdfagtergddfa49384934
from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select * from tabelka;

select kolumna
from tabela;

select dsfy87dsayfsadf7 from ffsadfadsfasdfasfs;
select kjfds8ay7f8as8f    from ffsadfadsfasdfasfs;
delete from pracownicy;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;

update tabelka set umowa = ‘OK’ where umowa = NULL;

delete from pracownicy where imie = ‘andrzej’;

insert into tabelka(kol1,kol2) values(‘JaN’,'Kowalski’);

select TYTUL from BOOK WHERE   autor = ‘Profesor’   ORDER BY tytul;

select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
delete from zamowienia;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;

– komentarz, ponizej instrukcje ddl czyli tworzenia baz

create database testowa;
create database drugabazka;

create table waznedane (kol1 int, wartosc varchar);

create table fjdskfjkldsfkl (kol2 int, kol4 int, kol3 bool);

grant uprawnienie on employee to piotr with grant option;

wyjście:

select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fasdfagtergddfa49384934 from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select * from tabelka;
select kolumna from tabela;
select dsfy87dsayfsadf7 from ffsadfadsfasdfasfs;
select kjfds8ay7f8as8f from ffsadfadsfasdfasfs;
delete from pracownicy;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
update tabelka set umowa = ‘OK’ where umowa = NULL;
delete from pracownicy where imie = ‘andrzej’;
insert into tabelka (kol1,kol2) values (‘JaN’,'Kowalski’);
select TYTUL from BOOK where autor = ‘Profesor’ order by tytul;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
delete from zamowienia;
select fadsiouuwaruwf from ffsadfadsfasdfasfs;
–  komentarz, ponizej instrukcje ddl czyli tworzenia bazcreate database testowa;
create database drugabazka;
create table waznedane(kol1 int, wartosc varchar);
create table fjdskfjkldsfkl(kol2 int, kol4 int, kol3 bool);
Test OK!

Dzięki programowi w flexie możemy skopiować string dla każdego tokena (zamiast alokować pamięć i używać strcpy wystarczy użyć instrukcji yylval=text; , jednak kopiowanie stringów jest bezpieczniejsze jeżeli mamy zamysł pisania pretty-printera kodu), natomiast w bisonie każda instrukcja jest przetwarzana pod kątem naszej gramatyki i jeżeli w pliku wejściowym wpiszemy nieprawidłową instrukcję (niezgodną z nasza gramatyką), otrzymamy komunikat o błędzie.

Program kompiluje się w następujący sposób:

#!/bin/bash
flex -i sql.l
bison -d sql.y
gcc -o sql sql.tab.c -lfl

listopad 11, 2008

Regexp – vc++

Zaszufladkowany do: 1 — oskarj @ 9:29 pm

Niesamowite możliwości udostępniają wyrażenia regularne. Istnieje narzędzie, które nazywa się Regex Builder w wersji 2.05, za jego pomocą można w wygodny sposób testować wyrażenia na dowolnym łańcuchu znaków, aby te prawidłowe móc potem użyć we własnym programie.

regex builder

I tak na przykład, aby wyciągnąć wartości i wykładniki z wielomianów za pomocą wyrażenia regularnego, możemy użyć następująco:

Regex ^expression = gcnew Regex(“x\\^(\\d+)”);
// wielomian jest dzielony wyrażeniem regularnym na poszczególne wykładniki (n>1)
expression = gcnew Regex(“[+-]*(\\d)*x[^^]|[+-][x]“);
// wielomian jest dzielony wyrażeniem regularnym na poszczególne wykładniki (n==1)
expression = gcnew Regex(“(.?)((\\d)+).”);
// wielomian jest dzielony wyrażeniem regularnym na poszczególne wykładniki (n==0)
MatchCollection ^polyMatch = expression->Matches(text);

5x+54+4784x^5+x+389x^2+5x+4x+3x+89x^3+2x^2+4+8x^8+5345+85x+4+x

Składowe wpisanego wielomianu:
współczynnik: 4784 wykładnik: 5
współczynnik: 389 wykładnik: 2
współczynnik: 89 wykładnik: 3
współczynnik: 2 wykładnik: 2
dodawanie współczynników: (389 + 2) x^2
współczynnik: 8 wykładnik: 8
współczynnik: 5 wykładnik: 1
współczynnik: 1 wykładnik: 1
(5 + 1) x^1
współczynnik: 5 wykładnik: 1
(6 + 5) x^1
współczynnik: 4 wykładnik: 1
(11 + 4) x^1
współczynnik: 3 wykładnik: 1
(15 + 3) x^1
współczynnik: 85 wykładnik: 1
(18 + 85) x^1
współczynnik: 1 wykładnik: 1
(103 + 1) x^1
współczynnik: 54 wykładnik: 0
współczynnik: 4 wykładnik: 0
(54 + 4) x^0
współczynnik: 5345 wykładnik: 0
(58 + 5345) x^0
współczynnik: 4 wykładnik: 0
(5403 + 4) x^0
ostatecznie w2: 8x^8 +4784x^5 +89x^3 +391x^2 +104x^1 +5407

czerwiec 16, 2008

Jak w kodzie dodać kontrolki w .NET 3.5 (WPF) ?

Zaszufladkowany do: Academic, Kod — oskarj @ 7:01 pm
Tags:

Jak w kodzie dodać kontrolki w .NET 3.5 (WPF) ?

W pracy dyplomowej mam funkcjonalność do zaimplementowania – mapa stolików w restauracji. Na mapie stolików wykonanej w AutoCAD nakładam przyciski, więc wczytuje z pliku XML położenia moich stolików na mapie bitowej (wysokość i szerokość w pikselach), po czym właśnie w tym miejscu dodaję nową kontrolkę – button, posiadającą handler dla Click.

foreach (Seat seat in seats)

{

System.Windows.Controls.Button button = new Button();

button.Content = seat.Sala + “-” + seat.Stolik;

//ustawienie pozycji przycisku

button.Width = 40;

button.Height = 40;

Thickness thick = new Thickness();

thick.Left = seat.Width + 160;

thick.Top = seat.Height + 20;

thick.Right = 0;

thick.Bottom = 0;

button.Margin = thick;

// ulozenie

button.HorizontalAlignment = HorizontalAlignment.Left;

button.VerticalAlignment = VerticalAlignment.Top;

// przypisanie akcji przyciskowi

button.Click += new RoutedEventHandler(newButt_Click);

// koloryzacja

button.IsEnabled = false;

button.Background = buttonBrushes[2];

// dodanie do layoutu

{… implementacja …}

if (seat.Sala == Image.selected + 1) LayoutRoot.Children.Add(button);

}

}

private void newButt_Click(object sender, RoutedEventArgs e)

{

Button button = (Button)sender;

if (button.Background.Equals(buttonBrushes[3]))

{

// odzaznaczenie rezerwacji w przypadku edycji

}

{…kod implementacji…}

}

Polecam lekturę:

http://arcanecode.wordpress.com/2007/09/07/adding-wpf-controls-progrrammatically/

kwiecień 13, 2008

Milionerzy ?

Zaszufladkowany do: 1, Recenzja, przemyślenia — oskarj @ 2:14 pm
Tags:

Pewnie każdy z nas od czasu ogląda ten tvn-owski teleturniej, ale nie wie dokładnie, jak wygląda proces eliminacji. Należy wysłać dokładnie 3 smsy na numer 7244, z czego pierwszy jest tylko zgłoszeniowy, dwa następne to twoje odpowiedzi na pytania z bazy danych pytań, a wygląda ona następująco:

1. Blues narodził się w:
B) Ameryce Północnej

2. Czy słodka włóknista masa z nasion oleistych i karmelu to:
C) chałwa

3. Słynny 24-godzinny wyścig samochodowy odbywa się we Francji w
C) Le Mans

4. Czy łacińska maksyma chwytaj dzień to w oryginale
A) carpe diem

5. Marszałkiem pierwszego sejmu III RP zwanego kontraktowym był
C) Kozakiewicz

6. Przechodzenie ciała stałego w stan lotny bez topnienia to
B) sublimacja

Jeżeli jesteś w pierwszej setce osób, które odpowiedziały najszybciej (dlatego najlepiej wysyłać odpowiedzi z komputera poprzez PC-Suite), to w przeciągu miesiąca do trzech miesięcy zadzwoni do ciebie konsultant, po czym wypyta o dane osobowe, zainteresowania i zada od siedmiu do dwudziestu pytań.. i teraz nie ma wariantów abc, tylko musisz znać odpowiedź ;P Finalnie zaproszenie do studia w Krakowie. Ja na razie czekam aż ktoś oddzwoni ;P. Może będę miał równie łatwe pytania jak te, które zostały zadane przy głównej wygranej.

marzec 30, 2008

No i jestem..

Zaszufladkowany do: 1, Academic, project management — oskarj @ 4:00 pm

po kolejnym wdrożeniu. Zainstalowałem serwer IIS u klienta na systemie Win XP (a czemu nie :) ) ), dołączyłem webaplikację w aspach za pomocą konsoli mmc i odpowiedniej przystawki. Za pierwszym razem nie zadziałało, dostałem komunikat iż nie mam dostępu do metadanych IIS. Spowodowane to było złą kolejnością instalacji, najpierw należy instalować IIS, dopiero potem .NET framework 2.0 . Opcja repair w intalatorze .net frameworka pomogła poradzić sobie z tym problemem. Następnie konfiguracja wyjątków w firewallu, otwarcie portu 80, i wszystko hula w całej sieci.

Teraz powoli rozkręcam z innymi studentami projekt za pomocą metodyki PRINCE 2 na warsztaty z Project Management. Miałem przyjemność uczestniczyć w wykładzie dr. Kosieradzkiego (firma P2Ware , oprogramowanie Product Base Planner) i wszystko powoli staje się jasne na temat procesu planowania. Może dojdzie do realizacji pewnego portalu internetowego w Polsce o tematyce…. , kto wie :)

marzec 20, 2008

bez ładu, bez składu

Zaszufladkowany do: 1, historia podróży, przemyślenia — oskarj @ 1:43 pm

Jako że według mojej Almy Mater mam teraz wolne, postanowiłem coś dopisać ;)

Ostatnie dni mijały w różnoraki sposób, zabawa przeplatana z próbą podejmowania różnych prac. Nauka jazdy na snowboardzie w Österreich. Wizyta w Poznaniu, domóweczka, klub „Stare kino”, ciekawy powrót na osiedle Piastowskie. Odpoczynek, po czym kierunek – Warszawa. Zwiedzanie Nowego Świata, kawiarnie, rozmowy. Prezenty urodzinowe.

Inne pozytywne aspekty: nowe zlecenia, nowe doświadczenia.

Pracowałem nad systemem który pomaga firmom zarządzać procesami, czyli usuwać, dodawać, śledzić zmiany, przypisywać osoby odpowiedzialne itp.

Połączenie z bazą danych mySQL po wielu bojach ustanowione za pomocą sterownika ODBC Connector, i to w poprzedniej wersji, bo 3.51.
Na Microsoft Server skonfigurowałem połączenie z poziomu narzędzia dostępnego w ‘Administrative Tools’, ustawiłem port, hasło do roota oraz kodowanie UTF-8
Co ciekawsze, podczas pisania web aplikacji w Visual Studio 2008 (naturalnie język C# która powala na kolana swoją składnia takiego VBasica czy tez C++) byłem zmuszony używać obiektów klasy OdbcConnection zamiast np. SQLConnection. Wynik ten sam, kilka linijek kodu umożliwiło mi wygodne wysyłanie poleceń SQL. Zupełne inne podejście spowodowane chociażby tym, że nazwy tabel w nawiasach kwadratowych zostaną zignorowane, z tego właśnie powodu trzeba każdy GridView ręcznie oprogramować instrukcjami SQL.

Środowisko akademickie.

Wiele rzeczy, które mi się podoba. Legitymacja studencka, w której mam kodowane bilety do komunikacji miejskiej (czemu wiele uczelni wciąż z tym zwleka??), brak indeksów (choć podobno są też minusy tego), rozbudowany system obsługi studenta – USOS (na który wszyscy psioczymy, ale prawdą jest to, że lepszy produkt chyba nie istnieje), w którym miło jest ujrzeć wpisaną ocenę 5! (z wykrzyknikiem)

Darmowy ‘Wall Street Journal’, ‘Żółte strony’, ‘Parkiet’ na Wydziale Zarządzania UW. Jedyny minus to brak sieci WLAN. Kto ze mną przebuduje strukturę sieciową? Bierzemy zlecenie? ;)

styczeń 7, 2008

Podróże, małe i duże

Zaszufladkowany do: 1, google, historia podróży, ligthstalkers, maps, podróże, travel — oskarj @ 12:25 am

Pochłonięty lekturą www.tokyobynight.pl (szykowałem prezentację o Japonii na angielski na UW) natrafiłem na odsyłacz do rewelacyjnego serwisu “lightstalkers”, w którym można między innymi stworzyć własną mapkę z dokonanych podróży, za pomocą mechanizmu google maps.

Przykładowo wygląda to tak

mapka podróży

Serwis posiada jeszcze wiele innych ciekawych funkcji których nie zdążyłem odkryć.

Tymczasem dziękuję za liczbę odwiedziń bliską 2.000, przede mną ciężki styczeń zaliczeń, po którym nadejdą zasłużone ferie (mam nadzieje, że śnieżne! …ale tylko w górach ;-) ) ).

wrzesień 22, 2007

Digital Fortress – Dan Brown się pomylił

Zaszufladkowany do: Dan Brown, Kryptografia, Recenzja — oskarj @ 5:57 pm

Z chęci przeczytania jakiejś lektury na zakończenie wakacji zdecydowałem się na wydanie anglojęzyczne. W Empiku dorwałem „Cyfrową twierdzę” (tak to się tłumaczy?) Dan Browna w cenie 35zł, minus zniżka z Euro26. Ale to nieistotne. Tłem w tej lekturze są komputery i kryptografia, i choć w tej drugiej dziedzinie nie jestem ekspertem, zauważyłem wiele drażniących nieścisłości, które moim zdaniem, potrafią zepsuć odbiór książki.

Autor wynalazł parę rzeczy, szczególnie w dziedzinie matematyki oraz informatyki, które tak naprawdę nie istnieją. Co najlepsze, wg. Browna, dwóch eks-agentów NSA pomagało współtworzyć utwór „Digital Fortress”, co wydaję się trochę śmieszne.

Ostrzeżenie: poniżej szczegóły fabuły.

“The notion of a rotating cleartext function was first put forth in an obscure, 1987 paper by a Hungarian mathematician, Josef Harne. Because brute-force computers broke codes by examining cleartext for identifiable word patterns, Harne proposed an encryption algorithm that, in addition to encrypting, shifted decrypted cleartext over a time variant. In theory, the perpetual mutation would ensure that the attacking computer would never locate recognisable word patterns and thus never know when it had found the proper key. The concept was somewhat like the idea of colonising Mars—fathomable on an intellectual level, but, at present, well beyond human ability.”

O ile wspomniany matematyk – Josef Harne – tak naprawdę nie istniał, o tyle zdaje się, że możemy uwierzyć w owy pomysł nowatorskiego algorytmu kodowania. Niesłusznie, skoro algorytm produkował dane które zmieniały się w pewnym odstępstwie czasowym, to i tak zakodowana treść byłaby do odczytania – po prostu do klucza dodano by trochę więcej informacji (związanych cyfrowo z czasem), a każdy klucz pasujący do szyfru można odgadnąć metodą brute-force, prędzej czy później.

“Susan had learned about the Bergofsky Principle early in her career. It was a cornerstone of brute-force technology. It was also Strathmore’s inspiration for building TRANSLTR. The principle clearly stated that if a computer tried enough keys, it was mathematically guaranteed to find the right one. A code’s security was not that its pass-key was unfindable but rather that most people didn’t have the time or equipment to try.”

Kolejna niespodzianka – coś takiego jak zasada, reguła Bergofskiego nie istnieje i została wymyślona na potrzeby utwory, tak, aby fabuła trzymała się kupy, czego i tak nie osiągnięto. Wg niej komputer byłby w stanie ZNALEŹĆ każdy klucz do szyfru jeżeli posiadałby wystarczającą moc obliczeniową. Komputer nie znajduje, komputer TESTUJE wszystkie możliwe kombinacje i znajduje tą właściwą.

“Now Susan was even more doubtful. Encryption algorithms were just mathematical formulas, recipes for scrambling text into code. Mathematicians and programmers created new algorithms every day. There were hundreds of them on the market—PGP, Diffie-Hellman, ZIP, IDEA, El Gamal. TRANSLTR broke all of their codes every day, no problem. To TRANSLTR all codes looked identical, regardless of which algorithm wrote them.”

PGP – system który pozwala szyfrować i deszyfrować dane jest programem, który bazuje na algorytmie RSA – PGP sam w sobie algorytmem nie jest. ZIP – format kompresji, zaprojektowany przez Phila Katza dla PKZIP, w aktualnej postaci korzysta z algorytmu deflate.

“Public-key encryption was a concept as simple as it was brilliant. […] The only way to unscramble the message was to enter the sender’s “pass-key”—a secret series of characters that functioned much like a PIN number at an automatic teller.”

Dan zapewne pomylił szyfrowanie asymetryczne z symetrycznym – w tym pierwszym wykorzystuje się parę kluczy – jeden publiczny, jeden prywatny, W tym drugim, np. AES klucz jest jeden.

Może teraz coś na rozluźnienie:

“Cranberry juice was a popular drink in Spain, but drinking it alone was unheard of.”

Czy jemu nie chodziło przypadkiem o Sangrię, pitą z owocami i lodem w wysokich szklankach, od Katalonii po Andaluzję?

Na początku powieści Dan Brown stwierdza, że tylko 3% procent amerykanów jest świadoma istnienia ‘National Security Agency’.. czy to możliwe ? Heh

Mimo tego wszystkie zamierzam skończyć czytać Digital Fortress do końca.

Następna strona »

Blog na WordPress.com.