User Macro – Un semplice esempio di utilizzo

User Macro

In questo post andremo ad consultare un articolo presente in questo blog, che ritengo molto interessante. Lo esamineremo e cercheremo di approfondire l’argomento, in quanto lo ritengo un ottimo esempio didattico.

Andiamo in dettaglio

L’articolo del blog spiega come realizzare una alternativa alla macro Space Detail Macrousando le macro per ottenere un risultato migliore 🙂

In particolare il risultato che offre con la sua macro è il seguente:

L’ho scelto perché si tratta di una macro molto semplice e, dal punto di vista didattico, la macro risulta realizzata molto bene.

Vediamo il codice

La configurazione preliminare della macro è molto semplice. La seguente immagine la riassume:

Il codice è molto semplice. Lo riporto di seguito nella sua interessa e successivamente lo andremo ad esaminare pezzo per pezzo, in modo da capire come viene eseguita ogni singola operazione.

## Macro title: Space Meta Data
## Macro has a body: Y or N (N)
## Body processing: Selected body processing option
## Output: Selected output option
##
## Developed by: Andrew Frayling
## Date created: 03/05/2012
## Installed by: <your name>

## Macro to display information such as number of pages, number of blog posts, attachment size, etc. about a Space. 

## @noparams

## Get space details
#set ( $spaceName = $space.getName() )
#set ( $spaceKey = $space.getKey() )
#set ( $spaceHome = $space.getHomePage() )
#set ( $spaceCreator = $space.getCreatorName() )
#set ( $spaceCreationDate = $space.getCreationDate() )
#set ( $spaceDescription = $space.getDescription() )
#set ( $pageCount = $spaceManager.findPageTotal($space) )
#set ( $blogCount = $spaceManager.getNumberOfBlogPosts($space) )

## Get all pages in the current Space
#set ( $allPagesInSpace = $pageManager.getPages($space, true) )

## Reset total attachment file size
#set ( $totalAttachmentFileSizeForSpace = 0 )

## Reset total number of attachments
#set ( $totalAttachmentCount = 0 )

## Loop through all pages in the current Space
#foreach ($page in $allPagesInSpace)
  ## reset the attachment count for each page
  #set ( $pageAttachmentCount = 0 )
  ## reset the attachment file size total for each page
  #set ( $totalFileSizePerPage = 0 )
  ## get the attachments for each page
  #set ( $allAttachments = $page.getAttachments() )
  ## Loop through each attachment
  #foreach ($attachment in $allAttachments)
    ## Increment the attachment count for the page
    #set ( $pageAttachmentCount = $pageAttachmentCount + 1 )
    ## Sum the size of the attachments on the page
    #set ( $totalFileSizePerPage = $totalFileSizePerPage + $attachment.getFileSize() )
  #end
  ## End looping through attachments
  ## Increment total attachment count for the current Space
  #set ( $totalAttachmentCount = $totalAttachmentCount + $pageAttachmentCount )
  ## Sum the total size of attachments for the current Space
  #set ( $totalAttachmentFileSizeForSpace = $totalAttachmentFileSizeForSpace + $totalFileSizePerPage )
#end
## End looping through pages

## Convert attachment size to MBs
#set ( $attachmentSizeMb = ($totalAttachmentFileSizeForSpace / 1024.00) / 1024.00 )

## Display Space Details
<table class="confluenceTable">
  <tbody>
    <tr>
      <th class="confluenceTh">Name</th>
      <td class="confluenceTd">$spaceName</td>
    </tr>
    <tr>
      <th class="confluenceTh">Key</th>
      <td class="confluenceTd">$spaceKey</td>
    </tr>
    <tr>
      <th class="confluenceTh">Description</th>
      <td class="confluenceTd">$spaceDescription.getBodyAsString()</td>
    </tr>
    <tr>
      <th class="confluenceTh">Home Page</th>
      <td class="confluenceTd">#contentLink2($spaceHome true false)</td>
    </tr>
    <tr>
      <th class="confluenceTh">Created By</th>
      <td class="confluenceTd">#usernameLink($spaceCreator) ($action.dateFormatter.formatDateTime($spaceCreationDate))</td>
    </tr>
    <tr>
      <th class="confluenceTh">Number of Pages</th>
      <td class="confluenceTd">$pageCount</td>
    </tr>
    <tr>
      <th class="confluenceTh">Number of Blog Posts</th>
      <td class="confluenceTd">$blogCount</td>
    </tr>
    <tr>
      <th class="confluenceTh">Number of Attachments</th>
      <td class="confluenceTd">$totalAttachmentCount (including all versions)</td>
    </tr>
    <tr>
      <th class="confluenceTh">Total Size of Attachments</th>
      <td class="confluenceTd">$attachmentSizeMb MB</td>
    </tr>
  </tbody>
