Visualizzazione post con etichetta c++. Mostra tutti i post
Visualizzazione post con etichetta c++. Mostra tutti i post

domenica 15 giugno 2008

[PDF] Librerie e applicazioni utili

Nel ricercare un tool su SourceForge che mi permettesse di esportare le immagini da un PDF, ho trovato interessanti librerie che mi propongo di analizzare nel medio-lungo periodo (il tempo è tiranno e gli impegni molti):

  • PDFBox [Java]: PDFBox is an open source Java PDF library for working with PDF documents. This project allows creation of new PDF documents, manipulation of existing documents and the ability to extract content from documents. PDFBox also includes several command line utilities.
  • PHP PDF Factory [PHP]: PDFLib-free PDF creation using PHP. It has interface compatible with php pdf creator (pdf-php library). Implements most of Adobe recommended features like PageTrees, Outlines, and so on.
  • XML-PDF Transformation GUI [Java]: This is a Java Swing GUI for popular XML tools from the Apache Group. It uses Xerces for XML validation, Xalan for XSLT, FOP for XML to PDF and iText for adding security features to the PDF. Can produce FO, HTML and PDF. I personally use it for my DocBook.
  • QPDF [C++]: QPDF is a command-line program that [...] is capable of creating linearized [...] files and encrypted files. It is also capable of converting PDF files with object streams [...] to files with no compressed objects or to generate object streams from files that don't have them (or even those that already do). QPDF also supports a special mode designed to allow you to edit the content of PDF files in a text editor. For more details, please see the documentation links below.
  • PDF Edit [C++,XPDF, QT3,QSA]: Free (and open source) editor for manipulating PDF documents. GUI version + commandline interface. Scripting is used to a great extent in editor and almost anything can be scripted, it is possible to create own scripts or plugins. Target platform are operating systems of Unix type (Linux, BSD).
  • [PHP]: Want to create dynamic pdf documents with PHP, but don't want to (or can't) install any of those required modules? Wll we could have the solution.. for you, a PHP class which will allow the easy production of simple pdf documents.
  • Inno-PDF, iText, PDF4J [Java]: librerie Java per la generazione di PDF;
  • TCPDF, PC4P, PHP PDF Creation [PHP]: classi per la generazione di documenti PDF;
  • PDML [PHP]: PDML is an informal markup language written in 100% PHP, allowing to create complex PDF documents very easily for people already familiar with HTML. People familiar with PHP can also use it as a way to define templates for dynamic PDF documents. PDML is built on top of FPDF, and is licensed under the GPL;
  • Peters PHP PDF Report: A PHP5 class, which capable to generate PDF report (w optional sections like pageheader, reportheader, content etc..) based on fpdf class. The report is defined in xml, groups' definitions and variable replacement from any database are supported.
  • WP2PDF: it is a script that converts the content of one or more entries of the Blog-Software WordPress to PDF. It is based on FPDF, a free PDF library and written in PHP. It requires a working WordPress installation and PHP 4.x.

martedì 13 maggio 2008

[Link] Raccolta di cheet sheet

Qui di seguito una raccolta di "bigini" online :)

Raccoglitori di cheet sheet e altro materiale

Ecco una lista di ottimi siti web che raccolgono liste di memorandum in formato PDF in merito a svariati argomenti:

martedì 4 marzo 2008

4294967295

Il numero che titola questo post, oltre ad essere il più grande numero dispari di lati di un poligono regolare costruibile con compasso e righello, è un codice di errore che viene ritornato da molte funzioni.

Questo numero in realtà è la rappresentazione unsigned int di -1. Vedi codice seguente in C++:

string strAddress("showaddress|Gorizia|Via dei Campi|4|50938\n");

basic_string ::size_type indexCh;

cout << "E' presente la parola \"cerchio\"? ";
indexCh = strAddress.find("cerchio");
signed int indexChInt = strAddress.find("cerchio");

if(indexCh != string::npos)
cout << "SI. Indice: " << indexCh << endl;
else {
cout << "No. Res: " << indexCh << endl;
cout << " signed: " << indexChInt << endl;
}
Come output avremo:

E' presente la parola "cerchio"? No. Res: 4294967295 signed: -1

lunedì 3 marzo 2008

[C++] 114 programmi per farsi un'idea

Ho terminato la lettura di "Teach yourself ANSI C++ in 21 days", un libro sulle 900 pagine che offre una buona panoramica del mondo C++.

Come al solito ho ricopiato stralci interessanti dal libro e ovviamente tutti i sorgenti sono disponibili per il download (per un totale di 114 programmi).

