Blupixel IT Blog – Articoli e Tutorial Informatica e Programmazione

Blog ufficiale di Blupixel IT Srl

Trasformare un testo in una tabella in Android SDK

In Android la gestione della visualizzazione dei testi può essere molto complessa.

Per visualizzare un testo in maniera ordinata, come fosse una tabella, ad esempio, è necessario creare un layout appositamente, con un elemento per ogni cella che si vuole compilare e poi caricare i dati una cella alla volta aggiungendo inoltre un elemento alla view.

Se avessi, però, solo un testo normale in una TextView e volessi renderlo ben allineato su ogni riga in modo che sembri una tabella, puoi usare questo trucco, che sfrutta il calcolo della dimensione delle scritte, per aggiungere tanti spazi quanti necessari per identare correttamente le parti del testo

String lines[] = getItem(position).toString().split("\n");
String print = "";
String parts[] = null;
String tmp = "";
int weight = 0;
for (int i=0; i < lines.length; i++) {
   if (!lines[i].equalsIgnoreCase("")) {
	   parts = lines[i].split(":", 2);
	   tmp = "";
	   Paint textPaint = text.getPaint();
	   float width = textPaint.measureText(parts[0]);
	   float wslength = textPaint.measureText(" ");
	   for (int j = 0; j < (220 - Math.round(width))/Math.round(wslength); j++) {
		   tmp = tmp + " ";
	   }
	   if (print.equalsIgnoreCase("")) {
		   print = print + parts[0] + tmp + Html.fromHtml(""+parts[1]+"");
	   } else {
		   print = print + "\n" + parts[0] + tmp + parts[1];
	   }
   }
}

Nella prima parte separo una stringa in linee separandola sugli a capo, dopo ciclo su ogni riga e se la riga non è vuota creo la riga in versione tabellare.

Separo ogni riga in “celle” dividendo il testo ogni volta che incontro il carattere “:” (in questo caso prevedo 2 celle), quindi prendo la lunghezza visualizzata del testo e aggiungo tanti spazi bianchi quanti ne sono necessari per arrivare ad una lunghezza di 220.

Se prevedete più di due celle dovrete ripetere l’operazione per tutte le celle (ultima esclusa)

Se è la parima riga, la metto in grassetto, come fosse un header.

Così sarà possibile inserire la variabile print in qualunque TextView o AlertDialog, ottenendo un testo con effetto tabella.

Buon lavoro

Lanciare una seconda istanza di skype su Ubuntu Linux

A volte potrebbe essere necessario avere sullo stesso computer due istanze di Skype contemporaneamente.

Di seguito i passaggi per farlo su un generico sistema Linux e quindi per mettere l’icona della seconda istanza sulla launchbar di ubuntu.

Prima cosa bisogna creare una nuova cartella Skype nella propria home

mkdir ~/.personalSkype

Quindi conviene duplicare l’esecutivo skype per permettere al sistema di collegare correttamente le finestre all’istanza giusta:

sudo ln -s /usr/bin/skype /usr/bin/skype2nd

Adesso si potrà lanciare la seconda istanza di skype con il comando

skype2nd --dbpath=~/.personalSkype

 

Per creare un’icona nella barra sinistra di Ubuntu seguire i seguenti passaggi:

1. Creare una nuova icona per skype (ad esempio la S verde), chiamarla skype-personal.png (o altro nome se preferite, ma dovrete modificare il prossimo file) e salvarla nella cartella /usr/share/icons/hicolor/64×64/apps/ (saranno necessari i privilegi di root)

2. Creare un file chiamato SkypePersonal.desktop nella cartella /usr/share/applications con il seguente contenuto

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon=skype-personal
Name=Skype 2nd
Exec=skype2nd --dbpath=~/.personalSkype
Name=Skype 2nd
Icon=skype-personal

3. Aprire la cartella /usr/share/applications  nel File Manager e trascinare il nuovo file creato sulla barra a sinistra (launchbar)

Adesso per poter lanciare la seconda istanza sarà sufficiente cliccare sull’icona appena trascinata.

 

Cercare una stringa in un array in C/C++

Purtroppo il linguaggio di programmazione C non è così immaediato come può essere il PHP o il C#.
Quindi per cercare un valore all’interno di un array, specialmente se gli array non sono di tipo vector ma di tipo char** allora sicuramente non troverete nelle librerie standard un metodo per farlo in automatico.

Un’aspetto negativo dell’uso del char** anzichè del vector sta nel fatto che non è possibile usare iteratori e che inoltre è indispensabile conoscere la lunghezza dell’array prima di fare la ricerca per evitare di andare in “Segmentation Fault”.

Per chi si fosse imbattuto già in questo errore ma non sapesse ancora di cosa sis tratta posso dire che l’errore Segmentation Fault avviene nella maggior parte dei casi perchè si sta cercando di accedere (in lettura o in scrittura) ad un elemento dell’array al di fuori dell’array inizializzato.
Così, se per esempio, avete un array

int* arr = new int[5];

 

Avrete a disposizione in lettura e scrittura i soli valori arr[0], arr[1], arr[2], arr[3], arr[4]. Se cercate di accedere quindi ad arr[5] o arr[10] e così via, otterrete un bel “Segmentation fault”!

Per questo nella funzione di ricerca della stringa è indispensabile conoscere da prima la lunghezza dell’array, perchè con i puntatori non si può conoscere la lunghezza, nè si può verificare se l’elemento con indice X esiste o no…

Ma adesso vediamo la funzione:

#include
#include
#include 

using namespace std;

int array_search(char** input, int input_length, char* search) {

    int result = -1;
    string tmp;

    for(int i = 0; i < input_length; i++) {
        if (strcmp(input[i], search) == 0) {
              result = i;
              break;
        }
    }

    return result;

}

 

Nella funzione semplicemente prendiamo in ingresso: il char** contenente l’array in cui cercare, la sua lunghezza, la parola da cercare.
La funzione scorre l’array, confronta il tutto e interrompe il ciclo se trova un risultato.
Ritorna -1 se non trova niente o il valore dell’indice (da 0 a input_length-1) in cui la stringa è stata trovata.

Purtroppo la funzione è CASE SENSITIVE, vuol dire che “Paperino” è diverso da “paperino”. Per farla case insensitive bisogna renderla un po’ più complessa.

A presto