</table>

Distinguiamo le seguenti sezioni nella macro:

  • Testata
  • Lettura parametri dello space
  • Lettura della dimensione dei vari allegati
  • Visualizzazione dati ottenuti

Andiamo ad esaminarle in dettaglio.

## Macro title: Space Meta Data 
## Macro has a body: Y or N (N) 
## Body processing: Selected body processing option 
## Output: Selected output option 
## 
## Developed by: Andrew Frayling 
## Date created: 03/05/2012 
## Installed by: <your name> 
## Macro to display information such as number of pages, number of blog posts, attachment size, etc. about a Space. ## @noparams

L’Intestazione della macro è quello che avevo già descritto nel mio primo post. In questo caso, l’autore ha realizzato una intestazione molto ben fatta, chiara, semplice e di rapido effetto.

Spiega subito le caratteristiche della macro in poche righe.

## Get space details
#set ( $spaceName = $space.getName() )
#set ( $spaceKey = $space.getKey() )
#set ( $spaceHome = $space.getHomePage() )
#set ( $spaceCreator = $space.getCreatorName() )
#set ( $spaceCreationDate = $space.getCreationDate() )
#set ( $spaceDescription = $space.getDescription() )
#set ( $pageCount = $spaceManager.findPageTotal($space) )
#set ( $blogCount = $spaceManager.getNumberOfBlogPosts($space) )

## Get all pages in the current Space
#set ( $allPagesInSpace = $pageManager.getPages($space, true) )

## Reset total attachment file size
#set ( $totalAttachmentFileSizeForSpace = 0 )

In questa sezione, invece, va a leggere tutte le informazioni dello Space, impostando tutte le variabili con le informazioni che si vogliono visualizzare nella macro. Notiamo le variabili, definite con la sintassi che è stata già spiegata nei precedenti post.

## Reset total number of attachments 
#set ( $totalAttachmentCount = 0 )

## Loop through all pages in the current Space
#foreach ($page in $allPagesInSpace)
  ## reset the attachment count for each page
  #set ( $pageAttachmentCount = 0 )
  ## reset the attachment file size total for each page
  #set ( $totalFileSizePerPage = 0 )
  ## get the attachments for each page
  #set ( $allAttachments = $page.getAttachments() )
  ## Loop through each attachment
  #foreach ($attachment in $allAttachments)
    ## Increment the attachment count for the page
    #set ( $pageAttachmentCount = $pageAttachmentCount + 1 )
    ## Sum the size of the attachments on the page
    #set ( $totalFileSizePerPage = $totalFileSizePerPage + $attachment.getFileSize() )
  #end
  ## End looping through attachments
  ## Increment total attachment count for the current Space
  #set ( $totalAttachmentCount = $totalAttachmentCount + $pageAttachmentCount )
  ## Sum the total size of attachments for the current Space
  #set ( $totalAttachmentFileSizeForSpace = $totalAttachmentFileSizeForSpace + $totalFileSizePerPage )
#end
## End looping through pages

## Convert attachment size to MBs
#set ( $attachmentSizeMb = ($totalAttachmentFileSizeForSpace / 1024.00) / 1024.00 )

In questa sezione del codice, viene eseguito un esempio di ciclo sulle varie pagine, per determinare la dimensione dei vari allegati alle pagine dello Space. Questo è sicuramente un ottimo esempio che mostra come sono reperite le informazioni usando il codice delle macro.

In aggiunta vediamo come eseguire il reperimento dei dati, quali le pagine presenti dentro uno space, e degli allegati. La sintassi non è affatto difficile e consente di poter lavorare agevolmente.