I programmi sono stati tutti compilati con Visual Studio 2005, quindi a parte qualche rimaneggiamento degli #include, il codice dovrebbe esser compilabile anche da altri compilatori.

giovedì 14 febbraio 2008

[C++]WinSock tutorial: un po' di link

Nelle settimane passate ho buttato giù la stesura del server in C++. Ad ogni modo ho approfondito blandamente le funzioni di Winsock. Per questo dopo una quasi esaustiva ricerca su Google,presento qui i migliori tutorial trovati in rete.
I criteri di scelta si basano essenzialmente:

  • sulla versione di Visual Studio usata: tutorial che fanno uso di versioni troppo vecchie non sono stati considerati;
  • rilevanza di posizionamento secondo Google;
  • presentazione abbondante di codice;

Links

Altri link che intendo approfondire sono:

domenica 10 febbraio 2008

[C++ / Visual Studio 2005] Nota sulle direttive #include

Se nel vostro listato inserite #include <fstream.h> all'inizio VS2005 si lamenterà del fatto che non trova tale file. Invece se mettere #include "fstream" VS2005 è contento e trova l'header. Perchè? Mi risponde Igor Tandetnik:

The difference is likely not in angle brackets vs quotes. Note how in one case the file name is fstream.h, and in the other it's just fstream.
The former was used in VC6 and earlier, was deprecated in VC6 and was removed in subsequent version. The latter (fstream without an extension) is modern, standard-conformant header file name.

In buona sostanza #include "fstream" è la sintassi moderna e corretta di includere gli header,anche se non mi è chiaro perchè a questo punto una #include "winsock2" fallisca,mentre #include "winsock2.h" invece no...misteri di Visual Studio :)

Fonte: microsoft.public.vc.language

[C++]Conversioni numeriche

Breve post illustrativo su come convertire degli interi positivi in base 2,8 e 16. Ometto la definizione di number e l'inclusione degli header. Chi volesse saperne di più commenti qui sotto.


cout.setf(ios::showbase); // mostra la base es. 0x per HEX
cout << "The number in hex is " << hex << number << endl;
cout.unsetf(ios_base::showbase); // non mostra più la base
cout << "The number in oct is " << oct << number << endl;
cout << "The number in binary is ";
binary(number);
cout << endl;

La funzione binary(int) viene così definita:

void binary(int number) {
int remainder;

if(number <= 1) {
cout << number;
return;
}

remainder = number%2;
binary(number >> 1);
cout << remainder;
}

giovedì 7 febbraio 2008

[C++] La classe basic_string: minitutorial

Introduzione

Nel mio progetto di tesi,faccio uso di stringhe di caratteri per l'invio di comandi e il confronto fra stringhe.
Venendo dal mondo Java,ho fatto un po' di fatica ad orientarmi su come vengono trattate le stringhe in C++ (con particolare considerazione all'ambiente Visual Studio).
A seguire alcune considerazioni sulla classe basic_string.

Sprazzi di codice

Quanto segue è la creazione di una stringa e il confronto fra stringhe, prendendo in input una stringa digitata dall'utente. Il confronto viene fatto sia tramite l'operatore "==" sia tramite compare che ritorna 0 se le stringhe sono uguali:

string myString("partenza");
string passwd;

cout << "Stringa: \"" << myString << "\"" << endl;
cout << "Lunghezza stringa: " << myString.length() << endl;

cout << "Scrivi una stringa: ";
getline(cin, passwd, '\n');
if(passwd == "partenza") {
cout << "Usato \"=\": OK" << endl;
}
if(passwd.compare(myString) == 0){
cout << "Usato \"compare\": OK" << endl;
}
Osserviamo ora il seguente confronto:
string newString("getttnversion\r\n");
string another("getttnversion");
cout << "Confronto fra stringhe con caratteri di escape: " << endl;
cout << " - ";
if(newString.compare(another) == 0)
cout << "Risultano uguali\n" << endl;
else cout << "Risultano diverse\n" << endl; // risulteranno diverse!
Le stringhe risultano diverse! Per ragioni di esigenza,quando passo una stringa di caratteri dal client in java,la faccio terminare con un "\n",pensando che recv interpreti la cosa come la fine del messaggio (anche se non ho ben capito su che basi recv determini che il client ha smesso di inoltrare dati...).
Segue quindi una funzione "purificatrice" per le stringhe: rimuovo gli spazi,i carriage return e i line feed:
void cleanString(string *aString) {
for(size_t i = aString->find(" ", 0); i != aString->npos; i = aString->find(" ", i)){
aString->erase(i,1);
}
for(size_t i = aString->find("\n", 0); i != aString->npos; i = aString->find("\n", i)){
aString->erase(i,1);
}
for(size_t i = aString->find("\r", 0); i != aString->npos; i = aString->find("\r", i)){
aString->erase(i,1);
}
}

