urlread

  • La solution trouvée sur un forum:

Sur le MATLAB central on peut voir par exemple dans ce post
Thread Subject: Using URLREAD on IMDB

qu’il suffit d’éditer urlread.m et y ajouter
urlConnection.setRequestProperty(‘User-Agent’,’Mozilla 5.0′);

Mais bon éditer un code source n’est pas une bonne pratique bien que cette solution fonctionne.

  • La solution TMW:

Ayant remonté ce problème au support technique de tMW, j’ai eu une explication très satisfaisante sur le sujet :

The biggest difference between URLREAD in MATLAB and in standalone mode is the User-Agent which it reports (in MATLAB it returns the User-Agent string of the built-in browser used by the WEB command, in standalone it only returns your JRE version). Possibly the server of the specific URL which is not working does not « like » the User-Agent in standalone mode.

To work around this you can change the User-Agent by setting the http.agent Java property, for example:
java.lang.System.setProperty(‘http.agent’,’Mozilla/5.0′)

On a recompilé notre code avec cette ligne et ça a aussi corrigé le problème.

  • La solution Fex:

Le 21 Mars 2012 Yair avait posté un sujet Expanding urlread capabilities qui pointait vers l’utilitaire urlread2.
Cette solution aussi fonctionne très bien et d’ailleurs je la conseille.
Pour s’en convaincre il suffit de prendre l’url qui est discutée dans le sujet du MATLAB Central : http://www.imdb.com/title/tt0372784/

Voici les différents tests en R2011b:

1er test (urlread normal): Failed

>> str = urlread(‘http://www.imdb.com/title/tt0372784/’)
Error using urlread (line 111)
Error downloading URL. Your network connection may be down or your proxy settings improperly configured.

2ème test (java.lang juste avant): Failed

On aura la même erreur en faisant :
>> java.lang.System.setProperty(‘http.agent’,’Mozilla/5.0′)
>>str = urlread(‘http://www.imdb.com/title/tt0372784/’)
Error using urlread (line 111)
Error downloading URL. Your network connection may be down or your proxy settings improperly configured.

3ème test (urlread.m modifié): OK

En ajoutant la ligne urlConnection.setRequestProperty(‘User-Agent’,’Mozilla 5.0′) dans urlread.m ça marche … mais bon comme je disais pas top de modifier un code source.

4ème test (urlread2 de Jim Hokanson): OK

Alors qu’avec urlread2 , ça marche sans problème!
>> str = urlread2(‘http://www.imdb.com/title/tt0372784/’)
str retourne bien le contenu de la page.

  • bug corrigé

Je reproduis l’erreur « Error downloading URL. Your network connection may be down or your proxy settings improperly configured. » en R2010b , R2011a et R2011b.
En revanche en R2012a et R2012b prerelease urlread fonctionne très bien.
Upgrader est toujours bon!

Super feature de la R2012b Prerelease

Par exemple je tape dec2nin au lieu de dec2bin:

dec2bin

non seulement MATLAB me dit que je me suis trompé et comprend ce que je voulais taper , mais surtout il me propose directement d’évaluer dec2bin(228) !! … je n’ai rien eu à taper , la correction proposée est formidable !

Feature qu’on retrouve dans les release notes:

suggestions r2012b

C’est vraiment une méga amélioration.

Accélerer la création de figures avec clf

Je vais vous montrer comment réduire le temps par 5 :
En effet on peut appeler une seule fois la commande figure avant la boucle for et faire des nouveaux plots dessus en utilsant clf. Ce qui donne:

tic
figure
for iteration= 1:20
 plot(rand(10,2));
 title(['plot: ' num2str(iteration)]);
 print(['file_' num2str(iteration) '.jpg']);
 clf % le trick
end
close all
toc

C’est astucieux , ça marche , c’est simple et efficace : 2 secondes seulement sont nécessaires … merci clf.

Installer le MCR silencieusement

1. Il faut unzipper le gros fichier MCRInstaller.exe depuis MATLAB avec unzip ou hors de MATLAB avec un soft comme WinRAR ou WinZip.
2. Une fois dézippé apparaitra le fichier setup.exe.
3. Pour lancer l’installation silencieuse du MCR dans le répertoire test_R2011b depuis une fenêtre DOS:
setup.exe -mode silent -destinationFolder C:\test_R2011b
(aucune interface graphique , pour le coup c’est vraiment silencieux !)
ou
setup.exe -mode automated -destinationFolder C:\test_R2011b
si on veut voir apparaitre l’interface graphique pendant l’installation. Les boutons Next seront évidemment cliqués à notre place.

MATLAB Primer

Primer c’est le nouveau nom donné en Mars 2012 à la 18ème édition imprimée du MATLAB Getting Started Guide. Primer en français peut se traduire par manuel élémentaire.
La première édition du MATLAB Getting Started Guide est sortie 16 ans plus tôt en décembre 1996 pour MATLAB 5.
A noter qu’il existe 7 autres éditions en plus des 18 en ligne uniquement.
MATLAB Primer contient 214 pages.

On peut trouver également pleins d’autres User Guides téléchargeables à l’adresse suivante:

http://www.mathworks.fr/help/pdf_doc/allpdf.html

Je me suis régalé entre autres avec le MATLAB Compiler User’s Guide
Je compte également dévorer le guide sur la programmation orientée objet http://www.mathworks.fr/help/pdf_doc/matlab/matlab_oop.pdf de … 611 pages !

Rafraichir une légende (part II)

Si on reprend notre exemple précédent :

plot(1:10,'b','displayname','1st graph')  
legend('show')  
hold on  
plot(3:5,'r','displayname','2nd graph')  
legend('show')

et qu’on regarde un commentaire de Yair (March 21, 2012 at 12:27 pm), on trouve ce merveilleux workaround:

hLegend = findall(gcf,'tag','legend');
uic = get(hLegend,'UIContextMenu');
uimenu_refresh = findall(uic,'Label','Refresh');
callback = get(uimenu_refresh,'Callback');
hgfeval(callback,[],[]);

ce qui permet de faire apparaitre la légende 2nd Graph pour la ligne rouge.

Merci Yair pour ce feedback!

Rafraichir une légende

L’idée est de successivement plotter une ligne puis afficher la légende , plotter une seconde ligne , ré-afficher la légende avec cette nouvelle donnée.

Voilà le code simplifié : on plotte deux lignes auxquelles on ajoute un displayname :

plot(1:10,'b','displayname','1st graph')
legend('show')
hold on
plot(3:5,'r','displayname','2nd graph')
legend('show')

only one legend

Ce qu’on remarque c’est que la légende de la ligne rouge ‘2nd graph’ n’apparait pas. Alors évidemment on pourrait appeler legend show une seule fois à la fin du code. Mais nous dans notre cas on voudrait voir la légende se rafraichir.
Il existe deux solutions : une manuelle supportée et une en ligne de commande non semi-documentée.

  • La première solution officielle

Il suffit de cliquer droit sur la légende et de choisir dans le context menu « Refresh » :

refresh legend

  • La seconde solution semi documentée

C’est d’utiliser la propriété -DynamicLegend

plot(1:10,’b’,’displayname’,’1st graph’)
legend(‘-DynamicLegend’);
legend(‘show’)
hold on
plot(3:5,’r’,’displayname’,’2ng graph’)
legend(‘show’)

Elle est semi documentée dans le sens où il suffit d’afficher le code legend.m pour voir apparaitre cette option:
edit legend
legend

Bref dans les 2 cas on arrive au résultat souhaité:

two legends