## Display Space Details
<table class="confluenceTable">
  <tbody>
    <tr>
      <th class="confluenceTh">Name</th>
      <td class="confluenceTd">$spaceName</td>
    </tr>
    <tr>
      <th class="confluenceTh">Key</th>
      <td class="confluenceTd">$spaceKey</td>
    </tr>
    <tr>
      <th class="confluenceTh">Description</th>
      <td class="confluenceTd">$spaceDescription.getBodyAsString()</td>
    </tr>
    <tr>
      <th class="confluenceTh">Home Page</th>
      <td class="confluenceTd">#contentLink2($spaceHome true false)</td>
    </tr>
    <tr>
      <th class="confluenceTh">Created By</th>
      <td class="confluenceTd">#usernameLink($spaceCreator) ($action.dateFormatter.formatDateTime($spaceCreationDate))</td>
    </tr>
    <tr>
      <th class="confluenceTh">Number of Pages</th>
      <td class="confluenceTd">$pageCount</td>
    </tr>
    <tr>
      <th class="confluenceTh">Number of Blog Posts</th>
      <td class="confluenceTd">$blogCount</td>
    </tr>
    <tr>
      <th class="confluenceTh">Number of Attachments</th>
      <td class="confluenceTd">$totalAttachmentCount (including all versions)</td>
    </tr>
    <tr>
      <th class="confluenceTh">Total Size of Attachments</th>
      <td class="confluenceTd">$attachmentSizeMb MB</td>
    </tr>
  </tbody>
</table>

Questa è la parte che si occupa della visualizzazione. Notiamo che si tratta di HTML, che sfrutta le classi e le proprietà di Confluence. Vediamo che tutti i risultati delle precedenti elaborazioni sono inserite in questa tabella, in maniera molto rapida.

Conclusioni

Abbiamo analizzato un esempio di macro, molto semplice ma nello stesso tempo, fondamentale. Con esso è possibile comprendere e capire meglio come si può realizzare una macro, come possiamo sfruttare i vari punti del linguaggio per realizzare le funzionalità di cui si abbisogna senza, in questo caso, dover installare nulla :-). Scusate se è poco 😀

Ringraziamenti

Un ringraziamento particolare va all’autore del post blog. L’articolo è ben fatto e, anche se in inglese, è molto chiaro. I complimenti all’autore sono d’obbligo. 🙂

 

 

Advertisements

Exocet – Prova su strada – 2

Prova su strada – Continua

In questo post andremo a completare la panoramica dell’addon della Valiantys.

Continuiamo il test

Nel post precedente, abbiamo visto come è stata realizzata una sincronizzazione di commenti, tra due task collegati, attraverso l’addon. In questo post andremo ad esaminare altre operazioni.

Clone avanzato

Abbiamo a disposizione una funzionalità avanzata di Clone Issue. Se andiamo a selezionarla dalle Action di una Issue (DEMO-3, nel nostro esempio), notiamo che viene subito proposta, come da seguente figura:

exocet-02-01

una agevole autocomposizione. Andiamo quindi a confermare la creazione e questo è il nostro risultato:

exocet-02-02

Operations

Quando definiamo le operazioni, queste sono riportate, a seconda di dove indicato, su Action Menù. Nel nostro test abbiamo definito due operazioni:

exocet-02-03

e queste sono riportate nell’Action Menù, una volta che entriamo nel dettaglio della ISSUE:

exocet-02-04

consentendo all’utente di poterle subito utilizzare.

Conclusioni