// come si usa...
cleanString(&anotherString);
In questo modo anotherString verrà ripulita di spazi e dai caratteri '\r' e '\n'. Se qualcuno sa spiegarmi nel dettaglio:
  • come fa recv a determinare la fine dei dati spediti;
  • se aspetta all'infinito oppure scade dopo un timeout;
Mi farebbe un bel piacere :)

venerdì 1 febbraio 2008

Messaggi di debug in applicazioni per PDA

Grazie ai vari consigli è finalmente saltata fuori una funzione che permette di dare maggior significato alle parti del programma:

Questa funzione farà comparire nella finestra output per il Debug ciò che abbiamo scritto.

Certo,si potrebbero usare i breakpoints,ma quelli ancora non li ho mai usati in Visual Studio :D

Ricordarsi sempre di guardare la voce "Requirements" in fondo alle funzioni citate nella libreria online di MSDN: questo ci dice quali header importare e quali librerie linkare per il nostro progetto.

mercoledì 30 gennaio 2008

Programmare con le Socket per PDA: atto I

Se sei un programmatore esperto di C++ e conosci bene i meccanismi di Visual Studio,prova a tornare ai tempi in cui non ci capivi un cazzo e alle frustrazioni che ti dava il linker che non ne voleva sapere di "risolvere" certe funzioncine a te care.

Beh in questi due giorni mi son sentito così,finchè finalmente qualche anima pia ha saputo indicarmi la "cosa giusta".

Ormai mi incollerò come una zecca al forum Smart Devices Native C++ Development.

Quindi in parole povere per lavorare con le Socket su Pocket PC:

  • mettete un bell' #include <winsock.h> in cima al file;
  • Linkate la liberia "ws2.lib" nelle proprietà del vostro progetto oppure usando l'istruzione
    #pragma comment (lib, "WS2.lib")

Per il momento è tutto quello che c'è da sapere. Una buona guardata all'SDK Documentation credo sarà di rigore. Tale documentazione riguarda:

The documentation applies to the following Windows Mobile software platforms:

  • Pocket PC 2003 Second Edition
  • Smartphone 2003 Second Edition
  • Pocket PC 2003
  • Smartphone 2003
  • Pocket PC 2002
  • Smartphone 2002
  • Pocket PC 2000

Con questo chiudo e che Dio me la mandi (buona!!).

mercoledì 23 gennaio 2008

Hello World per Pocket PC

Non poteva mancare l'immancabile appuntamento dell'"Hello World" con il giocattolo con cui gioco al momento.

I passi per ottenerlo

Prima di tutto sto utilizzando Visual Studio 2005 Professional (che possiede gli emulatori per Pocket PC 2003 e Smartphone) e Windows Vista.

  • Aprire Visual Studio 2005 Professional e fare File > New > Project;
  • Ampliare Visual C++ e selezionare Smart Device;
  • Ci si presentano dei template per Smart Device:
    - ATL: a project for Windows Mobile and other Windows CE-based devices that uses the Active Template Library;
    - MFC: an application for Windows Mobile and other Windows CE-based devices that uses the Microsoft Foundation Class Library;
    - Win32: a Win32 or Console project for Windows Mobile and other Windows CE-based devices;
    - MFC ActiveX: an ActiveX control for Windows Mobile and other Windows CE-based devices that uses the Microsoft Foundation Class Library;
    - MFC DLL: a dynamic-link library for Windows Mobile and other Windows CE-based devices that uses the Microsoft Foundation Class library;
  • Sclego Win32 Smart Device - e flaggo Window come tipo di applicazione;

A questo punto siccome abbiamo selezionato "Window",VS ci sparerà dentro il nostro progetto una vagonata iniziale di codice per la gestione degli eventi,le finestre,ecc. Ma all'osso com'è un programma per dispositivi Windows CE based?



#include "stdafx.h"
#include "ppc-hello5.h"
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstan,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
/* printf ("Hello World\n"); verrebbe visualizzato solo su console
non dall'emulatore nè dal pocket pc */
MessageBox (NULL, TEXT ("Hello World"), TEXT ("Hello2"), MB_OK);
return 0;
}


Potete riconoscere una specie di main e una funzione intuitiva: aprirà una finestrella con scritto "Hello World" e un bottone OK per chiuderla:





helloworld




Note



Se notate ho commentato una printf. Se usate funzioni per stampare in output su Consolle (così come cout) il Pocket PC (e l'emulatore stesso non daranno segni di vita al suo avvio. Questo perchè non c'è il supporto per la consolle. Ma se vi scaricate i Windows Mobile Developer Power Toys potete installare una shell sul vostro pocket pc. E' scritto tutto nel readme,basta spostare una dll nella directory di Windows e due eseguibili dove volete e cliccare su cmd.exe per aprire una shell posizionata in partenza sulla root del dispositivo.

Putiferio programmatoriale

OK dai piani alti non arrivano sempre direttive molto chiare,per cui oggi ho proposto ai miei relatori di proseguire sostanzialmente per passi:

  • realizzazione di un'applicazione client/server java in J2ME Personal Profile (a dopo per le spiegazioni);
  • realizzazione di un client/server in Visual C++;
  • ovviamente i due devono comunicare tra loro bel seguente modo: l'applicazione java devespedire dei comandi al server il quale li rigirerà al TomTom tramite le API fornite nel suo SDK. Ricevuta la risposta la porterà di nuovo all'attenzione dell'applicazione java.

Facile no? :-D Insomma,partiamo per punti:

  • J2ME è sostanzialmente strutturato secondo 3 elementi principali:
  • 1 - le configurazioni (CDC e CLDC): CDC è orientata per dispositivi con capacità di calcolo maggiori come smatphone e PDA,mentre CLDC il contrario. Forniscono un set di API comuni per un vasto range di dispositivi;
    2 - i profili: sono delle API più specifiche. Ogni configurazione ha i suoi profili,per esempio CLDC ha MIDP (le famose MIDlet) mentre CDC ne ha 3 tra cui quello a cui sono interessato ossia Personal Profile;
    3 - package opzionali per tecnologie specifiche;

javame_components

Il bello comunque è che quanto già conosci per J2SE può esser in qualche modo sfruttato anche per il Personal Profile poichè supporta tutte le API del JDK v.1.2 e le AWT 1.1. Quindi supporta sockets,StringTokenizer e altre amenità non presenti per MIDP.

Quanto al programma in C++: io devo creare un applicazione che vada su un Pocket PC con Windows Mobile 2003 SE (il cui cuore se non erro è comunque Windows CE). Devo trovare come aprire le socket sui palmari. Non è importante abbia interfaccia grafica,anzi penso proprio non freghi a nessuno.

Fatti questi due punti si potrebbe lanciare l'eseguibileda java direttamente come server in ascolto  e passargli tutti i nostri sporchi comandi.
E posso usare tranquillamente J2SE v. 6 credo,basta usare le API supportate dalla vecchia versione,anche perchè l'installer JDK 1.2 su Vista non ne vuol sapere di esser eseguito (un workaround è farselo installare da qualcuno con XP e farsi tornare indietro il contenuto della cartella,il problema sta nell'installer,non nel contenuto!)
Quindi non credo ci siano particolari configurazioni da fare per Eclipse ( se non l'impacchettamento in un file jar suppongo...mi devo informare).

I link d'oro sono:

  • PersonalJava Compatibility Classes: classi addizionali disponibili nelle API PersonalJava API ma non disponibili nel corrispondente JDK. Tali classi permettono alle applets e applicazioni sviluppate con PersonalJava di esser eseguite in un ambiente basato su JDK.
  • JavaCheck: tool per testare se l'applicazione sarà compatibile con un particolare ambiente Java e perciò se possa essere eseguita su tutti i dispositivi che implementano tale ambiente Java. analizza i file .class per cercare dipendenze non incluse in particolari APIs. Ciò permette agli sviluppatori di creare applicazioni che vengano eseguite in modo sicuro su differenti implementazioni Java . JavaCheck legge i platform specification files (.spc), files specifici per certe API i quali sono stati codificati (disponibile solo per PersonalJava);
  • PersonalJava Emulation Environment: verifica che le applicazioni scritte possano girare in un ambiente che supporta Personal Java. (NON VISTA COMPATIBILE: un workaround è farselo installare da qualcuno con XP e farsi tornare indietro il contenuto della cartella,il problema sta nell'installer,non nel contenuto!)
  • Writing an application for the J2ME Personal Profile: la domanda che ho posto a google e che mi ha fatto trovare tutto quello che mi servivia :-D

  • Java ME Technologies Personal Profile forum;

Qualcuno ha idee,link,conosce libri su come sviluppare un'applicazione per Pocket PC che:

  • abbia funzionalità di rete;
  • utilizzi classi C++ (quindi niente metodi particolari del .NET Framework);

Any help is appreciated thanks ;)

domenica 20 gennaio 2008

TomTom: raccolta appunti

Ho aperto una pagina sul mio sito d'appunti per raccogliere tutto il materiale di lavoro per la tesi inerente all'uso di TomTom Navigator 6 e del suo SDK.

Inutile dire che se conoscete siti in cui si parla di programmazione con questo SDK,avete a disposizione qualche materiale a riguardo o volte darmi un qualsiasi tipo di aiuto,SIETE PIU' che benvenuti :-)

Del resto io mi sto approcciando all'argomento da TOTALE inesperto quanto a programmazione C++/Visual C++ e all'uso di Visual Studio stesso.

venerdì 11 gennaio 2008

Fence post errors e Visual Studio

Dicesi "Fence post errors" quegli errori comuni nella gestione errata di un array,nella fattispecie quando assegniamo un valore ad un indice dell'array fuori dai suoi limiti. Esempio pratico:


long TargetArray[25]; // array to fill
TargetArray[25] = 20; // out of bounds!!

Nell'esempio soprastante,Visual Studio farà tranquillamente l'asseegnamento e stamperà pure 20 in fase di esecuzione. Qualcuno un po' più perito di me in C++ e Visual Studio 2005,mi chiarisce perchè Visual Studio non lancia errori o avvertimenti di sorta ma tratta un array quasi come fosse uno stack? Grazie.

domenica 2 dicembre 2007

L'Hello World in C++ e Visual C++

Come già preannunciato,mi tocca imparare per lo meno le basi di C++ per poter lavorare alla tesi. Ebbene sto leggendo un libro un po' datato,ispirato dal titolo: "Teach yourself ANSI C++ in 21 days",0-672-30887-6, J.Liberty, J.Hord - SAMS Publishing (1996). Il primo esempio di codice mi riserva subito dei problemi con Visual Studio:


#include "iostream.h"

void main()
{
cout << “Hello World!\n”; }
Di fatto non riconosce "cout",proprio come se la libreria non fosse stata importata. Girovagando per la rete,per rendere compatibili i programmi con il compilatore Microsoft,bisogna usare questo codice:

#include "stdafx.h"
#include "iostream"

using namespace std;

/* per rendere compatibile il normale codice c++
* in VS bisogna anteporre le librerie e il namespace
* messi qui sopra */
void main() {
cout << "Hello World!\n"; }
Mi raccomando di mettere "stdafx.h" prima di ogni altra cosa poichè il compilatore ignora qualsiasi cosa anteposto a questa stringa.

martedì 27 novembre 2007

Visual Studio 2005 e l'errore "il server di automazione non può creare l'oggetto"

Oggi è stata la giornata dedicata al troubleshooting. Tra i miei svariati problemi avevo l'impossibilità di creare nuovi progetti Visual C++: all'atto della creazione,una nefasta finestrella di errore mi precludeva il coding:

Le ricerche son state lunghette e alla fine ho trovato la soluzione al problema. Al fine di evitare anche ad altri il tormento di ricercare le varie possibili soluzioni,riporto tutte quelle che ho trovato,sperimentatele tutte,la mia soluzione vincente su Vista è stata l'ultima postata qui sotto.
  • Il supporto di Microsoft indica di scaricare la versione 5.6 di Windows Script. Gran parte delle dll presenti sono più vecchie di quelle che avevo già installate e ciò non ha risoolto il mio problema;
  • Ho cercato la stringa dell'errore nel suo equivalente inglese:"Automation server can't create object". Nel forum di MSDN viene indicata una chiave di registro da modificare,ma purtroppo tale chiave su Vista non c'era...
  • Infine su un sito di cui ho appena perso il link ho trovato che un tipo registrava la seguente dll da "Esegui": regsvr32.exe scrrun.dll. Il tutto poi ha funzionato :)

sabato 3 novembre 2007

E il C++ mi tocca

Sinceramente ne avrei anche fatto a meno di sorbirmi il C++,del resto conosco già Java e mi sto imparando il C#,quindi non vedevo l'utilità di dover imparare anche C++. Ad ogni modo le API di TomTom sono scritte in questo linguaggio,quindi devo per lo meno sapere le basi del linguaggio per capire come costruire un client in C++ che comunichi sia con il TomTom navigator,sia con l'applicazione in Java fatta dal laboratorio.
Potrete vedere i miei appunti a questa pagina.