Sviluppo e sistema - Tecnologie dell'informazione e della comunicazione Tecnologie dell'informazione e della comunicazione https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema 2024-04-29T07:40:07+00:00 Joomla! - Open Source Content Management Delphi: copy unicode HTML to clipboard 2011-06-27T17:25:36+00:00 2011-06-27T17:25:36+00:00 https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema/61-delphi-copy-unicode-html-to-clipboard Administrator ads@tmg.it <div class="feed-description"><h2>How to copy unicode HTML code to the clipboard in html format, so it can be pasted into Writer, Word etc.</h2> <p>Several articles show working code to copy an html structure to the clipboard registering as HTML Format (so it can be pasted in a word processor - rendered - instead of pasting the html code).</p> <p>This is my small contribution, just changing slightly the works you find in references, to also support fully unicode text, i.e. cyrillic copy and paste.</p> <pre><br />procedure TPHTML.CopyHTMLToClipBoardUnicode(const str, htmlStr: string);<br /><br />/// Attempting to get real unicode to work.<br />/// Альма матер, альма матер, легкая лаDдья.<br /><br />/// Works fine with Delphi 2010+ and accepts unicode text. But if you try to copy Unicode<br />/// characters which do not have an ASCII representation, they will not be copied.<br /><br />/// Riccardo Zorn www.tmg.it<br />///<br /><br />//The second parameter is optional and is put into the clipboard as CF_HTML.<br />//Function can be used standalone or in conjunction with the VCL clipboard so long as<br />//you use the USEVCLCLIPBOARD conditional define<br />//($define USEVCLCLIPBOARD}<br />//(and clipboard.open, clipboard.close).<br />//Code from http://www.lorriman.com<br />// http://it.w3support.net/index.php?db=so&amp;id=1114883<br /><br /><br /> // If you've ever tried sticking html into the clipboard using the usual CF_TEXT<br /> // format then you might have been disappointed to discover that wysiwyg html<br /> // editors paste your offering as if it were just text,<br /> // rather than recognising it as html. For that you need the CF_HTML format.<br /> // CF_HTML is entirely text format and uses the transformation format UTF-8.<br /> // It includes a description, a context, and within the context, the fragment.<br /> //<br /> // As you may know one can place multiple items of data onto the clipboard for<br /> // a single clipboard entry, which means that the same data can be pasted in a<br /> // variety of different formats in order to cope with target<br /> // applications of varying sophistocation.<br /> //<br /> // The following example shows how to stick CF_TEXT (and CF_HTML)<br /> // into the clipboard.<br /><br /> //The second parameter is optional and is put into the clipboard as CF_HTML.<br /> //Function can be used standalone or in conjunction with the VCL clipboard so long as<br /> //you use the USEVCLCLIPBOARD conditional define<br /> //($define USEVCLCLIPBOARD}<br /> //(and clipboard.open, clipboard.close).<br /> //Code from http://www.lorriman.com<br /><br /> function FormatHTMLClipboardHeader(HTMLText: string): string;<br /> const<br /> CrLf = #13#10;<br /> begin<br /> Result := 'Version:0.9' + CrLf;<br /> Result := Result + 'StartHTML:-1' + CrLf;<br /> Result := Result + 'EndHTML:-1' + CrLf;<br /><br /> Result := Result + 'StartFragment:^^^^^^' + CrLf;<br /> Result := Result + 'EndFragment:°°°°°°' + CrLf;<br /><br /> Result := StringReplace(Result, '^^^^^^', Format('%.6d', [Length(Result)*SizeOf(Char)]), []);<br /><br /> Result := Result + HTMLText + CrLf;<br /> Result := StringReplace(Result, '°°°°°°', Format('%.6d', [Length(Result)*SizeOf(Char)]), []);<br /> end;<br /><br /><br />var<br /> gMem: HGLOBAL;<br /> lp: PChar;<br /> Strings: array[0..1] of UTF8String;<br /> Formats: array[0..1] of UINT;<br /> i: Integer;<br />begin<br /> gMem := 0;<br /> {$IFNDEF USEVCLCLIPBOARD}<br /> Win32Check(OpenClipBoard(0));<br /> {$ENDIF}<br /> try<br /> //most descriptive first as per api docs<br /> Strings[0] := FormatHTMLClipboardHeader(htmlStr);<br /> Strings[1] := str;<br /> Formats[0] := RegisterClipboardFormat('HTML Format');<br /> Formats[1] := CF_UNICODETEXT;<br /> {$IFNDEF USEVCLCLIPBOARD}<br /> Win32Check(EmptyClipBoard);<br /> {$ENDIF}<br /> for i := 0 to High(Strings) do<br /> begin<br /> if Strings[i] = '' then Continue;<br /> //an extra "1" for the null terminator<br /> gMem := GlobalAlloc(GMEM_DDESHARE + GMEM_MOVEABLE, (Length(Strings[i])+1)*sizeOf(Char));<br /> {Succeeded, now read the stream contents into the memory the pointer points at}<br /> try<br /> Win32Check(gmem &lt;&gt; 0);<br /> lp := GlobalLock(gMem);<br /> Win32Check(lp &lt;&gt; nil);<br /> CopyMemory(lp, PChar(Strings[i]), (Length(Strings[i])+1)*sizeOf(Char));<br /> finally<br /> GlobalUnlock(gMem);<br /> end;<br /> Win32Check(gmem &lt;&gt; 0);<br /> SetClipboardData(Formats[i], gMem);<br /> Win32Check(gmem &lt;&gt; 0);<br /> gmem := 0;<br /> end;<br /> finally<br /> {$IFNDEF USEVCLCLIPBOARD}<br /> Win32Check(CloseClipBoard);<br /> {$ENDIF}<br /> end;<br />end;</pre> <p> </p> <h2>References:</h2> <p><a href="http://www.swissdelphicenter.ch/torry/showcode.php?id=1391" title="Torry, working version of copy to html in non-unicode Delphi">Torry, working version in non-unicode Delphis</a></p> <p>http://www.swissdelphicenter.ch/torry/showcode.php?id=1391</p> <p><a href="http://stackoverflow.com/questions/1114883/how-do-i-put-some-formatted-text-into-the-clipboard" title="StackOverflow, working version in D2009 with no unicode support">StackOverflow, working version in D2009 with no unicode support</a></p> <p>http://stackoverflow.com/questions/1114883/how-do-i-put-some-formatted-text-into-the-clipboard</p> <p><a href="http://msdn.microsoft.com/en-us/library/ms649016%28v=VS.85%29.aspx#_win32_Registering_a_Clipboard_Format" title="Using the clipboard (MSDN)">Using the clipboard (MSDN)</a></p> <p>http://msdn.microsoft.com/en-us/library/ms649016%28v=VS.85%29.aspx#_win32_Registering_a_Clipboard_Format</p> <p>CF_HTML</p> <p><a href="http://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx" title="CF_HTML">http://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx</a></p> <p>Delphi Unicode migration tips</p> <p><a href="http://edn.embarcadero.com/article/38693" title="Delphi Unicode migration tips">http://edn.embarcadero.com/article/38693</a></p> <p> </p> <p> </p></div> <div class="feed-description"><h2>How to copy unicode HTML code to the clipboard in html format, so it can be pasted into Writer, Word etc.</h2> <p>Several articles show working code to copy an html structure to the clipboard registering as HTML Format (so it can be pasted in a word processor - rendered - instead of pasting the html code).</p> <p>This is my small contribution, just changing slightly the works you find in references, to also support fully unicode text, i.e. cyrillic copy and paste.</p> <pre><br />procedure TPHTML.CopyHTMLToClipBoardUnicode(const str, htmlStr: string);<br /><br />/// Attempting to get real unicode to work.<br />/// Альма матер, альма матер, легкая лаDдья.<br /><br />/// Works fine with Delphi 2010+ and accepts unicode text. But if you try to copy Unicode<br />/// characters which do not have an ASCII representation, they will not be copied.<br /><br />/// Riccardo Zorn www.tmg.it<br />///<br /><br />//The second parameter is optional and is put into the clipboard as CF_HTML.<br />//Function can be used standalone or in conjunction with the VCL clipboard so long as<br />//you use the USEVCLCLIPBOARD conditional define<br />//($define USEVCLCLIPBOARD}<br />//(and clipboard.open, clipboard.close).<br />//Code from http://www.lorriman.com<br />// http://it.w3support.net/index.php?db=so&amp;id=1114883<br /><br /><br /> // If you've ever tried sticking html into the clipboard using the usual CF_TEXT<br /> // format then you might have been disappointed to discover that wysiwyg html<br /> // editors paste your offering as if it were just text,<br /> // rather than recognising it as html. For that you need the CF_HTML format.<br /> // CF_HTML is entirely text format and uses the transformation format UTF-8.<br /> // It includes a description, a context, and within the context, the fragment.<br /> //<br /> // As you may know one can place multiple items of data onto the clipboard for<br /> // a single clipboard entry, which means that the same data can be pasted in a<br /> // variety of different formats in order to cope with target<br /> // applications of varying sophistocation.<br /> //<br /> // The following example shows how to stick CF_TEXT (and CF_HTML)<br /> // into the clipboard.<br /><br /> //The second parameter is optional and is put into the clipboard as CF_HTML.<br /> //Function can be used standalone or in conjunction with the VCL clipboard so long as<br /> //you use the USEVCLCLIPBOARD conditional define<br /> //($define USEVCLCLIPBOARD}<br /> //(and clipboard.open, clipboard.close).<br /> //Code from http://www.lorriman.com<br /><br /> function FormatHTMLClipboardHeader(HTMLText: string): string;<br /> const<br /> CrLf = #13#10;<br /> begin<br /> Result := 'Version:0.9' + CrLf;<br /> Result := Result + 'StartHTML:-1' + CrLf;<br /> Result := Result + 'EndHTML:-1' + CrLf;<br /><br /> Result := Result + 'StartFragment:^^^^^^' + CrLf;<br /> Result := Result + 'EndFragment:°°°°°°' + CrLf;<br /><br /> Result := StringReplace(Result, '^^^^^^', Format('%.6d', [Length(Result)*SizeOf(Char)]), []);<br /><br /> Result := Result + HTMLText + CrLf;<br /> Result := StringReplace(Result, '°°°°°°', Format('%.6d', [Length(Result)*SizeOf(Char)]), []);<br /> end;<br /><br /><br />var<br /> gMem: HGLOBAL;<br /> lp: PChar;<br /> Strings: array[0..1] of UTF8String;<br /> Formats: array[0..1] of UINT;<br /> i: Integer;<br />begin<br /> gMem := 0;<br /> {$IFNDEF USEVCLCLIPBOARD}<br /> Win32Check(OpenClipBoard(0));<br /> {$ENDIF}<br /> try<br /> //most descriptive first as per api docs<br /> Strings[0] := FormatHTMLClipboardHeader(htmlStr);<br /> Strings[1] := str;<br /> Formats[0] := RegisterClipboardFormat('HTML Format');<br /> Formats[1] := CF_UNICODETEXT;<br /> {$IFNDEF USEVCLCLIPBOARD}<br /> Win32Check(EmptyClipBoard);<br /> {$ENDIF}<br /> for i := 0 to High(Strings) do<br /> begin<br /> if Strings[i] = '' then Continue;<br /> //an extra "1" for the null terminator<br /> gMem := GlobalAlloc(GMEM_DDESHARE + GMEM_MOVEABLE, (Length(Strings[i])+1)*sizeOf(Char));<br /> {Succeeded, now read the stream contents into the memory the pointer points at}<br /> try<br /> Win32Check(gmem &lt;&gt; 0);<br /> lp := GlobalLock(gMem);<br /> Win32Check(lp &lt;&gt; nil);<br /> CopyMemory(lp, PChar(Strings[i]), (Length(Strings[i])+1)*sizeOf(Char));<br /> finally<br /> GlobalUnlock(gMem);<br /> end;<br /> Win32Check(gmem &lt;&gt; 0);<br /> SetClipboardData(Formats[i], gMem);<br /> Win32Check(gmem &lt;&gt; 0);<br /> gmem := 0;<br /> end;<br /> finally<br /> {$IFNDEF USEVCLCLIPBOARD}<br /> Win32Check(CloseClipBoard);<br /> {$ENDIF}<br /> end;<br />end;</pre> <p> </p> <h2>References:</h2> <p><a href="http://www.swissdelphicenter.ch/torry/showcode.php?id=1391" title="Torry, working version of copy to html in non-unicode Delphi">Torry, working version in non-unicode Delphis</a></p> <p>http://www.swissdelphicenter.ch/torry/showcode.php?id=1391</p> <p><a href="http://stackoverflow.com/questions/1114883/how-do-i-put-some-formatted-text-into-the-clipboard" title="StackOverflow, working version in D2009 with no unicode support">StackOverflow, working version in D2009 with no unicode support</a></p> <p>http://stackoverflow.com/questions/1114883/how-do-i-put-some-formatted-text-into-the-clipboard</p> <p><a href="http://msdn.microsoft.com/en-us/library/ms649016%28v=VS.85%29.aspx#_win32_Registering_a_Clipboard_Format" title="Using the clipboard (MSDN)">Using the clipboard (MSDN)</a></p> <p>http://msdn.microsoft.com/en-us/library/ms649016%28v=VS.85%29.aspx#_win32_Registering_a_Clipboard_Format</p> <p>CF_HTML</p> <p><a href="http://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx" title="CF_HTML">http://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx</a></p> <p>Delphi Unicode migration tips</p> <p><a href="http://edn.embarcadero.com/article/38693" title="Delphi Unicode migration tips">http://edn.embarcadero.com/article/38693</a></p> <p> </p> <p> </p></div> Cambiare il disco del macbook pro unibody 2011-04-20T06:07:26+00:00 2011-04-20T06:07:26+00:00 https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema/56-cambiare-il-disco-del-macbook-pro-unibody Administrator ads@tmg.it <div class="feed-description"><p>In questa breve guida elenco i passi necessari per cambiare il disco rigido di un macbook Pro unibody, il modello distribuito dal giugno 2009.</p> <p>Materiale necessario: un hard disk (vedi sotto punto 1), un cacciavite philips 00 (croce super piccolo); uno torx T-6. Entrambi sono minuscoli, non usate altro, specialmente per quello a croce altrimenti finirete per rovinare le viti.  Caldamente consigliato un contenitore per le viti.</p> <p>Caveat: Aprire un macbook pro invalida la garanzia</p> <p>Difficoltà: Medio-Bassa. Se avete cambiato un disco ad un portatile qualunque non avrete difficoltà con questo; se non l'avete mai fatto, magari aiutatevi con una guida video o foto cercate su youtube.</p> <p>Pazienza: Medio alta. La procedura può richiedere un'ora oltre il tempo necessario a trasferire i dati; è richiesta precisione</p> <p>1. La prima cosa da fare è scegliere un disco compatibile, grossomodo qualunque modello SATA da 9mm di spessore (anche detti metà spessore) va bene, potete consultare questo sito per una lista di dischi sicuramente compatibili dal sito <a href="http://eshop.macsales.com/MyOWC/" title="Scegli il tuo disco">myOWC</a></p> <p>2. Assicuratevi di poter connettere il nuovo disco al computer, la soluzione più economica, da 10 a 15 euro, è un cassettino USB 2.5" SATA nel quale alloggerete il vostro nuovo disco.</p> <p>3. Ora inserite il disco di installazione Mac OSX 10.x fornito con il portatile e riavviate tenendo premuta la lettera "C" sulla tastiera.</p> <p>4. Al boot verrà avviato il programma di installazione di Mac OSX; dopo aver scelto la lingua, dal menù Utility scegliete Disk Utility e formattate il nuovo disco, avendo cura di specificare un nome distintivo: quindi premete Erase/Cancella; al termine della formattazione uscite da Disk Utility.</p> <p>5. Procedete ad installare Mac OSX dal dvd sul nuovo disco (quello connesso via USB e appena formattato); dopo aver finito l'installazione seguite le istruzioni per importare i dati della precedente installazione.</p> <p>6. A questo punto spegnete il computer e sostituite il disco. Basta</p> <ul> <li>svitare le 10 viti dietro; quelle in corrispondenza della griglia di ventilazione sul retro sono più lunghe; le altre sono lievemente inclinate, quindi inclinate il cacciavite per non danneggiarle.</li> <li>sollevare delicatamente il pannello di alluminio; questo ha tre ritenzioni, due meccaniche in plastica ed una adesiva, sollevandolo con dolcezza si libereranno rapidamente</li> <li>smontate il braccetto nero antiurto del disco, rimuovete delicatamente il connettore del vecchio disco</li> <li>spostate i supporti laterali del disco con il cacciavite torx sul nuovo disco</li> <li>a questo punto prendete un aspirapolvere e date una ripulita, sicuramente le ventole ne saranno felici. Non fate toccare la bocchetta dell'aspirapolvere, una botta minima e si rovinano subito le ventole. Fatele girare un po'. Se avete una pistola ad aria compressa, uscite in terrazza e abusatene</li> <li>rimontate il disco, fissate il braccetto, riassemblate il fondo di alluminio</li> </ul> <p>7. Accendete il computer. Per prima cosa fate un aggiornamento del sistema operativo.</p> <p>8. Montate il vecchio disco nel cassettino USB e - quando sarete sicuri che i vostri dati sono tutti al loro posto - usatelo come disco di trasporto; oppure conservatelo, contiene un backup completo del vostro sistema che può sempre tornare utile.</p> <p>Nota bene: secondo la licenza Apple cambiare il disco invalida la garanzia.</p> <p>E la memoria?</p> <p>Già che ci siete, prendete pure un po' di RAM... non fa mai male. Una volta aperto il coperchio cambiare la ram richiede solo un istante.</p></div> <div class="feed-description"><p>In questa breve guida elenco i passi necessari per cambiare il disco rigido di un macbook Pro unibody, il modello distribuito dal giugno 2009.</p> <p>Materiale necessario: un hard disk (vedi sotto punto 1), un cacciavite philips 00 (croce super piccolo); uno torx T-6. Entrambi sono minuscoli, non usate altro, specialmente per quello a croce altrimenti finirete per rovinare le viti.  Caldamente consigliato un contenitore per le viti.</p> <p>Caveat: Aprire un macbook pro invalida la garanzia</p> <p>Difficoltà: Medio-Bassa. Se avete cambiato un disco ad un portatile qualunque non avrete difficoltà con questo; se non l'avete mai fatto, magari aiutatevi con una guida video o foto cercate su youtube.</p> <p>Pazienza: Medio alta. La procedura può richiedere un'ora oltre il tempo necessario a trasferire i dati; è richiesta precisione</p> <p>1. La prima cosa da fare è scegliere un disco compatibile, grossomodo qualunque modello SATA da 9mm di spessore (anche detti metà spessore) va bene, potete consultare questo sito per una lista di dischi sicuramente compatibili dal sito <a href="http://eshop.macsales.com/MyOWC/" title="Scegli il tuo disco">myOWC</a></p> <p>2. Assicuratevi di poter connettere il nuovo disco al computer, la soluzione più economica, da 10 a 15 euro, è un cassettino USB 2.5" SATA nel quale alloggerete il vostro nuovo disco.</p> <p>3. Ora inserite il disco di installazione Mac OSX 10.x fornito con il portatile e riavviate tenendo premuta la lettera "C" sulla tastiera.</p> <p>4. Al boot verrà avviato il programma di installazione di Mac OSX; dopo aver scelto la lingua, dal menù Utility scegliete Disk Utility e formattate il nuovo disco, avendo cura di specificare un nome distintivo: quindi premete Erase/Cancella; al termine della formattazione uscite da Disk Utility.</p> <p>5. Procedete ad installare Mac OSX dal dvd sul nuovo disco (quello connesso via USB e appena formattato); dopo aver finito l'installazione seguite le istruzioni per importare i dati della precedente installazione.</p> <p>6. A questo punto spegnete il computer e sostituite il disco. Basta</p> <ul> <li>svitare le 10 viti dietro; quelle in corrispondenza della griglia di ventilazione sul retro sono più lunghe; le altre sono lievemente inclinate, quindi inclinate il cacciavite per non danneggiarle.</li> <li>sollevare delicatamente il pannello di alluminio; questo ha tre ritenzioni, due meccaniche in plastica ed una adesiva, sollevandolo con dolcezza si libereranno rapidamente</li> <li>smontate il braccetto nero antiurto del disco, rimuovete delicatamente il connettore del vecchio disco</li> <li>spostate i supporti laterali del disco con il cacciavite torx sul nuovo disco</li> <li>a questo punto prendete un aspirapolvere e date una ripulita, sicuramente le ventole ne saranno felici. Non fate toccare la bocchetta dell'aspirapolvere, una botta minima e si rovinano subito le ventole. Fatele girare un po'. Se avete una pistola ad aria compressa, uscite in terrazza e abusatene</li> <li>rimontate il disco, fissate il braccetto, riassemblate il fondo di alluminio</li> </ul> <p>7. Accendete il computer. Per prima cosa fate un aggiornamento del sistema operativo.</p> <p>8. Montate il vecchio disco nel cassettino USB e - quando sarete sicuri che i vostri dati sono tutti al loro posto - usatelo come disco di trasporto; oppure conservatelo, contiene un backup completo del vostro sistema che può sempre tornare utile.</p> <p>Nota bene: secondo la licenza Apple cambiare il disco invalida la garanzia.</p> <p>E la memoria?</p> <p>Già che ci siete, prendete pure un po' di RAM... non fa mai male. Una volta aperto il coperchio cambiare la ram richiede solo un istante.</p></div> Un webserver sul mio mac per sviluppare PHP 2011-02-25T16:00:14+00:00 2011-02-25T16:00:14+00:00 https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema/55-un-webserver-sul-mio-mac-per-sviluppare-php Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>Obiettivo: installare Joomla, phpMyAdmin, mySQL, eclipse versione PHP su mac OSX 10.6 con la minima configurazione possibile.</p> <p>Insieme a mySQL è utile uno strumento di gestione, ho indicato sia come installare MySQL Workbench che phpMyAdmin, si può usare l'uno o l'altro (o entrambi)</p> <h1>MySQL</h1> <h2>Installazione</h2> <p>Vai su http://www.mysql.com/downloads/mysql/ scarica la versione Community Edition (quella gratuita) <strong>Mac OS X ver. 10.6 (x86, 64-bit), DMG Archive. </strong>/</p> <p>Apri il DMG, all'interno trovi il pacchetto di installazione e il pannello per le preferenze, installa entrambi.</p> <p>Ora bisogna configurare mysql, con il file /etc/my.cnf</p> <p>Un buon inizio è nella distribuzione di mysql, /usr/local/mysql/support-files/my-small.cnf</p> <p>Quindi copia quel file su /etc/my.cnf, poi modificalo: l'unica modifica necessaria è se vuoi usare innodb (come me), cerca la apposita sezione e rimuovi i commenti come indicato:</p> <pre># Uncomment the following if you are using InnoDB tables<br />innodb_data_home_dir = /usr/local/mysql/data<br />innodb_data_file_path = ibdata1:10M:autoextend<br />innodb_log_group_home_dir = /usr/local/mysql/data<br /># You can set .._buffer_pool_size up to 50 - 80 %<br /># of RAM but beware of setting memory usage too high<br />innodb_buffer_pool_size = 16M<br />innodb_additional_mem_pool_size = 2M<br /># Set .._log_file_size to 25 % of buffer pool size<br />innodb_log_file_size = 5M<br />innodb_log_buffer_size = 8M<br />innodb_flush_log_at_trx_commit = 1<br />innodb_lock_wait_timeout = 50</pre> <p>I percorsi sono già inseriti quindi non ci vuole molto. Salva.</p> <p>Dalle preferenze di sistema apri Altro -&gt; mySQL e avvialo.</p> <h2>Workbench</h2> <p>Creare una password, un database e caricare dati</p> <p>Ora scarica http://dev.mysql.com/downloads/workbench/5.2.html MySQL Workbench, ed eseguilo.</p> <p>Nel box di destra "Server Administration" premete New Server Instance, una wizard vi guiderà a configurare l'istanza. Connettetevi a localhost oppure 127.0.0.1</p> <p>L'utente root di default non ha password, ma una volta entrati sulla connessione premete Server Administration, e dentro accounts create una password.</p> <p>Potete quindi procedere a caricare i dati, ma voglio installare anche phpMyAdmin per questo, quindi procediamo con</p> <h1>phpMyAdmin</h1> <p>Dal sito http://www.phpmyadmin.net/home_page/downloads.php scaricate la versione "all languages" in qualunque formato compresso; se avete "the Unarchiver" oppure "PathFinder" non sarà difficile decomprimerli, altrimenti prendetevi un tar.gz o uno zip che li legge anche il Finder.</p> <p>Esplodetelo nella cartella /Library/WebServer/Documents/phpMyAdmin quindi modificate il file di configurazione /Library/WebServer/Documents/phpMyAdmin/config.inc.php</p> <p>Questi sono i parametri più semplici; occhio a mettere l'host numerico altrimenti usando localhost c'è un'alta probabilità di ricevere l'errore 2002: <code>#2002 - The server is not responding (or the local MySQL server's socket is not correctly configured) </code></p> <pre>$cfg['Servers'][$i]['auth_type'] = 'http';<br />/* Server parameters */<br />$cfg['Servers'][$i]['host'] = '127.0.0.1';<br />$cfg['Servers'][$i]['connect_type'] = 'tcp';<br />$cfg['Servers'][$i]['compress'] = false;</pre> <pre>$cfg['Servers'][$i]['extension'] = 'mysql';</pre> <pre>// Quest'ultimo parametro è necessario se non hai usato workbench per assegnare una password all'utente root:</pre> <pre>$cfg['Servers'][$i]['AllowNoPassword'] = true;</pre> <p>Ora prova a connetterti:</p> <p>http://localhost/phpMyAdmin e dopo aver inserito il login root con la password creata in workbench dovresti vedere phpMyAdmin</p> <p>Crea un database ed un utente per Joomla</p> <h1>Joomla</h1> <p>A questo punto siete pronti per installare Joomla; se desiderate installarlo nella root (ovvero in modo che risponda a http://localhost) copiate i file di installazione su /Library/WebServer/Documents e avviate l'installazione da http://localhost altrimenti metteteli in una sottocartella e avviate l'installazione da http://localhost/sottocartella</p> <h1>Eclipse</h1> <p>Ora però se vogliamo sviluppare qualcosa sarà il caso di usare uno strumento più evoluto di TextEdit o TextWrangler, diciamo qualcosa come eclipse farebbe al caso nostro.</p> <p>http://www.zend.com/en/community/pdt</p> <p>Scarica, esplodi ed esegui... non serve far altro.</p> <h1>SVN</h1> <p>Ho parlato di sviluppo? Beh come minimo mi servirà un subversion server altrimenti rischio di diventare matto.  Possiamo usare SVN da eclipse quindi non dobbiamo preoccuparci del fatto che su mac osx non esiste un client free bello come tortoise per windows, ma http://www.syncrosvnclient.com/ val bene una menzione (a pagamento).</p> <p>Per installare il server, vi rimando all'uso di fink (http://www.devdaily.com/blog/post/mac-os-x/installing-subversion-svn-server-on-mac-os-x/ )</p> <p> </p></div> <div class="feed-description"><p>Obiettivo: installare Joomla, phpMyAdmin, mySQL, eclipse versione PHP su mac OSX 10.6 con la minima configurazione possibile.</p> <p>Insieme a mySQL è utile uno strumento di gestione, ho indicato sia come installare MySQL Workbench che phpMyAdmin, si può usare l'uno o l'altro (o entrambi)</p> <h1>MySQL</h1> <h2>Installazione</h2> <p>Vai su http://www.mysql.com/downloads/mysql/ scarica la versione Community Edition (quella gratuita) <strong>Mac OS X ver. 10.6 (x86, 64-bit), DMG Archive. </strong>/</p> <p>Apri il DMG, all'interno trovi il pacchetto di installazione e il pannello per le preferenze, installa entrambi.</p> <p>Ora bisogna configurare mysql, con il file /etc/my.cnf</p> <p>Un buon inizio è nella distribuzione di mysql, /usr/local/mysql/support-files/my-small.cnf</p> <p>Quindi copia quel file su /etc/my.cnf, poi modificalo: l'unica modifica necessaria è se vuoi usare innodb (come me), cerca la apposita sezione e rimuovi i commenti come indicato:</p> <pre># Uncomment the following if you are using InnoDB tables<br />innodb_data_home_dir = /usr/local/mysql/data<br />innodb_data_file_path = ibdata1:10M:autoextend<br />innodb_log_group_home_dir = /usr/local/mysql/data<br /># You can set .._buffer_pool_size up to 50 - 80 %<br /># of RAM but beware of setting memory usage too high<br />innodb_buffer_pool_size = 16M<br />innodb_additional_mem_pool_size = 2M<br /># Set .._log_file_size to 25 % of buffer pool size<br />innodb_log_file_size = 5M<br />innodb_log_buffer_size = 8M<br />innodb_flush_log_at_trx_commit = 1<br />innodb_lock_wait_timeout = 50</pre> <p>I percorsi sono già inseriti quindi non ci vuole molto. Salva.</p> <p>Dalle preferenze di sistema apri Altro -&gt; mySQL e avvialo.</p> <h2>Workbench</h2> <p>Creare una password, un database e caricare dati</p> <p>Ora scarica http://dev.mysql.com/downloads/workbench/5.2.html MySQL Workbench, ed eseguilo.</p> <p>Nel box di destra "Server Administration" premete New Server Instance, una wizard vi guiderà a configurare l'istanza. Connettetevi a localhost oppure 127.0.0.1</p> <p>L'utente root di default non ha password, ma una volta entrati sulla connessione premete Server Administration, e dentro accounts create una password.</p> <p>Potete quindi procedere a caricare i dati, ma voglio installare anche phpMyAdmin per questo, quindi procediamo con</p> <h1>phpMyAdmin</h1> <p>Dal sito http://www.phpmyadmin.net/home_page/downloads.php scaricate la versione "all languages" in qualunque formato compresso; se avete "the Unarchiver" oppure "PathFinder" non sarà difficile decomprimerli, altrimenti prendetevi un tar.gz o uno zip che li legge anche il Finder.</p> <p>Esplodetelo nella cartella /Library/WebServer/Documents/phpMyAdmin quindi modificate il file di configurazione /Library/WebServer/Documents/phpMyAdmin/config.inc.php</p> <p>Questi sono i parametri più semplici; occhio a mettere l'host numerico altrimenti usando localhost c'è un'alta probabilità di ricevere l'errore 2002: <code>#2002 - The server is not responding (or the local MySQL server's socket is not correctly configured) </code></p> <pre>$cfg['Servers'][$i]['auth_type'] = 'http';<br />/* Server parameters */<br />$cfg['Servers'][$i]['host'] = '127.0.0.1';<br />$cfg['Servers'][$i]['connect_type'] = 'tcp';<br />$cfg['Servers'][$i]['compress'] = false;</pre> <pre>$cfg['Servers'][$i]['extension'] = 'mysql';</pre> <pre>// Quest'ultimo parametro è necessario se non hai usato workbench per assegnare una password all'utente root:</pre> <pre>$cfg['Servers'][$i]['AllowNoPassword'] = true;</pre> <p>Ora prova a connetterti:</p> <p>http://localhost/phpMyAdmin e dopo aver inserito il login root con la password creata in workbench dovresti vedere phpMyAdmin</p> <p>Crea un database ed un utente per Joomla</p> <h1>Joomla</h1> <p>A questo punto siete pronti per installare Joomla; se desiderate installarlo nella root (ovvero in modo che risponda a http://localhost) copiate i file di installazione su /Library/WebServer/Documents e avviate l'installazione da http://localhost altrimenti metteteli in una sottocartella e avviate l'installazione da http://localhost/sottocartella</p> <h1>Eclipse</h1> <p>Ora però se vogliamo sviluppare qualcosa sarà il caso di usare uno strumento più evoluto di TextEdit o TextWrangler, diciamo qualcosa come eclipse farebbe al caso nostro.</p> <p>http://www.zend.com/en/community/pdt</p> <p>Scarica, esplodi ed esegui... non serve far altro.</p> <h1>SVN</h1> <p>Ho parlato di sviluppo? Beh come minimo mi servirà un subversion server altrimenti rischio di diventare matto.  Possiamo usare SVN da eclipse quindi non dobbiamo preoccuparci del fatto che su mac osx non esiste un client free bello come tortoise per windows, ma http://www.syncrosvnclient.com/ val bene una menzione (a pagamento).</p> <p>Per installare il server, vi rimando all'uso di fink (http://www.devdaily.com/blog/post/mac-os-x/installing-subversion-svn-server-on-mac-os-x/ )</p> <p> </p></div> comandare DvdPlayer della Ellion 350H - una panoramica completa 2010-10-17T10:54:21+00:00 2010-10-17T10:54:21+00:00 https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema/54-comandare-dvdplayer-della-ellion-350h-una-panoramica-completa Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>I media player Ellion 351H, 350H e affini (inclusi medley, EMTEC N200, Emtec S800, Emtec HMR-351H, O2Media HMR-351N, Markus 750, Medley 2+, Medley 3, O2Media) offrono funzionalità di televisione digitale, player multimediale, con possibilità di connettere dischi SATA, USB e via rete. Il programma DvdPlayer della Realtek (closed source) provvede al funzionamento delle unità.</p> <p>Obiettivo: Estendere il funzionamento della Ellion permettendo:</p> <ol> <li>di emulare il telecomando via telnet o meglio via web</li> <li>di avviarla senza il menù amministrativo aperto (ovvero all'accensione visualizza l'ultimo canale DV visualizzato)</li> <li>di controllare l'unità via web: sostituendo il file browser con uno web-based con funzioni di ricerca.</li> </ol> <h2>1. Telecomando Web per il player Ellion HMR 351H e affini.</h2> <p>Questa parte riguarda una personalizzazione del <a href="http://adicon.lahost.org/2010/01/07/emtec-n200-web-remote-command/" target="_blank" title="EMTEC N200 Web Remote Command">Emtec N200 Web Remote Control</a>, un telecomando via web, modificato per essere compatibile con il firmware della Ellion, e aggiungendo alcuni tasti non previsti.</p> <p>Inoltre ho aggiunto una funzione "info" con i credits e con una funzione per testare l'invio di comandi (ancora manca il comando per il tasto NET e altri tasti, da qui si possono inviare i comandi).</p> <p>Nella distribuzione è inclusa anche una sottocartella con alcuni script amministrativi che mi sono stati utili per capire come funziona DvdPlayer.</p> <h2>1.1 Distribuzione Ellion HMR 351H</h2> <p>il file /usr/local/bin/DvdPlayer comanda il funzionamento dell'unità.</p> <p>Il programma <strong>stopall</strong> permette di fermare tutte le istanze del programma DvdPlayer.</p> <p>Avviando DvdPlayer da console si possono inviare diversi comandi: riporto un elenco quasi completo preso dal post di <a href="http://ziogeek.com/forum/medley-2-plus-unofficial-generale/medley-2-scansione-canali-dvb-t-vt3199.html" target="_blank" title="Codici STDIN DvdPlayer"><strong>nicorac su ziogeek</strong></a>:</p> <p> </p> <pre> <br />-------------------------------------------------<br />a - audio button<br />b - takes you into the recording setup screen<br />c - delete schedule when in recording, otherwise doesn't appear to do anything<br />f - reverse play &lt;&lt;<br />j - reverse zoom (starts at max zoom and goes back to 1)<br />l - slow play reverse<br />m - mute on/off<br />n - skip to next title (not chapter)<br />o - Shut down quickly<br />p - skip to prior title (not chapter)<br />q - go back 10 SECONDS<br />r - start recording / switch to av<br />s - subtitle toggle<br />v - volume -<br />z - normal zoom<br /><br />A - left<br />B - 30 Second Skip<br />C - Command Line interpreter, engineering mode, see below<br />D - right<br />E - Delete<br />F - Fast forward &gt;&gt;<br />G - Asks for GCode. Not sure what the GCode is. Tried a VCR+ code given the context,<br /> but the code I tried only crashed the player.<br />H - report some kind of status<br />L - slow play forward<br />M - Menu<br />N - Next chapter<br />O - shut down normally<br />P - Prior chapter<br />Q - Stop<br />S - Play<br />T- AV input screen<br />V - volume +<br />W - up<br />X - down<br />Z - Step / pause<br /><br />- - goto<br />= - repeat a/b<br />+ - repeat button<br /><br /># - go to USB screen<br />$ - go to REC directory<br />&amp; - graphical file copy, looks nice.<br />Much better than the cut/copy/paste concept you can do from the remote.<br />( - start performance logging<br />) - stop performance logging<br />~ - memory allocation status<br />0-9 - same as entering 0-9. Jumps to title. I did not know you could jump to a <br /> specific title that way on this player, so something new.<br /><br />[ - source button<br />] - go to ScreenPlay Pro root drive<br />{ - home button<br />, - return button<br />/ - go to setup menu<br />\ - switch tv system<br />: - switch tv system (not sure how it is different from \)<br />@ - DV (videocamera control)<br /><br />ESC - Go to setup menu<br /><br />In engineering mode, you can type HELP and get this:<br />(Switch to engineering mode with command C, see above )<br /><br />Engineering Mode Command List:<br />port: read or write value to specified address<br />setdebug: set audio/video debug flag<br />setbri : set Video In Brightness value (00~ff)<br />setcont : set Video In Contrast value (00~ff)<br />setsatu : set Video In Saturation value (00~ff)<br />sethue : set Video In Hue value (00~ff)<br />setscal : set the coefficients of VIN Scaling (0x10<br />00~0xFFFF)<br />setcolorm<br />: set VO hardware's Color Adjustment transformation matrix<br />copyfree: enable copy-free<br />netperf : Enable network performance meter. Use on or o<br />ff to tern on/off this feature<br />netperf nodecode, means streaming only withou<br />t decode.<br />setyc: set YC separation parameters [6 parameters]<br />| save: save setting<br />| load: load setting<br />| default: use factory default setting<br />| show: show current setting<br />shell: Unix Shell to execute unix command<br />kill: kill the program immediately (to generate coredump)<br />quit: quit from command line interpreter<br />-------------------------------------------------</pre> <h2>1.2 Telecomando IR</h2> <p>Questi comandi sono ben diversi dai codici inviati dal telecomando; la periferica che riceve i codici dal telecomando è /dev/venus_irrp e si può leggerla con</p> <pre>cat /dev/venus_irrp</pre> <p>oppure con un batch più completo:</p> <pre>#! /bin/sh<br />echo ""<br />echo "Remote Control Dump for Ellion HMR 350, 351H, plus N200, Medley etc"<br />echo " Below you can see all remote control codes as the keys are pressed"<br />echo " i.e. this is the sample output for the \"mute\" key:"<br />echo ""<br />echo " Processo:"<br />echo " 0000000 f708 a55a 000a "<br />echo " 0000005"<br />echo ""<br />echo ""<br />echo " You can use ./telecomando_chrhex.cgi to test parameters as you read them<br />echo " i.e."<br />echo ""<br />echo " ./telecomando_chrhex.cgi f7 08 a5 5a 00 0a \&gt;\&gt; /tmp/command_sender.<br />echo ""<br />echo " for the example above, muting the audio."<br />echo ""<br />echo "------------------- Remote control: hex dump --------------------"<br />irfile=/tmp/irfile<br />cat /dev/venus_irrp &gt; $irfile &amp;<br /><br />bincode=nocode<br />while [ -f $irfile ] <br />do <br /> bincode=$(tail -c 4 $irfile) <br /> <br /> if [ -n "${bincode}" ] <br /> then <br /> if [ "${bincode}" != "${oldbincode}" ] <br /> then <br /> oldbincode=$bincode <br /> echo Processo: <br /> echo $bincode | hexdump <br /> fi <br /> fi <br /> usleep 10 <br />done <br />exit 0<br /></pre> <p>Basta ora premere un tasto sul telecomando per vedere il codice inviato.</p> <p>Output di esempio:</p> <p> </p> <pre>-----------------------------------------------------------------------------<br />Remote Control Dump for Ellion HMR 350, 351H, plus N200, Medley etc<br /> Below you can see all remote control codes as the keys are pressed<br /> i.e. this is the sample output for the "mute" key:<br /> Processo:<br /> 0000000 f708 a55a 000a <br /> 0000005<br /><br /> You can use ./telecomando_chrhex.cgi to test parameters as you read them below:<br /> i.e.<br /> ./telecomando_chrhex.cgi f7 08 a5 5a 00 0a \&gt;\&gt; /tmp/command_sender.txt<br /> for the example above, muting the audio.<br />------------------- Remote control: hex dump --------------------</pre> <h2>1.3 Il telecomando di adicon, esteso per la Ellion</h2> <p><a href="http://adicon.lahost.org/2010/01/07/emtec-n200-web-remote-command/" target="_blank">Adicon</a> ha scritto un telecomando per il modello N200, utilizzando lo STDIN di DvdPlayer.</p> <p>Per farlo basta avviare DvdPlayer reindirizzando lo STDIN da un file arbitrario /tmp/command_sender.txt:</p> <pre><pre>tail -f /tmp/command_sender.txt DvdPlayer</pre> <br /><br /></pre> <p>quindi sarà sufficiente inviare i comandi al file /tmp/command_sender.txt , per esempio:</p> <pre>echo "m" &gt; /tmp/command_sender.txt </pre> <p>per mettere in mute.</p> <h3>1.3.1 Avvio automatico</h3> <p>E' necessario modificare lo script di avvio della console perché ad ogni riavvio il programma DvdPlayer parta con l'input reindirizzato:</p> <p>/usr/local/etc/rcS</p> <p>Aggiungere il testo in rosso:</p> <pre>if [ -f $DEFAULT_AP_DIR/DvdPlayer ] &amp;&amp; [ -x $DEFAULT_AP_DIR/DvdPlayer ]; then<br />cd $DEFAULT_AP_DIR<br /><strong style="color: red;">rm /tmp/command_sender.txt<br />touch /tmp/command_sender.txt</strong><br />if [ -f $DEFAULT_AP_DIR/RootApp ] &amp;&amp; [ -x $DEFAULT_AP_DIR/RootApp ]; then<br /> echo Running dvdplayer with RootApp<br /> <strong style="color: red;">tail -f /tmp/command_sender.txt | </strong>./RootApp DvdPlayer -s RTC &amp;<br />else<br /> echo Running dvdplayer<br /> <strong style="color: red;">tail -f /tmp/command_sender.txt | </strong>./DvdPlayer -s RTC &amp;<br />fi<br />else<br /> /usr/local/etc/dvdplayer/script/run_tail<br />fi</pre> <h3>1.3.2 Il telecomando</h3> <p>Ho modificato di poco lo script del telecomando per includere alcuni tasti che non sono presenti sul telecomando.</p> <p>Purtroppo sia dalla lista sopra che dal telecomando della N200 manca il codice per LAN, che non sono riuscito a trovare; purtroppo i codici di scansione non seguono alcun ordine logico, usano i caratteri da 32 a 127 ma nessuno di questi mi ha dato la funzionalità LAN/NET.</p> <p>Il dispositivo Ellion dispone di un server web il cui contenuto di fabbrica è sostanzialmente inutile; in queste condizioni si può installare nella root; altrimenti creare una cartella.</p> <p>Io ho <a href="http://ziogeek.com/forum/sviluppo-software-open-source/hdmedia-services-installazione-win-mac-linux-vt1701.html" target="_blank">HDMediaServices</a> installato per la gestione dei servizi SAMBA e FTP; diversamente dovrete modificare la installazione in /tmp_orig.</p> <p>Per installarlo nella cartella /remote ecco i comandi:</p> <p>(presuppongono che l'installazione d</p> <p>Per installarlo, digitare:</p> <pre>cd /tmp<br />echo nameserver 208.67.222.222 &gt; /etc/resolv.conf<br />wget http://www.tmg.it/files/remote/install.sh<br />chmod a+x install.sh<br />./install.sh<br /></pre> <p>L'installazione effettua poi un reboot automaticamente.</p> <p>Ad ogni avvio (/usr/local/etc/rcS) copia la cartella /tmp/hdd/volumes/HDD1/Applications/Web su /var/www</p> <p>(L'installazione originale modificava /tmp_orig/ ma sulla ellion non si monta il filesystem di root facilmente in rw).</p> <p>Ora è possibile accedere al telecomando dall'indirizzo http://ip_ellion/remote</p> <p> </p> <h2>2. Avvio automatico su TV</h2> <p>Non so per quale motivo la Ellion parta sempre con il menù amministrativo aperto.</p> <p>Basta modificare nel file <strong>/usr/local/etc/rcS</strong> la stringa di avvio</p> <pre>DvdPlayer</pre> <p>e modificarla in</p> <pre>DvdPlayer -s RTC<br /></pre> <h2>3.Controllo completo da web</h2> <p>I limiti del telecomando sono la necessità di guardare il televisore per capire in che menù ci troviamo, e la carenza di funzionalità avanzate in particolare la ricerca.</p> <p>Controllare l'unità via web: sostituendo il file browser con uno web-based con funzioni di ricerca sarebbe molto comodo... le pagine con gli indici possono essere rigenerate manualmente, e si può raffinare le funzioni di ricerca e visualizzazione a piacimento.</p> <p>Purtroppo non ho trovato modo di inviare al DvdPlayer un nome di file da riprodurre; e quindi questa funzionalità naufraga sul nascere.</p> <h2>4.Cosa manca?</h2> <p>Scoprire il codice da inviare per emulare il tasto NET del telecomando.</p> <p><strong>Nota</strong>: E' possibile utilizzando il sistema di emulazione del telecomando conoscere il codice corrispondente al tasto NET usando la procedura indicata sopra al punto 1.2. dalla periferica /dev/venus_irrp ; tuttavia non è chiaro dove si possano inviare questi comandi, certo si potrebbe sostituire il /dev/venus_irrp con un programma apposito nel quale iniettare i codici corrispondenti a NET: ma vediamo prima se si trova il codice da usare con il sistema corrente (giusto per non complicarci eccessivamente la vita)</p> <h2>5. Risorse</h2> <p>Pagina originale del telecomando Web di adicon per la N200</p> <p>http://adicon.lahost.org/2010/01/07/emtec-n200-web-remote-command/</p> <p>HDMedia Services (controllo SAMBA FTP Torrent ecc.)</p> <p>http://ziogeek.com/forum/sviluppo-software-open-source/hdmedia-services-installazione-win-mac-linux-vt1701.html</p> <p>Telecomando IR sostitutivo per la Ellion:</p> <p>http://www.hwupgrade.it/forum/showpost.php?p=30479663&amp;postcount=340</p> <p> </p></div> <div class="feed-description"><p>I media player Ellion 351H, 350H e affini (inclusi medley, EMTEC N200, Emtec S800, Emtec HMR-351H, O2Media HMR-351N, Markus 750, Medley 2+, Medley 3, O2Media) offrono funzionalità di televisione digitale, player multimediale, con possibilità di connettere dischi SATA, USB e via rete. Il programma DvdPlayer della Realtek (closed source) provvede al funzionamento delle unità.</p> <p>Obiettivo: Estendere il funzionamento della Ellion permettendo:</p> <ol> <li>di emulare il telecomando via telnet o meglio via web</li> <li>di avviarla senza il menù amministrativo aperto (ovvero all'accensione visualizza l'ultimo canale DV visualizzato)</li> <li>di controllare l'unità via web: sostituendo il file browser con uno web-based con funzioni di ricerca.</li> </ol> <h2>1. Telecomando Web per il player Ellion HMR 351H e affini.</h2> <p>Questa parte riguarda una personalizzazione del <a href="http://adicon.lahost.org/2010/01/07/emtec-n200-web-remote-command/" target="_blank" title="EMTEC N200 Web Remote Command">Emtec N200 Web Remote Control</a>, un telecomando via web, modificato per essere compatibile con il firmware della Ellion, e aggiungendo alcuni tasti non previsti.</p> <p>Inoltre ho aggiunto una funzione "info" con i credits e con una funzione per testare l'invio di comandi (ancora manca il comando per il tasto NET e altri tasti, da qui si possono inviare i comandi).</p> <p>Nella distribuzione è inclusa anche una sottocartella con alcuni script amministrativi che mi sono stati utili per capire come funziona DvdPlayer.</p> <h2>1.1 Distribuzione Ellion HMR 351H</h2> <p>il file /usr/local/bin/DvdPlayer comanda il funzionamento dell'unità.</p> <p>Il programma <strong>stopall</strong> permette di fermare tutte le istanze del programma DvdPlayer.</p> <p>Avviando DvdPlayer da console si possono inviare diversi comandi: riporto un elenco quasi completo preso dal post di <a href="http://ziogeek.com/forum/medley-2-plus-unofficial-generale/medley-2-scansione-canali-dvb-t-vt3199.html" target="_blank" title="Codici STDIN DvdPlayer"><strong>nicorac su ziogeek</strong></a>:</p> <p> </p> <pre> <br />-------------------------------------------------<br />a - audio button<br />b - takes you into the recording setup screen<br />c - delete schedule when in recording, otherwise doesn't appear to do anything<br />f - reverse play &lt;&lt;<br />j - reverse zoom (starts at max zoom and goes back to 1)<br />l - slow play reverse<br />m - mute on/off<br />n - skip to next title (not chapter)<br />o - Shut down quickly<br />p - skip to prior title (not chapter)<br />q - go back 10 SECONDS<br />r - start recording / switch to av<br />s - subtitle toggle<br />v - volume -<br />z - normal zoom<br /><br />A - left<br />B - 30 Second Skip<br />C - Command Line interpreter, engineering mode, see below<br />D - right<br />E - Delete<br />F - Fast forward &gt;&gt;<br />G - Asks for GCode. Not sure what the GCode is. Tried a VCR+ code given the context,<br /> but the code I tried only crashed the player.<br />H - report some kind of status<br />L - slow play forward<br />M - Menu<br />N - Next chapter<br />O - shut down normally<br />P - Prior chapter<br />Q - Stop<br />S - Play<br />T- AV input screen<br />V - volume +<br />W - up<br />X - down<br />Z - Step / pause<br /><br />- - goto<br />= - repeat a/b<br />+ - repeat button<br /><br /># - go to USB screen<br />$ - go to REC directory<br />&amp; - graphical file copy, looks nice.<br />Much better than the cut/copy/paste concept you can do from the remote.<br />( - start performance logging<br />) - stop performance logging<br />~ - memory allocation status<br />0-9 - same as entering 0-9. Jumps to title. I did not know you could jump to a <br /> specific title that way on this player, so something new.<br /><br />[ - source button<br />] - go to ScreenPlay Pro root drive<br />{ - home button<br />, - return button<br />/ - go to setup menu<br />\ - switch tv system<br />: - switch tv system (not sure how it is different from \)<br />@ - DV (videocamera control)<br /><br />ESC - Go to setup menu<br /><br />In engineering mode, you can type HELP and get this:<br />(Switch to engineering mode with command C, see above )<br /><br />Engineering Mode Command List:<br />port: read or write value to specified address<br />setdebug: set audio/video debug flag<br />setbri : set Video In Brightness value (00~ff)<br />setcont : set Video In Contrast value (00~ff)<br />setsatu : set Video In Saturation value (00~ff)<br />sethue : set Video In Hue value (00~ff)<br />setscal : set the coefficients of VIN Scaling (0x10<br />00~0xFFFF)<br />setcolorm<br />: set VO hardware's Color Adjustment transformation matrix<br />copyfree: enable copy-free<br />netperf : Enable network performance meter. Use on or o<br />ff to tern on/off this feature<br />netperf nodecode, means streaming only withou<br />t decode.<br />setyc: set YC separation parameters [6 parameters]<br />| save: save setting<br />| load: load setting<br />| default: use factory default setting<br />| show: show current setting<br />shell: Unix Shell to execute unix command<br />kill: kill the program immediately (to generate coredump)<br />quit: quit from command line interpreter<br />-------------------------------------------------</pre> <h2>1.2 Telecomando IR</h2> <p>Questi comandi sono ben diversi dai codici inviati dal telecomando; la periferica che riceve i codici dal telecomando è /dev/venus_irrp e si può leggerla con</p> <pre>cat /dev/venus_irrp</pre> <p>oppure con un batch più completo:</p> <pre>#! /bin/sh<br />echo ""<br />echo "Remote Control Dump for Ellion HMR 350, 351H, plus N200, Medley etc"<br />echo " Below you can see all remote control codes as the keys are pressed"<br />echo " i.e. this is the sample output for the \"mute\" key:"<br />echo ""<br />echo " Processo:"<br />echo " 0000000 f708 a55a 000a "<br />echo " 0000005"<br />echo ""<br />echo ""<br />echo " You can use ./telecomando_chrhex.cgi to test parameters as you read them<br />echo " i.e."<br />echo ""<br />echo " ./telecomando_chrhex.cgi f7 08 a5 5a 00 0a \&gt;\&gt; /tmp/command_sender.<br />echo ""<br />echo " for the example above, muting the audio."<br />echo ""<br />echo "------------------- Remote control: hex dump --------------------"<br />irfile=/tmp/irfile<br />cat /dev/venus_irrp &gt; $irfile &amp;<br /><br />bincode=nocode<br />while [ -f $irfile ] <br />do <br /> bincode=$(tail -c 4 $irfile) <br /> <br /> if [ -n "${bincode}" ] <br /> then <br /> if [ "${bincode}" != "${oldbincode}" ] <br /> then <br /> oldbincode=$bincode <br /> echo Processo: <br /> echo $bincode | hexdump <br /> fi <br /> fi <br /> usleep 10 <br />done <br />exit 0<br /></pre> <p>Basta ora premere un tasto sul telecomando per vedere il codice inviato.</p> <p>Output di esempio:</p> <p> </p> <pre>-----------------------------------------------------------------------------<br />Remote Control Dump for Ellion HMR 350, 351H, plus N200, Medley etc<br /> Below you can see all remote control codes as the keys are pressed<br /> i.e. this is the sample output for the "mute" key:<br /> Processo:<br /> 0000000 f708 a55a 000a <br /> 0000005<br /><br /> You can use ./telecomando_chrhex.cgi to test parameters as you read them below:<br /> i.e.<br /> ./telecomando_chrhex.cgi f7 08 a5 5a 00 0a \&gt;\&gt; /tmp/command_sender.txt<br /> for the example above, muting the audio.<br />------------------- Remote control: hex dump --------------------</pre> <h2>1.3 Il telecomando di adicon, esteso per la Ellion</h2> <p><a href="http://adicon.lahost.org/2010/01/07/emtec-n200-web-remote-command/" target="_blank">Adicon</a> ha scritto un telecomando per il modello N200, utilizzando lo STDIN di DvdPlayer.</p> <p>Per farlo basta avviare DvdPlayer reindirizzando lo STDIN da un file arbitrario /tmp/command_sender.txt:</p> <pre><pre>tail -f /tmp/command_sender.txt DvdPlayer</pre> <br /><br /></pre> <p>quindi sarà sufficiente inviare i comandi al file /tmp/command_sender.txt , per esempio:</p> <pre>echo "m" &gt; /tmp/command_sender.txt </pre> <p>per mettere in mute.</p> <h3>1.3.1 Avvio automatico</h3> <p>E' necessario modificare lo script di avvio della console perché ad ogni riavvio il programma DvdPlayer parta con l'input reindirizzato:</p> <p>/usr/local/etc/rcS</p> <p>Aggiungere il testo in rosso:</p> <pre>if [ -f $DEFAULT_AP_DIR/DvdPlayer ] &amp;&amp; [ -x $DEFAULT_AP_DIR/DvdPlayer ]; then<br />cd $DEFAULT_AP_DIR<br /><strong style="color: red;">rm /tmp/command_sender.txt<br />touch /tmp/command_sender.txt</strong><br />if [ -f $DEFAULT_AP_DIR/RootApp ] &amp;&amp; [ -x $DEFAULT_AP_DIR/RootApp ]; then<br /> echo Running dvdplayer with RootApp<br /> <strong style="color: red;">tail -f /tmp/command_sender.txt | </strong>./RootApp DvdPlayer -s RTC &amp;<br />else<br /> echo Running dvdplayer<br /> <strong style="color: red;">tail -f /tmp/command_sender.txt | </strong>./DvdPlayer -s RTC &amp;<br />fi<br />else<br /> /usr/local/etc/dvdplayer/script/run_tail<br />fi</pre> <h3>1.3.2 Il telecomando</h3> <p>Ho modificato di poco lo script del telecomando per includere alcuni tasti che non sono presenti sul telecomando.</p> <p>Purtroppo sia dalla lista sopra che dal telecomando della N200 manca il codice per LAN, che non sono riuscito a trovare; purtroppo i codici di scansione non seguono alcun ordine logico, usano i caratteri da 32 a 127 ma nessuno di questi mi ha dato la funzionalità LAN/NET.</p> <p>Il dispositivo Ellion dispone di un server web il cui contenuto di fabbrica è sostanzialmente inutile; in queste condizioni si può installare nella root; altrimenti creare una cartella.</p> <p>Io ho <a href="http://ziogeek.com/forum/sviluppo-software-open-source/hdmedia-services-installazione-win-mac-linux-vt1701.html" target="_blank">HDMediaServices</a> installato per la gestione dei servizi SAMBA e FTP; diversamente dovrete modificare la installazione in /tmp_orig.</p> <p>Per installarlo nella cartella /remote ecco i comandi:</p> <p>(presuppongono che l'installazione d</p> <p>Per installarlo, digitare:</p> <pre>cd /tmp<br />echo nameserver 208.67.222.222 &gt; /etc/resolv.conf<br />wget http://www.tmg.it/files/remote/install.sh<br />chmod a+x install.sh<br />./install.sh<br /></pre> <p>L'installazione effettua poi un reboot automaticamente.</p> <p>Ad ogni avvio (/usr/local/etc/rcS) copia la cartella /tmp/hdd/volumes/HDD1/Applications/Web su /var/www</p> <p>(L'installazione originale modificava /tmp_orig/ ma sulla ellion non si monta il filesystem di root facilmente in rw).</p> <p>Ora è possibile accedere al telecomando dall'indirizzo http://ip_ellion/remote</p> <p> </p> <h2>2. Avvio automatico su TV</h2> <p>Non so per quale motivo la Ellion parta sempre con il menù amministrativo aperto.</p> <p>Basta modificare nel file <strong>/usr/local/etc/rcS</strong> la stringa di avvio</p> <pre>DvdPlayer</pre> <p>e modificarla in</p> <pre>DvdPlayer -s RTC<br /></pre> <h2>3.Controllo completo da web</h2> <p>I limiti del telecomando sono la necessità di guardare il televisore per capire in che menù ci troviamo, e la carenza di funzionalità avanzate in particolare la ricerca.</p> <p>Controllare l'unità via web: sostituendo il file browser con uno web-based con funzioni di ricerca sarebbe molto comodo... le pagine con gli indici possono essere rigenerate manualmente, e si può raffinare le funzioni di ricerca e visualizzazione a piacimento.</p> <p>Purtroppo non ho trovato modo di inviare al DvdPlayer un nome di file da riprodurre; e quindi questa funzionalità naufraga sul nascere.</p> <h2>4.Cosa manca?</h2> <p>Scoprire il codice da inviare per emulare il tasto NET del telecomando.</p> <p><strong>Nota</strong>: E' possibile utilizzando il sistema di emulazione del telecomando conoscere il codice corrispondente al tasto NET usando la procedura indicata sopra al punto 1.2. dalla periferica /dev/venus_irrp ; tuttavia non è chiaro dove si possano inviare questi comandi, certo si potrebbe sostituire il /dev/venus_irrp con un programma apposito nel quale iniettare i codici corrispondenti a NET: ma vediamo prima se si trova il codice da usare con il sistema corrente (giusto per non complicarci eccessivamente la vita)</p> <h2>5. Risorse</h2> <p>Pagina originale del telecomando Web di adicon per la N200</p> <p>http://adicon.lahost.org/2010/01/07/emtec-n200-web-remote-command/</p> <p>HDMedia Services (controllo SAMBA FTP Torrent ecc.)</p> <p>http://ziogeek.com/forum/sviluppo-software-open-source/hdmedia-services-installazione-win-mac-linux-vt1701.html</p> <p>Telecomando IR sostitutivo per la Ellion:</p> <p>http://www.hwupgrade.it/forum/showpost.php?p=30479663&amp;postcount=340</p> <p> </p></div> SSH senza password? 2010-09-30T08:13:49+00:00 2010-09-30T08:13:49+00:00 https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema/53-ssh-senza-password Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>Se amministri molti server può esserti utile automatizzare le procedure di login e copia degli aggiornamenti. Per far questo è necessario configurare il sistema per utilizzare una coppia di chiavi RSA o DSA invece della password.</p> <p>Se la comunicazione già richiede l'autenticazione con chiavi riceverete l'errore <strong>Permission denied (publickey)</strong> tentando di loggarvi.</p> <p>Per poter effettuare questa configurazione è necessario poter scrivere nella cartella del server /Users/NomeUtente/.ssh</p> <h2>1. Creo una coppia di chiavi sul mio computer</h2> <p>Dovrò scegliere l'algoritmo da utilizzare, DSA ha lunghezza fissa di 1024, mentre RSA è configurabile con un default di 2048; quindi è più sicuro utilizzare una chiave RSA.</p> <pre>ssh-keygen -b 1024 -t dsa</pre> <p>oppure</p> <pre>ssh-keygen -b 4096 -t rsa</pre> <p>quindi premere invio (accettando quindi i defaults) finché non esce dal programma. L'output indicherà il percorso della chiave pubblica:</p> <pre>ptah:~ ric$ ssh-keygen -b 1024 -t rsa<br />Generating public/private rsa key pair.<br />Enter file in which to save the key (/Users/ric/.ssh/id_rsa): <br />Enter passphrase (empty for no passphrase): <br />Enter same passphrase again: <br />Your identification has been saved in /Users/ric/.ssh/id_rsa.<br />Your public key has been saved in /Users/ric/.ssh/id_rsa.pub.<br />The key fingerprint is:</pre> <p>A questo punto nel file<strong> /Users/ric/.ssh/id_rsa</strong> (sostituite <strong>ric</strong> con il vostro username) avrete la vostra chiave pubblica e la chiave privata sarà stata installata automaticamente.</p> <h2>2. Copio la chiave sul server</h2> <p>Potete copiarla come vi pare, per esempio, se avete già accesso SSH:</p> <pre>scp /Users/ric/.ssh/id_rsa.pub serveraddress:</pre> <p>quindi aprite una sessione SSH verso il server e (per chiavi RSA)</p> <pre>cat id_rsa.pub &gt;&gt; /Users/user/.ssh/authorized_keys</pre> <p>oppure, per chiavi DSA:</p> <pre>cat id_dsa.pub &gt;&gt; /Users/user/.ssh/authorized_keys2</pre> <p>Per poterla usare sul server dovrete copiarla alla fine del file /Users/ric/.ssh/authorized_keys (chiavi RSA) oppure /Users/ric/.ssh/authorized_keys2 (chiavi DSA)</p> <h2>3. Mi collego</h2> <p>A questo punto è possibile una sessione SSH crittografata con le chiavi appena create.</p> <p><strong>Attenzione</strong>: fate sempre un backup di ogni coppia di chiavi in un posto sicuro: le chiavi dei server tendono ad accumularsi, e a volte non si usano per anni; una buona misura di sicurezza è disabilitare l'accesso in mancanza di chiavi valide: in tal caso potreste restare tagliati fuori in caso doveste smarrirle.</p> <p>4. Restringo l'accesso ad ssh agli utenti che abbiano una chiave valida registrata</p> <p>Ora è possibile "indurire" un po' di più il server, limitando l'accesso agli utenti che abbiano una chiave valida; la configurazione è nel file</p> <pre> /etc/ssh/sshd_config<br /></pre></div> <div class="feed-description"><p>Se amministri molti server può esserti utile automatizzare le procedure di login e copia degli aggiornamenti. Per far questo è necessario configurare il sistema per utilizzare una coppia di chiavi RSA o DSA invece della password.</p> <p>Se la comunicazione già richiede l'autenticazione con chiavi riceverete l'errore <strong>Permission denied (publickey)</strong> tentando di loggarvi.</p> <p>Per poter effettuare questa configurazione è necessario poter scrivere nella cartella del server /Users/NomeUtente/.ssh</p> <h2>1. Creo una coppia di chiavi sul mio computer</h2> <p>Dovrò scegliere l'algoritmo da utilizzare, DSA ha lunghezza fissa di 1024, mentre RSA è configurabile con un default di 2048; quindi è più sicuro utilizzare una chiave RSA.</p> <pre>ssh-keygen -b 1024 -t dsa</pre> <p>oppure</p> <pre>ssh-keygen -b 4096 -t rsa</pre> <p>quindi premere invio (accettando quindi i defaults) finché non esce dal programma. L'output indicherà il percorso della chiave pubblica:</p> <pre>ptah:~ ric$ ssh-keygen -b 1024 -t rsa<br />Generating public/private rsa key pair.<br />Enter file in which to save the key (/Users/ric/.ssh/id_rsa): <br />Enter passphrase (empty for no passphrase): <br />Enter same passphrase again: <br />Your identification has been saved in /Users/ric/.ssh/id_rsa.<br />Your public key has been saved in /Users/ric/.ssh/id_rsa.pub.<br />The key fingerprint is:</pre> <p>A questo punto nel file<strong> /Users/ric/.ssh/id_rsa</strong> (sostituite <strong>ric</strong> con il vostro username) avrete la vostra chiave pubblica e la chiave privata sarà stata installata automaticamente.</p> <h2>2. Copio la chiave sul server</h2> <p>Potete copiarla come vi pare, per esempio, se avete già accesso SSH:</p> <pre>scp /Users/ric/.ssh/id_rsa.pub serveraddress:</pre> <p>quindi aprite una sessione SSH verso il server e (per chiavi RSA)</p> <pre>cat id_rsa.pub &gt;&gt; /Users/user/.ssh/authorized_keys</pre> <p>oppure, per chiavi DSA:</p> <pre>cat id_dsa.pub &gt;&gt; /Users/user/.ssh/authorized_keys2</pre> <p>Per poterla usare sul server dovrete copiarla alla fine del file /Users/ric/.ssh/authorized_keys (chiavi RSA) oppure /Users/ric/.ssh/authorized_keys2 (chiavi DSA)</p> <h2>3. Mi collego</h2> <p>A questo punto è possibile una sessione SSH crittografata con le chiavi appena create.</p> <p><strong>Attenzione</strong>: fate sempre un backup di ogni coppia di chiavi in un posto sicuro: le chiavi dei server tendono ad accumularsi, e a volte non si usano per anni; una buona misura di sicurezza è disabilitare l'accesso in mancanza di chiavi valide: in tal caso potreste restare tagliati fuori in caso doveste smarrirle.</p> <p>4. Restringo l'accesso ad ssh agli utenti che abbiano una chiave valida registrata</p> <p>Ora è possibile "indurire" un po' di più il server, limitando l'accesso agli utenti che abbiano una chiave valida; la configurazione è nel file</p> <pre> /etc/ssh/sshd_config<br /></pre></div> La macchina da scrivere 2008-10-30T18:24:37+00:00 2008-10-30T18:24:37+00:00 https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema/43-la-macchina-da-scrivere Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>Il 98% degli utenti di programmi di videoscrittura non ha ben chiara la differenza tra una macchina da scrivere e un wordprocessor</p><p>In particolare l'uso di due spazi adiacenti è accettabile solo dopo il ".", dopo il "!" e dopo il "?" se segue un'altra frase.</p><p>Non si può usare per fare tabelle.</p><p>Questo video spiega come fare a creare un documento complesso con indici e struttura di livelli per i capitoli con la minima fatica evitando gli errori più triviali. </p><div> <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="425" height="350"><param name="height" value="350" /><param name="width" value="425" /><param name="src" value="http://www.youtube.com/v/DnTEIPxEE3Q" /><embed type="application/x-shockwave-flash" height="350" width="425" src="http://www.youtube.com/v/DnTEIPxEE3Q"></embed></object> </div></div> <div class="feed-description"><p>Il 98% degli utenti di programmi di videoscrittura non ha ben chiara la differenza tra una macchina da scrivere e un wordprocessor</p><p>In particolare l'uso di due spazi adiacenti è accettabile solo dopo il ".", dopo il "!" e dopo il "?" se segue un'altra frase.</p><p>Non si può usare per fare tabelle.</p><p>Questo video spiega come fare a creare un documento complesso con indici e struttura di livelli per i capitoli con la minima fatica evitando gli errori più triviali. </p><div> <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="425" height="350"><param name="height" value="350" /><param name="width" value="425" /><param name="src" value="http://www.youtube.com/v/DnTEIPxEE3Q" /><embed type="application/x-shockwave-flash" height="350" width="425" src="http://www.youtube.com/v/DnTEIPxEE3Q"></embed></object> </div></div> Trucchetti Javascript 2008-09-14T08:36:26+00:00 2008-09-14T08:36:26+00:00 https://www.tmg.it/articoli-tecnici/trucchetti-javascript Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>Lo sapevi che In tutti i browser è possibile inserire direttamente nella barra dell'indirizzo del codice javascript?</p> <p>Il javascript può esserci utile per divertimento principalmente; ma anche per lavoro.</p> <h2>Divertimento</h2> <p>(First things first)</p> <p>Aprite <a href="http://www.flickr.com/search/?q=eyes" title="Occhi vari">una pagina </a>con un po' di immagini, quindi digitate nella barra dell'indirizzo:</p> <p> </p> <p><strong><span style="font-family: courier new,courier">javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.getElementsByTagName(%22img%22); DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+%22px%22; DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+%22px%22}R++}setInterval('A()',50); void(0);</span></strong></p> <p> </p> <p>Divertente, vero?</p> <p>Oppure, aprite una pagina di un giornale e poi scrivete nella barra degli indirizzi:</p> <pre><strong><span style="font-family: courier new,courier">javascript: document.body.contentEditable = 'true'; document.designMode = 'on'; void 0 </span></strong> </pre> <p>A questo punto, cliccate qualunque testo sullo schermo e iniziate a modificarlo...</p> <p><strong>Nota bene</strong>: qualunque istruzione deve sempre terminare con <strong><span style="font-family: courier new,courier">void 0</span></strong>, altrimenti il browser aprirà una pagina vuota per eseguire la funzione.</p> <h2>Lavoro</h2> <p>Beh questa è più dura. Trovare una utilità vera è più difficile...</p> <p>Per esempio si può rendere cliccabile o selezionabile un sito che non lo permette:</p> <p>Le tecniche per evitare di far selezionare testo o cliccare con il tasto destro sono varie, ma di solito si riducono nel funzionamento all'assegnamento di un paio di funzioni:</p> <pre><span style="font-family: courier new,courier">document.oncontextmenu=new Function("return false")<br />document.onselectstart=new Function("return false")</span><br /> </pre> <p>Sia che queste funzioni siano definite in-line, sia che siano definite altrove all'interno dello script, per ripristinare il normale funzionamento basta rimuovere l'assegnazione agli eventi:scriviamo quindi nella barra degli indirizzi:</p> <pre><strong><span style="font-family: courier new,courier">javascript:document.oncontextmenu=null;document.onselectstart=null;void 0;</span></strong><br /> </pre> <hr /> <p><a name="krric" href="http://www.gixen.com/index.php" target="_blank"> <img src="http://www.gixen.com/images/gixenlink.gif" border="0" alt="eBay Sniper" /> </a></p></div> <div class="feed-description"><p>Lo sapevi che In tutti i browser è possibile inserire direttamente nella barra dell'indirizzo del codice javascript?</p> <p>Il javascript può esserci utile per divertimento principalmente; ma anche per lavoro.</p> <h2>Divertimento</h2> <p>(First things first)</p> <p>Aprite <a href="http://www.flickr.com/search/?q=eyes" title="Occhi vari">una pagina </a>con un po' di immagini, quindi digitate nella barra dell'indirizzo:</p> <p> </p> <p><strong><span style="font-family: courier new,courier">javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.getElementsByTagName(%22img%22); DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+%22px%22; DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+%22px%22}R++}setInterval('A()',50); void(0);</span></strong></p> <p> </p> <p>Divertente, vero?</p> <p>Oppure, aprite una pagina di un giornale e poi scrivete nella barra degli indirizzi:</p> <pre><strong><span style="font-family: courier new,courier">javascript: document.body.contentEditable = 'true'; document.designMode = 'on'; void 0 </span></strong> </pre> <p>A questo punto, cliccate qualunque testo sullo schermo e iniziate a modificarlo...</p> <p><strong>Nota bene</strong>: qualunque istruzione deve sempre terminare con <strong><span style="font-family: courier new,courier">void 0</span></strong>, altrimenti il browser aprirà una pagina vuota per eseguire la funzione.</p> <h2>Lavoro</h2> <p>Beh questa è più dura. Trovare una utilità vera è più difficile...</p> <p>Per esempio si può rendere cliccabile o selezionabile un sito che non lo permette:</p> <p>Le tecniche per evitare di far selezionare testo o cliccare con il tasto destro sono varie, ma di solito si riducono nel funzionamento all'assegnamento di un paio di funzioni:</p> <pre><span style="font-family: courier new,courier">document.oncontextmenu=new Function("return false")<br />document.onselectstart=new Function("return false")</span><br /> </pre> <p>Sia che queste funzioni siano definite in-line, sia che siano definite altrove all'interno dello script, per ripristinare il normale funzionamento basta rimuovere l'assegnazione agli eventi:scriviamo quindi nella barra degli indirizzi:</p> <pre><strong><span style="font-family: courier new,courier">javascript:document.oncontextmenu=null;document.onselectstart=null;void 0;</span></strong><br /> </pre> <hr /> <p><a name="krric" href="http://www.gixen.com/index.php" target="_blank"> <img src="http://www.gixen.com/images/gixenlink.gif" border="0" alt="eBay Sniper" /> </a></p></div> Decalogo del Javascript facile da manutenere 2008-09-13T19:11:37+00:00 2008-09-13T19:11:37+00:00 https://www.tmg.it/articoli-tecnici/decalogo-del-javascript Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p>Javascript è un linguaggio sempre più usato per scrivere applicazioni complesse.</p> <p>Tuttavia la sua enorme versatilità fa sì che spesso il codice diventi un incubo da manutenere.</p> <p><br /> Il costo sopportato dalle aziende per la sola manutenzione del software rappresenta l'80% mentre lo sviluppo di nuovo codice solo il 20%. Questo significa che anche se investiamo il doppio del tempo per scrivere codice più facile da manutenere, siamo destinati a trarne comunque enormi benefici più avanti.</p> <p><br /> Scrivere codice manutenibile vuol dire scrivere codice di qualità. Codice che sia in primo luogo semplice da comprendere (tramite commenti e indentazione), e semplice da manutenere, ovvero facilmente modificabile, estensibile, e debuggabile (tramite un uso sapiente di oggetti ed errori)</p> <p> </p> <p>Uso personalmente Javascript in una applicazione con 9 oggetti, per un totale di poco meno di cinquemila righe, con due client separati che utilizzano integralmente la stessa logica, dalle stesse librerie javascript. L'applicazione è spesso soggetta a richieste di modifiche da parte dell'utente; dopo 6 anni di vita, posso consigliare le pratiche migliori da adottare sul campo; e dopo aver visto l'intervento di Nicholas Zakas sulla manutenibilità del codice, ho deciso di pubblicare in italiano le mie considerazioni, unite alle sue, corredandole di esempi di codice.</p> <p>Nessuna di queste indicazioni vuol essere un dogma; tuttavia prendetele in considerazione sempre prima di operare una scelta diversa.</p> <p> </p> </div> <div class="feed-description"><p>Javascript è un linguaggio sempre più usato per scrivere applicazioni complesse.</p> <p>Tuttavia la sua enorme versatilità fa sì che spesso il codice diventi un incubo da manutenere.</p> <p><br /> Il costo sopportato dalle aziende per la sola manutenzione del software rappresenta l'80% mentre lo sviluppo di nuovo codice solo il 20%. Questo significa che anche se investiamo il doppio del tempo per scrivere codice più facile da manutenere, siamo destinati a trarne comunque enormi benefici più avanti.</p> <p><br /> Scrivere codice manutenibile vuol dire scrivere codice di qualità. Codice che sia in primo luogo semplice da comprendere (tramite commenti e indentazione), e semplice da manutenere, ovvero facilmente modificabile, estensibile, e debuggabile (tramite un uso sapiente di oggetti ed errori)</p> <p> </p> <p>Uso personalmente Javascript in una applicazione con 9 oggetti, per un totale di poco meno di cinquemila righe, con due client separati che utilizzano integralmente la stessa logica, dalle stesse librerie javascript. L'applicazione è spesso soggetta a richieste di modifiche da parte dell'utente; dopo 6 anni di vita, posso consigliare le pratiche migliori da adottare sul campo; e dopo aver visto l'intervento di Nicholas Zakas sulla manutenibilità del codice, ho deciso di pubblicare in italiano le mie considerazioni, unite alle sue, corredandole di esempi di codice.</p> <p>Nessuna di queste indicazioni vuol essere un dogma; tuttavia prendetele in considerazione sempre prima di operare una scelta diversa.</p> <p> </p> </div> Apache + .exe cgi on windows slowdown after december 2006 2007-03-07T20:39:22+00:00 2007-03-07T20:39:22+00:00 https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema/23-apache--exe-cgi-on-windows-slowdown-after-december-2006 Riccardo Zorn r.zorn@tmg.it <div class="feed-description"><p> <strong>Symptoms: </strong>Your application slowed down by two - three seconds after december 2006. </p> <p> <strong>Our test environments:</strong> </p> <ul> <li>Threaded .exe cgi running on apache 1.3 or 2.0</li> <li>Threaded .dll cgi running on apache 1.3 or 2.0</li> <li>Stand-alone C++ windows application compiled with BCC </li> </ul> <br /> <p> <strong>Problem description:</strong> </p> <p> The windows socket function GetHostByName for some unknown reasons was slowed down after a KB update microsoft put out in december 2006. </p> <p> <strong>Systems affected:</strong> </p> <p> Only windows XP Home  </p> <p> <strong>Solution:</strong> </p> <p> None known </p> <p> <strong>Workaround:</strong> </p> <p> Cache that info! I create a thread upon application startup or initialization, that returns the value asynchronously.  IP and network name are not subject to change too often. </p></div> <div class="feed-description"><p> <strong>Symptoms: </strong>Your application slowed down by two - three seconds after december 2006. </p> <p> <strong>Our test environments:</strong> </p> <ul> <li>Threaded .exe cgi running on apache 1.3 or 2.0</li> <li>Threaded .dll cgi running on apache 1.3 or 2.0</li> <li>Stand-alone C++ windows application compiled with BCC </li> </ul> <br /> <p> <strong>Problem description:</strong> </p> <p> The windows socket function GetHostByName for some unknown reasons was slowed down after a KB update microsoft put out in december 2006. </p> <p> <strong>Systems affected:</strong> </p> <p> Only windows XP Home  </p> <p> <strong>Solution:</strong> </p> <p> None known </p> <p> <strong>Workaround:</strong> </p> <p> Cache that info! I create a thread upon application startup or initialization, that returns the value asynchronously.  IP and network name are not subject to change too often. </p></div> una VPN gratis 2006-10-18T14:49:20+00:00 2006-10-18T14:49:20+00:00 https://www.tmg.it/articoli-tecnici/sviluppo-e-sistema/13-una-vpn-gratis Administrator ads@tmg.it <div class="feed-description"><p><strong>Chi non ha mai desiderato una VPN?</strong></p><p>Hai mai avuto bisogno di accedere a file o servizi su computer che si trovano in un'altra sede? </p><p><strong>Cosa è una VPN?</strong> </p><p>Una VPN = Rete privata virtuale altro non è se non un'estensione logica della tua rete locale che sfrutta in maniera misteriosa* un tunnel sicuro per farti vedere computer remoti come se fossero locali (anche se più lentamente).</p><p><strong>Quanto mi costa tutto ciò?</strong></p><p>Fino a ieri? un bagno di sudore di un sistemista bravo, oppure bei soldoni in licenze o account web </p><p>Oggi? Un po' di pazienza. Non servono grandi conoscenze informatiche, e in 15 minuti puoi tirare su una rete virtuale gratuita che funzionerà a vita. Peccato che domani tu debba reinstallare windoz :-(</p><p><strong>Cosa mi serve?</strong></p><p>Due computer connessi ad internet in qualunque modo, anche in sedi diverse (ma non necessariamente)</p><p><strong>E allora come procedo?</strong> </p><p>Leggi il resto dell'articolo per saperlo </p><p>&nbsp;</p><p>&nbsp;</p></div> <div class="feed-description"><p><strong>Chi non ha mai desiderato una VPN?</strong></p><p>Hai mai avuto bisogno di accedere a file o servizi su computer che si trovano in un'altra sede? </p><p><strong>Cosa è una VPN?</strong> </p><p>Una VPN = Rete privata virtuale altro non è se non un'estensione logica della tua rete locale che sfrutta in maniera misteriosa* un tunnel sicuro per farti vedere computer remoti come se fossero locali (anche se più lentamente).</p><p><strong>Quanto mi costa tutto ciò?</strong></p><p>Fino a ieri? un bagno di sudore di un sistemista bravo, oppure bei soldoni in licenze o account web </p><p>Oggi? Un po' di pazienza. Non servono grandi conoscenze informatiche, e in 15 minuti puoi tirare su una rete virtuale gratuita che funzionerà a vita. Peccato che domani tu debba reinstallare windoz :-(</p><p><strong>Cosa mi serve?</strong></p><p>Due computer connessi ad internet in qualunque modo, anche in sedi diverse (ma non necessariamente)</p><p><strong>E allora come procedo?</strong> </p><p>Leggi il resto dell'articolo per saperlo </p><p>&nbsp;</p><p>&nbsp;</p></div>