Abbiamo visionato altre funzionalità dell’addon e con questo post, completiamo la nostra prova su strada. Possiamo affermare che le operazioni eseguite dallo stesso sono ottime. Unico punto negativo che andiamo a riscontrare, riguarda ahime proprio la documentazione :-(. Questa non risulta perfettamente chiara in ogni singolo punto e si fa molta fatica a capire come utilizzare l’addon. Suggerirei una piccola revisione, al fine di rendere il tutto più dettagliato, vista la complessità.

TimePO – Time tracking and Timesheets

Tracciamo meglio il lavoro

In questo post andremo ad esaminare un addon per JIRA, che ci può sicuramente aiutare nel tracciare le nostre attività e censire meglio il lavoro.

 

Dettaglio

Si tratta del TimePO – Time tracking and Timesheets, un addon che ci aiuta nel time tracking delle attività di tutti gli utenti (manager ed operatori) e nel reporting delle stesse informazioni. Si tratta di un addon per le installazioni server e…… gratuito (al momento in cui viene redatto questo post, l’addon risulta free).

Come mostrato dalla immagine sopra riportata, abbiamo una agevole interfaccia per il caricamento delle ore per singolo task.

I manager riescono, attraverso una visualizzazione di insieme, a capire meglio la situazione ed avere un quadro di insieme.

In aggiunta, disponiamo di una valida reportistica e di un sistema di esportazione su Excel, che meglio ci aiuta nella gestione del progetto/i.

Conclusioni

Uno strumento gratuito che mette a disposizione delle funzionalità non indifferenti :-). Nei prossimi post andremo a fare la nostra solita prova su strada per meglio capire come possiamo sfruttare questo addon.

 

Una piccola novità su Confluence

Una piccola novità….

In questo post andremo a riportare una curiosità, di cui mi sono accorto in questi giorni. Seguirà un post con opportuni approfondimenti 🙂

 

Di cosa si tratta?

Andiamo al dunque. Lavorando tutti i giorni con la versione Cloud di Confluence e JIRA, quasi non faccio caso alle ultime novità. Ma questa volta ho notato una piccola …. variante 😀

novita01

Nella fase di creazione di nuovi contenuti, è stata introdotta una variante. Il tasto Create è stato modificato in modo da semplificare il lavoro dell’operatore. Questo significa che se vogliamo creare una singola pagina, basta selezionare il tasto. Se invece abbiamo la necessità di creare una pagina da Template, allora quello che possiamo fare  selezionare il tasto con i tre punti, posto a fianco del tasto Create .

Conclusioni

Si tratta di un piccolo miglioramento, ma nel lavoro di un operatore, si tratta di una variante molto interessante. Se ci concentriamo sul lavoro di un operatore generico, questo lo aiuta notevolmente nell’aumentare la produttività e nel semplificarsi la vita. Non è cosa da poco 🙂

Addon by AppFusions – Userprofile

Approfondiamo l’argomento

In questo post andremo ad approfondire l’argomento dello UserProfile, affrontato in questo post. Vediamo una ulteriore alternativa disponibile 🙂

Enterprise Directory & Org Chart for Atlassian Confluence

Si tratta di un addon, realizzato dalla AppFusions, che permette di disporre di una buona integrazione con Active Directory LDAP e mette a disposizione un sistema per poter navigare e rappresentare in maniera efficace la User directory.

L’interfaccia per la ricerca è molto semplice e diretta e consente, agli utenti, di poter cercare in maniera agevole tra i dati della People Directory.

Altra caratteristica importante è quella di consentire una rappresentazione gerarchica degli utenti. Questa è una funzionalità non indifferente: Avremmo a disposizione sempre la possibilità di poter creare il nostro organigramma. Al momento solo in questo post abbiamo visto come poter generare un diagramma simile.

Conclusioni

Abbiamo visto una ulteriore alternativa alla UserProfile di Confluence. Abbiamo visto che, in questo sistema, non esiste una sola alternativa alla funzionalità standard, ma abbiamo un ampio ventaglio di alternative, che possiamo scegliere in base a quali sono le nostre esigenze. Prova su strada seguirà nei prossimi post 🙂

 

Reference

Maggiori dettagli dell’addon sono reperibili qui.

 

Ringraziamenti

Mi permetto d ringraziare David Simpson per la segnalazione inviatami, che aiuta tutti noi a capire meglio come orientarci in questo grande insieme di addons per Confluence.

Zephyr for JIRA – Test Management

Test su JIRA

In questo post sarà completato l’argomento iniziato in questo post ed in quest’altro post, relativamente alla possibilità di usare JIRA per eseguire dei test. Esaminiamo Zephyr for JIRA – Test Management

Diamo una occhiata

Anche questo addon consente di poter aggiungere, a JIRA, tutte le funzionalità necessarie per poter gestire un Test Management.

 

Viene data la possibilità di poter creare dei test, all’interno di JIRA, comprensivi di tutti i passi che li compongono, dei cicli di test, quali Issue sono collegate a questi test e definire, infine, i piani di test.

