{"id":228,"date":"2009-09-03T21:31:00","date_gmt":"2009-09-03T21:31:00","guid":{"rendered":"http:\/\/e-ware.org\/blog\/?p=228"},"modified":"2009-09-03T21:31:00","modified_gmt":"2009-09-03T21:31:00","slug":"sapere-se-un-software-e-installato","status":"publish","type":"post","link":"http:\/\/e-ware.org\/blog\/sapere-se-un-software-e-installato\/","title":{"rendered":"Sapere se un software \u00e8 installato"},"content":{"rendered":"<div>\n<div><span>Quando si creano programmi abbastanza complessi, alle volte pu\u00f2 essere utile ricorrere a programmi esterni per agevolare il lavoro di stesura del codice del nostro software per evitare di riscrivere funzioni che potrebbero essere svolte benissimo da programmi di terze parti. La cosa funziona di sicuro se il programma viene scritto ed eseguito sul nostro computer poich\u00e8 si presue che noi stessi sappiamo quali programmi che sono instalati su di esso; ma la cosa si complica se il nostro software deve essere distribuito: chi ci assicura che il programma a cui abbiamo chiesto <\/span><span>aiuto<\/span><span> sia installato anche sui pc di eventuali utenti finali?<\/p>\n<p>Per ovviare a questa cosa \u00e8 possibile interrogare il terminale mediante codice. Ovviamente ci\u00f2 che sto per dire potr\u00e0 essere usato solo su sistemi GNU\/linux vista la notevole potenza dei comandi del terminale.<\/p>\n<p>Esso prevede una comoda funzione che prende il nome di <\/span><span>which<\/span><span>; questo comando accetta come parametro il nome di un programma e ne restituisce il path in cui \u00e8 installato se esiste o non restituisce nulla se nel computer esso non \u00e8 presente. Proprio analizzando la risposta della shell si pu\u00f2 capire se il programma non c&#8217;\u00e8 e quindi avvisare l&#8217;utente di installarlo per far si che il nostro software funzioni come dovrebbe.<\/p>\n<p>In gambas la cosa molto semplice. Per analizzare come fare scriviamo il codice di una funzione che accetta una stringa contenente il nome del programma e restituisce un booleano che vale 0 se il programma non c&#8217;\u00e8 o 1 se il programma \u00e8 installato.<br \/><\/span><\/div>\n<p><span><br \/>Codice:<br \/><code><\/code><\/span><\/p>\n<pre><span><br>STATIC PUBLIC FUNCTION SoftExist(software AS String) AS Boolean<br><br>DIM control AS String<br><br>SHELL \"which \" & software<br>WAIT<br><br>IF InStr(control, software) THEN<br>  RETURN TRUE<br><br>ELSE<br>  RETURN FALSE<br><br>END IF<br><br>END<br><\/span><\/pre>\n<p><span><br \/><\/span><\/p>\n<div><span>Analizziamo il codice. Inizialmente dichiariamo la stringa control nella quale verr\u00e0 salvato il risultato del terminale. Il comando <\/span><span>SHELL<\/span><span> permette di eseguire istruzioni come se si lavorasse nel terminale. In questo caso diciamo al comando SHELL di eseguire which e di accettare come parametro la stringa che viene passata ala funzione; dopodich\u00e8 aspetta che il terminale abbia finito con il comando <\/span><span>WAIT<\/span><span>.<\/span><\/div>\n<div><span>Ora, grazie ad un ciclo<\/span><span> IF<\/span><span> si controlla che la risposta del comando contenga il nome del programma. Questo \u00e8 possibile farlo poich\u00e8 se il programma \u00e8 installato, which restituir\u00e0 il path che contiene al suo interno il nome stesso del programma. Proprio grazie alla funzione <\/span><span>InStr<\/span><span> si analizza che nella stringa control sia presente il nome del programma. Se cos\u00ec fosse restituisce 1 altrimenti (<\/span><span>ELSE<\/span><span>) si ottiene 0.<\/p>\n<p>Per chi volesse ho implementato questa funzione nella classe sistema, di cui ho gi\u00e0 parlato in un altro post. Potete scaricare il pacchetto Gambas-classe-sistema nell&#8217;apposita box <\/span><span>DOWNLOAD<\/span><span> qui a lato.<\/span><\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Quando si creano programmi abbastanza complessi, alle volte pu\u00f2 essere utile ricorrere a programmi esterni per agevolare il lavoro di stesura del codice del nostro software per evitare di riscrivere funzioni che potrebbero essere svolte benissimo da programmi di terze parti. La cosa funziona di sicuro se il programma viene scritto ed eseguito sul nostro [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[63,23,2,4],"tags":[],"class_list":["post-228","post","type-post","status-publish","format-standard","hentry","category-classe","category-gambas","category-gnulinux","category-opencode"],"views":1073,"_links":{"self":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/comments?post=228"}],"version-history":[{"count":0,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/228\/revisions"}],"wp:attachment":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/media?parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/categories?post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/tags?post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}