Opportuni report sono messi a disposizione per poter monitorare l’andamento degli stessi test, come mostra la figura precedente.

Viene data la possibilità di creare i test esattamente come le Issue. In questo modo, gli utenti, senza ulteriori corsi, possono già creare i test.

Allo stesso modo, con la stessa grafica del dettaglio Issue, è possibile vedere il dettaglio del test.

Conclusioni

Questo addon è sicuramente interessante. Fornisce un modo per poter gestire i test, simile all’addon già presentato qui. Nei prossimi post, andremo a realizzare la solita prova su strada.

Pillole di esperienza su Confluence – Come usare un Wiki al meglio

Pillole di esperienza

In questo post iniziamo a trattare un argomento più complesso, ma anche molto più interessante :-), in quanto iniziamo a capire meglio, oltre che ad usare questo strumento dal punto di vista tecnico, come farlo rendere al meglio. Iniziamo ad introdurre alcuni concetti che stanno alla base dell’uso di un Wiki e che aiutano a migliorare la vita. 😀

 

Alcune precisazioni

Prima di affrontare questo argomento, occorre fare alcune precisazioni. L’argomento trattato può essere facilmente esteso a qualsiasi WIKI, senza alcuna difficoltà, in quanto si tratta di indicazioni che vanno bene per tutti. Il WIKI è uno strumento, e come tale deve essere trattato.

In aggiunta, un WIKI non è uno strumento che vive di vita propria. Deve essere curato costantemente, occorre sempre verificarne pagine e contenuti. Un WIKI Necessita di costante intervento umano, altrimenti non serve assolutamente a nulla. Diventa un banale contenitore di informazioni e ogni utente dovrà perdere tempo nel reperire le stesse.

E’ come se mettiamo degli oggetti in una grande scatola e l’unico sistema per accedere alla scatola è buco dove a malapena entra una mano. Se vogliamo prendere uno degli oggetti dobbiamo infilare la mano e, alla cieca, cercare di prendere l’oggetto che vogliamo. Non ha assolutamente senso.

A cosa serve un Wiki?

Un Wiki è uno Strumento che aiuta ad organizzare le informazioni, in modo efficiente e semplice. Il vantaggio di usare un wiki è che il sistema di organizzazione delle informazioni è molto flessibile e si basa sulla collaborazione degli stessi utenti, il cui obbiettivo non è solo la scrittura e fruizione delle informazioni, ma anche il costante miglioramento delle stesse.

Molto spesso si da per scontato che, una volta adottato un WIKI, tutti i problemi sulla documentazione siano stati superati. Errore numero 1 – Siamo appena all’inizio :-).

Tuttavia, una volta che è stato avviato, nei modi e nei tempi corretti, abbiamo a disposizione uno strumento che ci può semplificare la vita di tutti i giorni. Questo richiede uno sforzo iniziale molto forte, ma se ben fatto il risultato ripaga molto delle fatiche che sono sostenute nella fase iniziale di redazione e tutte le modifiche/estensioni successive sono poi di facile esecuzione.

Wiki come punto centrale

Inserire le informazioni solo su WIKI è un vantaggio enorme. Questo significa che le stesse sono presenti solo li, non sono duplicate o la duplicazione è ridotta al minimo possibile, e, molto importante, sono tutte collegate tra di loro, fornendo un filo logico di lettura e consentendo agli utenti di poterle visionare senza grandi problemi.

Il vantaggio di una centralizzazione è evidente: avere un unico punto dove far risiedere le informazioni riduce la possibilità di errore (non dobbiamo andare a cercare le informazioni a destra e manca) ed aumenta la produttività. Se l’informazione è sul WIKI, questa sarà ricercata li e non su mail o file system o chissà che altro.

In organizzazioni molto strutturate, molto spesso, sono dotati di complessi portali e sistemi farraginosi il cui obbiettivo è la centralità delle informazioni. Molto spesso questo non è vero, in quanto si tratta di soluzioni molto rigide, studiate per una necessità particolare e, come sempre accade, questa necessità non può essere facilmente adattata ai cambiamenti.

Un WIKI è una soluzione tra le più flessibili, in quanto le rigidità dei portali praticamente non esistono. Occorre che gli utenti sfruttino il più possibile questa flessibilità a proprio vantaggio. Il non farlo causa dei grossi problemi in fasi successive, quando si fruisce della informazione stessa. Come scrivevo prima, scrivere delle pagine alla rinfusa, non aiuta affatto, occorre che ci sia uno schema e che le informazioni siano collegate.

Facilità di uso

Le informazioni su WIKI devono essere organizzate in maniera semplice e devono essere fruibili altrettanto facilmente. Di conseguenza, in base alle esigenze aziendali, queste devono essere organizzate, collegate, referenziate in maniera opportuna. Più lo schema adottato è semplice, più è semplice fruirne. Maggiore caos nelle informazioni, maggiore caos nella ricerca, maggiore caos nel reperire le informazioni. Allora non ha alcun senso creare delle pagine su di un WIKI, sperando che gli utenti facciano da soli. Essere utenti non significa essere macchine.

Un primo passo è quello di dotare le pagine di una determinata gerarchia e, successivamente, collegare le pagine in maniera da poterle …. navigare. Avere delle pagine con la semplice informazione, ma letteralmente buttata alla rinfusa, serve a nulla. Avere delle pagine con informazioni e collegate tra di loro, dove un utente può, partendo da una determinata informazione, risalire alle altre, questo si che è un vantaggio non indifferente ed il modo di gestire un wiki. Sul come fare, abbiamo tutti gli strumenti del caso 🙂

Il secondo passo è aggiornare costantemente queste informazioni. Mantenere delle informazioni statiche, non ha molto senso. Aggiornarle costantemente ha il suo vantaggio. Per aggiornarle si intende sia estendere le informazioni presenti nella pagina, sia estendere la rete di collegamenti tra pagine.

Evitiamo le mode

Altro punto fondamentale: Non si usa un wiki solo perchè l’azienda concorrente lo usa e fa affari d’oro. Lo si usa per migliorare l’azienda, dare un valore aggiunto, ridurre la complessità e arrivare prima degli altri ai propri obbiettivi. Discorsi del tipo: loro lo usano e vanno benissimo; non servono a nulla: Errore numero 2. :-).

Uno strumento deve essere adottato in azienda solo se serve, no perché va di moda. Le mode passano. Le metodologie valide rimangono ed i risultati si vedono.

Percorso di Lettura

Altra caratteristica importante per un WIKI, riguarda come si può eseguire la lettura delle pagine. Questo è un concetto molto importante. Ogni pagina deve essere inserita in un opportuno percorso di lettura, attraverso il quale l’utente naviga alla ricerca delle sue informazioni.

Questo significa che la pagina del WIKI non è scollegata, ma è connessa con altre pagine. L’utente deve poter reperire questa pagina principalmente attraverso la navigazione di pagine. La ricerca deve essere l’ultima possibilità di reperire le informazioni, e non la normalità. Se ogni informazione viene reperita solo attraverso la ricerca, allora questo non va bene.

Facciamo un esempio. Supponiamo di avere un applicativo, cui abbiamo realizzato delle personalizzazioni per determinati clienti. Se, ad esempio, dobbiamo cercare una determinata personalizzazione, questa deve essere reperita attraverso:

  • la pagina del cliente. Da li deve essere possibile poter risalire alla personalizzazione. Se questa è comune a più clienti, allora si deve poter risalire dalle pagine dei clienti coinvolti.
  • la pagina dell’applicativo. Dalle indicazioni generali deve essere possibile risalire al particolare sviluppo operato.
  • la pagina delle personalizzazioni. Dalle indicazioni riassuntive delle personalizzazioni, deve poter essere possibile risalire alla informazione particolare del o dei clienti coinvolti.

Se non abbiamo molti elementi, allora conviene cercare per la ricerca.

Come descritto, prima di arrivare a cercare attraverso la maschera di ricerca, siamo transitati dalle pagine principali di altre informazioni, tentando una navigazione che ci porti a quello che stiamo cercando. Questo è l’utilizzo

 

Conclusione

Siamo giunti al termine di questo primo post, dedicato ai concetti fondamentali di un WIKI. Nei prossimi, cercheremo di fornire ulteriori approfondimenti che aiutino gli utenti (utilizzatori e scrittori) a fare meglio il proprio lavoro.