<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-33438045</id><updated>2012-01-14T04:17:13.269-08:00</updated><category term='install'/><category term='table row header'/><category term='discussion'/><category term='plans'/><category term='script syntax highlighting editor ide test'/><category term='feature'/><category term='rowscope file viewer large'/><category term='technical'/><category term='news'/><category term='discussion import'/><category term='tutorial'/><category term='status'/><category term='release 2.1'/><category term='2.0 client server beta'/><category term='release'/><category term='functions 2.2 matrex'/><category term='matrex 2.1 script'/><category term='screencast'/><title type='text'>Matrex Blog</title><subtitle type='html'>Blog about Matrex and Rowscope</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrea Ferrandi</name><uri>http://www.blogger.com/profile/12127633773772041446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_YTA4McFPGSk/TIJoOEvVEsI/AAAAAAAAAAM/psMFOj9bgt8/S220/andrea_avatar2_Cartoonizer_1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>95</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33438045.post-7734083083222767065</id><published>2012-01-14T03:59:00.001-08:00</published><updated>2012-01-14T04:17:13.277-08:00</updated><title type='text'>Matrex 2.2 out</title><content type='html'>&lt;span&gt;&lt;span style="font-size: 100%;"&gt;Finally relaeased Matrex 2.2.&lt;/span&gt;&lt;/span&gt;&lt;div style="font-family: Georgia, serif; font-size: 100%; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Matrex 2.2 adds 42 new functions in the standard package:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.date.removetime&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.date.subtract&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.db.update&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.minmax.max&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.minmax.min&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.minmax.nthmax&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.minmax.nthmin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.test.iseven&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.test.isodd&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.trigonometric.acosh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.trigonometric.asinh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.trigonometric.atanh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.changebase&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.closesteven&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.closestodd&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.constant&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.constantas&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.factorial2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.gcd&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.lcm&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.standard.logbase&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.chars.charstocodes&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.chars.charstostring&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.chars.codestochars&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.chars.codestostring&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.chars.stringtochars&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.chars.stringtocodes&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.regex.find&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.regex.replace&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.test.isboolean&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.test.isdate&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.test.isinteger&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.test.isnumeric&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.equalsignorecase&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.find&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.len&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.repeat&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.replace&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.trimleft&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.trimright&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.string.uppercasefirst&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sys.util.convertunit&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;of them, very important are:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;b&gt;sys.db.update &lt;/b&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;This is used to insert, update or delete data in a database.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;It allows the classical database operation &lt;/span&gt;&lt;span style="text-align: -webkit-auto; "&gt;&lt;i&gt;update row if it exists, otherwise insert a new one&lt;/i&gt; , very useful when you want to store data from a spreadsheet.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;b&gt;sys.util.convertunit&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;This used to convert data from &lt;/span&gt;&lt;span style="text-align: -webkit-auto; "&gt;a measurement unit to another.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="text-align: -webkit-auto; "&gt;For example convert from watt to horsepower, liter to pint...&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;You can find more information in the &lt;a href="http://matrex.sourceforge.net/templates.html"&gt;function templates list&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Internally, Matrex uses now &lt;a href="http://joda-time.sourceforge.net/"&gt;JodaTime&lt;/a&gt; to handle dates. This allowed to write the &lt;/span&gt;&lt;span style="text-align: -webkit-auto; "&gt;&lt;b&gt;sys.date.&lt;/b&gt;&lt;/span&gt;&lt;span style="text-align: -webkit-auto; "&gt;&lt;b&gt;subtract&lt;/b&gt; function, which is used to do dates subtraction.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Matrex 2.2 needs Java 6 (jre 1.6) to run.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Georgia, serif; font-size: 100%; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Georgia, serif; font-size: 100%; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; "&gt;Here is the &lt;a href="http://sourceforge.net/projects/matrex/files/Matrex/"&gt;download link&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div style="font-family: Georgia, serif; font-size: 100%; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Georgia, serif; font-size: 100%; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; "&gt;Thanks to Braxton for the MacOSX version.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7734083083222767065?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7734083083222767065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7734083083222767065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7734083083222767065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7734083083222767065'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2012/01/matrex-22-out.html' title='Matrex 2.2 out'/><author><name>Andrea Ferrandi</name><uri>http://www.blogger.com/profile/12127633773772041446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_YTA4McFPGSk/TIJoOEvVEsI/AAAAAAAAAAM/psMFOj9bgt8/S220/andrea_avatar2_Cartoonizer_1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-6257392908287015964</id><published>2011-08-22T13:09:00.000-07:00</published><updated>2011-08-22T13:25:52.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functions 2.2 matrex'/><title type='text'>New version of Matrex</title><content type='html'>&lt;div&gt;I'm working on a new version of Matrex (2.2).&lt;/div&gt;&lt;div&gt;The purpose of this version is to &lt;b&gt;add functions&lt;/b&gt; (formulas).&lt;/div&gt;&lt;div&gt;Matrex has already &lt;a href="http://matrex.sourceforge.net/templates.html"&gt;all functions&lt;/a&gt; needed for most users, but with this version I will add functions for specific niches (e.g. financial), functions that are secondary but needed (e.g. fact, log10) and more functions to access the databases.&lt;/div&gt;&lt;div&gt;Now I am preparing a list of all the new functions, as soon as I'm finished I will start the coding. As usual, help is welcome.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-6257392908287015964?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/6257392908287015964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=6257392908287015964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6257392908287015964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6257392908287015964'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2011/08/new-version-of-matrex.html' title='New version of Matrex'/><author><name>Andrea Ferrandi</name><uri>http://www.blogger.com/profile/12127633773772041446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_YTA4McFPGSk/TIJoOEvVEsI/AAAAAAAAAAM/psMFOj9bgt8/S220/andrea_avatar2_Cartoonizer_1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1585361791374540165</id><published>2011-06-08T13:58:00.000-07:00</published><updated>2011-06-08T14:22:44.155-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rowscope file viewer large'/><title type='text'>Rowscope 1.1</title><content type='html'>I updated &lt;a href="http://rowscope.sourceforge.net"&gt;Rowscope&lt;/a&gt;, that reaches version 1.1.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-UPWn1pp3kpI/Te_jibEAiVI/AAAAAAAAACM/t_6_NEAIafw/s1600/rowscope.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 263px;" src="http://3.bp.blogspot.com/-UPWn1pp3kpI/Te_jibEAiVI/AAAAAAAAACM/t_6_NEAIafw/s400/rowscope.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5615957440873924946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rowscope fixes some problems of the previous version:&lt;div&gt;&lt;ol&gt;&lt;li&gt;It adds the &lt;b&gt;line numbers&lt;/b&gt; column, which shows the line numbers of the displayed rows in the file.&lt;/li&gt;&lt;li&gt;It has a &lt;b&gt;more compact GUI&lt;/b&gt; (the top menu has been moved on the right, the log is now displayed in a combo box). In this way it looks much better in Windows.&lt;/li&gt;&lt;li&gt;The buttons that are related to a single row (expand up/down, open a new tab from that row) are displayed &lt;b&gt;on the selected row&lt;/b&gt;; no more need to move the mouse to expand a row.&lt;/li&gt;&lt;/ol&gt;It also can use the &lt;b&gt;&lt;a href="http://gee.cs.oswego.edu/dl/papers/fj.pdf"&gt;fork-join framework&lt;/a&gt;&lt;/b&gt; (Scala 2.9) to search text in the rows, making use of multiple cores. This can improve the performances, depending by the number of cores and their use.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Rowscope got also a better icon (the previous one was too simple and flat), code has been simplified and, when possible, tested.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1585361791374540165?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1585361791374540165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1585361791374540165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1585361791374540165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1585361791374540165'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2011/06/rowscope-11.html' title='Rowscope 1.1'/><author><name>Andrea Ferrandi</name><uri>http://www.blogger.com/profile/12127633773772041446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_YTA4McFPGSk/TIJoOEvVEsI/AAAAAAAAAAM/psMFOj9bgt8/S220/andrea_avatar2_Cartoonizer_1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-UPWn1pp3kpI/Te_jibEAiVI/AAAAAAAAACM/t_6_NEAIafw/s72-c/rowscope.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4164044390596893707</id><published>2011-04-09T02:18:00.000-07:00</published><updated>2011-04-09T02:19:31.704-07:00</updated><title type='text'>Linux Magazine speaks about Matrex</title><content type='html'>The &lt;a href="http://www.linux-magazine.com/w3/issue/125/092-094_projects.pdf"&gt;link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4164044390596893707?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4164044390596893707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4164044390596893707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4164044390596893707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4164044390596893707'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2011/04/linux-magazine-speaks-about-matrex.html' title='Linux Magazine speaks about Matrex'/><author><name>Andrea Ferrandi</name><uri>http://www.blogger.com/profile/12127633773772041446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_YTA4McFPGSk/TIJoOEvVEsI/AAAAAAAAAAM/psMFOj9bgt8/S220/andrea_avatar2_Cartoonizer_1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1062793630565802099</id><published>2010-12-22T01:21:00.000-08:00</published><updated>2010-12-22T02:03:38.491-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release 2.1'/><title type='text'>Matrex 2.1 released</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;b&gt;Matrex 2.1&lt;/b&gt; has been released yesterday.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://matrexblog.blogspot.com/2010/04/matrex-20-released.html"&gt;Version 2.0&lt;/a&gt; was revolutionary because it introduced the concept of client/server; version 2.1 is more an evolution because its purpose is to help the user having &lt;b&gt;full control&lt;/b&gt; on projects and on the system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In detail, these are the big changes:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;The &lt;b&gt;grid/tables&lt;/b&gt; have now a&lt;a href="http://matrexblog.blogspot.com/2010/08/swt-table-row-header.html"&gt; real row header&lt;/a&gt;, making easier to work with them and giving them a more professional look.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;script editor&lt;/b&gt;, which was very simple, has become a small but &lt;a href="http://matrexblog.blogspot.com/2010/10/new-script-editor.html"&gt;complete IDE&lt;/a&gt; to write and test scripts. With it the user can write its own functions and can test them before he uses them in his projects.&lt;/li&gt;&lt;li&gt;For someone that uses Matrex for the first time it is very important to find out immediately how it works. To make it possible, Matrex has now a &lt;b&gt;help button&lt;/b&gt; in every window. Here is an example:&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/_YTA4McFPGSk/TRHKnOCfugI/AAAAAAAAABg/i8CUHfGI8do/s400/mx.JPG" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 179px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5553442590656805378" /&gt;&lt;/div&gt;&lt;div&gt;The other changes are less visible, but still important:&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Before 2.1 the user could change all the function templates, included the ones that come with the system. Now he can &lt;b&gt;only change templates written by users&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Fixed permission problems in the installation under Windows, allowing to install under the &lt;i&gt;Program Files&lt;/i&gt; directory.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Thanks to Braxton for building the Matrex setup &lt;/div&gt;&lt;div&gt;file for MacOSX. Here is a screenshot of Matrex under MacOSX:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/_YTA4McFPGSk/TRHL6ifjRvI/AAAAAAAAABo/tkGjqEZXrY0/s400/Screen%2Bshot%2B2010-12-18%2Bat%2B10.53.13%2BAM.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5553444022076524274" /&gt;&lt;/div&gt;&lt;div&gt;In the next version I will try to change the grid row header buttons under MacOSX to make them rectangular.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Matrex 2.1 is downloadable from &lt;a href="http://sourceforge.net/projects/matrex/files/Matrex/2.1/"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1062793630565802099?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1062793630565802099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1062793630565802099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1062793630565802099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1062793630565802099'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/12/matrex-21-released.html' title='Matrex 2.1 released'/><author><name>Andrea Ferrandi</name><uri>http://www.blogger.com/profile/12127633773772041446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_YTA4McFPGSk/TIJoOEvVEsI/AAAAAAAAAAM/psMFOj9bgt8/S220/andrea_avatar2_Cartoonizer_1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_YTA4McFPGSk/TRHKnOCfugI/AAAAAAAAABg/i8CUHfGI8do/s72-c/mx.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2844538607867487012</id><published>2010-10-24T08:18:00.000-07:00</published><updated>2010-10-30T08:31:15.076-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='script syntax highlighting editor ide test'/><title type='text'>The new script editor</title><content type='html'>Matrex has always allowed to use a &lt;b&gt;script&lt;/b&gt; language (Jython, Groovy, JRuby...) to &lt;a href="http://matrex.sourceforge.net/doc/functioncoding.pdf"&gt;write the code&lt;/a&gt; of the &lt;a href="http://matrex.sourceforge.net/help/Concepts.html#function"&gt;functions&lt;/a&gt;.&lt;br /&gt;But until now the support was limited to the following functionalities:&lt;div&gt;&lt;ul&gt;&lt;li&gt;A button in the function &lt;a href="http://matrex.sourceforge.net/help/TemplateEditor.html"&gt;template editor&lt;/a&gt; to associate a script to a function template.&lt;/li&gt;&lt;li&gt;A simple editor to write the script.&lt;/li&gt;&lt;/ul&gt;From &lt;b&gt;version 2.1&lt;/b&gt;, Matrex will have a small &lt;b&gt;IDE&lt;/b&gt; to write scripts:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YTA4McFPGSk/TMwfR7w-clI/AAAAAAAAABU/SIJrWp-LD2E/s1600/editscript.jpeg"&gt;&lt;/a&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YTA4McFPGSk/TMwfR7w-clI/AAAAAAAAABU/SIJrWp-LD2E/s1600/editscript.jpeg"&gt;&lt;img style="text-align: left;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 400px; height: 370px; " src="http://4.bp.blogspot.com/_YTA4McFPGSk/TMwfR7w-clI/AAAAAAAAABU/SIJrWp-LD2E/s400/editscript.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5533832435092845138" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The &lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;IDE&lt;/a&gt; has:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;An editor with a simple but effective &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Syntax_highlighting"&gt;syntax highlighting&lt;/a&gt;&lt;/b&gt;. For each script language defines its specific highlighting rules.&lt;/li&gt;&lt;li&gt;A &lt;b&gt;graphical test environment&lt;/b&gt; that allows to set up input &lt;a href="http://matrex.sourceforge.net/help/Concepts.html#matrix"&gt;matrices&lt;/a&gt; and &lt;a href="http://matrex.sourceforge.net/help/Concepts.html#parameters"&gt;parameters&lt;/a&gt;, with their content, and output matrices of the script. Once the matrices are set, the script can be &lt;b&gt;executed&lt;/b&gt; and the result of the script can be checked in the output matrices.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;In this way it is possible to edit the script and test it before it gets use as a Matrex function.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2844538607867487012?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2844538607867487012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2844538607867487012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2844538607867487012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2844538607867487012'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/10/new-script-editor.html' title='The new script editor'/><author><name>Andrea Ferrandi</name><uri>http://www.blogger.com/profile/12127633773772041446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_YTA4McFPGSk/TIJoOEvVEsI/AAAAAAAAAAM/psMFOj9bgt8/S220/andrea_avatar2_Cartoonizer_1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_YTA4McFPGSk/TMwfR7w-clI/AAAAAAAAABU/SIJrWp-LD2E/s72-c/editscript.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1220563461303995863</id><published>2010-09-04T09:13:00.000-07:00</published><updated>2010-09-04T09:53:16.871-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matrex 2.1 script'/><title type='text'>Matrex 2.1: status</title><content type='html'>I am working on version 2.1 of Matrex .&lt;div&gt;The work on &lt;a href="http://matrexblog.blogspot.com/2010/04/matrex-20-released.html"&gt;version 2.0&lt;/a&gt; has been completely dedicated to the conversion of Matrex from a pure standalone to a &lt;b&gt;standalone + client/server&lt;/b&gt; architecture, so I had to postpone some improvements to the GUI and the implementation of new functions.&lt;/div&gt;&lt;div&gt;Now I can finally work to implement these changes. &lt;/div&gt;&lt;div&gt;The planned changes for version 2.1 are the following:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Conversion of all the grid/tables (editors/viewers) so that they use the new &lt;a href="http://matrexblog.blogspot.com/2010/08/swt-table-row-header.html"&gt;&lt;b&gt;table row header&lt;/b&gt;&lt;/a&gt;, which has shown to work without glitches and to be extremely efficient, even with large matrices and &lt;a href="http://matrexblog.blogspot.com/2006/08/virtual-tables.html"&gt;virtual tables&lt;/a&gt;. &lt;i&gt;Already implemented&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;New &lt;b&gt;Help&lt;/b&gt; button in every window/dialog. &lt;i&gt;Already implemented&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Conversion of the script editor to a simple &lt;b&gt;script IDE&lt;/b&gt;, which allows to &lt;b&gt;test&lt;/b&gt; the function scripts before they are added to the system, and has simple &lt;b&gt;syntax coloring&lt;/b&gt;. &lt;i&gt;Working on it&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Add several &lt;b&gt;new functions&lt;/b&gt;. I think Matrex has already all the functions needed by most of the people, but I think more specialized functions are need, so that every kind of user has what he needs. &lt;i&gt;Will start soon&lt;/i&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;This is the plan, but probably some more feature will be added to version 2.1. See the &lt;a href="http://sourceforge.net/apps/trac/matrex/report/1"&gt;active tickets&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;You can have a snapshot of version 2.1 from the &lt;a href="http://sourceforge.net/scm/?type=svn&amp;amp;group_id=133398"&gt;subversion repository&lt;/a&gt;, which should always contain a working version.&lt;/div&gt;&lt;div&gt;If you want to help, you are &lt;a href="http://sourceforge.net/project/memberlist.php?group_id=133398"&gt;welcome to join the project&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1220563461303995863?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1220563461303995863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1220563461303995863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1220563461303995863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1220563461303995863'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/09/matrex-21-status.html' title='Matrex 2.1: status'/><author><name>Andrea Ferrandi</name><uri>http://www.blogger.com/profile/12127633773772041446</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://2.bp.blogspot.com/_YTA4McFPGSk/TIJoOEvVEsI/AAAAAAAAAAM/psMFOj9bgt8/S220/andrea_avatar2_Cartoonizer_1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-5776238987612350139</id><published>2010-08-03T02:57:00.000-07:00</published><updated>2010-08-04T02:47:18.722-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='table row header'/><title type='text'>SWT Table: row header</title><content type='html'>&lt;div style="text-align: left;"&gt;I always used the &lt;a href="http://www.eclipse.org/swt/widgets/"&gt;SWT Table&lt;/a&gt; as grid component for my project &lt;a href="http://matrex.sourceforge.net/"&gt;Matrex&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;The problem of this grid component is that &lt;a href="http://matrexblog.blogspot.com/2006/09/swt-table-vertical-header_115927127189610449.html"&gt;it does not have a row header&lt;/a&gt;; and this is a real problem for an application like Matrex, that is an alternative to spreadsheet applications.&lt;/div&gt;&lt;div&gt;There are&lt;a href="http://stackoverflow.com/questions/115766/a-more-advanced-table-spreadsheet-swt-implementation"&gt; alternatives&lt;/a&gt; to the SWT Table that have a row header, but even if some of them are very good I personally prefer to use the original SWT Table.&lt;/div&gt;&lt;div&gt;So I tried the fixed &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet234.java"&gt;first column horizontal scroll remaining columns&lt;/a&gt; SWT snippet, where the row header consists in &lt;b&gt;a second SWT Table&lt;/b&gt; with only one column, syncronized with the main table.&lt;/div&gt;&lt;div&gt;This solution works fine in Windows, but has the following disadvantages:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;In Gnome/Linux scrolling the table up and down the &lt;b&gt;first row can be partially hidden&lt;/b&gt; by the column header. This is not handled by the snippet, therefore from time to time the row header appears not synchronized with the table.&lt;/li&gt;&lt;li&gt;The cells of the row header table are &lt;b&gt;normal cells&lt;/b&gt;, not header cells (3D gray-button look). This can be &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet126.java?view=co"&gt;fixed&lt;/a&gt;, but it looks like for a table of 10000 rows you need to create 10000 buttons!&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So I have found a different solution, which uses a separate control for the row header, like in the snippet.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;The row header control is a panel containing a vertical set of buttons, one for each &lt;b&gt;visible&lt;/b&gt; row of the table.&lt;/div&gt;&lt;div&gt;You can see the panel on the left in the following picture (which is based on the SWT snippet &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet38.java"&gt;create a table (columns, headers, lines)&lt;/a&gt;) :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://3.bp.blogspot.com/_UV8bHZTOgQE/TFiKgL1U1uI/AAAAAAAAAKk/LnmOfV2NHqM/s400/screenshot_045.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 168px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5501299230369961698" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the picture, each button shows the index of the related row.&lt;/div&gt;&lt;div&gt;When the user &lt;b&gt;scrolls&lt;/b&gt; the table vertically, the buttons texts change accordingly.&lt;/div&gt;&lt;div&gt;If part of the row is &lt;b&gt;partially hidden&lt;/b&gt; by the column header, like in the picture, the related button is also partially hidden. &lt;/div&gt;&lt;div&gt;If the &lt;b&gt;horizontal scrollbar&lt;/b&gt; appears, the row header changes its size accordingly.&lt;/div&gt;&lt;div&gt;In synthesis, the row header is &lt;b&gt;always synchronized&lt;/b&gt; with the table.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can see a demo of the row header in this &lt;a href="http://www.screentoaster.com/watch/stUEtVREJARFtXQFVbWFJdXlVQ/swt_table_row_header"&gt;video&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;table row header&lt;/b&gt; is just a &lt;a href="http://matrex.svn.sourceforge.net/viewvc/matrex/trunk/matrex/matrex/gui/util/TableRowHeader.java?revision=453&amp;amp;view=markup"&gt;single class&lt;/a&gt;, that can be tested using &lt;a href="http://matrex.svn.sourceforge.net/viewvc/matrex/trunk/matrex/matrex/gui/util/TestTableRowHeader.java?revision=453&amp;amp;view=markup"&gt;this test class&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only complicated part of the class is the function &lt;b&gt;getOffset&lt;/b&gt;, which solves the problem of the "partially hidden first row", returning the part of the first row that is hidden.&lt;/div&gt;&lt;div&gt;It uses the SWT Table function table.getItem([point]), which returns the row at the given point.&lt;/div&gt;&lt;div&gt;With this function it can know where is the limit between the first and second row, and therefore when the first row finishes. Knowing the height of each row (table.getItemHeigh), it calculates which part of the row is hidden.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I tested it with Windows and Linux (Ubuntu) and it&lt;b&gt; works fine&lt;/b&gt;. It could be nice if someone can test it on MacOSX. There should be no problem, since it uses only documented functions in a standard way.&lt;/div&gt;&lt;div&gt;I will use it on all tables of the &lt;a href="http://matrex.sourceforge.net/"&gt;Matrex&lt;/a&gt; project.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-5776238987612350139?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/5776238987612350139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=5776238987612350139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5776238987612350139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5776238987612350139'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/08/swt-table-row-header.html' title='SWT Table: row header'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UV8bHZTOgQE/TFiKgL1U1uI/AAAAAAAAAKk/LnmOfV2NHqM/s72-c/screenshot_045.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8443958116083841316</id><published>2010-07-30T07:47:00.000-07:00</published><updated>2010-07-31T02:41:53.194-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rowscope file viewer large'/><title type='text'>Rowscope: view large files</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UV8bHZTOgQE/TFPu2n9ImQI/AAAAAAAAAKc/N0rzKeSOyME/s1600/rowscope.png"&gt;&lt;/a&gt;I had a problem in the office: I had a server application that was generating a&lt;b&gt; large log file&lt;/b&gt; every day (between 100 Megabytes and 1 Gigabytes) and, if something went wrong with the application, viewing this log file was very difficult.&lt;div&gt;I tried several file viewers, but &lt;b&gt;none of them worked&lt;/b&gt; well for me. Some of them did not show the entire row, some of them did not show all rows, some of them was slow when searching.&lt;/div&gt;&lt;div&gt;So, I went back to use notepad, which worked generally very well, but used too many resources and when the file was over the 300/400 Megabytes it was using the whole CPU and memory of the server.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I have decided to write a file viewer and to write it in &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;, also because I wanted to try this language. The new file viewer, called &lt;a href="http://rowscope.sourceforge.net/"&gt;Rowscope&lt;/a&gt;, had to be &lt;b&gt;lightweight&lt;/b&gt; and &lt;b&gt;fast&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;For this purpose, I used a &lt;b&gt;trick&lt;/b&gt;. Instead of viewing the file and then search strings in it, the user must &lt;b&gt;first enter the search string&lt;/b&gt;, then when he opens the file what he sees are &lt;b&gt;the rows resulting from the search&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;Then he can look &lt;b&gt;what's around&lt;/b&gt; one or more of the found rows.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this way, if the search string is good enough, the viewer &lt;b&gt;shows only a few rows&lt;/b&gt; and therefore uses a limited amount of memory. Clearly it reads all rows, but if they don't match the search string they are &lt;b&gt;discarded immediately&lt;/b&gt; and then garbage collected.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_UV8bHZTOgQE/TFPu2n9ImQI/AAAAAAAAAKc/N0rzKeSOyME/s400/rowscope.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5500002192155252994" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 263px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To avoid that the GUI blocks Rowscope uses multiple threads in a pipe (&lt;a href="http://www.scala-lang.org/node/242"&gt;Scala actors&lt;/a&gt;) to do the real work, and the rows are passed to the &lt;b&gt;GUI thread only when they need to be displayed&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;With the correct &lt;b&gt;settings&lt;/b&gt; for each actor (how many rows to read from the file before they get sent to the other actors, how many rows to send from one actor to the other in one shot), the application uses the correct amount of CPU and memory and remains reactive to the user input.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was a little scared when I started to use it at work. Yes, theoretically it should work, but will I use it just because I wrote it or because it really works?&lt;/div&gt;&lt;div&gt;I can say that now I use it without even thinking I am doing it, like all the other tools I use in my daily job. The &lt;b&gt;first search then view&lt;/b&gt; approach works. &lt;/div&gt;&lt;div&gt;If I don't know what to search I start it with an empty search string, just to have an idea of what the file contains. Rowscope shows only the first 1000 lines of the file. From this I find a good search string and I start to work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm preparing a new version of Rowscope. If you miss some feature or have some good idea, please let me know.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8443958116083841316?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8443958116083841316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8443958116083841316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8443958116083841316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8443958116083841316'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/07/rowscope-view-large-files.html' title='Rowscope: view large files'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UV8bHZTOgQE/TFPu2n9ImQI/AAAAAAAAAKc/N0rzKeSOyME/s72-c/rowscope.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-332444973932779604</id><published>2010-04-20T11:52:00.000-07:00</published><updated>2010-04-20T12:25:00.187-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>Matrex 2.0 released</title><content type='html'>&lt;div style="text-align: left;"&gt;Finally the version 2.0 of Matrex has been released.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_UV8bHZTOgQE/S83_YNnkyBI/AAAAAAAAAKU/f2IbH-qAZTk/s400/clientserver.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5462302714507872274" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 317px; " /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The big change is the new optional &lt;a href="http://matrex.sourceforge.net/details_clientserver.html"&gt;client/server architecture&lt;/a&gt; that allows several users to  work together on a project or for a user to delegate the calculations to a server (in the picture we see 3 Matrex Desktops sharing a project on a server run in the same PC).&lt;/div&gt;&lt;div&gt;We already told everything about this feature in the previous articles in this blog (read for example the &lt;a href="http://matrexblog.blogspot.com/2009/09/matrex-20-is-not-just-specification.html"&gt;article&lt;/a&gt; showing the steps to follow to connect to a server).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But we have other changes that are really useful.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First of all, &lt;b&gt;Matrex does not need a batch file&lt;/b&gt; to start anymore. Just double-click on the &lt;b&gt;matrex_start.jar&lt;/b&gt; file and Matrex starts (if java is configured correctly). &lt;/div&gt;&lt;div&gt;This also removes the shell/command line that was always starting together with the GUI, making the application look unprofessional.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second, Matrex gets installed on MacOSX as an&lt;b&gt; application bundle&lt;/b&gt; (packaged by Braxton), that's why its name is terminating with .app.dmg.&lt;/div&gt;&lt;div&gt;Unfortunately the application bundle can only be installed on MacOSX 64 bits. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia, times, 'times new roman', serif;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, serif;"&gt;&lt;div&gt;For the 32 bits version of MacOSX (Java 5) you will need to install the generic version, then, using a shell, go to the top Matrex directory, run:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;java -XstartOnFirstThread -jar Java/matrex_start.jar&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and follow the instructions to install the GUI library (check also the F.A.Q. about this).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-332444973932779604?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/332444973932779604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=332444973932779604' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/332444973932779604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/332444973932779604'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/04/matrex-20-released.html' title='Matrex 2.0 released'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UV8bHZTOgQE/S83_YNnkyBI/AAAAAAAAAKU/f2IbH-qAZTk/s72-c/clientserver.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8622216375244547779</id><published>2010-04-14T10:32:00.000-07:00</published><updated>2010-04-14T10:40:01.955-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screencast'/><title type='text'>Screencast: connect to server</title><content type='html'>I was not able to publish Matrex 2.0 until now, because the test took more time than I thought initially and because Braxton and me are trying to make it installable on MacOSX using an application bundle.&lt;div&gt;Hopefully in a few day the new version will be published.&lt;br /&gt;&lt;div&gt;Anyway, I made a screencast, published on ScreenToaster, on how to connect Matrex to a server on the same PC:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;object id="stUEtVREJARFtYQV9aXlJQVFBd" width="425" height="344" type="application/x-shockwave-flash" data="http://www.screentoaster.com/swf/STPlayer.swf" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0"&gt;&lt;param name="movie" value="http://www.screentoaster.com/swf/STPlayer.swf"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;param name="flashvars" value="video=stUEtVREJARFtYQV9aXlJQVFBd"&gt;&lt;/object&gt;&lt;div style="width: 425px; text-align: right;"&gt;&lt;a href="http://www.screentoaster.com/"&gt;Screencasts and videos online&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8622216375244547779?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8622216375244547779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8622216375244547779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8622216375244547779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8622216375244547779'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/04/screencast-connect-to-server.html' title='Screencast: connect to server'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-3605272089897211208</id><published>2010-03-03T12:40:00.000-08:00</published><updated>2010-03-03T13:25:34.456-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2.0 client server beta'/><title type='text'>Matrex 2.0 Beta released</title><content type='html'>A beta of the &lt;a href="http://matrexblog.blogspot.com/2009/09/matrex-20-is-not-just-specification.html"&gt;client/server version&lt;/a&gt; of Matrex, 2.0, has been released.&lt;div&gt;The plan is to release the final version in a pair of weeks, so please test it!&lt;/div&gt;&lt;div&gt;To test the client/server connection:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Install&lt;/b&gt; &lt;a href="https://sourceforge.net/projects/matrex/files/"&gt;Matrex 2.0 beta&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Follow the instructions contained in the &lt;a href="http://matrex.sourceforge.net/doc/server.pdf"&gt;server document&lt;/a&gt; (which is included in the installed documents) to install the &lt;b&gt;Matrex Server&lt;/b&gt; and start it.&lt;/li&gt;&lt;li&gt;Start &lt;b&gt;Matrex Desktop&lt;/b&gt; and connect to the server following the &lt;i&gt;Remote Projects &lt;/i&gt;section of the help content (press Ctrl-F1 in the Matrex Desktop).&lt;/li&gt;&lt;li&gt;Create a project on the server or copy a local project to the server, as described in the help content, and &lt;b&gt;play with it&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If something is not clear, please &lt;a href="http://matrex.sourceforge.net/bugs.shtml"&gt;contact me&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;If you find bugs please report them in the &lt;a href="https://sourceforge.net/tracker/?group_id=133398"&gt;trackers&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-3605272089897211208?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/3605272089897211208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=3605272089897211208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3605272089897211208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3605272089897211208'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/03/matrex-20-beta-released.html' title='Matrex 2.0 Beta released'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-5175980374425626291</id><published>2010-01-03T13:17:00.000-08:00</published><updated>2010-01-03T14:09:30.565-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discussion'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Matrex 2.0: project integrity in a multi-user system</title><content type='html'>Now it is a long time the alpha version of Matrex 2.0 was published, but a beta is still not available. The reason is that the task to make the core objects (project, matrix, function...) thread safe is complex.&lt;div&gt;Until now Matrex was a &lt;b&gt;single-user&lt;/b&gt; system. That does not guarantee against &lt;b&gt;concurrency problems&lt;/b&gt;, but makes certainly things easier than on a &lt;b&gt;multi-user&lt;/b&gt; system, like Matrex 2.0. In Matrex 2.0 a function or chart or presentation can potentially be changed by multiple users in the same time, which can lead to unpredictable results.&lt;/div&gt;&lt;div&gt;To avoid this, the work I'm doing now is to make the &lt;b&gt;project object&lt;/b&gt; not only a repository of its items (matrices, functions...) but to give it the &lt;b&gt;responsibility&lt;/b&gt; of its own integrity, and to this, the complete responsibility of adding, updating and deleting items. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Matrex 2.0 the chart editor, for example, is not able to update a chart object directly. It &lt;b&gt;tells the project how to change&lt;/b&gt; the chart object, and the project changes it, after it checked that the change is possible and does not break its own &lt;b&gt;integrity&lt;/b&gt;: charts are dependent by matrices and it could be possible that the change involves adding a matrix to it that during the chart editing gets deleted by a different user; in this case the project &lt;b&gt;rejects&lt;/b&gt; the update, the chart does not get change and the editor gets an error.&lt;/div&gt;&lt;div&gt;The project's methods are &lt;b&gt;guarded&lt;/b&gt;, so that it is impossible to do incompatible changes in the same time. For example it is not possible to delete a matrix in the same time a chart is updated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In other words the project in Matrex 2.0 looks a lot like an SQL server with transactions. The SQL server makes sure two SQL updates cannot take place on the same rows of a table in the same time and an SQL update (or a group of them) can be integrally rejected (rollback) if something goes wrong, leaving the database as it was.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;A side effect of these changes is that, since everything is done through the project, the items become more or less &lt;b&gt;read-only&lt;/b&gt; for the editors and the rest of the GUI, simplifying the system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In terms of &lt;b&gt;performance&lt;/b&gt; these changes should be in-influent. What is important for the system performance are not the items editing, but the matrices calculations that derive from it, which are much more complex and CPU consuming.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;I'm now in the middle of the work of changing project, items, editors to make them work in this way. As soon as I am finished I will publish a beta.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-5175980374425626291?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/5175980374425626291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=5175980374425626291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5175980374425626291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5175980374425626291'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2010/01/matrex-20-project-integrity-in-multi.html' title='Matrex 2.0: project integrity in a multi-user system'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-6581293589016629417</id><published>2009-10-27T06:37:00.000-07:00</published><updated>2009-10-29T14:20:55.742-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discussion import'/><title type='text'>CSV files again</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UV8bHZTOgQE/SuoFAfiLTyI/AAAAAAAAAJo/dbSU0x8r_ec/s1600-h/csvimport.png"&gt;&lt;/a&gt;The &lt;a href="http://matrexblog.blogspot.com/2009/10/matrex-20-alpha.html"&gt;alpha release&lt;/a&gt; of Matrex 2.0 solves the problem I reported about &lt;a href="http://matrexblog.blogspot.com/2009/10/large-csv-files.html"&gt;importing large CSV files&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;div&gt;Already in the previous versions Matrex used a&lt;a href="http://matrexblog.blogspot.com/2006/08/virtual-tables.html"&gt; virtual table&lt;/a&gt; to show the imported CSV files;  this means the table (grid) loads from the memory &lt;b&gt;only the rows&lt;/b&gt; that it needs to display.&lt;/div&gt;&lt;div&gt;The next step was simple: in version 2.0 &lt;b&gt;the file is not even loaded in memory&lt;/b&gt;; only the rows that are displayed are actually loaded from the file.&lt;/div&gt;&lt;div&gt;In this way the memory used to import the CSV file decreased dramatically compared to the previous versions of Matrex.&lt;/div&gt;&lt;div&gt;To avoid performance losses with this new version, Matrex keeps a &lt;b&gt;cache&lt;/b&gt; of 2000 rows from the file (the 2000 rows around the last row loaded from the file); in this way scrolling the table up and down is still fluid.&lt;/div&gt;&lt;div&gt;The following picture shows the 3 levels of the CSV file import: file, memory cache, table.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/_UV8bHZTOgQE/SuoFAfiLTyI/AAAAAAAAAJo/dbSU0x8r_ec/s320/csvimport.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5398132609379946274" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 286px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If the table is scrolled a lot up and down it can still be that many rows are loaded in memory, and released immediately after; to avoid memory losses because of this, Matrex calls directly the &lt;b&gt;garbage collector&lt;/b&gt; every 50000 rows loaded.&lt;/div&gt;&lt;div&gt;In this way it was possible to import data from the 22 MBytes CSV file for which the memory problem was reported, running Matrex without any special memory option.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This fix will be part of version 2.0, but I also &lt;b&gt;back-ported it to version 1.3.8&lt;/b&gt;, which will be published in a few days.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-6581293589016629417?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/6581293589016629417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=6581293589016629417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6581293589016629417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6581293589016629417'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/10/csv-files-again.html' title='CSV files again'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_UV8bHZTOgQE/SuoFAfiLTyI/AAAAAAAAAJo/dbSU0x8r_ec/s72-c/csvimport.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4070233028006119217</id><published>2009-10-14T21:33:00.000-07:00</published><updated>2009-10-22T13:55:10.580-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='install'/><title type='text'>Matrex 2.0 alpha</title><content type='html'>I published an &lt;b&gt;alpha&lt;/b&gt; (unstable) version of the new &lt;a href="http://matrexblog.blogspot.com/2009/07/working-on-clientserver.html"&gt;Matrex 2.0&lt;/a&gt;, which adds the possibility to use Matrex as a &lt;b&gt;client/server&lt;/b&gt; system.&lt;div&gt;You can download it from &lt;a href="http://matrex.sourceforge.net/matrex_2_0_alpha_generic.jar"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;To test it as a client/server system:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://matrex.sourceforge.net/quickstart.shtml"&gt;Install&lt;/a&gt; this version of Matrex. It is a &lt;a href="http://matrex.sourceforge.net/faq.shtml"&gt;generic&lt;/a&gt; version, so remember that when you start it the first time it will download the graphical library SWT. Only the second time you start it it will really start.&lt;/li&gt;&lt;li&gt;Install the Matrex Server. The setup file is in the Matrex directory, called &lt;b&gt;matrex_server_2_0.jar&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Execute &lt;b&gt;&lt;a href="http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/rmiregistry.html"&gt;rmiregistry&lt;/a&gt;&lt;/b&gt;. It is the RMI registry server (Matrex Desktop and Server use RMI to communicate). It is part of the Java Runtime Environment (JRE).&lt;/li&gt;&lt;li&gt;In the Matrex Server directory, execute &lt;b&gt;matrex_server.bat&lt;/b&gt; (Windows) or &lt;b&gt;matrex_server.sh&lt;/b&gt; (Linux, MacOSX...) to start the server. Check that there are no errors.&lt;/li&gt;&lt;li&gt;In the Matrex directory start Matrex.&lt;/li&gt;&lt;li&gt;Follow &lt;a href="http://matrexblog.blogspot.com/2009/09/matrex-20-is-not-just-specification.html"&gt;this&lt;/a&gt; to let Matrex open a server project.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;You can login as guest (password guest).&lt;/div&gt;&lt;div&gt;If you want to login as a different user, you need to change the &lt;b&gt;config/accounts.xml&lt;/b&gt; file in the Matrex Server directory, adding an account element with the userid and password, always setting the encrypted attribute to false.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To become final release, Matrex 2.0 needs the following changes:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Fix potential issues when a single project in one server is opened &lt;b&gt;concurrently&lt;/b&gt; by several users.&lt;/li&gt;&lt;li&gt;Some operations, like adding functions or functions expression (&lt;a href="http://matrex.sourceforge.net/help/ExpressionParser.html"&gt;expression parser&lt;/a&gt;) cause the addition or update of several items in the project. Therefore these operations must be done atomically, possibly using some kind of &lt;b&gt;transaction&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Check that the &lt;b&gt;resources&lt;/b&gt; allocated to a client in the server are cleaned up correctly when the client disconnects.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If you find problems with this alpha version, please add a comment to this article.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4070233028006119217?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4070233028006119217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4070233028006119217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4070233028006119217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4070233028006119217'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/10/matrex-20-alpha.html' title='Matrex 2.0 alpha'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-7828037223276487384</id><published>2009-10-05T12:05:00.000-07:00</published><updated>2009-10-09T13:27:01.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discussion import'/><title type='text'>Large CSV files</title><content type='html'>A &lt;a href="http://sourceforge.net/tracker/?func=detail&amp;amp;aid=2854282&amp;amp;group_id=133398&amp;amp;atid=727065"&gt;bug&lt;/a&gt; submitted the last month was showing that Matrex needs a lot of memory when i&lt;a href="http://matrex.sourceforge.net/help/ImportDialog.html"&gt;mporting large CSV files&lt;/a&gt;.&lt;div&gt;The CSV file mentioned in the bug has a size of &lt;b&gt;22 MBytes&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;The file contains around 200000 lines. Each line has 14 fields and is around 100 characters long.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To import this file the memory used by the Matrex process increases of &lt;b&gt;300 MBytes&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;The CSV file is large but it does not justify so much RAM to handle it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I checked the code that imports CSV files in Matrex; nothing is wrong.&lt;/div&gt;&lt;div&gt;Matrex uses the &lt;a href="http://sourceforge.net/projects/javacsv/"&gt;Java CSV library&lt;/a&gt; to read CSV files, which works fine.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The file is loaeded in memory  row after row.  &lt;/div&gt;&lt;div&gt;I checked how much memory is used for each loaded row. This is not easy in Java, since nothing similar to a &lt;b&gt;sizeof&lt;/b&gt; function exists in the standard libraries. But I have found the &lt;a href="http://code.google.com/p/javabi-sizeof/"&gt;Javabi library&lt;/a&gt;, which is able to measure the amount of memory used in total by a java object.&lt;/div&gt;&lt;div&gt;Each row with its &lt;b&gt;fields&lt;/b&gt; is handled as an array of &lt;b&gt;strings&lt;/b&gt;, which uses around 800 bytes, &lt;b&gt;8 times the original row's size&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;This is because:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Java strings use &lt;a href="http://leepoint.net/notes-java/data/basic_types/characters/unicode.html"&gt;Unicode&lt;/a&gt;, which means that they use 2 bytes for each character&lt;/li&gt;&lt;li&gt;Strings use &lt;a href="http://www.javamex.com/tutorials/memory/string_memory_usage.shtml"&gt;additional memory&lt;/a&gt; for their fields and  their fields alignments&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;800 bytes * 200000 rows = ~160 MBytes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As far as I understood the rest of the memory used to import the file is allocated to the intermediate strings that the CSV reader uses to read the file, and that remain allocated until the garbage collector frees them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are some solutions that could be applied to reduce the memory use:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Avoid loading all rows of the CSV file in memory&lt;/b&gt;: in other words, make the import editor extract the displayed lines directly from the file, and let it extract the lines only when they are actually displayed.&lt;br /&gt;I'm not sure about the effectiveness of this solution, because in general the user wants to import to a matrix an entire column of the file. Therefore the file, sooner or later, has to be read entirely.&lt;br /&gt;Another problem with this solution is that the Java CSV library, as far as I understood, does not allow to count the number of rows without reading them and does not allow to jump between rows without reading all the intermediate rows.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Read less fields:&lt;/b&gt; immediately at the start of the import process give the possibility to the user to discard some fields, so that they are not loaded in the import dialog.&lt;br /&gt;This can work, but I am not sure that it can dramatically reduce the amount of memory used to load the file.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Optimize the reading process so that it uses less memory&lt;/b&gt;: this means to look for an alternative to the Java CSV library that uses less memory to read the files (for example using &lt;a href="http://www.ermalaev.spb.ru/javase/6/docs/api/java/lang/CharSequence.html"&gt;CharSequence&lt;/a&gt; objects that use less memory). There are alternative libraries, for example &lt;a href="http://opencsv.sourceforge.net/"&gt;opencsv&lt;/a&gt; and the &lt;a href="http://ostermiller.org/utils/CSV.html"&gt;Ostermiller utilities&lt;/a&gt;. They need to be tested and see if they are better than the Java CSV library to reduce the used memory.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I will try to apply these solutions and explain, in one of the next articles, what has been done.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7828037223276487384?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7828037223276487384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7828037223276487384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7828037223276487384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7828037223276487384'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/10/large-csv-files.html' title='Large CSV files'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-9162501854567871177</id><published>2009-09-17T12:25:00.000-07:00</published><updated>2009-09-17T13:20:16.436-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feature'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Matrex 2.0 is not  just a specification anymore</title><content type='html'>After more than two months of work I was able in these days to let Matrex open a project in a Matrex server.&lt;br /&gt;This is how it works:&lt;br /&gt;&lt;br /&gt;In Matrex click on the menu &lt;span style="font-weight: bold;"&gt;File-&gt;Connect&lt;/span&gt;. The following dialog appears:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKR2p9YbQI/AAAAAAAAAIQ/Tphl4W4VE30/s1600-h/connect.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 161px;" src="http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKR2p9YbQI/AAAAAAAAAIQ/Tphl4W4VE30/s320/connect.jpeg" alt="" id="BLOGGER_PHOTO_ID_5382524872823434498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In this case the server is on my PC, the same one in which I run Matrex, so I write localhost as server address.&lt;br /&gt;Clicking on &lt;span style="font-weight: bold;"&gt;Names&lt;/span&gt;, the &lt;span style="font-weight: bold;"&gt;Matrex Server&lt;/span&gt; combo box is populated with the list of available servers in the PC with the given address.&lt;br /&gt;In my case there is only one server, default.&lt;br /&gt;I press OK. The &lt;span style="font-weight: bold;"&gt;login dialog&lt;/span&gt; appears:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKTCJXWk7I/AAAAAAAAAIY/KqTVm9IJbWs/s1600-h/login.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 228px; height: 242px;" src="http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKTCJXWk7I/AAAAAAAAAIY/KqTVm9IJbWs/s320/login.jpeg" alt="" id="BLOGGER_PHOTO_ID_5382526169744053170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Guest&lt;/span&gt; is the default user, with password guest. It is the user that is available by default in the server, if it has not been configured.&lt;br /&gt;I write user id and password and press OK.&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;remote machine  tab&lt;/span&gt; for the localhost server appears, beside the local machine:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UV8bHZTOgQE/SrKWY6pmaBI/AAAAAAAAAIg/6OndGKUqa8k/s1600-h/remotemachine.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 256px; height: 121px;" src="http://2.bp.blogspot.com/_UV8bHZTOgQE/SrKWY6pmaBI/AAAAAAAAAIg/6OndGKUqa8k/s320/remotemachine.jpeg" alt="" id="BLOGGER_PHOTO_ID_5382529859465930770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In the machine menu I click on Open Project. The &lt;span style="font-weight: bold;"&gt;Open Remote Project&lt;/span&gt; dialog appears:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKW0HYKWVI/AAAAAAAAAIo/pE1auynuZew/s1600-h/openremoteproject.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 246px; height: 320px;" src="http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKW0HYKWVI/AAAAAAAAAIo/pE1auynuZew/s320/openremoteproject.jpeg" alt="" id="BLOGGER_PHOTO_ID_5382530326738917714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Differently from the local projects there is only the possibility to choose in a &lt;span style="font-weight: bold;"&gt;list of projects&lt;/span&gt;. In facts on the server side the projects are all under the same directory, &lt;span style="font-style: italic;"&gt;projects&lt;/span&gt;.&lt;br /&gt;I select the example project &lt;span style="font-style: italic;"&gt;popcolorado&lt;/span&gt; and the project opens:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKXiXf16YI/AAAAAAAAAIw/FmsQqi5lwao/s1600-h/remoteproject.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 268px; height: 320px;" src="http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKXiXf16YI/AAAAAAAAAIw/FmsQqi5lwao/s320/remoteproject.jpeg" alt="" id="BLOGGER_PHOTO_ID_5382531121340082562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By now I checked that it is possible to open matrix and functions viewers and editors.&lt;br /&gt;In the next days I will check all the project's functionalities.&lt;br /&gt;As usual, the sources for the last version of Matrex are under the Matrex subversion &lt;a href="http://sourceforge.net/scm/?type=svn&amp;amp;group_id=133398"&gt;repository&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As soon as I have a version that is tested enough, I'll publish it as a pre-alpha.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-9162501854567871177?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/9162501854567871177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=9162501854567871177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/9162501854567871177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/9162501854567871177'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/09/matrex-20-is-not-just-specification.html' title='Matrex 2.0 is not  just a specification anymore'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UV8bHZTOgQE/SrKR2p9YbQI/AAAAAAAAAIQ/Tphl4W4VE30/s72-c/connect.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-7711193736345897231</id><published>2009-08-24T21:30:00.000-07:00</published><updated>2009-08-24T21:51:10.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>Matrex 1.3.7</title><content type='html'>I released version 1.3.7, which fixes the bug reported as a comment to &lt;a href="http://matrexblog.blogspot.com/2009/06/matrex-136.html"&gt;the Matrex 1.3.6 blog entry&lt;/a&gt;, and that I entered in the &lt;a href="http://sourceforge.net/tracker/?func=detail&amp;amp;aid=2832236&amp;amp;group_id=133398&amp;amp;atid=727065"&gt;Matrex bug tracker&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(0, 0, 102);"&gt;Matrex seems to forget the Project settings (threading, etc.) after a restart;&lt;/blockquote&gt;&lt;br /&gt;This was caused by Matrex not being able to overwrite the project file.&lt;br /&gt;The files are the following (in alphabetic order):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/matrex/files/Matrex/1.3.7/matrex_1_3_7_generic.jar/download"&gt;matrex_1_3_7_generic.jar&lt;/a&gt; for any platform&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/matrex/files/Matrex/1.3.7/matrex_1_3_7_linux_gtk.jar/download"&gt;matrex_1_3_7_linux_gtk.jar&lt;/a&gt; for Linux&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/matrex/files/Matrex/1.3.7/matrex_1_3_7_macosx_32.jar/download"&gt;matrex_1_3_7_macosx_32.jar&lt;/a&gt; for MacOSX with 32 bits Java (Java 5)&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/matrex/files/Matrex/1.3.7/matrex_1_3_7_macosx_64.jar/download"&gt;matrex_1_3_7_macosx_64.jar&lt;/a&gt; for MacOSX with 64 bits Java (Java 6)&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/matrex/files/Matrex/1.3.7/matrex_1_3_7_win32.jar/download"&gt;matrex_1_3_7_win32.jar&lt;/a&gt; for Windows&lt;br /&gt;&lt;br /&gt;The bug has also been fixed in the code of the next release, &lt;a href="http://matrexblog.blogspot.com/2009/07/working-on-clientserver.html"&gt;2.0&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7711193736345897231?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7711193736345897231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7711193736345897231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7711193736345897231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7711193736345897231'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/08/matrex-137.html' title='Matrex 1.3.7'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-3294802399531025745</id><published>2009-08-08T04:40:00.001-07:00</published><updated>2009-08-16T12:54:16.921-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Client/Server: technical view</title><content type='html'>As told in the previous &lt;a href="http://matrexblog.blogspot.com/2009/07/working-on-clientserver.html"&gt;article,&lt;/a&gt; I'm changing Matrex from a pure &lt;span style="font-weight: bold;"&gt;standalone&lt;/span&gt; desktop application to an application that allows to work standalone or in a &lt;span style="font-weight: bold;"&gt;client/server&lt;/span&gt; architecture.&lt;br /&gt;To support the client/server architecture I use the &lt;a href="http://en.wikipedia.org/wiki/Java_remote_method_invocation"&gt;RMI protocol&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This means that the &lt;span style="font-weight: bold;"&gt;calculation engine&lt;/span&gt;, the one that calculates the functions and therefore generates the content of matrices, presentations, charts, will be both in the desktop application and in the server.&lt;br /&gt;For this reason, the GUI has to use &lt;span style="font-weight: bold;"&gt;in the same way&lt;/span&gt; the objects involved in the calculation (projects, matrices, functions...) , whether they are on the client side or on the server side.&lt;br /&gt;To do this, the original calculation objects (projects, matrices functions,...) are wrapped in two different new categories of objects: &lt;span style="font-weight: bold;"&gt;Local&lt;/span&gt; (client) and &lt;span style="font-weight: bold;"&gt;Server&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UV8bHZTOgQE/SohbGBaAfSI/AAAAAAAAAII/9uHXyBLE5vc/s1600-h/clientserver.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 266px; height: 320px;" src="http://3.bp.blogspot.com/_UV8bHZTOgQE/SohbGBaAfSI/AAAAAAAAAII/9uHXyBLE5vc/s320/clientserver.png" alt="" id="BLOGGER_PHOTO_ID_5370642714654178594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Both the wrappers, share the same remote interface (which extends the RMI's Remote interface).&lt;br /&gt;&lt;br /&gt;The reasons I use wrappers instead of the original objectts is because all the methods of a RMI business object must throw the &lt;span style="font-weight: bold;"&gt;RemoteException&lt;/span&gt; exception.&lt;br /&gt;RemoteException is needed to understand when the server is down or there are problems of connection, so I would never do without it.&lt;br /&gt;On the other side, it becomes &lt;span style="font-weight: bold;"&gt;annoying&lt;/span&gt; to catch it every time some code calls a method of a business object, so I want to do it only when it is strictly needed.&lt;br /&gt;So I use the wrappers only in the GUI, where it is needed. Instead the calculation engine uses the original objects.&lt;br /&gt;&lt;br /&gt;Now, why Local and Server wrappers? Why not use only Server wrappers, both on the server and on the client side?&lt;br /&gt;There are several reasons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Server machines and projects have &lt;span style="font-weight: bold;"&gt;slight different interfaces&lt;/span&gt; when they are on the client and on the server side, mainly because projects on the server side can only be saved in a specific directory, projects on the client side can be saved in any directory of the disk.&lt;/li&gt;&lt;li&gt;The server wrappers extends the &lt;span style="font-weight: bold;"&gt;UnicastRemoteObject&lt;/span&gt;, local wrappers don't. I don't really understand completely how the Java compiler and RMI compiler handle these objects, so I cannot be sure that they don't have some effects on the application's performance. If these &lt;span style="font-weight: bold;"&gt;performance effects&lt;/span&gt; are needed with the server business objects, I don't want them on the local objects.&lt;/li&gt;&lt;/ul&gt;And why I did not use the original classes instead of the Local wrappers? Because I needed a special wrapper for the Matrix class when it is used in the GUI, and only when used in the GUI, called &lt;span style="font-weight: bold;"&gt;SafeMatrix&lt;/span&gt;, which makes the Matrix methods thread safe.&lt;br /&gt;But this means that all the other calculation classes need to have parameters of type SafeMatrix when called by the GUI, and instead use parameters of type Matrix when called by the calculation engine. And this means that I need special wrappers that use SafeMatrex parameters, the &lt;span style="font-weight: bold;"&gt;Local&lt;/span&gt; wrappers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, now I'm working on it. I will take some time, because in the GUI all the references to the original objects must be changed to the new remote interfaces.&lt;br /&gt;Which means:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;remote exceptions to handle.&lt;/li&gt;&lt;li&gt;utility functions to convert the original classes to the wrappers.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;some code duplication.&lt;/li&gt;&lt;li&gt;many wrappers to write, expecially for the charts, for which there is one class for each chart type.&lt;/li&gt;&lt;/ul&gt;Also, I expect to reduce the number of  methods in the calculation classes to reduce the number of remote calls.&lt;br /&gt;&lt;br /&gt;When I have something that more or less works I'll publish it as an &lt;span style="font-weight: bold;"&gt;alpha version&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-3294802399531025745?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/3294802399531025745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=3294802399531025745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3294802399531025745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3294802399531025745'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/08/clientserver-technical-view.html' title='Client/Server: technical view'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UV8bHZTOgQE/SohbGBaAfSI/AAAAAAAAAII/9uHXyBLE5vc/s72-c/clientserver.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-953632018722012383</id><published>2009-07-22T10:38:00.000-07:00</published><updated>2009-07-22T13:11:17.342-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Working on client/server</title><content type='html'>I started to work on the &lt;span style="font-weight: bold;"&gt;client/server&lt;/span&gt; version of Matrex, the 2.0.&lt;br /&gt;&lt;br /&gt;This version, as explained in the &lt;a href="http://matrex.sourceforge.net/doc/clientserver.pdf"&gt;specification&lt;/a&gt;, will give the possibility to use Matrex in two ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;standalone&lt;/span&gt;, as today&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;connected&lt;/span&gt; to one or more Matrex servers.&lt;/li&gt;&lt;/ul&gt;When Matrex opens a project in a server, all calculations for that project are done in the server: Matrex acts only as a graphical interface.&lt;br /&gt;One would open a project in a server:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;to use the &lt;span style="font-weight: bold;"&gt;CPU&lt;/span&gt; of the PC running the server instead of the one of his own PC.&lt;/li&gt;&lt;li&gt;to &lt;span style="font-weight: bold;"&gt;share&lt;/span&gt; the project with other people. In  fact two or more Matrex clients can work on the same project in the same server in the same time, without problems.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Matrex has been written from the start to become one day a client/server system, so the &lt;span style="font-weight: bold;"&gt;GUI&lt;/span&gt; will not change so much: not much more than a new menu to connect to a server (I will publish some pictures as soon as I have a stable version).&lt;br /&gt;&lt;br /&gt;The protocol used is &lt;a href="http://en.wikipedia.org/wiki/Java_remote_method_invocation"&gt;RMI&lt;/a&gt;, but I will keep the possibility to use different protocols in the future. It could be nice to have a version (based on REST?) that can work on the internet through the firewalls.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-953632018722012383?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/953632018722012383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=953632018722012383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/953632018722012383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/953632018722012383'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/07/working-on-clientserver.html' title='Working on client/server'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2313966620697657880</id><published>2009-06-30T00:06:00.000-07:00</published><updated>2009-06-30T01:09:07.117-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>Matrex 1.3.6</title><content type='html'>A few days ago the Eclipse Foundation published version 3.5 of &lt;a href="http://www.eclipse.org/swt/"&gt;SWT&lt;/a&gt;.&lt;br /&gt;I was waiting for this because it means that &lt;span style="font-weight: bold;"&gt;Mac users&lt;/span&gt; can finally use Matrex with bot Java 5 and Java 6, and with better graphics, because the new version is based on &lt;a href="http://developer.apple.com/cocoa/"&gt;Cocoa&lt;/a&gt;.&lt;br /&gt;So, as soon as this new version has become available, I have published the new version of Matrex, &lt;span style="font-weight: bold;"&gt;1.3.6&lt;/span&gt;.&lt;br /&gt;Together with the new SWT, 1.3.6 comes the following changes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There was still some &lt;span style="font-weight: bold;"&gt;incompatibilities with Java 5&lt;/span&gt;, so it was not possible to run Matrex 1.3.5 with Java 5. This problem was hitting mainly the Mac users, that could not use Java 6 because SWT was not working with it. Now I made sure this problem will not show up again.&lt;/li&gt;&lt;li&gt;From Matrex 1.3.5 maximizing the main window means &lt;span style="font-weight: bold;"&gt;maximizing only vertically&lt;/span&gt;, leaving the horizontal size of the window the same. In Windows it could happen that maximizing the main window it disappeared from the screen. In Linux from time to time the main window was becoming insensible to the mouse after the maximization. These problems got fixed.&lt;/li&gt;&lt;li&gt;Matrex is able now to read &lt;span style="font-weight: bold;"&gt;script templates&lt;/span&gt; from the script classpath defined in the Files Locations dialog. In this way also the script languages plugins (groovy, jruby...) can be installed outside the Matrex directory.&lt;/li&gt;&lt;li&gt;Minor bug fixing.&lt;/li&gt;&lt;/ul&gt;Now the versions are the follwing:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/project/downloading.php?group_id=133398&amp;amp;filename=matrex_1_3_6_win32.jar&amp;amp;a=86889384"&gt;matrex_1_3_6_win32.jar&lt;/a&gt; for Windows 32 bits.&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/project/downloading.php?group_id=133398&amp;amp;filename=matrex_1_3_6_linux_gtk.jar&amp;amp;a=41335614"&gt;matrex_1_3_6_linux_gtk.jar&lt;/a&gt; for Linux 32 bits.&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/project/downloading.php?group_id=133398&amp;amp;filename=matrex_1_3_6_macosx_32.jar&amp;amp;a=94824644"&gt;matrex_1_3_6_macosx_32.jar&lt;/a&gt; for MacOSX 32 bits (Java 5).&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/project/downloading.php?group_id=133398&amp;amp;filename=matrex_1_3_6_macosx_64.jar&amp;amp;a=42511396"&gt;matrex_1_3_6_macosx_64.jar&lt;/a&gt; for MacOSX 64 bits (Java 6).&lt;/li&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/project/downloading.php?group_id=133398&amp;amp;filename=matrex_1_3_6_generic.jar&amp;amp;a=20387807"&gt;matrex_1_3_6_generic.jar&lt;/a&gt; for all the other architectures, included Windows 64 and Linux 64 (SWT is installed the first time Matrex is started).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The choice between 32 and 64 bits depends by the Java runtime interpreter used.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2313966620697657880?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2313966620697657880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2313966620697657880' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2313966620697657880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2313966620697657880'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/06/matrex-136.html' title='Matrex 1.3.6'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1420061518974034782</id><published>2009-05-25T14:24:00.001-07:00</published><updated>2009-05-25T14:32:56.220-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discussion'/><title type='text'>About MacOSX</title><content type='html'>If you are not able to install Matrex 1.3.5 on &lt;span style="font-weight: bold;"&gt;MacOSX&lt;/span&gt;, please check the &lt;a href="http://matrexblog.blogspot.com/2009/02/matrex-on-macosx.html"&gt;article&lt;/a&gt; about this topic.&lt;br /&gt;You can download a more recent beta version of the SWT library for Cocoa &lt;a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/S-3.5M6-200903130100/swt-3.5M6-carbon-macosx.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;As soon as &lt;a href="http://wiki.eclipse.org/Galileo"&gt;Eclipse 3.5 Galileo&lt;/a&gt; will be released, I will update the setup files to use the new SWT library, which will probably solve the problem.&lt;a id="publishButton" class="cssButton" href="javascript:void(0)" target="" onclick="if (this.className.indexOf(&amp;quot;ubtn-disabled&amp;quot;) == -1) {var e = document['stuffform'].publish;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}"&gt;&lt;div class="cssButtonOuter"&gt;&lt;div class="cssButtonMiddle"&gt;&lt;div class="cssButtonInner"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1420061518974034782?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1420061518974034782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1420061518974034782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1420061518974034782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1420061518974034782'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/05/about-macosx.html' title='About MacOSX'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4691233919004788091</id><published>2009-05-23T10:33:00.000-07:00</published><updated>2009-05-23T11:33:58.121-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>Matrex 1.3.5 has been released</title><content type='html'>Matrex 1.3.5 has finally been released.&lt;br /&gt;&lt;br /&gt;It should have been called 1.4 for the new features it contains, but when the coding started it was called 1.3.5 and so it remained.&lt;br /&gt;As the notes that come in the setup file report, these are the new features:&lt;br /&gt;&lt;br /&gt;GUI:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://matrexblog.blogspot.com/2009/03/project-diagram.html"&gt;Project diagram&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Plugins dialog has been evolved to a more general &lt;span style="font-weight: bold;"&gt;locations dialog&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UV8bHZTOgQE/Shg-KQ5daqI/AAAAAAAAAHg/qwbTzSGCzlg/s1600-h/fileslocations_dialog.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 278px;" src="http://1.bp.blogspot.com/_UV8bHZTOgQE/Shg-KQ5daqI/AAAAAAAAAHg/qwbTzSGCzlg/s320/fileslocations_dialog.jpeg" alt="" id="BLOGGER_PHOTO_ID_5339085704303307426" border="0" /&gt;&lt;/a&gt;In this way it is possible to add plugins to Matrex without installing anything in its directory.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If a &lt;span style="font-weight: bold;"&gt;toolbar&lt;/span&gt; becomes too small to contain all buttons, it displays a menu containing the missing buttons:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UV8bHZTOgQE/Shg-vh2dIcI/AAAAAAAAAHo/iD6qFpM_xcM/s1600-h/toolbarwithmenu.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 246px; height: 320px;" src="http://2.bp.blogspot.com/_UV8bHZTOgQE/Shg-vh2dIcI/AAAAAAAAAHo/iD6qFpM_xcM/s320/toolbarwithmenu.jpeg" alt="" id="BLOGGER_PHOTO_ID_5339086344509268418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Progress bar&lt;/span&gt; that shows loading of the single items of a project:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UV8bHZTOgQE/Shg_Cx40EkI/AAAAAAAAAHw/04InrVgdEYk/s1600-h/progressbar.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 73px;" src="http://2.bp.blogspot.com/_UV8bHZTOgQE/Shg_Cx40EkI/AAAAAAAAAHw/04InrVgdEYk/s320/progressbar.jpeg" alt="" id="BLOGGER_PHOTO_ID_5339086675231642178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The &lt;span style="font-weight: bold;"&gt;matrix editor&lt;/span&gt; has a toolbar, to make the GUI uniform in the whole application:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UV8bHZTOgQE/Shg_jceTBJI/AAAAAAAAAH4/8EkO-Bigd3Q/s1600-h/editmatrix.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 212px;" src="http://3.bp.blogspot.com/_UV8bHZTOgQE/Shg_jceTBJI/AAAAAAAAAH4/8EkO-Bigd3Q/s320/editmatrix.jpeg" alt="" id="BLOGGER_PHOTO_ID_5339087236418962578" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Internal:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://matrexblog.blogspot.com/2009/03/matrex-easier-to-package.html"&gt;Configuration files&lt;/a&gt; containing the location of the other Matrex files (see locations dialogs). With this Matrex becomes easy to &lt;span style="font-weight: bold;"&gt;package&lt;/span&gt; for specific operating systems.&lt;/li&gt;&lt;li&gt;Able to read/write &lt;span style="font-weight: bold;"&gt;tab separated files&lt;/span&gt; (together with the CSV files).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Test:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;More &lt;span style="font-weight: bold;"&gt;unit testing&lt;/span&gt; (&gt; 280 tests). The idea is to have a set of tests to fire to check the project before each release.&lt;/li&gt;&lt;li&gt;GUI unit testing of an editor (Function Editor) with &lt;a href="http://www.eclipse.org/swtbot/"&gt;SWTBot&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Used &lt;a href="http://findbugs.sourceforge.net/"&gt;Findbugs&lt;/a&gt; annotations.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Several bugs have been fixed.&lt;br /&gt;&lt;br /&gt;You can download it &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398&amp;amp;package_id=146508"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4691233919004788091?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4691233919004788091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4691233919004788091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4691233919004788091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4691233919004788091'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/05/matrex-135-has-been-released.html' title='Matrex 1.3.5 has been released'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_UV8bHZTOgQE/Shg-KQ5daqI/AAAAAAAAAHg/qwbTzSGCzlg/s72-c/fileslocations_dialog.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-5982326485994567729</id><published>2009-05-07T11:27:00.000-07:00</published><updated>2009-05-07T11:40:09.029-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Matrex 1.3.5 almost ready.</title><content type='html'>Last tests for the version 1.3.5 of Matrex, which will be probably released in the last half of May.&lt;br /&gt;The changes are many, but surely the most important are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://matrexblog.blogspot.com/2009/03/matrex-easier-to-package.html"&gt;Flexible configuration files&lt;/a&gt;, which allow Matrex to be installed in packages or setup files.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The &lt;a href="http://matrexblog.blogspot.com/2009/03/project-diagram.html"&gt;project diagram&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;together with many bug fixes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-5982326485994567729?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/5982326485994567729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=5982326485994567729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5982326485994567729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5982326485994567729'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/05/matrex-135-almost-ready.html' title='Matrex 1.3.5 almost ready.'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-5419825181236228848</id><published>2009-03-30T12:39:00.000-07:00</published><updated>2009-04-10T12:02:37.599-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feature'/><title type='text'>Project diagram</title><content type='html'>Matrex version 1.3.5 will have the possibility to show the project in form of a diagram.&lt;br /&gt;Here is the diagram for the example project &lt;span style="font-style: italic;"&gt;projection&lt;/span&gt;, that is included in the Matrex setup:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UV8bHZTOgQE/SdEmKmVaF0I/AAAAAAAAAHY/rt4fsHvB9Hs/s1600-h/diagram.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 191px;" src="http://4.bp.blogspot.com/_UV8bHZTOgQE/SdEmKmVaF0I/AAAAAAAAAHY/rt4fsHvB9Hs/s320/diagram.jpeg" alt="" id="BLOGGER_PHOTO_ID_5319074598432151362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It shows all &lt;span style="font-weight: bold;"&gt;items&lt;/span&gt; of the projects (but timers) and their &lt;span style="font-weight: bold;"&gt;connections&lt;/span&gt;.&lt;br /&gt;Each item is labeled with its &lt;span style="font-weight: bold;"&gt;type&lt;/span&gt; (matrix, function...), each connection is displayed as an &lt;span style="font-weight: bold;"&gt;arrow&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Compared to the &lt;a href="http://matrex.sourceforge.net/help/MainWindow.html#Trees"&gt;item trees&lt;/a&gt; and to the &lt;a href="http://matrex.sourceforge.net/help/InformationView.html"&gt;information views&lt;/a&gt;, the project diagram has the advantage that It gives a &lt;span style="font-weight: bold;"&gt;global overview&lt;/span&gt; of the project. In one single window it is possible to see all items of the project.&lt;br /&gt;&lt;br /&gt;The meaning of the arrows is the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An arrow from a matrix to a function means that the matrix is input of the function&lt;/li&gt;&lt;li&gt;An arrow from a function to a matrix means that the matrix is output (result) of the function&lt;/li&gt;&lt;li&gt;An arrow from a matrix to a presentation or chart means that the matrix is used in the presentation or chart.&lt;/li&gt;&lt;/ul&gt;Since a project can contain many items and therefore many connections among them items, the project diagram can become &lt;span style="font-weight: bold;"&gt;complex&lt;/span&gt;.&lt;br /&gt;To make it easier to understand it, it is possible to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Click on an &lt;span style="font-weight: bold;"&gt;item&lt;/span&gt;: the item becomes &lt;span style="color: rgb(51, 204, 0); font-weight: bold;"&gt;green&lt;/span&gt; and all the connected items and their arrows become &lt;span style="color: rgb(51, 51, 255); font-weight: bold;"&gt;blue&lt;/span&gt; (in) and &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;red&lt;/span&gt; (out).&lt;/li&gt;&lt;li&gt;Click on one of the items &lt;span style="font-weight: bold;"&gt;type&lt;/span&gt; on the tool bar: all the items of that type become &lt;span style="color: rgb(51, 204, 0); font-weight: bold;"&gt;green&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In the tool bar there is also a button to &lt;span style="font-weight: bold;"&gt;print&lt;/span&gt; the diagram.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-5419825181236228848?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/5419825181236228848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=5419825181236228848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5419825181236228848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5419825181236228848'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/03/project-diagram.html' title='Project diagram'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UV8bHZTOgQE/SdEmKmVaF0I/AAAAAAAAAHY/rt4fsHvB9Hs/s72-c/diagram.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8243488586622212340</id><published>2009-03-09T13:08:00.000-07:00</published><updated>2009-03-16T13:31:49.954-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feature'/><title type='text'>Matrex easier to package</title><content type='html'>Until now once you installed Matrex in a directory, Matrex used the same directory to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;write its &lt;span style="font-weight: bold;"&gt;log file&lt;/span&gt;&lt;/li&gt;&lt;li&gt;write the changes to its &lt;span style="font-weight: bold;"&gt;configuration files&lt;/span&gt;&lt;/li&gt;&lt;li&gt;write &lt;span style="font-weight: bold;"&gt;additional templates&lt;/span&gt; &lt;/li&gt;&lt;li&gt;write &lt;span style="font-weight: bold;"&gt;scripts&lt;/span&gt; used as base of templates&lt;/li&gt;&lt;/ul&gt;This is natural for a java application that is installed with a java installer and does not pretend to integrate with the platform in which it is installed.&lt;br /&gt;&lt;br /&gt;But what if we want to create &lt;span style="font-weight: bold;"&gt;installers for specific platforms&lt;/span&gt; (Windows setup, MacOSX application bundles, Linux .deb and .rpm files)?&lt;br /&gt;In this case:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it is the operating system that &lt;span style="font-weight: bold;"&gt;defines&lt;/span&gt; in which directory or directories Matrex is installed. &lt;/li&gt;&lt;li&gt;Matrex cannot write the files it produces (templates, configurations, log...) in the directories in which it is installed, but must use a &lt;span style="font-weight: bold;"&gt;writable directory&lt;/span&gt;, which can be under &lt;span style="font-style: italic;"&gt;Documents and Settings&lt;/span&gt; in Windows or  under the home directory in Linux.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Version 1.3.5 will make this possible with two changes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the new configuration file &lt;span style="font-weight: bold;"&gt;main.properties&lt;/span&gt;, which contains the paths of all other configuration files (which can contain environment variables).&lt;/li&gt;&lt;li&gt;the new concept of configuration files that contain the &lt;span style="font-weight: bold;"&gt;locations&lt;/span&gt; of other files.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The configuration files that contain the locations of other files are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;templates.cld&lt;/span&gt;, which contains the paths of the top directories of directory trees containing functions templates.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;plugins.cld&lt;/span&gt;, which contains the directories and jar files containing additional java classes used as plugins and their dependencies.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;scrips.cld&lt;/span&gt;, which contains the top directories of directory trees containing scripts used by templates.&lt;/li&gt;&lt;/ul&gt;With the addition of &lt;span style="font-weight: bold;"&gt;main.properties&lt;/span&gt; and of the &lt;span style="font-weight: bold;"&gt;.cld&lt;/span&gt; files it is possible to have the configuration files that change after the installation and additional templates, java classes and scripts in writable directories.&lt;br /&gt;In this way anyone can change these files, add them or delete them without touching the original installation.&lt;br /&gt;&lt;br /&gt;It will be then easy to install Matrex:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In Windows in a directory under the &lt;span style="font-style: italic;"&gt;Program Files&lt;/span&gt; directory, with the additional files and the writable configuration files in a directory under &lt;span style="font-style: italic;"&gt;Documents and Settings&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;In Linux in the standard directories (&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;/usr/bin, usr/share...), &lt;/span&gt;&lt;/span&gt;with the additional files and the writable configuration files in a directory (.matrex ?) under the home directory.&lt;/li&gt;&lt;li&gt;In MacOSX in a directory under the &lt;span style="font-style: italic;"&gt;Applications&lt;/span&gt; directory, with the additional files and the writable configuration files in a directory under &lt;span style="font-style: italic;"&gt;Users&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;I tested this new feature installing version 1.3.5 under a &lt;span style="font-weight: bold;"&gt;read-only&lt;/span&gt; directory and configuring it so that it keeps all the files that need to be changed under a writable directory.&lt;br /&gt;It works fine.&lt;br /&gt;As soon as possible I will release a beta of this version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8243488586622212340?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8243488586622212340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8243488586622212340' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8243488586622212340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8243488586622212340'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/03/matrex-easier-to-package.html' title='Matrex easier to package'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8118804318839447543</id><published>2009-02-26T12:18:00.000-08:00</published><updated>2009-02-26T13:28:35.572-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><title type='text'>ToolBarWithMenu component</title><content type='html'>The SWT &lt;span style="font-weight: bold;"&gt;ToolBar component&lt;/span&gt; has a minor problem: when there is no space enough to show all the buttons contained in the ToolBar, it just shows the first ones.&lt;br /&gt;It is true that the &lt;span style="font-weight: bold;"&gt;SWT.WRAP&lt;/span&gt; property partially fixes the problem wrapping the buttons in two or more lines, but this does not work in some platforms (e.g. Linux) in which the property is ignored.&lt;br /&gt;This can be a problem, because the user of the application can be completely &lt;span style="font-weight: bold;"&gt;unaware&lt;/span&gt; of the buttons that are not displayed.&lt;br /&gt;I have seen other graphical libraries solve this problem adding an additional button at the end of the toolbar. This button when clicked shows a menu with the missing buttons.&lt;br /&gt;So I adopted the same logic in SWT: I made a class called &lt;a href="http://matrex.svn.sourceforge.net/viewvc/matrex/trunk/matrex/matrex/gui/util/ToolBarWithMenu.java?view=markup"&gt;ToolBarWithMenu&lt;br /&gt;&lt;/a&gt;, which &lt;span style="font-weight: bold;"&gt;adds a button at the start&lt;/span&gt; of the toolbar. The button has a menu showing the buttons that are not displayed in the toolbar because there is no space. Here is an example in &lt;a href="http://matrex.sourceforge.net/"&gt;Matrex&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UV8bHZTOgQE/Sab5b0OsunI/AAAAAAAAAHI/emqo3xbZBDA/s1600-h/toolbarwithmenu.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 270px;" src="http://4.bp.blogspot.com/_UV8bHZTOgQE/Sab5b0OsunI/AAAAAAAAAHI/emqo3xbZBDA/s320/toolbarwithmenu.jpeg" alt="" id="BLOGGER_PHOTO_ID_5307203467174787698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Clicking on one of the menu items has the same effect as clicking on the related toolbar button.&lt;br /&gt;It works as expected also for a button with an &lt;span style="font-weight: bold;"&gt;attached menu&lt;/span&gt;, if the button's selection listener that shows the menu implements the &lt;a href="http://matrex.svn.sourceforge.net/viewvc/matrex/trunk/matrex/matrex/gui/util/IHasMenu.java?view=markup"&gt;IHasMenu&lt;/a&gt; interface.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8118804318839447543?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8118804318839447543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8118804318839447543' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8118804318839447543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8118804318839447543'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/02/toolbarwithmenu-component.html' title='ToolBarWithMenu component'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UV8bHZTOgQE/Sab5b0OsunI/AAAAAAAAAHI/emqo3xbZBDA/s72-c/toolbarwithmenu.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-929086346444396410</id><published>2009-02-26T00:41:00.000-08:00</published><updated>2009-02-26T02:13:13.186-08:00</updated><title type='text'>Matrex on MacOSX</title><content type='html'>&lt;h4&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;Matrex &lt;/span&gt;uses the &lt;span style="font-weight: bold;"&gt;SWT&lt;/span&gt; library for its GUI. SWT uses the native GUI of the platform.  The current version of Matrex, 1.3, uses SWT &lt;span style="font-weight: bold;"&gt;3.4&lt;/span&gt;.&lt;br /&gt;On MacOSX SWT 3.4 is based on Carbon, which is only 32 bits.&lt;br /&gt;So Matrex 1.3 on MacOSX does not work using &lt;span style="font-weight: bold;"&gt;Java 1.6&lt;/span&gt; (Java 6), which is only 64 bits and therefore not compatible with Carbon.&lt;br /&gt;If you want to use Matrex 1.3 in MacOSX please either:&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;run it with Java 1.5 (Java 5) instead of Java 1.6&lt;/li&gt;&lt;li&gt;try the &lt;a href="http://download.eclipse.org/eclipse/downloads/drops/S-3.5M5-200902021535/download.php?dropFile=swt-3.5M5-cocoa-macosx-x86_64.zip"&gt;beta version of SWT 3.5 for Cocoa 64 bits&lt;/a&gt;.  Download the zip file and unzip it in the &lt;matrex&gt;/swt directory, where &lt;matrex&gt; is the directory where you installed Matrex.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;&lt;span style="font-weight: normal;"&gt;The following is the description of the SWT 3.4 problem written by the SWT developers:&lt;/span&gt;&lt;br /&gt;&lt;/h4&gt;&lt;h4&gt;SWT cannot be used with OS X JRE version 1.6 (Mac OSX only)&lt;/h4&gt; &lt;p&gt;OS X JRE version 1.6 assumes that pointers have a size of 64 bits, but SWT's Carbon port only uses 32-bit pointers, so SWT and Eclipse cannot be used with OS X JRE version 1.6.  The workaround is to use an earlier supported version of the OS X JRE. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-929086346444396410?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/929086346444396410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=929086346444396410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/929086346444396410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/929086346444396410'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/02/matrex-on-macosx.html' title='Matrex on MacOSX'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1479173488009124452</id><published>2009-02-22T12:55:00.000-08:00</published><updated>2009-02-22T13:18:41.192-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Updated Matrex adapter to Scilab</title><content type='html'>The Matrex &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398&amp;amp;package_id=181365"&gt;adapter&lt;/a&gt; to &lt;a href="http://www.scilab.org/"&gt;Scilab&lt;/a&gt; has been updated for Matrex 1.3.5.&lt;br /&gt;The adapter has been tested with Scilab 5.1.&lt;br /&gt;&lt;br /&gt;The adapter contains a special function template that &lt;span style="font-weight: bold;"&gt;calls Scilab functions to calculate Matrex functions&lt;/span&gt;.&lt;br /&gt;Input matrices and parameters of the Matrex function are passed to the related Scilab functions, which is calculated. The result of the Scilab function is passed back to Matrex as output matrices of the Matrex function.&lt;br /&gt;&lt;br /&gt;More information can be found in the documentation included in the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398&amp;amp;package_id=181365"&gt;Scilab adapter setup&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1479173488009124452?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1479173488009124452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1479173488009124452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1479173488009124452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1479173488009124452'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/02/updated-matrex-adapter-to-scilab.html' title='Updated Matrex adapter to Scilab'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-7837724970307487342</id><published>2009-02-22T12:18:00.000-08:00</published><updated>2009-02-22T12:39:19.590-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>New Matrex adapter to Groovy</title><content type='html'>I released in these days the new Matrex &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=133398&amp;amp;package_id=311017"&gt;adapter&lt;/a&gt; to the &lt;a href="http://groovy.codehaus.org/"&gt;Groovy language&lt;/a&gt;.&lt;br /&gt;This follows the two adapters to &lt;a href="http://www.jython.org/"&gt;Jython&lt;/a&gt; (integrated in Matrex) and to &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt;.&lt;br /&gt;This adapter is good:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;for fast &lt;span style="font-weight: bold;"&gt;prototyping&lt;/span&gt; and test of function templates&lt;br /&gt;&lt;/li&gt;&lt;li&gt;to write more &lt;span style="font-weight: bold;"&gt;compact code&lt;/span&gt; than in Java&lt;br /&gt;&lt;/li&gt;&lt;li&gt;to use &lt;span style="font-weight: bold;"&gt;features&lt;/span&gt;, for example closures, that are not available in Java&lt;/li&gt;&lt;/ul&gt;Like the other language adapters it used in this way:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;create a Groovy &lt;span style="font-weight: bold;"&gt;script&lt;/span&gt; with the code for the function template&lt;/li&gt;&lt;li&gt;create the function template &lt;span style="font-weight: bold;"&gt;definition&lt;/span&gt;&lt;/li&gt;&lt;li&gt;use the function template to &lt;span style="font-weight: bold;"&gt;create functions&lt;/span&gt; in Matrex projects&lt;/li&gt;&lt;/ol&gt;More information can be found in the documentation included in the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398&amp;amp;package_id=311017"&gt;Groovy adapter setup&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="http://www.blogger.com/img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7837724970307487342?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7837724970307487342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7837724970307487342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7837724970307487342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7837724970307487342'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/02/new-and-updated-adapters.html' title='New Matrex adapter to Groovy'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-6089637730216248314</id><published>2009-01-25T23:23:00.000-08:00</published><updated>2009-01-25T23:34:58.585-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Subversion</title><content type='html'>For who is interested in the Matrex code, I'm moving Matrex and all its satellite projects to &lt;span style="font-weight: bold;"&gt;Subversion &lt;/span&gt;(SVN).&lt;br /&gt;With CVS I was always adding to the repository a lot of files by mistake and was never able to really remove them.&lt;br /&gt;&lt;br /&gt;For more information just go to the Matrex SVN page in &lt;a href="http://sourceforge.net/svn/?group_id=133398"&gt;Sourceforge.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As soon as possible I will move to Subversion also &lt;a href="http://isqllibrary.sourceforge.net/"&gt;Internal SQL Library&lt;/a&gt; and &lt;a href="http://osdepinstaller.sourceforge.net/"&gt;SWT Web Installer&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-6089637730216248314?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/6089637730216248314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=6089637730216248314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6089637730216248314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6089637730216248314'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2009/01/subversion.html' title='Subversion'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-757093460196298139</id><published>2008-11-29T06:51:00.000-08:00</published><updated>2008-11-29T09:15:15.883-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plans'/><title type='text'>Plans</title><content type='html'>These are the plans for the future of Matrex, in order of time:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Upgrade&lt;/span&gt; all &lt;a href="http://matrex.sourceforge.net/addins.shtml"&gt;adapters to libraries, script languages and scientific applications&lt;/a&gt; to work with the  version &lt;span style="font-weight: bold;"&gt;1.3.x&lt;/span&gt; of Matrex, which uses a new &lt;span style="font-weight: bold;"&gt;plugins architecture&lt;/span&gt;. I already upgraded the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398&amp;amp;package_id=181368"&gt;Jama adapter&lt;/a&gt; and I'm working on the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398&amp;amp;package_id=182807"&gt;JRuby adapter&lt;/a&gt;. Clearly if there are new versions of the libraries, languages and applications the adapters will work with them.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;New adapter&lt;/span&gt; to the &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; interpreter.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;New intermediate version of Matrex, probably called &lt;span style="font-weight: bold;"&gt;1.3.5&lt;/span&gt;. This version will not contain major changes from version 1.3. The idea is to make possible to have configuration files and additional templates in different directories. In this way it is possible to build &lt;span style="font-weight: bold;"&gt;.deb or .rpm setup packages&lt;/span&gt; for Matrex and make it easier to use under Vista and MacOSX.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;New version &lt;span style="font-weight: bold;"&gt;2.0&lt;/span&gt;: It will be possible to use Matrex as a standalone application, like now, or as a &lt;a href="http://matrex.sourceforge.net/doc/clientserver.pdf"&gt;client/server system&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;The upgrade of the adapters and the Groovy adapter will be done in the next weeks.&lt;br /&gt;Versions 1.3.5 will be probably finished in ~ 2/3 months.&lt;br /&gt;2.0 will be finished in ~ 6 months.&lt;br /&gt;Versions 1.3.5 and version 2.0 will be developed in parallel.&lt;br /&gt;&lt;br /&gt;In the same time Braxton and me are trying to build a setup file to install Matrex on MacOSX as an &lt;a href="http://www.eclipse.org/swt/macosx/"&gt;application bundle&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-757093460196298139?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/757093460196298139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=757093460196298139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/757093460196298139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/757093460196298139'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/11/plans.html' title='Plans'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-6865758672778475690</id><published>2008-11-26T23:43:00.000-08:00</published><updated>2008-11-27T12:16:32.235-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Compatibility with Java5 : Matrex 1.3.01</title><content type='html'>I published a new release of Matrex,  1.3.01, to cope with the fact that Matrex 1.3 was able to run with Java6, but not with Java5.&lt;br /&gt;The problem was a call to the String.isEmpty() method, which is only available from Java6.&lt;br /&gt;In 1.3.01 this call has been replaced and this version has been tested with Java5.&lt;br /&gt;&lt;br /&gt;Thanks to Braxton who found the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-6865758672778475690?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/6865758672778475690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=6865758672778475690' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6865758672778475690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6865758672778475690'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/11/compatibility-with-java5-matrex-1301.html' title='Compatibility with Java5 : Matrex 1.3.01'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4329825658310764636</id><published>2008-11-12T11:13:00.000-08:00</published><updated>2008-11-12T12:03:37.738-08:00</updated><title type='text'>Matrex 1.3 relased</title><content type='html'>So we finally made it. Version 1.3 has been released!&lt;br /&gt;&lt;br /&gt;A summary of the changes from version 1.2 is available in the  Sourceforge's &lt;a href="http://sourceforge.net/project/shownotes.php?group_id=133398&amp;amp;release_id=639823"&gt;release notes&lt;/a&gt;.&lt;br /&gt;The big changes have been:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Main View usability improvement&lt;/span&gt;.&lt;br /&gt;The &lt;a href="http://matrexblog.blogspot.com/2008/06/changes-in-main-window.html"&gt;main view is now easier to use&lt;/a&gt; thanks to the buttons that hide and show specific trees (for example you can hide the function tree and show the presentation tree just clicking two buttons).&lt;br /&gt;&lt;br /&gt;It is also possible to &lt;span style="font-weight: bold;"&gt;search&lt;/span&gt; items or folders in a tree just typing a part of its name (in red).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UV8bHZTOgQE/SRsvNX904oI/AAAAAAAAAE0/2bJeF45NdgE/s1600-h/newmaingui.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 184px; height: 320px;" src="http://3.bp.blogspot.com/_UV8bHZTOgQE/SRsvNX904oI/AAAAAAAAAE0/2bJeF45NdgE/s320/newmaingui.jpeg" alt="" id="BLOGGER_PHOTO_ID_5267856095958065794" border="0" /&gt;&lt;/a&gt;In each tree is not possible to &lt;span style="font-weight: bold;"&gt;move&lt;/span&gt; a set of items  to a package.&lt;br /&gt;Just select some items of a tree (also in different packages), right-click with them mouse on the tree to display the popup menu and select &lt;span style="font-weight: bold;"&gt;Move...&lt;/span&gt; (for example Move Matrices). With a dialog box you choose the destination package and the items gets moved.&lt;br /&gt;The system takes care of the dependencies.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Viewers usability improvement &lt;/span&gt;. In the presentation viewer and matrix viewer it is now possible to display the content of presentations and matrices in the best way clicking the &lt;a href="http://matrexblog.blogspot.com/2008/06/fit-columns.html"&gt;fit columns button&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UV8bHZTOgQE/SRs2aemvdAI/AAAAAAAAAFU/TolmfYCiUhs/s1600-h/viewpresentation.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_UV8bHZTOgQE/SRs2aemvdAI/AAAAAAAAAFU/TolmfYCiUhs/s320/viewpresentation.jpeg" alt="" id="BLOGGER_PHOTO_ID_5267864017659982850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Generic setup&lt;/span&gt;. The Matrex generic setup allows to install Matrex on every platform. The idea is that, once installed, when executed the first time, Matrex downloads the correct version of the SWT library and installs it.&lt;br /&gt;Executing it once again, the downloaded library is used and Matrex works regularly.&lt;br /&gt;All thanks to the &lt;a href="http://osdepinstaller.sourceforge.net/"&gt;SWT Web Installer&lt;/a&gt; library.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;New high low charts&lt;/span&gt;. Added candle and high low charts.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UV8bHZTOgQE/SRszSeFPZuI/AAAAAAAAAFE/rkvA4LNGqMs/s1600-h/chart_highlow.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 207px;" src="http://2.bp.blogspot.com/_UV8bHZTOgQE/SRszSeFPZuI/AAAAAAAAAFE/rkvA4LNGqMs/s320/chart_highlow.jpeg" alt="" id="BLOGGER_PHOTO_ID_5267860581545633506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Plug-in architecture&lt;/span&gt;. Matrex now uses its own class loader, which allows to specify libraries (e.g. function template libraries) that need to be loaded using the Plugin Dialog:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UV8bHZTOgQE/SRs0Qw5n7UI/AAAAAAAAAFM/KFlPQcD2anE/s1600-h/plugins.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 186px;" src="http://4.bp.blogspot.com/_UV8bHZTOgQE/SRs0Qw5n7UI/AAAAAAAAAFM/KFlPQcD2anE/s320/plugins.jpeg" alt="" id="BLOGGER_PHOTO_ID_5267861651749072194" border="0" /&gt;&lt;/a&gt;No more class paths to change in the batch files!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Code quality improvement&lt;/span&gt;. The code is now well covered with JUnit tests and has been checked with &lt;a href="http://findbugs.sourceforge.net/"&gt;Findbugs&lt;/a&gt;. The GUI has also been unit tested using &lt;a href="http://matrexblog.blogspot.com/2008/09/swtbot-for-dialogs.html"&gt;SWTBot&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Also the experimental new feature of the &lt;a href="http://matrexblog.blogspot.com/2008/08/callbacks.html"&gt;callbacks&lt;/a&gt; has been added. It is used in the &lt;span style="font-weight: bold;"&gt;directsearch&lt;/span&gt; example project, which demonstrates the Nelder Mead optimization method.&lt;br /&gt;&lt;br /&gt;As usual, feedback is precious. Please &lt;a href="http://matrex.sourceforge.net/bugs.shtml"&gt;let me know&lt;/a&gt; if something is wrong!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4329825658310764636?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4329825658310764636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4329825658310764636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4329825658310764636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4329825658310764636'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/11/matrex-13-relased.html' title='Matrex 1.3 relased'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_UV8bHZTOgQE/SRsvNX904oI/AAAAAAAAAE0/2bJeF45NdgE/s72-c/newmaingui.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-6294646964500836610</id><published>2008-10-17T01:25:00.001-07:00</published><updated>2008-10-17T02:45:34.538-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>SWT Web Installer and ISQL Library updated</title><content type='html'>Since I published the pre-release of Matrex 1.3, I also updated the two libraries that Matrex uses, &lt;a href="http://osdepinstaller.sourceforge.net/"&gt;SWT Web Installer&lt;/a&gt; (now 1.0) and &lt;a href="http://isqllibrary.sourceforge.net/"&gt;ISQL Library&lt;/a&gt; (now 1.01). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SWT Web Installer downloads now SWT 3.4 instead of 3.3.1 and has a small change to the &lt;a href="http://osdepinstaller.sourceforge.net/doc/osdep/WebDownloader.html"&gt;WebInstaller&lt;/a&gt; class constructor (new parameter systemProperties).&lt;/div&gt;&lt;div&gt;I also added a &lt;a href="http://osdepinstaller.sourceforge.net/doc/osdep/configuration/SitesAndConfigurationsTest.html#testSites()"&gt;test &lt;/a&gt;that verifies that all sites in the swt_list.xml configuration file exist and are accessible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ISQL Library had a small bug related to the conditions of the query's where clause. That has been fixed in version 1.01.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have checked both libraries with &lt;a href="http://findbugs.sourceforge.net/"&gt;Findbugs &lt;/a&gt;before I published them. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-6294646964500836610?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/6294646964500836610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=6294646964500836610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6294646964500836610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6294646964500836610'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/10/swt-web-installer-and-isql-library.html' title='SWT Web Installer and ISQL Library updated'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-7983789034410467256</id><published>2008-10-16T23:34:00.001-07:00</published><updated>2008-10-17T00:18:22.122-07:00</updated><title type='text'>Matrex 1.3 pre-release</title><content type='html'>I published a pre-release version of Matrex 1.3.&lt;div&gt;You can find it under the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398&amp;amp;package_id=295491"&gt;Matrex Unstable&lt;/a&gt; download section in SourceForge.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The changes from version 1.2 are listed under the Matrex &lt;a href="http://sourceforge.net/project/shownotes.php?group_id=133398&amp;amp;release_id=633828"&gt;File Release Notes and Changelog&lt;/a&gt; page in SourceForge.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The idea is to make sure that if there are bugs in Matrex 1.3 they get fixed before the final version is released.&lt;/div&gt;&lt;div&gt;So &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;please give a try&lt;/span&gt; to this version and, if you find bugs, use the &lt;a href="http://sourceforge.net/tracker/?group_id=133398"&gt;tracker&lt;/a&gt; page in Sourceforge to report them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The pre-release version includes only the setup for the&lt;span class="Apple-style-span" style="font-weight: bold;"&gt; generic architecture&lt;/span&gt;, which means that when you start Matrex the first time it is supposed to &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;download &lt;/span&gt;the &lt;a href="http://www.eclipse.org/swt/"&gt;SWT library&lt;/a&gt; for your PC.&lt;/div&gt;&lt;div&gt;After that Matrex stops, so you need to start it once again to use it.&lt;/div&gt;&lt;div&gt;The download of SWT is a new feature, so if you have problems with it please use the &lt;a href="http://sourceforge.net/tracker/?group_id=133398"&gt;tracker&lt;/a&gt; page to report them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7983789034410467256?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7983789034410467256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7983789034410467256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7983789034410467256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7983789034410467256'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/10/matrex-13-pre-release.html' title='Matrex 1.3 pre-release'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8664619618765528447</id><published>2008-09-13T09:38:00.001-07:00</published><updated>2008-09-13T09:38:42.118-07:00</updated><title type='text'>SWTBot for dialogs</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I started writing &lt;b&gt;&lt;a href='http://www.junit.org/'&gt;JUnit&lt;/a&gt; test cases&lt;/b&gt; to test the &lt;b&gt;GUI&lt;/b&gt; of Matrex using &lt;b&gt;&lt;a href='http://swtbot.sourceforge.net'&gt;SWTBot&lt;/a&gt;&lt;/b&gt;.&lt;br/&gt;&lt;br/&gt;Since I did not have any experience with GUI testing, I wanted to start with something simple.&lt;br/&gt;The simplest GUI items to test in Matrex are the &lt;b&gt;dialogs&lt;/b&gt;, since they do something specific and limited.&lt;br/&gt;So I started writing test cases to test dialogs.&lt;br/&gt;&lt;br/&gt;It turned out that testing dialogs is &lt;b&gt;not so easy&lt;/b&gt; as it seems (and this is a general problem, not limited to SWTBot). &lt;br/&gt;With SWTBot you simulate the &lt;b&gt;actions&lt;/b&gt; of your application's user: press buttons, write in text boxes, select from list and check boxes...&lt;br/&gt;But you cannot simply open a dialog and simulate the user's actions: dialogs are &lt;b&gt;modal&lt;/b&gt;, which means that the function that opens a dialog cannot continue until it is closed.&lt;br/&gt;So, simulating the actions &lt;b&gt;before&lt;/b&gt; the dialog is open &lt;b&gt;does not work&lt;/b&gt; because there is no dialog; simulating the actions &lt;b&gt;after&lt;/b&gt; the dialog is closed &lt;b&gt;does not work&lt;/b&gt; because there is no dialog.&lt;br/&gt;&lt;br/&gt;There are two practical solutions to this problem:&lt;br/&gt;&lt;ol&gt;&lt;li&gt;make the dialog &lt;b&gt;not modal&lt;/b&gt;&lt;/li&gt;&lt;li&gt;open the dialog in the main thread and simulate the user's action in a &lt;b&gt;secondary thread&lt;/b&gt;.&lt;br/&gt;&lt;/li&gt;&lt;/ol&gt;The first option is not possible in my case. The dialogs are opened by factory methods and I cannot change the code in these methods only to test them.&lt;br/&gt;Moreover, if a second dialog gets opened by the first dialog we have the same problem again.&lt;br/&gt;&lt;br/&gt;So I used threads.&lt;br/&gt;I wrote a class for this purpose, &lt;a href='http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/gui/util/swtbot/SWTBotDialogTestThread.java?view=markup' target='_blank'&gt;SWTBotDialogTestThread&lt;/a&gt;. An example of use of this class is in &lt;br/&gt;the test case &lt;a href='http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/gui/util/InputDialogHandlerTest.java?view=markup' target='_blank'&gt;InputDialogHandlerTest&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;The right way to use a thread that acts on the SWT GUI is to call the function &lt;a href='http://help.eclipse.org/help32/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html#asyncExec%28java.lang.Runnable%29'&gt;Display.asyncExec&lt;/a&gt; on the dialog's display, otherwise the GUI becomes unstable.&lt;br/&gt;This is what I do in &lt;b&gt;SWTBotDialogTestThread.workWithDialog&lt;/b&gt;.&lt;br/&gt;&lt;br/&gt;Also if the actions on the dialog result in an &lt;b&gt;exception&lt;/b&gt;, the exception must be caught by the test case in the main thread. I solved this problem running the actions on the dialog in a &lt;a href='http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/FutureTask.html' target='_blank'&gt;FutureTask&lt;/a&gt; instance (wrapped in the &lt;b&gt;ITestAndWait&lt;/b&gt; interface). When the main thread calls the &lt;b&gt;FutureTask.get&lt;/b&gt; method (ITestAndWait.waitForWorkDone) this throws the exception that was raised by the thread started by asyncexec, if something went wrong.&lt;br/&gt;&lt;br/&gt;In synthesis, when I write a JUnit test case to test a dialog I:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;create an instance of SWTBotDialogTestThread, which &lt;b&gt;opens the shell &lt;/b&gt;used as starting point for the dialog.&lt;/li&gt;&lt;li&gt;call SWTBotDialogTestThread.workWithDialog, which &lt;b&gt;starts the thread&lt;/b&gt; with the actions to do on the dialog. The thread waits until the dialog is available.&lt;/li&gt;&lt;li&gt;&lt;b&gt;open the dialog&lt;/b&gt;. At this point the actions are done on the dialog. One of the actions (click on the Ok button) closes the dialog.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Call ITestAndWait.waitForWorkDone that re-throws the &lt;b&gt;exception&lt;/b&gt; thrown by the other thread, if that thread thrown exceptions.&lt;/li&gt;&lt;li&gt;&lt;b&gt;check&lt;/b&gt; the result of the dialog.&lt;/li&gt;&lt;li&gt;call SWTBotDialogTestThread.close to &lt;b&gt;close the shell&lt;/b&gt; opened at the start.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;I don't know if this is the best way to solve the problem, but it works, even if several test cases are run together.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8664619618765528447?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8664619618765528447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8664619618765528447' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8664619618765528447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8664619618765528447'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/09/swtbot-for-dialogs.html' title='SWTBot for dialogs'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8709151577267757205</id><published>2008-08-31T02:30:00.000-07:00</published><updated>2008-08-31T02:37:17.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Matrex 1.3. Development finished.</title><content type='html'>&lt;div style="text-align: left;"&gt;Matrex 1.3 coding has been finished.&lt;br /&gt;I'm now testing it and updating the documentation.&lt;br /&gt;Hopefully I'll release it at the end of september.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8709151577267757205?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8709151577267757205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8709151577267757205' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8709151577267757205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8709151577267757205'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/08/matrex-13-development-finished.html' title='Matrex 1.3. Development finished.'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-7181450276929048627</id><published>2008-08-29T11:07:00.001-07:00</published><updated>2008-08-30T01:26:29.080-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><title type='text'>Callbacks</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;A Matrex project consists in a &lt;b&gt;network of matrices and functions&lt;/b&gt; (let's forget about charts, presentations and timers).&lt;br /&gt;They are connected together by the relations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The matrix M&lt;small&gt;i&lt;/small&gt; is input parameter of the function F&lt;small&gt;j&lt;/small&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The matrix M&lt;small&gt;i&lt;/small&gt; is output (result)  of the function  F&lt;small&gt;j&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;&lt;small&gt;&lt;big&gt;When a matrix changes its content, it fires the functions of which is input, which recalculate their output matrices, which in turn fires the functions of which are input and so on.&lt;br /&gt;&lt;br /&gt;One peculiar property of this network is that it&lt;b&gt; does not have loops&lt;/b&gt;. In mathematics it is representable as a simple graph.&lt;br /&gt;This means that a matrix cannot be, directly or through other functions and matrices, input and output of the same function.&lt;br /&gt;&lt;br /&gt;This is a good property, because it guarantees that, if the calculation of each single function terminates in a finite time, the calculation of the whole project &lt;b&gt;terminates in a finite time&lt;/b&gt;.&lt;br /&gt;In other words, the calculation of the project cannot contain an infinite loop.&lt;br /&gt;&lt;br /&gt;In the upcoming version 1.3 I made an &lt;b&gt;exception&lt;/b&gt; to this property, to solve the following problem:&lt;br /&gt;I added a new &lt;b&gt;solver&lt;/b&gt; function template to Matrex, that finds the &lt;b&gt;minima&lt;/b&gt; of functions.&lt;br /&gt;To use a solver, you need to pass to it the function you want to minimize.&lt;br /&gt;In a programming language, you pass the function to mimimize to the solver function as a &lt;b&gt;callback function&lt;/b&gt; (or a closure).&lt;br /&gt;&lt;br /&gt;But how I did this in Matrex?&lt;br /&gt;In Matrex, a programming language's function is equivalent to a &lt;b&gt;network of functions and matrices&lt;/b&gt;, which, seen as a black box, has input and output matrices:&lt;br /&gt;&lt;br /&gt;&lt;/big&gt;&lt;/small&gt;&lt;div style="text-align: center;"&gt;&lt;small&gt;&lt;big&gt;&lt;img src="http://lh6.ggpht.com/kujun2007/SLWm5f7fxwI/AAAAAAAAAEo/Hj0ljY7CqWQ/%5BUNSET%5D.png" style="max-width: 800px; width: 257px; height: 446px;" /&gt;&lt;/big&gt;&lt;/small&gt;&lt;br /&gt;&lt;/div&gt;&lt;small&gt;&lt;big&gt;&lt;br /&gt;This block of functions and matrices can be &lt;b&gt;equivalent to a callback function&lt;/b&gt;, with a trick:&lt;br /&gt;&lt;/big&gt;&lt;/small&gt;&lt;ul&gt;&lt;li&gt;&lt;small&gt;&lt;big&gt;the output of the callback block and the input of the caller must have one matrix in common&lt;/big&gt;&lt;/small&gt;&lt;/li&gt;&lt;li&gt;&lt;small&gt;&lt;big&gt;the output of the caller and the input of the callback block must have one matrix in common&lt;/big&gt;&lt;/small&gt;&lt;/li&gt;&lt;/ul&gt;&lt;small&gt;&lt;big&gt;The output matrix of the caller that is input matrix of the callback block is called &lt;b&gt;callback matrix&lt;/b&gt;. &lt;/big&gt;&lt;/small&gt;&lt;br /&gt;&lt;small&gt;&lt;big&gt;&lt;br /&gt;Here is a picture showing the concept:&lt;br /&gt;&lt;br /&gt;&lt;/big&gt;&lt;/small&gt;&lt;div style="text-align: center;"&gt;&lt;small&gt;&lt;big&gt;&lt;img src="http://lh4.ggpht.com/kujun2007/SLWodxtr3YI/AAAAAAAAAEs/5Lc7FPJ_CBw/%5BUNSET%5D.png" style="max-width: 800px; width: 356px; height: 403px;" /&gt;&lt;/big&gt;&lt;/small&gt;&lt;br /&gt;&lt;/div&gt;&lt;small&gt;&lt;big&gt;&lt;br /&gt;In this way the caller, by &lt;/big&gt;&lt;/small&gt;&lt;small&gt;&lt;big&gt;changing the content of one of its input matrices &lt;/big&gt;&lt;/small&gt;&lt;small&gt;&lt;big&gt;&lt;b&gt;recalculates the callback block&lt;/b&gt;.&lt;br /&gt;When the callback block executes, it updates the content of its output matrices. But one of those is a input matrix of the caller, therefore &lt;b&gt;the caller is recalculated&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Caller and callback block execute each other &lt;b&gt;until the caller decides to stop&lt;/b&gt; and does not change the content of the output matrix that it has in common with the callback block.&lt;br /&gt;&lt;br /&gt;But when does the caller decide to stop? This depends by the caller code.&lt;br /&gt;&lt;br /&gt;The solver I added In Matrex is &lt;b&gt;Nelder Mead&lt;/b&gt; (&lt;a href="http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/fun/sys/mathstat/optimization/NelderMead.java?view=markup"&gt;sys.mathstat.optimization.neldermead&lt;/a&gt;), an implementation of the direct search algorithm, a simplex optimization algorithm (it uses the Apache Commons Math library).&lt;br /&gt;At each step of the solving process the solver needs to call a function to calculate the cost of the current solution. The cost calculation function is our callback function.&lt;br /&gt;The following picture shows the solver, the cost calculation function and their input and output matrices:&lt;br /&gt;&lt;br /&gt;&lt;/big&gt;&lt;/small&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://lh5.ggpht.com/kujun2007/SLg6kk1CL_I/AAAAAAAAAEw/SRKMhbDgtJQ/%5BUNSET%5D.png" style="max-width: 800px;" height="256" width="391" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;small&gt;&lt;big&gt;&lt;br /&gt;&lt;b&gt;x&lt;/b&gt; is the callback matrix of the solver. It is both output matrix of the solver and input matrix of the cost calculation function.&lt;br /&gt;When the content of x is changed, the cost calculation function is fired and it calculates the cost matrix, which is input of the solver.&lt;br /&gt;The solver is executed and produces a new content for the x matrix, therefore firing the cost calculation function, until the cost is good enough to stop. At this point &lt;b&gt;it stops&lt;/b&gt; changing the content of x and writes the final solution in the &lt;b&gt;result&lt;/b&gt; matrix.&lt;br /&gt;&lt;br /&gt;What I learned writing the Nelder Mead solver template is that one has to write the caller code carefully m&lt;/big&gt;&lt;/small&gt;aking always sure that the mutual execution of caller and callback function &lt;b&gt;stops&lt;/b&gt; at a certain point, in a way or the other. For example a solver must stop after a certain number of iterations, even if it does not converge.&lt;br /&gt;&lt;br /&gt;Adding callbacks in Matrex required some changes in the code:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The callback matrix is special: adding a function that has a callback output matrix requires that this matrix&lt;b&gt; is already in the project&lt;/b&gt; (it is the input matrix for the callback block).&lt;/li&gt;&lt;li&gt;Functions that have callback output matrices are &lt;b&gt;not calculated when the project is loaded&lt;/b&gt;.&lt;br /&gt;Calculating them only once would leave them incomplete (for a solver this means to calculate only one step).&lt;br /&gt;Calculate them until they stop would be a risk. Better to leave to the user the responsability to calculate them.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;small&gt;&lt;big&gt;Because of the complexity of this new feature, I introduce it in Matrex as experimental. &lt;/big&gt;&lt;/small&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7181450276929048627?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7181450276929048627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7181450276929048627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7181450276929048627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7181450276929048627'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/08/callbacks.html' title='Callbacks'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/kujun2007/SLWm5f7fxwI/AAAAAAAAAEo/Hj0ljY7CqWQ/s72-c/%5BUNSET%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1330066126946562250</id><published>2008-07-26T14:10:00.001-07:00</published><updated>2008-07-26T14:10:52.892-07:00</updated><title type='text'>Test test test</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Matrex is a project that gets tested manually by me before it is released. &lt;br/&gt;For this purpose I use a &lt;a href='http://matrex.sourceforge.net/check_list.html'&gt;check list&lt;/a&gt;. &lt;br/&gt;I run Matrex and I verify that the operations listed in the check list, like adding a matrix, adding a function... are executed correctly and don't produce side effects.&lt;br/&gt;&lt;br/&gt;Matrex is also tested by some of its user, but generally the users test it &lt;b&gt;after&lt;/b&gt; a new version has been released. This is not very satisfactory, even if it allows me to release corrective versions.&lt;br/&gt;&lt;br/&gt;To reduce the possibility that a version is released with bugs, I started, from version 1.2, to add some &lt;b&gt;unit testing&lt;/b&gt;.&lt;br/&gt;&lt;br/&gt;In the incoming release 1.3 unit testing will be a main concept:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;the tested classes are at this moment more than 160, covering almost all Matrex &lt;b&gt;template functions&lt;/b&gt; and a good section of the application code.&lt;/li&gt;&lt;li&gt;I'm checking the possibility to have also some GUI classes tested, using the  &lt;a href='http://swtbot.sourceforge.net/'&gt;SWTBot&lt;/a&gt; GUI unit testing tool.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;In this way I hope I will be able to:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Improve the quality of the code.&lt;/li&gt;&lt;li&gt;Help developers understand the code of Matrex.&lt;/li&gt;&lt;li&gt;Reduce the possibility of regression bugs.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;If you have other ways to improve the reliability of Matrex please let me know.&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1330066126946562250?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1330066126946562250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1330066126946562250' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1330066126946562250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1330066126946562250'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/07/test-test-test.html' title='Test test test'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-7939016231561705369</id><published>2008-06-21T12:18:00.001-07:00</published><updated>2008-06-22T12:49:31.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feature'/><title type='text'>Changes in the main window</title><content type='html'>Version 1.3 changes something in the main window:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_UV8bHZTOgQE/SF1VojnWQiI/AAAAAAAAAD4/m-VyKCq6eMk/s1600-h/newmaingui.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_UV8bHZTOgQE/SF1VojnWQiI/AAAAAAAAAD4/m-VyKCq6eMk/s320/newmaingui.jpeg" alt="" id="BLOGGER_PHOTO_ID_5214418098808308258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The buttons that are highlighted with a green rectangle &lt;span style="font-weight: bold;"&gt;hide or show trees&lt;/span&gt;. For example the first button hides the Matrix tree. Clicking it once again the Matrix tree is displayed again.&lt;br /&gt;The second button toggles the Function tree visibility, the third the Presentation tree, the 4th the Chart tree and 5th the Timer tree.&lt;/li&gt;&lt;li&gt;On the top of each tree, together with the tree menu, there is a &lt;span style="font-weight: bold;"&gt;search bar&lt;/span&gt;, highlighted with a red rectangle.&lt;br /&gt;Writing a part of the name/package of the item to search (matrix, function...) and clicking on the green arrow button, the next item with name-package containing that text is selected and showed in the tree.&lt;br /&gt;For example the text &lt;span style="font-style: italic;"&gt;ding.pri&lt;/span&gt; finds the item &lt;span style="font-style: italic;"&gt;trading.price&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7939016231561705369?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7939016231561705369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7939016231561705369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7939016231561705369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7939016231561705369'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/06/changes-in-main-window.html' title='Changes in the main window'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_UV8bHZTOgQE/SF1VojnWQiI/AAAAAAAAAD4/m-VyKCq6eMk/s72-c/newmaingui.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2090895499353435659</id><published>2008-06-06T13:44:00.001-07:00</published><updated>2008-06-06T13:44:46.681-07:00</updated><title type='text'>Exception stack trace for final users</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;In Matrex, like in other programs, it is not always possible to show a simple &lt;b&gt;message box&lt;/b&gt; when an error occurred. &lt;br/&gt;Sometimes what I have is an exception occurred &lt;b&gt;deep down&lt;/b&gt; in the code, may be in a library.&lt;br/&gt;Nevertheless something has to be shown to the user to let him understand that an error has occurred and give him &lt;b&gt;all the available information&lt;/b&gt; to decide what to do.&lt;br/&gt;A classic exception &lt;b&gt;stack trace&lt;/b&gt; is not an option: together with the exception text it contains a lot of information to &lt;b&gt;localize the code&lt;/b&gt; that generated the exception.&lt;br/&gt;This information, that is precious for the developer, is probably &lt;b&gt;unuseful and confusing&lt;/b&gt; for the final user.&lt;br/&gt;For this reason I wrote a small function that transform the exception in a string that contains only the texts of the exception and of all contained (cause) exceptions. Here is the code:&lt;br/&gt;&lt;br/&gt;&lt;small&gt;&lt;font face='sans-serif'&gt;    public static String flatException(Throwable e)&lt;br/&gt;    {&lt;br/&gt;        StringBuilder b = new StringBuilder();&lt;br/&gt;        while(e != null)&lt;br/&gt;        {&lt;br/&gt;            b.append(e.getMessage()).append('\n');&lt;br/&gt;            e = e.getCause();&lt;br/&gt;        }&lt;br/&gt;        return b.toString();&lt;br/&gt;    }&lt;br/&gt;&lt;/font&gt;&lt;/small&gt;&lt;br/&gt;Even if the number of contained exception is large, the message is generally &lt;b&gt;simple&lt;/b&gt; and gives immediately an idea of what happened.&lt;br/&gt;This is not intended as a substitute of the classic stack trace, which is written in the application log file so that if needed it can be examined by the developer.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2090895499353435659?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2090895499353435659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2090895499353435659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2090895499353435659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2090895499353435659'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/06/exception-stack-trace-for-final-users.html' title='Exception stack trace for final users'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-9180690998595990473</id><published>2008-06-01T12:50:00.001-07:00</published><updated>2008-06-03T12:55:09.364-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feature'/><title type='text'>Fit Columns</title><content type='html'>A new feature that will be released with version 1.3 is the possibility to fit the width of the columns of the table in a &lt;b&gt;matrix viewer&lt;/b&gt; or in a &lt;b&gt;presentation viewer&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;This has been a problem from the moment I started to use &lt;a href="http://www.eclipse.org/articles/Article-SWT-Virtual/Virtual-in-SWT.html"&gt;virtual tables&lt;/a&gt; for the two viewer.&lt;br /&gt;Virtual tables have the advantage that they can show tables with a &lt;b&gt;huge amount of rows&lt;/b&gt; (&gt; 10000) instantly, because they load only the rows of the table that are displayed in that moment, not the whole table.&lt;br /&gt;As a side effect, there is &lt;b&gt;no way&lt;/b&gt; to &lt;b&gt;automatically&lt;/b&gt; set the width of the columns so that they can fit the text displayed in the columns' cells.&lt;br /&gt;Because of this, before version 1.3 the use has to &lt;b&gt;manually&lt;/b&gt; change the width of the columns.&lt;br /&gt;In version 1.3 I added a menu in the two viewers, called &lt;b&gt;Fit Columns&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_UV8bHZTOgQE/SEWhf2LjwvI/AAAAAAAAADo/l4AmzEesioI/s1600-h/fitcolumns.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_UV8bHZTOgQE/SEWhf2LjwvI/AAAAAAAAADo/l4AmzEesioI/s320/fitcolumns.jpeg" alt="" id="BLOGGER_PHOTO_ID_5207746112615858930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This menu calls a &lt;a href="http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/gui/util/VirtualTableColumnsResizer.java?view=markup"&gt;function&lt;/a&gt; that takes a &lt;b&gt;sample&lt;/b&gt; of the table's content: a fixed amount of rows. It measures the lengths of the texts contained  in the cells of these rows, and with them it calculates an &lt;b&gt;estimation&lt;/b&gt; of the columns' width. Then sets the columns' with to this value.&lt;br /&gt;&lt;br /&gt;In conclusion there is no automatic columns' width calculation. The &lt;b&gt;user decides&lt;/b&gt; when to calculate them. And that is a good thing, because if the matrix or the presentation change (because matrices get recalculated in Matrex), he can click the menu when he wants to update the width accordingly.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-9180690998595990473?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/9180690998595990473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=9180690998595990473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/9180690998595990473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/9180690998595990473'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/06/fit-columns.html' title='Fit Columns'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_UV8bHZTOgQE/SEWhf2LjwvI/AAAAAAAAADo/l4AmzEesioI/s72-c/fitcolumns.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-240800022394840615</id><published>2008-05-29T13:38:00.001-07:00</published><updated>2008-06-23T05:18:19.422-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='feature'/><title type='text'>High Low charts</title><content type='html'>One of the new features that will come with version 1.3 are the &lt;b&gt;High Low charts&lt;/b&gt;.&lt;br /&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;It is a kind of financial charts that shows the evolutions of the quantities high, low, open, close and volume in a time period.&lt;br /&gt;As all the other charts in Matrex, the charts are built using the &lt;a href="http://www.jfree.org/jfreechart/"&gt;JFreeChart library&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;They can be shown in two variants: &lt;a href="http://en.wikipedia.org/wiki/Candle_chart"&gt;candlestick chart&lt;/a&gt; (top chart in the following picture) or &lt;a href="http://en.wikipedia.org/wiki/OHLC"&gt;high low chart&lt;/a&gt; (bottom chart). The picture shows the chart viewer for two high low charts that share the domain axis:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_UV8bHZTOgQE/SD8VKmLjwrI/AAAAAAAAADI/Y9ASk3-4q60/s1600-h/highlow_viewer.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_UV8bHZTOgQE/SD8VKmLjwrI/AAAAAAAAADI/Y9ASk3-4q60/s320/highlow_viewer.jpeg" alt="" id="BLOGGER_PHOTO_ID_5205902966055486130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;To build this kind of chart there is a special &lt;b&gt;editor&lt;/b&gt;. In the following picture we show the editor for the two charts in the viewer.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_UV8bHZTOgQE/SD8VX2LjwsI/AAAAAAAAADQ/ZEQIZ1ujcrM/s1600-h/highlow_editor.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_UV8bHZTOgQE/SD8VX2LjwsI/AAAAAAAAADQ/ZEQIZ1ujcrM/s320/highlow_editor.jpeg" alt="" id="BLOGGER_PHOTO_ID_5205903193688752834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There is one row in the table for each chart in the viewer. The values of high, low, open, close, volume are 1-column matrices in the same Matrex project.&lt;br /&gt;&lt;/div&gt;The &lt;b&gt;time period&lt;/b&gt; that defines the &lt;b&gt;domain axis&lt;/b&gt; can be defined in two ways:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;it can be a 1-column matrix containing date/times.&lt;/li&gt;&lt;li&gt;it can be an interval defined as [start,step]&lt;/li&gt;&lt;/ol&gt;The editor for each row of the table (which opens if you click the &lt;i&gt;Edit&lt;/i&gt; button) is the following:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_UV8bHZTOgQE/SD8V-mLjwtI/AAAAAAAAADY/REOUL6-GPl8/s1600-h/highlow_dialog.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_UV8bHZTOgQE/SD8V-mLjwtI/AAAAAAAAADY/REOUL6-GPl8/s320/highlow_dialog.jpeg" alt="" id="BLOGGER_PHOTO_ID_5205903859408683730" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;which shows the values for the first chart in the viewer: it is a candlestick chart, with the time period composed by an interval  [start,step] and has all the values (high,low,open,close,volume) assigned to 1-column matrices of the project.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-240800022394840615?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/240800022394840615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=240800022394840615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/240800022394840615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/240800022394840615'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/05/high-low-charts.html' title='High Low charts'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_UV8bHZTOgQE/SD8VKmLjwrI/AAAAAAAAADI/Y9ASk3-4q60/s72-c/highlow_viewer.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-6974862304797086723</id><published>2008-04-04T03:31:00.001-07:00</published><updated>2008-04-04T03:31:05.933-07:00</updated><title type='text'>SWT Web installer RC1 released</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;The documentation is in the &lt;a href='http://osdepinstaller.sourceforge.net/'&gt;SWT Web Installer site&lt;/a&gt;, and you can download it from &lt;a href='http://sourceforge.net/project/showfiles.php?group_id=223422'&gt;SourceForge&lt;/a&gt;.&lt;br/&gt;Please report any &lt;a href='http://sourceforge.net/tracker/?atid=1058543&amp;amp;group_id=223422&amp;amp;func=browse'&gt;bugs&lt;/a&gt;/&lt;a href='http://sourceforge.net/tracker/?atid=1058544&amp;amp;group_id=223422&amp;amp;func=browse'&gt;problems&lt;/a&gt;/&lt;a href='http://sourceforge.net/tracker/?atid=1058546&amp;amp;group_id=223422&amp;amp;func=browse'&gt;feature requests&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Moreover, there is a new version of the &lt;a href='http://matrex.sourceforge.net/doc/clientserver.pdf'&gt;client/server architecture document&lt;/a&gt; in the &lt;a href='http://matrex.sourceforge.net/documents.shtml'&gt;Matrex site&lt;/a&gt;.&lt;br/&gt;The main change is that the document considers also sequences of operations on the project that need to be executed atomically (&lt;b&gt;transactions&lt;/b&gt;).&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-6974862304797086723?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/6974862304797086723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=6974862304797086723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6974862304797086723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6974862304797086723'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/04/swt-web-installer-rc1-released.html' title='SWT Web installer RC1 released'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8920928096963941463</id><published>2008-03-31T13:25:00.001-07:00</published><updated>2008-03-31T13:25:39.029-07:00</updated><title type='text'>Status</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;big&gt;SWT web installer&lt;/big&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href='http://matrexblog.blogspot.com/2008/03/swt-web-installer.html'&gt;SWT web installer&lt;/a&gt; is almost ready to be released. &lt;br/&gt;I tested it and wrote the documentation. It just needs the final touches.&lt;br/&gt;I think it will be released during this week as version 1.0 beta.&lt;br/&gt;License is LGPL 3.0.&lt;br/&gt;&lt;br/&gt;&lt;big&gt;ISQL&lt;/big&gt;&lt;br/&gt;&lt;br/&gt;I made a library of &lt;a href='http://matrex.sourceforge.net/doc/internalsql.pdf'&gt;ISQL,&lt;/a&gt; which I will release as soon as possible.&lt;br/&gt;ISQL can be actually using separately from Matrex.&lt;br/&gt;It is just to call a function with, as parameters, the SQL query and the input and output arrays.&lt;br/&gt;I think it can be very interesting for people that wants to use SQL on arrays in memory.&lt;br/&gt;Also in this case the license will be GPL 3.0-&lt;br/&gt;&lt;br/&gt;&lt;big&gt;Matrex&lt;/big&gt;&lt;br/&gt;&lt;br/&gt;There will be a version 1.3 of Matrex. &lt;br/&gt;The idea is to include in this version the last changes made to the source code of Matrex:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='http://matrexblog.blogspot.com/2008/02/list-file-class-loader.html'&gt;new classloader and plugins structure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SWT web installer to install SWT from internet&lt;/li&gt;&lt;li&gt;separated ISQL library&lt;/li&gt;&lt;/ul&gt;Also, the 2D charts will be updated and new Matrex functions will be added, thanks to the new version of the &lt;a href='http://commons.apache.org/math/'&gt;commons math&lt;/a&gt; library .&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;I'm also working to plan version 2.0 of Matrex. I tested an &lt;a href='http://www.manning-sandbox.com/thread.jspa?messageID=1442'&gt;example of RMI callbacks&lt;/a&gt; and I've found that it works very well. I will soon publish a new document about the future Matrex Client/Server architecture.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8920928096963941463?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8920928096963941463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8920928096963941463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8920928096963941463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8920928096963941463'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/03/status.html' title='Status'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-6352776837707192563</id><published>2008-03-13T14:08:00.001-07:00</published><updated>2008-03-13T14:08:51.460-07:00</updated><title type='text'>The SWT Web Installer</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;You wrote this nice &lt;a href='http://www.eclipse.org/swt/'&gt;SWT&lt;/a&gt; application and you want to release it.&lt;br/&gt;And you realized it is not so easy, especially if the user has to install it himself.&lt;br/&gt;Yes, because there is a &lt;b&gt;different SWT version for each platform&lt;/b&gt;: a version for Windows, a version for Mac OSX, a version for Linux... not only, but also different versions for 32 and 64 bits.&lt;br/&gt;What you do? You build a setup file for your application for each platform?&lt;br/&gt;&lt;br/&gt;With these thoughts, I wrote a library that does the job for you.&lt;br/&gt;It is called &lt;b&gt;OS dependent installer&lt;/b&gt; (&lt;b&gt;osdepinstaller&lt;/b&gt;).&lt;br/&gt;You call it from your installer or from your application and it &lt;b&gt;installs the right SWT version&lt;/b&gt; for the platform where your application is installed.&lt;br/&gt;&lt;br/&gt;It works in this way:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;it loads from the internet a file containing a &lt;b&gt;list of links&lt;/b&gt; to download the SWT library from, one for each platform.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;It checks the &lt;b&gt;platform&lt;/b&gt; in which it is installed (two properties, os.type and os.arch).&lt;/li&gt;&lt;li&gt;it gets the link for that platform&lt;/li&gt;&lt;li&gt;it downloads the SWT library (it is a zip file)&lt;br/&gt;&lt;/li&gt;&lt;li&gt;it unzips the SWT library in a specific directory&lt;/li&gt;&lt;/ul&gt;If &lt;b&gt;something goes wrong&lt;/b&gt; (for example the platform was not found in the list of links), osdepinstaller offers &lt;b&gt;other solutions&lt;/b&gt; to the user.&lt;br/&gt;For example if the automatic choice of the platform does not work, the user is asked to do the choice manually.&lt;br/&gt;&lt;br/&gt;A principle of osdepinstaller is to give all the &lt;b&gt;information&lt;/b&gt; about what it is doing. In this way the user can continue manually if for some reason the library is not able to continue.&lt;br/&gt;&lt;br/&gt;Since osdepinstaller cannot work without internet, and it can happen that the internet can be accessed only through a firewall or a &lt;b&gt;proxy&lt;/b&gt;, the system checks with the user if there is a proxy and, in this case, if the proxy needs authorization.&lt;br/&gt;&lt;br/&gt;To get data from the user and to show the status osdepinstaller uses by default the &lt;b&gt;console&lt;/b&gt; (since it is normal that your application does not have a GUI until osdepinstaller has finished), but it can be &lt;b&gt;easily adapted&lt;/b&gt; to other solutions.&lt;br/&gt;&lt;br/&gt;Also, osdepinstaller is &lt;b&gt;not only for SWT&lt;/b&gt;: it can be used for any library the is platform dependent.&lt;br/&gt;&lt;br/&gt;Osdepinstaller is still in test, but you can download a &lt;a href='http://matrex.sourceforge.net/osdepinstaller.zip'&gt;test version&lt;/a&gt; and check the &lt;a href='http://matrex.cvs.sourceforge.net/matrex/osdepinstaller/'&gt;code&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;I will use osdepinstaller to let the user install SWT with the generic installer of &lt;a href='http://matrex.sourceforge.net/'&gt;Matrex&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-6352776837707192563?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/6352776837707192563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=6352776837707192563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6352776837707192563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6352776837707192563'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/03/swt-web-installer.html' title='The SWT Web Installer'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-5107496528788107806</id><published>2008-03-10T04:52:00.001-07:00</published><updated>2008-03-10T04:52:29.732-07:00</updated><title type='text'>Matrex 1.2 for MacOSX alternative setup</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I've got &lt;a href='http://www.macworld.it/blogs/ping/?p=1651'&gt;some one reporting me&lt;/a&gt; that the Matrex 1.2 version for &lt;b&gt;Mac OSX &lt;/b&gt;does not install perfectly on all Macs.&lt;br/&gt;The problem is that sometimes after the setup Matrex does not look like an &lt;b&gt;application &lt;/b&gt;but like a simple java folder.&lt;br/&gt;Surely you can open a terminal and run the shell script (the batch file) from there, but this is not really an intuitive way of running it!&lt;br/&gt;&lt;br/&gt;I use &lt;a href='http://izpack.org/'&gt;IzPack &lt;/a&gt;to install my software and IzPack claims to be able to install also on Mac OSX, even if from some messages in mailing lists it seems that there could be some problems.&lt;br/&gt;&lt;br/&gt;I tried to see what I can do. &lt;br/&gt;&lt;br/&gt;First I will &lt;b&gt;modify the shell script&lt;/b&gt; so that it can be called from everywhere (an initial statement to let it use the current directory as starting directory).&lt;br/&gt;Then I will update Izpack to the &lt;b&gt;last version&lt;/b&gt; (3.11). &lt;br/&gt;&lt;br/&gt;But one thing that I would really like to do is to create a &lt;a href='http://www.eclipse.org/swt/macosx/'&gt;MacOSX application bundle&lt;/a&gt; containing the Matrex files.&lt;br/&gt;The application bundle is the natural way applications are installed on MacOSX.&lt;br/&gt;To do this you need:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;a &lt;b&gt;.icns&lt;/b&gt; file, that contains the application icon.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;a way to generate a &lt;b&gt;.dmg&lt;/b&gt; file, which is an autoinstalling disk image containing the application bundle.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;There is no way, as far as I know, to generate .icns and .dmg files &lt;b&gt;outside MacOSX&lt;/b&gt;.&lt;br/&gt;&lt;br/&gt;So, if someone has a Mac and wants to &lt;b&gt;help me&lt;/b&gt; to build this application bundle and to test it, can he please let me know?&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-5107496528788107806?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/5107496528788107806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=5107496528788107806' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5107496528788107806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/5107496528788107806'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/03/matrex-12-for-macosx-alternative-setup.html' title='Matrex 1.2 for MacOSX alternative setup'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-7104248949078617518</id><published>2008-02-27T14:40:00.001-08:00</published><updated>2008-02-27T14:45:34.423-08:00</updated><title type='text'>List file class loader</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Matrex is composed by several jars:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The &lt;b&gt;Matrex&lt;/b&gt; jars: api, gui, fun.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;libraries&lt;/b&gt; used by Matrex, for example SWT, jfreechart.&lt;/li&gt;&lt;li&gt;The &lt;b&gt;plug-ins&lt;/b&gt;, for example the library to connect Matrex to Matlab.&lt;/li&gt;&lt;/ul&gt;To have java loading all these jars when starting Matrex, they was listed in the classpath parameter of the java call.&lt;br /&gt;Here is the typical content of a &lt;b&gt;batch file&lt;/b&gt; starting Matrex (it uses the two variables MATREX_CP and LIB_CP):&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;em&gt;&lt;blockquote&gt;MATREX_CP=matrex_api.jar:matrex_fun.jar:matrex_gui.jar&lt;br /&gt;LIB_CP=freehepj3d.jar:jython.jar:commons-math-1.1.jar:jfreechart-1.0.8a.jar:jcommon-1.0.12.jar:jxl.jar:lucene-core-2.0.0.jar:swt/swt.jar:antlr-runtime-3.0.1.jar:javacsv.jar:net.sf.paperclips_1.0.2.jar&lt;br /&gt;java -Djava.library.path=swt -Djava.util.logging.config.file=logging.properties -classpath  $MATREX_CP:$LIB_CP matrex.gui.Start $1&lt;/blockquote&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This approach has several problems:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It is &lt;b&gt;not readable&lt;/b&gt;, and it becomes less readable adding more libraries.&lt;/li&gt;&lt;li&gt;If the user wants to add a plug-in, he has to &lt;b&gt;edit the batch file&lt;/b&gt;. This is unconfortable, because the user needs to learn the syntax of the batch file, and dangerous: if the user does a small mistake changing the batch file the program does not start.&lt;/li&gt;&lt;li&gt;you need to have one copy of this batch file for each &lt;b&gt;platform&lt;/b&gt; in which Matrex is released (Windows, Linux, MacOSX...).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;In these days I worked on a new approach. The idea is to have 3 files containing the list of jars needed to start Matrex:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;matrex.cld containing the main Matrex jars&lt;/li&gt;&lt;li&gt;libraries.cld containing the libraries used by Matrex&lt;/li&gt;&lt;li&gt;plugis.cld containing the plug-ins (it is empty when Matrex is installed)&lt;/li&gt;&lt;/ul&gt;Here is an content of the matrex.cld file. The other two files follow the same rules:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;matrex_api.jar&lt;br /&gt;matrex_fun.jar&lt;br /&gt;matrex_gui.jar&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;To load these files and to load the jars listed in them, Matrex uses a custom &lt;b&gt;class loader&lt;/b&gt;, &lt;a href="http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/util/TextFilesClassLoader.java?view=log"&gt;TextFilesClassLoader&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The start class of Matrex is now called &lt;a href="http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/MatrexLoader.java?view=markup"&gt;MatrexLoader&lt;/a&gt;.&lt;br /&gt;MatrexLoader loads the main class of Matrex, Start, using TextFilesClassLoader as class loader.&lt;br /&gt;Since Start all the other classes of Matrex (included the ones in the library) are loaded, directly or indirectly, from Start, they all use the same class loader used by Start, TextFilesClassLoader.&lt;br /&gt;&lt;br /&gt;In this way it has been also possible to write a special Matrex GUI dialog, PluginsDialog, to update the content of plugins.cld:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_UV8bHZTOgQE/R8Xn4FYrevI/AAAAAAAAADA/D3xqwaeC9H8/s1600-h/pluginsdialog.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_UV8bHZTOgQE/R8Xn4FYrevI/AAAAAAAAADA/D3xqwaeC9H8/s320/pluginsdialog.jpeg" alt="" id="BLOGGER_PHOTO_ID_5171794697809263346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is much easier than to change manually the batch file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7104248949078617518?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7104248949078617518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7104248949078617518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7104248949078617518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7104248949078617518'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/02/list-file-class-loader.html' title='List file class loader'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_UV8bHZTOgQE/R8Xn4FYrevI/AAAAAAAAADA/D3xqwaeC9H8/s72-c/pluginsdialog.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8823220712486593498</id><published>2008-02-06T12:41:00.001-08:00</published><updated>2008-02-06T12:43:10.482-08:00</updated><title type='text'>Matrex functions unit testing</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I added a small chapter at the end of the &lt;b&gt;&lt;a href="http://matrex.sourceforge.net/doc/functioncoding.pdf"&gt;function coding document&lt;/a&gt;&lt;/b&gt; about the &lt;b&gt;Matrex functions code unit testing&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Before version 1.2 some of the Matrex functions had JUnit unit testing, but it was very limited.&lt;br /&gt;In version 1.2 I had to write the code for the &lt;a href="http://matrex.sourceforge.net/doc/templatesguide.pdf"&gt;ISQL function template&lt;/a&gt;, which is very complex compared to the other templates.&lt;br /&gt;So I needed to test it well.&lt;br /&gt;For this reason I wrote some unit testing help classes (for JUnit) that I grouped under the package &lt;a href="http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/item/test/"&gt;matrex.item.test&lt;/a&gt;.&lt;br /&gt;These classes can be used for the unit testing of any Matrex function template.&lt;br /&gt;&lt;br /&gt;With these classes unit testing of matrex functions becomes very easy. For standard function templates it is a &lt;b&gt;matter of minutes&lt;/b&gt; to write a test case.&lt;br /&gt;Give a look to them!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8823220712486593498?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8823220712486593498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8823220712486593498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8823220712486593498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8823220712486593498'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/02/matrex-functions-unit-testing.html' title='Matrex functions unit testing'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-7205675948420978176</id><published>2008-02-04T13:30:00.001-08:00</published><updated>2008-02-06T11:22:45.654-08:00</updated><title type='text'>Matrex 1.2 released</title><content type='html'>Finally Matrex 1.2 has been released!&lt;br /&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;The big step forward of this version is the new &lt;a href="http://matrexblog.blogspot.com/2007/07/sql-on-matrices-in-matrex.html"&gt;ISQL module&lt;/a&gt;.&lt;br /&gt;The &lt;b&gt;ISQL module&lt;/b&gt; is a function template to apply SQL queries to vectors in a Matrex project.&lt;br /&gt;It is therefore possible:&lt;ul&gt;&lt;li&gt;to apply filters on parts of the vectors&lt;/li&gt;&lt;li&gt;to order the elements of the vectors&lt;br /&gt;&lt;/li&gt;&lt;li&gt;to aggregate them&lt;/li&gt;&lt;/ul&gt;all with simple SQL queries. The &lt;a href="http://matrex.sourceforge.net/doc/templatesguide.pdf"&gt;internalsql&lt;/a&gt; document contained in the distributions explains how.&lt;br /&gt;As far as I know, no other spreadsheet application allows something similar.&lt;br /&gt;&lt;br /&gt;Other enhancements are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;P&lt;/b&gt;&lt;b&gt;rint&lt;/b&gt; matrices and presentations.&lt;/li&gt;&lt;li&gt;Export matrices and presentations to &lt;b&gt;csv&lt;/b&gt; and &lt;b&gt;xls&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_UV8bHZTOgQE/R6eEX1JwCVI/AAAAAAAAACg/e4l3LfDryOk/s1600-h/matrixviewermenu.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_UV8bHZTOgQE/R6eEX1JwCVI/AAAAAAAAACg/e4l3LfDryOk/s320/matrixviewermenu.jpeg" alt="" id="BLOGGER_PHOTO_ID_5163241042743396690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Import&lt;/b&gt; data from database, using an SQL query.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Menus&lt;/b&gt; to remove multiple items, duplicate matrices and functions, add function from a matrix (the function will have the matrix as first argument).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_UV8bHZTOgQE/R6eFi1JwCXI/AAAAAAAAACw/uBH-2ztMdmY/s1600-h/matrix_tree.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_UV8bHZTOgQE/R6eFi1JwCXI/AAAAAAAAACw/uBH-2ztMdmY/s320/matrix_tree.jpeg" alt="" id="BLOGGER_PHOTO_ID_5163242331233585522" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;b&gt;summary step&lt;/b&gt; for the expression parser.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_UV8bHZTOgQE/R6eE4VJwCWI/AAAAAAAAACo/RuUw-aewmiY/s1600-h/parser_step5.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_UV8bHZTOgQE/R6eE4VJwCWI/AAAAAAAAACo/RuUw-aewmiY/s320/parser_step5.jpeg" alt="" id="BLOGGER_PHOTO_ID_5163241601089145186" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Possibility to change the &lt;b&gt;colors&lt;/b&gt; of the windows headers.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_UV8bHZTOgQE/R6eGdlJwCYI/AAAAAAAAAC4/RyF31z-7tYk/s1600-h/guisettings_graphical.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_UV8bHZTOgQE/R6eGdlJwCYI/AAAAAAAAAC4/RyF31z-7tYk/s320/guisettings_graphical.jpeg" alt="" id="BLOGGER_PHOTO_ID_5163243340550900098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Also, several bugs have been removed (dates formatting, items renaming, boolean matrices editing).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-7205675948420978176?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/7205675948420978176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=7205675948420978176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7205675948420978176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/7205675948420978176'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/02/matrex-12-released.html' title='Matrex 1.2 released'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_UV8bHZTOgQE/R6eEX1JwCVI/AAAAAAAAACg/e4l3LfDryOk/s72-c/matrixviewermenu.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2895063823490510602</id><published>2008-01-23T04:21:00.001-08:00</published><updated>2008-01-23T04:21:41.875-08:00</updated><title type='text'>Pre-release of Matrex 1.2 to test</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I'm in the test phase of the version 1.2 of Matrex.&lt;br/&gt;If someone wants to test this pre-release version himself, he can:&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;download the pre-release &lt;a href='http://matrex.sourceforge.net/matrex_1_2_generic.jar'&gt;generic setup&lt;br/&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;install it&lt;/li&gt;&lt;li&gt;install the &lt;a href='http://www.eclipse.org/swt/'&gt;SWT library&lt;/a&gt; for his platform in the swt directory of the installation&lt;/li&gt;&lt;li&gt;use one of the matrix_generic.* files in doc/batch_files to launch Matrex&lt;/li&gt;&lt;/ul&gt;The changes from version 1.1 are in short:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;The new ISQL (internal SQL) module. There is a document about it in the setup.&lt;/li&gt;&lt;li&gt;New import and export modules.&lt;/li&gt;&lt;/ul&gt;If you find some bugs, please report them in the &lt;a href='http://sourceforge.net/tracker/?group_id=133398&amp;amp;atid=727065'&gt;Matrex bugs&lt;/a&gt; page. &lt;br/&gt;&lt;br/&gt;Thanks&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2895063823490510602?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2895063823490510602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2895063823490510602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2895063823490510602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2895063823490510602'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/01/pre-release-of-matrex-12-to-test.html' title='Pre-release of Matrex 1.2 to test'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8668380721721669825</id><published>2008-01-13T12:49:00.001-08:00</published><updated>2008-01-13T12:55:43.602-08:00</updated><title type='text'>Version 1.2 status</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Coding and documentation are finished.&lt;br/&gt;I'm now working on an example project for the &lt;a href='http://matrexblog.blogspot.com/2007/07/sql-on-matrices-in-matrex.html'&gt;ISQL module&lt;/a&gt;.&lt;br/&gt;After that I will terminate the test of the system and release it.&lt;br/&gt;&lt;br/&gt;There will be a version for:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Windows 32 bits&lt;/li&gt;&lt;li&gt;Linux 32 bits&lt;/li&gt;&lt;li&gt;Mac OSX&lt;/li&gt;&lt;/ul&gt;and also a &lt;b&gt;generic&lt;/b&gt; version, which you can use if you want to install it in a different environment (64 bits?).&lt;br/&gt;The generic version does not install SWT. You have to &lt;a href='http://www.eclipse.org/swt/'&gt;get it&lt;/a&gt; and unzip it yourself under the swt directory.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8668380721721669825?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8668380721721669825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8668380721721669825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8668380721721669825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8668380721721669825'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2008/01/version-12-status.html' title='Version 1.2 status'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1200689221253040451</id><published>2007-12-19T12:08:00.000-08:00</published><updated>2007-12-19T12:16:30.230-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status'/><title type='text'>Status</title><content type='html'>Today I finally released &lt;a href="http://matrexblog.blogspot.com/2007/11/matrexjruby.html"&gt;matrexjruby 1.0.2&lt;/a&gt; (you can find it in the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398"&gt;Matrex download page&lt;/a&gt;). It took some time to do the final test because of the frenetical work on Matrex 1.2.&lt;br /&gt;I'm now working on the last pieces of code of Matrex 1.2, since &lt;a href="http://matrexblog.blogspot.com/2007/07/sql-on-matrices-in-matrex.html"&gt;ISQL&lt;/a&gt; has now been tested and I consider it finished:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the code that allows to add a function from the matrix tree using as first matrix parameter the selected matrix.&lt;/li&gt;&lt;li&gt;the code that allows to create an item from the item selection dialog box.&lt;/li&gt;&lt;/ul&gt;Once these are finished, I need to do some more test and update the documentation. I hope 1.2 will be released in january.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1200689221253040451?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1200689221253040451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1200689221253040451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1200689221253040451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1200689221253040451'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/12/status.html' title='Status'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-3279052285730938625</id><published>2007-11-01T03:39:00.001-07:00</published><updated>2007-11-01T03:39:45.584-07:00</updated><title type='text'>MatrexJRuby </title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I updated the code of the adapter &lt;a href='http://matrex.sourceforge.net/addins.shtml'&gt;matrexjruby&lt;/a&gt;, which was still based on JRuby 0.9.&lt;br/&gt;Now it works with &lt;a href='http://jruby.codehaus.org/'&gt;JRuby 1.01&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Only a few fixes was needed (use the Ruby class instead of the IRuby interface, let the JRuby classes inherit from an abstract class instead of the IFunction interface).&lt;br/&gt;&lt;br/&gt;Matrexjruby is used to write the scripts that are the "code" of the Matrex function &lt;a href='http://matrex.sourceforge.net/templates.html'&gt;templates&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;I just need some final test and I will publish it as version 1.02.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-3279052285730938625?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/3279052285730938625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=3279052285730938625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3279052285730938625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3279052285730938625'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/11/matrexjruby.html' title='MatrexJRuby '/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8191712051486675906</id><published>2007-10-30T00:12:00.001-07:00</published><updated>2007-10-30T00:14:30.041-07:00</updated><title type='text'>See the light</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Finally!&lt;br /&gt;&lt;br /&gt;I 've got stock with the internal &lt;a href="http://matrexblog.blogspot.com/2007/07/sql-on-matrices-in-matrex.html"&gt;&lt;b&gt;sql module&lt;/b&gt;&lt;/a&gt; for a long while, I'm now able to see some results.&lt;br /&gt;The biggest problem derived from the fact that I made the &lt;i&gt;case... when... then...&lt;/i&gt; clause originally too complex (the when clause  was too general).&lt;br /&gt;&lt;br /&gt;Now I'm able to run some "select ... from ... where..."  queries (without &lt;i&gt;group by&lt;/i&gt; or &lt;i&gt;order by&lt;/i&gt; clauses).&lt;br /&gt;The code is on CVS under the package &lt;a href="http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/fun/sys/sql/"&gt;matrex.fun.sys.sql&lt;/a&gt; , so you can give a look yourself if you like.&lt;br /&gt;&lt;br /&gt;It looks like it will not take so long before I have an implementation of the &lt;i&gt;group by&lt;/i&gt; clause (together with the aggregate functions).&lt;br /&gt;Still some doubts about the &lt;span style="font-style: italic;"&gt;order by&lt;/span&gt; clause (allow order by &lt;expression&gt; or only order by &lt;column&gt;?).&lt;br /&gt;&lt;br /&gt;So, now we should be closer to version 1.2, if nothing comes in the way.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8191712051486675906?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8191712051486675906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8191712051486675906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8191712051486675906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8191712051486675906'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/10/see-light.html' title='See the light'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4609873795568804262</id><published>2007-10-04T23:24:00.001-07:00</published><updated>2007-10-04T23:24:19.081-07:00</updated><title type='text'>Antlr for the SQL module</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;To build the &lt;a href='http://matrexblog.blogspot.com/2007/07/sql-on-matrices-in-matrex.html'&gt;internal SQL module&lt;/a&gt; for Matrex I decided to work in the following way:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Write a &lt;b&gt;parser &lt;/b&gt;that converts the SQL expression in an internal object structure&lt;/li&gt;&lt;li&gt;Write the &lt;b&gt;code &lt;/b&gt;that applies the parsed SQL to the matrices/vectors arguments of the SQL function.&lt;/li&gt;&lt;/ul&gt;To do the parsing work, I chose the &lt;a href='http://www.antlr.org/'&gt;Antlr &lt;/a&gt;library.&lt;br/&gt;Antlr has the following advantages compared to the other parsers:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;More people&lt;/b&gt; use it (at least it looks like)&lt;/li&gt;&lt;li&gt;The parse result can be code in &lt;b&gt;different languages&lt;/b&gt; (Java, C#, python...) that can be useful if I want to port the same grammar to other projects&lt;/li&gt;&lt;li&gt;Together with the library you can download a graphical &lt;b&gt;application &lt;/b&gt;called &lt;a href='http://www.antlr.org/works/index.html'&gt;AntlrWorks &lt;/a&gt;to interactively test and debug your grammar. AntlrWorks is a very good tool, that let you find errors in your grammar before you start to use it.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;Antlr is a wonderful product, but I suffered creating the SQL grammar I needed.&lt;br/&gt;The reasons are probably:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;my inexperience in terms of parsers/lexers&lt;/li&gt;&lt;li&gt;some confusion and some holes in the free documentation&lt;/li&gt;&lt;/ul&gt;My initial idea was to download Antlr, get a &lt;a href='http://www.antlr.org/grammar/1062280680642/MS_SQL_SELECT.html'&gt;grammar describing the SQL SELECT statement&lt;/a&gt;, adapt the grammar to my needs, build the java sources from it and convert the produced AST trees to my internal structures.&lt;br/&gt;&lt;br/&gt;Simple, right? Wrong. Here are the problems for this approach:&lt;br/&gt;&lt;ol&gt;&lt;li&gt;Antlr is in version 3 now (is normally called v3). The example grammars are most made for version 2 (2.7.x). Altough v2 and v3 grammars look very similar, to convert a v2 grammar to a v3 one is not easy.&lt;/li&gt;&lt;li&gt;It is possible to buy a &lt;a href='http://www.pragmaticprogrammer.com/titles/tpantlr/index.html'&gt;book&lt;/a&gt; written by the Antlr's author. I did not want to buy the book because I'm not planning to use Antlr in the future. But then I discovered that the online documentation is partial and often referring to the old 2.7.2 version.&lt;/li&gt;&lt;li&gt;The produced java classes can have a method to get the AST tree, but as far as I understood the tree cannot be used for an interpreter, but only to check the result of the statement parsing.&lt;/li&gt;&lt;li&gt;To build an interpreter is not the only purpose for using a parser:&lt;br /&gt;Antlr is used for many other things, for example to compile, which&lt;br /&gt;means convert expressions from a grammar to another one. Consider this to avoid to get confused reading the documentation.&lt;br/&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;I struggled for a pair of weeks with these problems. At the end I was able to to understand the following concepts and to produce &lt;a href='http://matrex.cvs.sourceforge.net/matrex/matrex/MatrexSelect.g?view=markup'&gt;my grammar&lt;/a&gt;:&lt;br/&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;You can add java code directly in the grammar. With this code you can build the interpreter structures directly in the generated java code.&lt;/li&gt;&lt;li&gt;Be very careful about the case of the initial letter of the rule names. Upper case: lexer rule; Lower case : parser rule. It looks simple, but if only the initial letter of one rule name is wrong nothing works as it should.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;The lexer is used to parse single words (identifier, strings, numbers). The parser is used to parse phrases.&lt;/li&gt;&lt;li&gt;Spaces are handled automatically by the parser.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;In the java code that you add to the grammar you can set the package of the generated classes.&lt;/li&gt;&lt;li&gt;AntlrWorks generates two types of java classes: the ones to use in your application and the ones that it uses to debug. They are saved in the same place with the same names. The debug classes don't work in your application, so remember to generate the application classes after a debug session.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;So, if you give a look to the &lt;a href='http://matrex.cvs.sourceforge.net/matrex/matrex/MatrexSelect.g?view=markup'&gt;grammar &lt;/a&gt;I have written, you'll see that it is confused (rules definitions together with java code), but it works. When I run the generated java classes against an SQL expression the structures declared in the &lt;b&gt;@members&lt;/b&gt; block are populated with the correct values and from them I can interpret the expression.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4609873795568804262?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4609873795568804262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4609873795568804262' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4609873795568804262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4609873795568804262'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/10/antlr-for-sql-module.html' title='Antlr for the SQL module'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-3631762559634124274</id><published>2007-09-24T00:20:00.001-07:00</published><updated>2007-09-24T00:20:07.178-07:00</updated><title type='text'>Version 1.2: status</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Not so much has been produced in the last period, for the following reasons:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;holiday&lt;/li&gt;&lt;li&gt;got sick for one month&lt;/li&gt;&lt;li&gt;some time used understanding the concepts needed to write a grammar to parse the new internal sql template.&lt;/li&gt;&lt;/ul&gt;I'm still writing the grammar for the &lt;a href='http://matrexblog.blogspot.com/2007/07/sql-on-matrices-in-matrex.html'&gt;sql template&lt;/a&gt;. Soon I will be able to produce some code.&lt;br/&gt;The rest of the coding of version 1.2 is more or less in place.&lt;br/&gt;It clearly needs to be tested.&lt;br/&gt;&lt;br/&gt;&lt;a href='http://jruby.codehaus.org/'&gt;JRuby &lt;/a&gt;released a new version, so I will soon update the Matrex JRuby adapter.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-3631762559634124274?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/3631762559634124274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=3631762559634124274' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3631762559634124274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3631762559634124274'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/09/version-12-status.html' title='Version 1.2: status'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4366194930061047645</id><published>2007-07-31T12:32:00.001-07:00</published><updated>2007-07-31T12:36:31.174-07:00</updated><title type='text'>SQL on matrices in Matrex</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I'm planning to write a new Matrex template to &lt;b&gt;query&lt;/b&gt; matrices (only the ones with one column) using an &lt;b&gt;SQL&lt;/b&gt;-like syntax&lt;br /&gt;The idea is simple:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;consider the input matrices/vectors as columns of tables&lt;/li&gt;&lt;li&gt;query them using SQL&lt;/li&gt;&lt;li&gt;the SQL query result are the output matrices/vectors of the function.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The query is written in a language that is very similar to SQL. The differences are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the tables are defined in the query as sets of input matrices&lt;/li&gt;&lt;li&gt;sub-queries are not allowed&lt;/li&gt;&lt;/ul&gt;Operators (+, - ...) and aggregate functions (sum, max...) are available.&lt;br /&gt;For example, a query can look like:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;select sum(a.price) as sumprice, sum(a.volume) as sumvolume, b.ticker as ticker, b.validity as validity&lt;br /&gt;from [dealticker, price, volume] a, [ticker, validity] b&lt;br /&gt;where a.dealticker &lt;i&gt;= b.ticker&lt;br /&gt;group by b.ticker&lt;/i&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Here the matrices dealticker, price, volume are &lt;b&gt;grouped&lt;/b&gt; together to form the table a, of which they are columns;&lt;br /&gt;the matrices ticker, validity are grouped together to form the table b, of which they are columns.&lt;br /&gt;&lt;br /&gt;Every result column needs to be assigned a &lt;b&gt;name&lt;/b&gt; to; that is done using the &lt;i&gt;as&lt;/i&gt; keyword.&lt;br /&gt;&lt;br /&gt;All the table columns (e.g. a.price, b.ticker...) need to be expressed in the form [table].[column] (e.g. a.price).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This will be one of the most powerful templates in  Matrex. With it it will be possible to express very easily and clearly problems that otherwise could require the combination of multiple functions.&lt;br /&gt;&lt;br /&gt;Since it is not dependent by new features of the upcoming version 1.2, it is possible that the template will be available before 1.2 is released.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4366194930061047645?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4366194930061047645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4366194930061047645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4366194930061047645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4366194930061047645'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/07/sql-on-matrices-in-matrex.html' title='SQL on matrices in Matrex'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-9199669555277336267</id><published>2007-06-26T23:13:00.001-07:00</published><updated>2007-06-26T23:15:43.058-07:00</updated><title type='text'>About nebula</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://www.eclipse.org/nebula/"&gt;Nebula&lt;/a&gt; is a sub-project of eclipse that produces custom SWT widgets.&lt;br /&gt;I'm very interested in the &lt;a href="http://www.eclipse.org/nebula/widgets/grid/grid.php"&gt;grid&lt;/a&gt;, because it is supposed to have spreadsheet features like &lt;b&gt;cells selection&lt;/b&gt; and &lt;b&gt;row headers&lt;/b&gt;, which are very important in Matrex and I can just emulate in the SWT.Table widget.&lt;br /&gt;Nebula Grid is still in alpha state but it &lt;a href="http://dev.eclipse.org/mhonarc/lists/nebula-dev/msg00323.html"&gt;should become final&lt;/a&gt; when Eclipse 3.3 is released.&lt;br /&gt;I will check it (expecially with a big number of rows/columns) and possibly integrate it in Matrex in version 1.2 or 1.3.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-9199669555277336267?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/9199669555277336267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=9199669555277336267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/9199669555277336267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/9199669555277336267'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/06/about-nebula.html' title='About nebula'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-3845376759599061944</id><published>2007-06-20T12:39:00.001-07:00</published><updated>2007-06-20T12:39:05.658-07:00</updated><title type='text'>Jython debugger?</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;You can write Matrex functions as Jython or JRuby scripts.&lt;br&gt;&lt;/br&gt;Jython is included in the Matrex setup, so you can just use it.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;To debug these scripts you can use the log functionalities of Matrex.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;But today I've found out that there is a better possibility. With &lt;a href='http://www.fabioz.com/pydev/manual_adv_remote_debugger.html'&gt;PyDev&lt;/a&gt; your can remotely debug the script from Eclipse.&lt;br&gt;&lt;/br&gt;So, if a script is not working as it should you can put breakpoints, watch its variables until you don't find the problem.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;I will test it myself and write the test results in an article in this blog.&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-3845376759599061944?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/3845376759599061944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=3845376759599061944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3845376759599061944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/3845376759599061944'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/06/jython-debugger.html' title='Jython debugger?'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-195795289261398328</id><published>2007-06-20T00:52:00.001-07:00</published><updated>2007-06-20T00:56:35.609-07:00</updated><title type='text'>Work started for version 1.2</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Work started for version 1.2.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Version 1.2 will indicatively contain:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Export matrix view and presentation view to &lt;b&gt;Excel &lt;/b&gt;file.&lt;/li&gt;&lt;li&gt;Import matrices from &lt;b&gt;database &lt;/b&gt;tables (like the import from Excel files).&lt;/li&gt;&lt;li&gt;Import matrices from &lt;b&gt;CSV &lt;/b&gt;files (like the import from Excel files).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Remove multiple&lt;/b&gt; items (matrices, functions...) from a project in one shot.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Print &lt;/b&gt;matrix view and presentation view.&lt;/li&gt;&lt;li&gt;The &lt;a href="http://matrexblog.blogspot.com/2007/06/matrix-source-viewer.html"&gt;matrix source viewer&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;More &lt;b&gt;database functions&lt;/b&gt; templates (conditional query, update)&lt;/li&gt;&lt;li&gt;Use more &lt;b&gt;JFreeChart features&lt;/b&gt;: composite charts, annotations, pie charts with exploded section, step charts.&lt;/li&gt;&lt;/ul&gt;With version 1.2 a first pre-alpha version of the &lt;a href="http://matrex.sourceforge.net/doc/clientserver.pdf"&gt;Matrex server&lt;/a&gt; will be delivered.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.2 will probably be released in september/october. If some of the new features are not ready for that time, they will be moved to version 1.3.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you want to see in version 1.2 some feature that I did not consider, just add a comment to this article or send me a mail.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="poweredbyperformancing"&gt;Powered by &lt;a href="http://scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-195795289261398328?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/195795289261398328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=195795289261398328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/195795289261398328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/195795289261398328'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/06/work-started-for-version-12.html' title='Work started for version 1.2'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1958520672978890061</id><published>2007-06-09T14:01:00.001-07:00</published><updated>2007-06-09T14:01:47.459-07:00</updated><title type='text'>The matrix source viewer</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;From a &lt;b&gt;mathematical expression&lt;/b&gt; the &lt;a href='http://matrexblog.blogspot.com/2007/05/expression-parser.html'&gt;expression parser&lt;/a&gt; generates matrices and functions in a Matrex project. This is a powerful functionality in Matrex.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Once the expression parser has generated matrices and functions, the original expression gets lost. This is usally not a problem, since in the project there are all the matrices and functions (final and intermediate) that calculate the expression.&lt;br&gt;&lt;/br&gt;But sometimes you want to see again the original expression, to:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;see in one shot how a matrix has been calculated&lt;/li&gt;&lt;li&gt;know exactly which matrices and functions have been generated by the expression, for example because you want to replace the original expression with a new one and therefore you need to remove them&lt;br&gt;&lt;/br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;/br&gt;Fortunately the &lt;a href='http://matrexblog.blogspot.com/2006/08/navigation.html'&gt;info window&lt;/a&gt; shows, among the rest:&lt;br&gt;&lt;/br&gt;&lt;ul&gt;&lt;li&gt;for a &lt;b&gt;matrix&lt;/b&gt;, the function that has it as result&lt;/li&gt;&lt;li&gt;for a &lt;b&gt;function&lt;/b&gt;, the input matrices&lt;/li&gt;&lt;/ul&gt;So it is possible, from the expression's result matrix, to find out the original expression &lt;b&gt;navigating&lt;/b&gt; to the source function, to the input matrices and so on.&lt;br&gt;&lt;/br&gt;But it is a lot of work to follow all the links among functions and matrices, expecially if the original expression is long.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;To have a more valuable information, version 1.2 will contain a new functionality, called &lt;b&gt;matrix source viewer&lt;/b&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;The idea is to have a window that shows this information as a &lt;b&gt;textual expression&lt;/b&gt;, with the same format used to enter an expression in the expression parser.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Suppose you entered the expression:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;log(x + exp(y + z))&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;in the expression parser, and gave the name &lt;i&gt;logres&lt;/i&gt; to the result matrix.&lt;br&gt;&lt;/br&gt;If you open the &lt;b&gt;matrix source viewer&lt;/b&gt; on the &lt;i&gt;logres&lt;/i&gt; matrix, you'll see a window containing a text like:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;font color='#000000'&gt;log&lt;/font&gt; (&lt;font color='#000099'&gt; &lt;/font&gt;&lt;u&gt;&lt;font color='#000099'&gt;logres.log&lt;/font&gt;&lt;/u&gt; )&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Clicking on logres.log this part of the expression will be expanded and you'll have:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;log (x + &lt;font color='#000099'&gt;&lt;u&gt;logres.exp&lt;/u&gt;&lt;/font&gt; )&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Clicking on logres.exp this part of the expression will be expanded and you'll have:&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;log ( x + exp( y + z))&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;In this way with a limited number of clicks you'll have the original expression.&lt;br&gt;&lt;/br&gt;Also, a context menu on each item in the expression (excluded the parentheses) will open viewer or editor for that item.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Now the question is: why to see the original expression I need to click on links? Could it not appear as it was immediately?&lt;br&gt;&lt;/br&gt;The problem is that x, y and z could also be the result of other expressions and Matrex does not know which matrices are part of an expression and which are part of another.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1958520672978890061?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1958520672978890061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1958520672978890061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1958520672978890061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1958520672978890061'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/06/matrix-source-viewer.html' title='The matrix source viewer'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4491103110597068230</id><published>2007-05-20T05:58:00.001-07:00</published><updated>2007-05-21T13:42:54.137-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><title type='text'>The expression parser</title><content type='html'>While the &lt;i&gt;Expression Parser&lt;/i&gt; is not technically fundamental in &lt;a href="http://matrex.sourceforge.net/"&gt;Matrex&lt;/a&gt; (one can use the &lt;i&gt;Function Editor&lt;/i&gt; instead), it has become more and more central in the last versions.&lt;br /&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;The reason is simple: if you have a long expression (or formula as it is called in a classical spreadsheet)  to write, opening the &lt;i&gt;Function Editor&lt;/i&gt; for each function in the formula can be time consuming and potentially irritating.&lt;br /&gt;&lt;br /&gt;Using the &lt;i&gt;Expression Parser&lt;/i&gt; is much faster: you write the expression, as it is, in a text editor and in a few steps all the required functions and matrices are added to your project.&lt;br /&gt;&lt;br /&gt;The first thing to do to use the Expression Parser is to select the &lt;b&gt;Expression Parser menu&lt;/b&gt; in the function tree (or press Ctrl-X).&lt;function menu="" tree=""&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/function&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_UV8bHZTOgQE/RlBG05nhzgI/AAAAAAAAABA/C5UycxRZMus/s1600-h/function_tree.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_UV8bHZTOgQE/RlBG05nhzgI/AAAAAAAAABA/C5UycxRZMus/s320/function_tree.jpeg" alt="" id="BLOGGER_PHOTO_ID_5066627455425564162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;function menu="" tree=""&gt;This opens the Expression Parser wizard:&lt;/function&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_UV8bHZTOgQE/RlIDr5nhzmI/AAAAAAAAABw/p2qaO_xHP2k/s1600-h/parser_stepone.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_UV8bHZTOgQE/RlIDr5nhzmI/AAAAAAAAABw/p2qaO_xHP2k/s320/parser_stepone.jpeg" alt="" id="BLOGGER_PHOTO_ID_5067116583481101922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;function menu="" tree=""&gt;In the text editor you write the expression to add to the project. The expression is written as a combination of &lt;b&gt;function templates&lt;/b&gt;, &lt;b&gt;operators&lt;/b&gt; (+,-,*,/,^) and &lt;b&gt;matrices&lt;/b&gt;, like:&lt;br /&gt;&lt;br /&gt;cos(sin(x) + sin(y))&lt;br /&gt;&lt;br /&gt;where x and y are matrices names.&lt;br /&gt;&lt;br /&gt;You just need to write the names of the expression parts, their packages are not required.&lt;br /&gt;&lt;br /&gt;If you don't remember the name of a function template or a matrix, the &lt;b&gt;Insert..&lt;/b&gt; buttons allow you to add templates and matrices to the expression selecting them.&lt;/function&gt;&lt;br /&gt;&lt;br /&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;The expression is first parsed to a tree:&lt;br /&gt;&lt;br /&gt;&lt;/step1&gt;&lt;/function&gt;&lt;div style="text-align: center;"&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_UV8bHZTOgQE/RlIDApnhzjI/AAAAAAAAABY/WgpK5o79QTg/s1600-h/parser_step2.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_UV8bHZTOgQE/RlIDApnhzjI/AAAAAAAAABY/WgpK5o79QTg/s320/parser_step2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5067115840451759666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;br /&gt;Then the templates repository and the project are queried to determine the complete name-package of each part of the expression:&lt;br /&gt;&lt;step3&gt;&lt;br /&gt;&lt;/step3&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_UV8bHZTOgQE/RlIDNZnhzkI/AAAAAAAAABg/5Bgu3_GnaYI/s1600-h/parser_step3.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_UV8bHZTOgQE/RlIDNZnhzkI/AAAAAAAAABg/5Bgu3_GnaYI/s320/parser_step3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5067116059495091778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;step3&gt;&lt;/step3&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;br /&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;step3&gt;&lt;/step3&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;/div&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;step3&gt;&lt;br /&gt;&lt;br /&gt;At the end the name of the target matrix and function are requested. All the intermediate matrices and functions are written in special packages.&lt;br /&gt;&lt;br /&gt;&lt;/step3&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_UV8bHZTOgQE/RlIDX5nhzlI/AAAAAAAAABo/pfmh1pWPWAA/s1600-h/parser_step4.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_UV8bHZTOgQE/RlIDX5nhzlI/AAAAAAAAABo/pfmh1pWPWAA/s320/parser_step4.jpeg" alt="" id="BLOGGER_PHOTO_ID_5067116239883718226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;step3&gt;&lt;/step3&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;br /&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;step3&gt;&lt;/step3&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;/div&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;step3&gt;&lt;br /&gt;Summarizing, entering an expression in Matrex is different from entering a formula in a classic spreadsheet because:&lt;br /&gt;&lt;/step3&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;ul&gt;&lt;li&gt;Spreadsheet formulas work on &lt;b&gt;single cells&lt;/b&gt;, Matrex expressions on &lt;b&gt;vectors/matrices&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Therefore, spreadsheet formulas must be &lt;b&gt;copied&lt;/b&gt; for each result cell, Matrex expressions must be written &lt;b&gt;only once&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Spreadsheet formulas are &lt;b&gt;attached to cells&lt;/b&gt;, Matrex expressions are used to &lt;b&gt;generate&lt;/b&gt; functions and matrices in the project.&lt;/li&gt;&lt;li&gt;Therefore spreadsheet formulas can be updated as &lt;b&gt;whole&lt;/b&gt; (each cell), whether in Matrex the single generated functions and matrices must be updated &lt;b&gt;individually&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;function menu="" tree=""&gt;&lt;step1&gt;&lt;step2&gt;&lt;step3&gt;This last point is not always an advantage for Matrex. Once functions and matrices are generated, the original &lt;b&gt;expression&lt;/b&gt; that generated them is &lt;b&gt;lost&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;To solve this potential problem, Matrex version 1.2 will have  the following new features:&lt;br /&gt;&lt;/step3&gt;&lt;/step2&gt;&lt;/step1&gt;&lt;/function&gt;&lt;ul&gt;&lt;li&gt;It will be possible to see the &lt;b&gt;origin&lt;/b&gt; of a matrix as an expression: the functions and matrices of which the matrix is directly or indirecly a result. This feature will be object of an article on this blog.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It will be possible to &lt;b&gt;remove multiple&lt;/b&gt; items from a project in one shot. In this way it will be possible to easily remove all functions and matrices generated by an expression.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The last step of the expression parser will &lt;b&gt;display all &lt;/b&gt;the functions and matrices that will be generated. This will reduce the risk of generating functions and matrices from a wrong expression.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4491103110597068230?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4491103110597068230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4491103110597068230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4491103110597068230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4491103110597068230'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/05/expression-parser.html' title='The expression parser'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_UV8bHZTOgQE/RlBG05nhzgI/AAAAAAAAABA/C5UycxRZMus/s72-c/function_tree.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2887098517874645457</id><published>2007-04-27T06:53:00.001-07:00</published><updated>2007-04-27T06:53:15.563-07:00</updated><title type='text'>Help wanted</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;This week I published a &lt;a href='http://sourceforge.net/people/viewjob.php?group_id=133398&amp;amp;job_id=28227'&gt;request&lt;/a&gt; in SourceForge for Matrex developers.&lt;br&gt;&lt;/br&gt;Matrex gives you fun when you program it and there are always new things to do, new features to add.&lt;br&gt;&lt;/br&gt;But it requires time and it could be nice to have some help.&lt;br&gt;&lt;/br&gt;So, if you are interested please let me know, answering to the announcement or sending me an &lt;a href='http://matrex.sourceforge.net/bugs.shtml'&gt;e-mail&lt;/a&gt;.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2887098517874645457?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2887098517874645457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2887098517874645457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2887098517874645457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2887098517874645457'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/04/help-wanted.html' title='Help wanted'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-373561360262134391</id><published>2007-04-26T02:06:00.001-07:00</published><updated>2007-04-26T02:06:33.231-07:00</updated><title type='text'>5000 downloads!</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I hope for a much shorter time to come to 10000.&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;&lt;p class='poweredbyperformancing'&gt;Powered by &lt;a href='http://scribefire.com/'&gt;ScribeFire&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-373561360262134391?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/373561360262134391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=373561360262134391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/373561360262134391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/373561360262134391'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/04/5000-downloads.html' title='5000 downloads!'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2098636989870893636</id><published>2007-04-23T00:47:00.000-07:00</published><updated>2007-04-23T00:49:57.203-07:00</updated><title type='text'>Article about Matrex in an internet japanese magazine</title><content type='html'>This is the &lt;a href="http://journal.mycom.co.jp/news/2007/04/17/030/index.html"&gt;link &lt;/a&gt;to the article, written in Japanese.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2098636989870893636?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2098636989870893636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2098636989870893636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2098636989870893636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2098636989870893636'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/04/article-about-matrex-in-internet.html' title='Article about Matrex in an internet japanese magazine'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2048899820517371043</id><published>2007-04-15T03:43:00.000-07:00</published><updated>2007-04-15T04:08:52.636-07:00</updated><title type='text'>Matrex 1.1 released!</title><content type='html'>I'm glad to announce that Matrex 1.1 has been released.&lt;br /&gt;The purpose of this version is to make the system more open, easier to use and complete.&lt;br /&gt;The changes are the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Matrex is now able to &lt;span style="font-weight: bold;"&gt;import xls (Excel) files&lt;/span&gt;: open a Matrex project, from the project menu open the import dialog and load the Excel file:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_UV8bHZTOgQE/RiIDE2bSrQI/AAAAAAAAAAg/NNAKMgfAoDk/s1600-h/importxlsfile.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_UV8bHZTOgQE/RiIDE2bSrQI/AAAAAAAAAAg/NNAKMgfAoDk/s320/importxlsfile.jpeg" alt="" id="BLOGGER_PHOTO_ID_5053605113727462658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here you can select rectangles of cells that you import as matrices in the project.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Matrex has now a &lt;span style="font-weight: bold;"&gt;context help&lt;/span&gt;. Pressing Ctrl-F1 (or F1) in each window, the browser shows the help page for that window.&lt;br /&gt;A copy of the help is available &lt;a href="http://matrex.sourceforge.net/help/index.html"&gt;online&lt;/a&gt;.&lt;br /&gt;The help has also a summary page and can be full-text searched in the search dialog:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_UV8bHZTOgQE/RiIEJ2bSrRI/AAAAAAAAAAo/LPV1AyTOG1A/s1600-h/searchdoc.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_UV8bHZTOgQE/RiIEJ2bSrRI/AAAAAAAAAAo/LPV1AyTOG1A/s320/searchdoc.jpeg" alt="" id="BLOGGER_PHOTO_ID_5053606299138436370" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The 2D charts have been simplified and improved. Now there are only 3 kinds of charts (category, xy, time), but you can display their series in up to 7 different ways (line, line3d, bar, bar3d, area, scattered, scattered line):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_UV8bHZTOgQE/RiIFWWbSrSI/AAAAAAAAAAw/JyRMqPGMTow/s1600-h/chart_category.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_UV8bHZTOgQE/RiIFWWbSrSI/AAAAAAAAAAw/JyRMqPGMTow/s320/chart_category.jpeg" alt="" id="BLOGGER_PHOTO_ID_5053607613398428962" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The Expression Parser is now able to interpret expressions containing +,-,*,/,^ operators. The operators are translated to the related functions.&lt;br /&gt;Now it becomes really easy to build projects in Matrex.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_UV8bHZTOgQE/RiIG3mbSrTI/AAAAAAAAAA4/iwVtogHlvjY/s1600-h/parser_step1.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_UV8bHZTOgQE/RiIG3mbSrTI/AAAAAAAAAA4/iwVtogHlvjY/s320/parser_step1.jpeg" alt="" id="BLOGGER_PHOTO_ID_5053609284140707122" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2048899820517371043?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2048899820517371043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2048899820517371043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2048899820517371043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2048899820517371043'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/04/matrex-11-released.html' title='Matrex 1.1 released!'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_UV8bHZTOgQE/RiIDE2bSrQI/AAAAAAAAAAg/NNAKMgfAoDk/s72-c/importxlsfile.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4481908172174937</id><published>2007-03-29T01:03:00.000-07:00</published><updated>2007-03-29T01:12:00.686-07:00</updated><title type='text'>Matrex 1.1: some delays...</title><content type='html'>The development is terminated, the documentation is upgraded.&lt;br /&gt;Even the changes in the &lt;a href="http://matrex.sourceforge.net/"&gt;Matrex site&lt;/a&gt; are done (FAQ, new videos).&lt;br /&gt;&lt;br /&gt;The problem is the final test.&lt;br /&gt;It takes time, and I will not be able to release Matrex 1.1 before the middle of April.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4481908172174937?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4481908172174937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4481908172174937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4481908172174937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4481908172174937'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/03/matrex-11-some-delays.html' title='Matrex 1.1: some delays...'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-8374319816739801213</id><published>2007-03-21T02:18:00.000-07:00</published><updated>2007-03-21T10:54:41.076-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><title type='text'>SWT: cell selection in Table</title><content type='html'>The &lt;a href="http://www.eclipse.org/swt/widgets/"&gt;SWT Table&lt;/a&gt; allows only to &lt;span style="font-weight: bold;"&gt;select rows&lt;/span&gt;, not the cells in the rows.&lt;br /&gt;This is a strong limitation for applications that use tables to do something more complex than showing the content of database tables.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://matrex.sourceforge.net/"&gt;Matrex&lt;/a&gt; I needed to import xls (Excel) files and select from them rectangles of cells to add as matrices.&lt;br /&gt;So, I built the &lt;a href="http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/gui/util/TableWithCellSelection.java?revision=1.2&amp;view=markup"&gt;TableWithCellSelection &lt;/a&gt;class, which allows the user to select rectangles of cells in the table.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_UV8bHZTOgQE/RgFwq-RziTI/AAAAAAAAAAU/NAVMtMOkHDc/s1600-h/selection.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_UV8bHZTOgQE/RgFwq-RziTI/AAAAAAAAAAU/NAVMtMOkHDc/s320/selection.jpeg" alt="" id="BLOGGER_PHOTO_ID_5044436941206161714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It works listening the &lt;span style="font-style: italic;"&gt;mouseMove&lt;/span&gt;,  &lt;span style="font-style: italic;"&gt;mouseDown &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;mouseUp &lt;/span&gt;events to keep track of the mouse movements and to change the background of the cells when they are selected.&lt;br /&gt;The class works only for tables that are created with the SWT.FULL_SELECTION and SWT.VIRTUAL styles, which means that the table must be &lt;span style="font-weight: bold;"&gt;virtual&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Features: Clicking &lt;span style="font-weight: bold;"&gt;SHIFT &lt;/span&gt;together with the left mouse button the selection  process restarts from a previously selected cells rectangle.&lt;br /&gt;&lt;br /&gt;Limitations: It is not possible to &lt;span style="font-weight: bold;"&gt;scroll &lt;/span&gt;the table during the selection. To be able to select big rectangles you can use the SHIFT key.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-8374319816739801213?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/8374319816739801213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=8374319816739801213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8374319816739801213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/8374319816739801213'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/03/swt-cell-selection-in-table.html' title='SWT: cell selection in Table'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_UV8bHZTOgQE/RgFwq-RziTI/AAAAAAAAAAU/NAVMtMOkHDc/s72-c/selection.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2864956493543963076</id><published>2007-03-20T02:12:00.000-07:00</published><updated>2007-03-20T02:15:08.587-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Matrex 1.1 status</title><content type='html'>Matrex 1.1 coding should be finished.&lt;br /&gt;What is missing is testing and documentation update.&lt;br /&gt;The hope is to release it before easter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2864956493543963076?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2864956493543963076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2864956493543963076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2864956493543963076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2864956493543963076'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/03/matrex-11-status.html' title='Matrex 1.1 status'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2527009188277981678</id><published>2007-03-07T04:33:00.000-08:00</published><updated>2007-03-07T05:11:45.181-08:00</updated><title type='text'>More features in Matrex 1.1</title><content type='html'>The next release of Matrex, 1.1, will also contain the following features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;use of &lt;span style="font-weight: bold;"&gt;operators&lt;/span&gt; (+,-,*,/,^) in the &lt;span style="font-weight: bold;"&gt;expression parser&lt;/span&gt;. They will be converted respectively in the functions plus, minus, times, divide, pow.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;import and export of projects from/to &lt;span style="font-weight: bold;"&gt;zip&lt;/span&gt; files. In this way it will be possible for example to archive a project or to send it by mail.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2527009188277981678?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2527009188277981678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2527009188277981678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2527009188277981678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2527009188277981678'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/03/more-features-in-matrex-11.html' title='More features in Matrex 1.1'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-29988552283181485</id><published>2007-03-05T03:57:00.000-08:00</published><updated>2007-03-06T11:13:45.903-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>New symbol</title><content type='html'>Matrex got a new symbol, used both for the application icon and for the graphics of its &lt;a href="http://matrex.sourceforge.net/"&gt;web site&lt;/a&gt;.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_UV8bHZTOgQE/RewFsBdRljI/AAAAAAAAAAM/uLzo_5OqeVk/s1600-h/matrexlogo.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_UV8bHZTOgQE/RewFsBdRljI/AAAAAAAAAAM/uLzo_5OqeVk/s320/matrexlogo.png" alt="" id="BLOGGER_PHOTO_ID_5038408336984348210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;The symbol should suggest the idea of a &lt;span style="font-weight: bold;"&gt;matrix&lt;/span&gt;, with the word "Matrex" written over it.&lt;br /&gt;It should look more professional than the old falcon symbol, that did not really have so much to do with the main concepts of Matrex.&lt;br /&gt;&lt;br /&gt;I made the symbol using &lt;a href="http://www.openoffice.org"&gt;OpenOffice.org&lt;/a&gt; and &lt;a href="http://www.gimp.org"&gt;GIMP&lt;/a&gt;.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-29988552283181485?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/29988552283181485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=29988552283181485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/29988552283181485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/29988552283181485'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/03/new-symbol.html' title='New symbol'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_UV8bHZTOgQE/RewFsBdRljI/AAAAAAAAAAM/uLzo_5OqeVk/s72-c/matrexlogo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4489707991074365966</id><published>2007-02-21T04:18:00.000-08:00</published><updated>2007-02-28T02:56:54.228-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discussion'/><title type='text'>Why should I use Matrex if Excel 2007 supports multithreading?</title><content type='html'>One of the peculiar features of Matrex has always been the fact that functions are executed in different threads.&lt;br /&gt;Now Excel 2007 supports a similar &lt;a href="http://msdn2.microsoft.com/en-us/library/aa730921.aspx#office2007excelperf_ExcelPerformanceImprovements"&gt;feature&lt;/a&gt;, so one could think that there are less reasons to use Matrex instead of Excel.&lt;br /&gt;But that's wrong: the multithreading capabilities offered by the two products are different.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Purposes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Excel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Multithreading has been added to Excel &lt;span style="font-weight: bold;"&gt;to use both the cores in the new double core processors&lt;/span&gt; (Intel Core Duo and AMD X2).&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;Matrex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Matrex has introduced multithreading before these processors became popular and the purposes are the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't block the &lt;span style="font-weight: bold;"&gt;GUI &lt;/span&gt;during the function calculations&lt;/li&gt;&lt;li&gt;Get &lt;span style="font-weight: bold;"&gt;immediately &lt;/span&gt;the results of some calculation without to wait for the whole project (worksheet) to be recalculated.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Avoid that&lt;span style="font-weight: bold;"&gt; I/O dependent&lt;/span&gt;  functions  (formulas)  block CPU intensive functions.&lt;/li&gt;&lt;/ul&gt;Sure, Matrex is also able to use both the cores of a double core processor, but that is only a side effect of its multithreading feature.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Excel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't have details on the implementation, but that is what I think happens:&lt;br /&gt;&lt;br /&gt;When you recalculate a sheet the first time, all the &lt;span style="font-weight: bold;"&gt;dependencies &lt;/span&gt;among cells of the sheet (formulas) are examined and based on this the sheet is divided in 2 parts (or 4 if you have 4 cores) .&lt;br /&gt;Each part is calculated by a thread.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;Matrex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Matrex uses a &lt;span style="font-weight: bold;"&gt;pool of threads&lt;/span&gt;. &lt;span style="font-weight: bold;"&gt;Each function&lt;/span&gt; is calculated by a thread of the pool.&lt;br /&gt;In this way the whole Matrex internal engine is multithreaded.&lt;br /&gt;Only the GUI runs as a single thread, with which the other threads need to synchronize when matrices, charts or presentations are displayed in the viewers.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Conclusions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Multithreading has been just added to Excel to use well the dual core processors, but it is not a main feature in Excel: a part of the fact that the calculation is divided in 2 or more threads, the system &lt;span style="font-weight: bold;"&gt;works as in the previous versions&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Matrex is instead &lt;span style="font-weight: bold;"&gt;built on&lt;/span&gt; threads. They are &lt;span style="font-weight: bold;"&gt;everywhere&lt;/span&gt;: functions, matrices, presentations, charts, timers and the GUI have to cope with them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4489707991074365966?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4489707991074365966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4489707991074365966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4489707991074365966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4489707991074365966'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/02/why-should-i-use-matrex-if-excel-2007.html' title='Why should I use Matrex if Excel 2007 supports multithreading?'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-4696370200998386162</id><published>2007-02-08T23:58:00.000-08:00</published><updated>2007-02-09T00:03:30.910-08:00</updated><title type='text'>Printing support</title><content type='html'>To print, version 1.0 of Matrex  converts the content of the table (matrix or presentation) to a web &lt;span style="font-weight: bold;"&gt;page &lt;/span&gt;and opens a browser with it. So you can print the web page from the &lt;span style="font-weight: bold;"&gt;browser&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This works fine, but is not very professional. So why I don't print directly from Matrex? The reason is that &lt;a href="http://www.eclipse.org/swt/"&gt;SWT&lt;/a&gt;, the user interface library I'm using, does still not allow to &lt;span style="font-weight: bold;"&gt;print in Linux&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;But it seems that this will &lt;a href="http://www.eclipse.org/swt/R3_3/plan.html"&gt;change &lt;/a&gt;in SWT version 3.3.  So I will surely add the possibility to print directly from Matrex in version 1.2, or may be even 1.1 of Matrex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-4696370200998386162?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/4696370200998386162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=4696370200998386162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4696370200998386162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/4696370200998386162'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/02/printing-support.html' title='Printing support'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1418301296814724265</id><published>2007-02-04T04:14:00.000-08:00</published><updated>2007-02-04T04:25:08.530-08:00</updated><title type='text'>Help on line</title><content type='html'>Today Matrex got an&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;a href="http://matrex.sourceforge.net/help/index.html"&gt;help on line&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://matrexblog.blogspot.com/2007/01/matrex-11-plan.html"&gt;plan&lt;/a&gt; for version 1.1 of Matrex includes a &lt;span style="font-weight: bold;"&gt;context help&lt;/span&gt;.&lt;br /&gt;The context help is made as a set of linked html pages, one for each window and dialog of Matrex, so that it is possible to open the right page when pressing F1 on one window.&lt;br /&gt;This feature is more or less ready and I thought that it could be nice to have already all the help html pages as a help on the web.&lt;br /&gt;&lt;br /&gt;So, if you have a problem understanding what is the purpose of the view, open the &lt;a href="http://matrex.sourceforge.net/help/index.html"&gt;content page&lt;/a&gt; of the help, &lt;span style="font-weight: bold;"&gt;click on link for the window and read!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The content page is also reachable from the &lt;a href="http://matrex.sourceforge.net/documents.shtml"&gt;documents web page&lt;/a&gt; of the Matrex site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1418301296814724265?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1418301296814724265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1418301296814724265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1418301296814724265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1418301296814724265'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/02/help-on-line.html' title='Help on line'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2645024074004161986</id><published>2007-01-08T00:45:00.000-08:00</published><updated>2007-01-08T00:52:00.559-08:00</updated><title type='text'>Matrex 1.1 plan</title><content type='html'>It is time to start to work on the version 1.1 of Matrex.&lt;br /&gt;The main new features of Matrex 1.1 will be:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://matrexblog.blogspot.com/2007/01/context-help.html"&gt;Context Help&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Excel files (.xls) import.&lt;/li&gt;&lt;li&gt;Possibility to use bar series and line series in the same chart.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2645024074004161986?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2645024074004161986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2645024074004161986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2645024074004161986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2645024074004161986'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/01/matrex-11-plan.html' title='Matrex 1.1 plan'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-1605790461188391507</id><published>2007-01-03T04:30:00.000-08:00</published><updated>2007-01-08T00:08:18.166-08:00</updated><title type='text'>Context help</title><content type='html'>One of the features of the next version 1.1 will be the context help.&lt;br /&gt;This means that  pressing &lt;span style="font-weight: bold;"&gt;F1&lt;/span&gt; in a window Matrex shows some help  for that window.&lt;br /&gt;This will be a winning feature for Matrex, because it reduces the time needed to learn how the  system works.&lt;br /&gt;&lt;br /&gt;The content of the help will come from the PDF document &lt;a href="http://matrex.sourceforge.net/doc/howtouse.pdf"&gt;How to use Matrex&lt;/a&gt;.&lt;br /&gt;The idea is to make a map of all the windows in Matrex and assign a piece of the document as an &lt;span style="font-weight: bold;"&gt;HTML page&lt;/span&gt; to each window.&lt;br /&gt;Then refine the help text to make sense for each window and add links among the various help pages.&lt;br /&gt;&lt;a href="javascript:void(0)" onclick="return false;" tabindex="8"&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;To maintain the help system and the PDF document updated in the next versions I will:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;update the HTML pages of the help (change them, make new pages)&lt;/li&gt;&lt;li&gt;build the PDF document from the HTML pages using &lt;a href="http://www.easysw.com/htmldoc/"&gt;HTMLDOC&lt;/a&gt;. HTMLDOC is able to merge several HTML pages in one PDF document and is free.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-1605790461188391507?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/1605790461188391507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=1605790461188391507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1605790461188391507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/1605790461188391507'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2007/01/context-help.html' title='Context help'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2127468667572035015</id><published>2006-12-08T02:51:00.000-08:00</published><updated>2006-12-08T03:33:47.761-08:00</updated><title type='text'>Mac OSX Matrex start</title><content type='html'>In the Matrex Sourceforge pages Kusashi Nameta (JPN)  reports the &lt;a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1609057&amp;amp;amp;group_id=133398&amp;atid=727065"&gt;bug &lt;/a&gt;that the &lt;span style="font-weight: bold;"&gt;Mac OSX&lt;/span&gt; version of Matrex does not start correctly.&lt;br /&gt;&lt;br /&gt;The problem is that I can test the system only on Windows and Linux, so things like that can happen. There should be someone testing the Mac version before it is published.&lt;br /&gt;&lt;br /&gt;The solution, as you can see in my comments, is to add the &lt;span style="font-weight: bold;"&gt;-XstartOnFirstThread&lt;/span&gt; option to the java command.&lt;br /&gt;To do that, edit the matrex_macosx.sh file in the Matrex directory and to:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;java &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;subtitute:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;java -XstartOnFirstThread&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This should make it work correctly.&lt;br /&gt;I'll publish myself a patched version of the Mac OSX setup file this weekend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2127468667572035015?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2127468667572035015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2127468667572035015' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2127468667572035015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2127468667572035015'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/12/mac-osx-matrex-start.html' title='Mac OSX Matrex start'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-6111674456848400562</id><published>2006-11-26T22:51:00.000-08:00</published><updated>2006-11-28T03:39:19.263-08:00</updated><title type='text'>What now?</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Plans&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After the release of Matrex version 1.0, it is time to make some plans for the future.&lt;br /&gt;&lt;br /&gt;By now, I started to write the &lt;span style="font-weight: bold;"&gt;specification for the client/server architecture&lt;/span&gt;. This should start the process that takes to version 2.0 of Matrex.&lt;br /&gt;&lt;br /&gt;After that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;some adapters must be updated: I'm thinking about the adapter to &lt;a href="http://jruby.sourceforge.net/"&gt;&lt;span style="font-weight: bold;"&gt;JRuby&lt;/span&gt;&lt;/a&gt;, which must at least be tested for the last version of JRuby and the adapter to &lt;a href="http://www.scilab.org/"&gt;&lt;span style="font-weight: bold;"&gt;Scilab&lt;/span&gt; &lt;/a&gt;that will soon reach version 4.1.&lt;/li&gt;&lt;li&gt;as usual I will try to test the adapter to &lt;a href="http://www.mathworks.com/"&gt;&lt;span style="font-weight: bold;"&gt;Matlab&lt;/span&gt;, &lt;/a&gt;which has been ready for one year, but was never tested because I don't have Matlab. If someone wants to help, please contact me.&lt;/li&gt;&lt;li&gt;I will try to produce an adapter for the &lt;a href="http://www.r-project.org/"&gt;&lt;span style="font-weight: bold;"&gt;R&lt;/span&gt; &lt;/a&gt;statistical language.&lt;/li&gt;&lt;li&gt;start of the work to produce &lt;span style="font-weight: bold;"&gt;version 1.1&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Next versions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;First of all, this is how I will number the next versions of Matrex:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;A change in the first number means a &lt;span style="font-weight: bold;"&gt;major change&lt;/span&gt;: 2.0 will introduce the client server architecture.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A change in the second number means &lt;span style="font-weight: bold;"&gt;new important (visible) features&lt;/span&gt;: 1.1 will introduce the package to interact with Excel, the help framework and changes in the charts.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A change in the second number means &lt;span style="font-weight: bold;"&gt;bug fixing and minor feature changes&lt;/span&gt;: if a version 1.0.1 will be released, it will fix bugs in version 1.0.&lt;/li&gt;&lt;/ul&gt;I think these are the features to add in the next versions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Package for the &lt;span style="font-weight: bold;"&gt;interaction with Excel&lt;/span&gt;: should contain import/export of Excel spreadsheet files, communication Excel-&gt;Matrex and Matrex-&gt;Excel via Java/COM.&lt;/li&gt;&lt;li&gt;Package for the &lt;strong&gt;interaction with OpenOffice.org&lt;/strong&gt;: communication OpenOffice.org-&gt;Matrex and Matrex-&gt;OpenOffice.org (import/export can be done through .xls files).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Charts&lt;/span&gt; new features: scatter plot chart, possibility to have bars and lines in the same chart, chart attributes like line or bar type, vertical/horizontal bars.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Context help&lt;/span&gt;. Convert the &lt;span&gt;"How To Use"&lt;/span&gt; document to a context help in the Matrex desktop application. &lt;/li&gt;&lt;li&gt;Add first phase in the &lt;strong&gt;expression parser&lt;/strong&gt; where expressions of the type "a + b" (+,-,*,/,^) are converted to expressions of the type "plus(a,b)". This makes the expression parser simpler to understand.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; Zip/unzip&lt;/span&gt; of projects, so that they can be easily sent to other users.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Custom&lt;/span&gt; dialogs to enter function parameters. They are needed for complex functions like query, csv and, in the future, link.&lt;/li&gt;&lt;/ul&gt;The idea is to publish these features in a set of 1.x versions (1.1, 1.2 ...) .&lt;br /&gt;These versions should be released every 2/3 months to keep up the interest for the product.&lt;br /&gt;&lt;br /&gt;The first major version will be &lt;span style="font-weight: bold;"&gt;Matrex 2.0&lt;/span&gt;, which will introduce the &lt;span style="font-weight: bold;"&gt;client/server&lt;/span&gt; Matrex.&lt;br /&gt;&lt;br /&gt;Version &lt;span style="font-weight: bold;"&gt;2.1&lt;/span&gt; will (probably) introduce &lt;span style="font-weight: bold;"&gt;links between projects&lt;/span&gt; (also between projects running in different machines).&lt;br /&gt;&lt;br /&gt;No more M1, M2 version will published; an &lt;span style="font-weight: bold;"&gt;RC1 &lt;/span&gt;version (or more if needed) will be released before the final version to have some feedback.&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-6111674456848400562?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/6111674456848400562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=6111674456848400562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6111674456848400562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/6111674456848400562'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/11/what-now.html' title='What now?'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-2837222320686713608</id><published>2006-11-17T12:57:00.001-08:00</published><updated>2006-11-17T13:38:06.938-08:00</updated><title type='text'>Matrex 1,0 final released!</title><content type='html'>Finally, after weeks of test, Matrex 1.0 final has been released!&lt;br /&gt;The most important changes are the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Expression parser&lt;/span&gt;: the previous version was complex to use, expecially in the last step, where you had to choose the names of &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; the matrices and functions generated.&lt;br /&gt;With this version the last step requires &lt;span style="font-style: italic;"&gt;only the names of the primary (root) matrix and function&lt;/span&gt;. The intermediate matrices and func&lt;a href="javascript:void(0)" onclick="return false;" tabindex="7"&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;tions get a default name and are stored in a special package.&lt;br /&gt;&lt;br /&gt;Also, in the first step, &lt;span style="font-style: italic;"&gt;two buttons&lt;/span&gt; have been added to select templates and matrices and add them to the input expression; so if you don't remember a template name or its parameters or a matrix name you get help.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/6493/4081/1600/895317/expressionparser.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger2/6493/4081/320/151404/expressionparser.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Matrix editor:&lt;/span&gt; removed side effects when editing cells using the mouse; the editor remembers saves also the last edited cell content; better number and date parsing.&lt;/li&gt;&lt;li&gt;Added several &lt;span style="font-weight: bold;"&gt;function templates&lt;/span&gt;: among them:&lt;ul&gt;&lt;li&gt; &lt;span style="font-style: italic;"&gt;sort&lt;/span&gt;, to sort several matrices using as index the first matrix, called key (like the &lt;key,value&gt; pair of a map).&lt;/key,value&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;sumby&lt;/span&gt; and similar, similar to the &lt;span style="font-style: italic;"&gt;select sum/group by&lt;/span&gt; functionality in SQL.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;tail&lt;/span&gt; to tail a matrix with the content of another one.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;queue&lt;/span&gt; to use a matrix as a queue, to which you queue values of other matrices&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Removed any dependency of the &lt;span style="font-weight: bold;"&gt;Matrex API&lt;/span&gt; by the Matrex GUI, finally allowing to use Matrex as a library. In this way a Matrex project can be opened and used by any (java) application.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Presentation editor&lt;/span&gt;: better and easier interface. The &lt;span style="font-style: italic;"&gt;format/position editor&lt;/span&gt; has been put in a separate dialog and substituted by a format/position viewer:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/6493/4081/1600/823435/presentationFormat.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger2/6493/4081/320/602677/presentationFormat.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;aggregate&gt;&lt;br /&gt;&lt;/aggregate&gt;&lt;ul&gt;&lt;li&gt;&lt;aggregate&gt;&lt;span style="font-weight: bold;"&gt;Presentation viewer&lt;/span&gt;: add&lt;/aggregate&gt;&lt;aggregate&gt;ed vertical header:&lt;br /&gt;&lt;br /&gt;&lt;/aggregate&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/6493/4081/1600/381485/viewpresentation.jpg"&gt;&lt;br /&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger2/6493/4081/320/311925/viewpresentation.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Also, it uses &lt;span style="font-style: italic;"&gt;virtual tables&lt;/span&gt;. It is possible to view/edit large presentations without performance losses.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Matrix viewer&lt;/span&gt;: added vertical header:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/6493/4081/1600/482901/viewmatrix.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger2/6493/4081/320/709747/viewmatrix.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Added a &lt;span style="font-weight: bold;"&gt;template full-text search&lt;/span&gt; dialog to find templates by their description:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger2/6493/4081/1600/601262/find_template.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/x/blogger2/6493/4081/320/149963/find_template.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;aggregate&gt;&lt;br /&gt;&lt;br /&gt;&lt;/aggregate&gt;&lt;aggregate&gt;&lt;br /&gt;&lt;br /&gt;&lt;/aggregate&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-2837222320686713608?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/2837222320686713608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=2837222320686713608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2837222320686713608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/2837222320686713608'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/11/matrex-10-final-released.html' title='Matrex 1,0 final released!'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-116374642888555905</id><published>2006-11-16T22:49:00.000-08:00</published><updated>2006-11-16T22:53:48.896-08:00</updated><title type='text'>Matrex 1.0 final</title><content type='html'>I will probably release Matrex 1.0 final this night.&lt;br /&gt;After a very hard test (GUI, events, templates) I think Matrex is ready for production.&lt;br /&gt;This version has very few but important changes from RC1: easier to use and more professional GUI, more function templates and the Matrex API.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-116374642888555905?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/116374642888555905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=116374642888555905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/116374642888555905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/116374642888555905'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/11/matrex-10-final.html' title='Matrex 1.0 final'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-116117560974865356</id><published>2006-10-18T05:25:00.000-07:00</published><updated>2006-10-19T03:58:13.373-07:00</updated><title type='text'>RMI for Client/Server?</title><content type='html'>Matrex 1.0 final  is almost ready, so I'm thinking about the future of the system.&lt;br /&gt;As you know, there will be at least two main versions after 1.0:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1.1, with &lt;span style="font-weight: bold;"&gt;improvements &lt;/span&gt;in various areas of the desktop application.&lt;/li&gt;&lt;li&gt;2.0, which will introduce the &lt;span style="font-weight: bold;"&gt;client/server&lt;/span&gt; architecture&lt;/li&gt;&lt;/ul&gt;With version 2.0, it will be possible for a Matrex desktop (or client) to connect to a Matrex server.&lt;br /&gt;The server will host Matrex projects shared among serveral clients.&lt;br /&gt;&lt;br /&gt;Matrex has been &lt;span style="font-weight: bold;"&gt;tought from the start&lt;/span&gt; as configurable as a client/server architecture, so it should be not very difficult to introduce the new architecture.&lt;br /&gt;&lt;br /&gt;Anyway, some problems remained unresolved for a while, for example which &lt;span style="font-weight: bold;"&gt;protocol &lt;/span&gt;to use to connect client and server.&lt;br /&gt;To choose it, I considered these facts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The clients and servers can reside on a &lt;span style="font-weight: bold;"&gt;LAN&lt;/span&gt;, it does not make sense to have internet connections.&lt;/li&gt;&lt;li&gt;At least in a first stage &lt;span style="font-weight: bold;"&gt;only Matrex java clients&lt;/span&gt; will connect to the servers. If other programs need to use Matrex to calculate they can directly use the matrex API.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Performance &lt;/span&gt;is very important. The users expect the system to calculate fast even if it works in a network.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Here are the candidates possibilities:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SOAP&lt;/li&gt;&lt;li&gt;CORBA&lt;/li&gt;&lt;li&gt;Jini&lt;/li&gt;&lt;li&gt;RMI&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The advantage of CORBA and SOAP is the &lt;span style="font-weight: bold;"&gt;compatibility &lt;/span&gt;with different platforms and languages; but this is not needed.&lt;br /&gt;SOAP messages can pass through a &lt;span style="font-weight: bold;"&gt;firewall&lt;/span&gt;, but since Matrex just needs to work in a LAN, this is not needed.&lt;br /&gt;On the other side, SOAP is the &lt;span style="font-weight: bold;"&gt;slowest &lt;/span&gt;protocol and CORBA is loosing &lt;span style="font-weight: bold;"&gt;popularity&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Jini gives high realiability and performance, but it is very &lt;span style="font-weight: bold;"&gt;complex&lt;/span&gt;. Using Jini for Matrex is like to hunt birds with tanks.&lt;br /&gt;&lt;br /&gt;RMI is the right choice for Matrex. It is sure not the most recent (it was available already in Java 1.1) but it works fine, is &lt;span style="font-weight: bold;"&gt;fast &lt;/span&gt;and requires less coding, because is made exclusively for java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-116117560974865356?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/116117560974865356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=116117560974865356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/116117560974865356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/116117560974865356'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/10/rmi-for-clientserver.html' title='RMI for Client/Server?'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115981002439911767</id><published>2006-10-02T10:17:00.000-07:00</published><updated>2006-10-02T10:27:04.413-07:00</updated><title type='text'>SWT Wizard Component</title><content type='html'>I extracted from the code of Matrex 1 class and 2 interfaces to implement a generic &lt;span style="font-weight: bold;"&gt;wizard&lt;/span&gt; with the SWT  GUI library.&lt;br /&gt;It is used to implement the &lt;span style="font-weight: bold;"&gt;expression parser&lt;/span&gt; in Matrex:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6756/3671/1600/parser_step3.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/6756/3671/320/parser_step3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;You can find the code under &lt;a href="http://matrex.cvs.sourceforge.net/matrex/matrex/matrex/gui/util/wizard/"&gt;the wizard directory in the Matrex CVS repository&lt;/a&gt;.&lt;br /&gt;The license of Matrex is GPL, but may be for the wizard code it can be changed  to LGPL.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115981002439911767?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115981002439911767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115981002439911767' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115981002439911767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115981002439911767'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/10/swt-wizard-component.html' title='SWT Wizard Component'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115933946797678398</id><published>2006-09-26T23:28:00.002-07:00</published><updated>2006-09-26T23:45:46.436-07:00</updated><title type='text'>Function Templates list</title><content type='html'>I added in the Matrex site a &lt;a href="http://matrex.sourceforge.net/templates.html"&gt;list of all function templates&lt;/a&gt; with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;name&lt;/li&gt;&lt;li&gt;description&lt;/li&gt;&lt;li&gt;input matrices&lt;/li&gt;&lt;li&gt;output matrices&lt;/li&gt;&lt;li&gt;parameters&lt;/li&gt;&lt;/ul&gt;I hope this will help to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;find fast which template you have to use to write your function&lt;/li&gt;&lt;li&gt;find out templates that are needed but missing&lt;br /&gt;&lt;/li&gt;&lt;li&gt;find out fails or imprecisions in the templates descriptions&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115933946797678398?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115933946797678398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115933946797678398' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115933946797678398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115933946797678398'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/09/function-templates-list_115933946797678398.html' title='Function Templates list'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115927127189610449</id><published>2006-09-26T04:47:00.000-07:00</published><updated>2006-10-07T09:55:02.776-07:00</updated><title type='text'>SWT: table vertical header</title><content type='html'>Matrex RC1  introduced a &lt;span style="font-weight: bold;"&gt;vertical header column&lt;/span&gt; in the matrix editor table, to show the row index or, if needed, to show a vector as a vertical ruler.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-style: italic;"&gt;SWT table does not allow&lt;/span&gt; to have a vertical header column as needed for Matrex, i.e. such that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;is a&lt;span style="font-weight: bold;"&gt; fixed column&lt;/span&gt; in the table (it remains always visible scrolling horizontally)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;has cells with &lt;span style="font-weight: bold;"&gt;raised border&lt;/span&gt; to distinguish it from the other columns.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;In version RC1 I decided to not loose so much time verifying if there was a work around, so I simply used as vertical header &lt;span style="font-weight: bold;"&gt;the first column&lt;/span&gt; of the table and giving it a gray color to distinguish it from the others.&lt;br /&gt;&lt;br /&gt;In version 1.0 final I want to have a vertical header in other two tables, the matrix viewer and the presentation viewer, just to show the row index.&lt;br /&gt;Therefore I started to see if there is a &lt;span style="font-weight: bold;"&gt;better solution&lt;/span&gt; than the one implemented in version RC1.&lt;br /&gt;&lt;br /&gt;So I tested the &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet234.java"&gt;SWT snippet 2&lt;/a&gt;  which should solve the problem using as vertical header a &lt;span style="font-weight: bold;"&gt;different table&lt;/span&gt; with only one column, synchronized with the original one.&lt;br /&gt;This is a good idea, but has these problems:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the vertical header table appears with a vertical scrollbar, which lets it appear &lt;span style="font-weight: bold;"&gt;disconnected&lt;/span&gt; from the main table. The scrollbar can be hidden, but I'm not sure it can be done on any platform.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the cells have no &lt;span style="font-weight: bold;"&gt;raised border&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;sometimes the rows in the two tables appear &lt;span style="font-weight: bold;"&gt;slightly unsynchronized&lt;/span&gt;. This happens because the main table shows its first row only partially.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;These problems (expecially the last one) make this solution not very usable and definitely do not give a professional look to the application.&lt;br /&gt;Therefore by now I keep the solution used in version RC1. I'll see in the future if there will be other possibilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115927127189610449?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115927127189610449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115927127189610449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115927127189610449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115927127189610449'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/09/swt-table-vertical-header_115927127189610449.html' title='SWT: table vertical header'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115858222724716622</id><published>2006-09-18T04:30:00.000-07:00</published><updated>2006-09-18T05:26:51.623-07:00</updated><title type='text'>Again the Matrex database project</title><content type='html'>It looks like in the currently published version of &lt;span style="font-style: italic;"&gt;matrexdb &lt;/span&gt;(in &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=133398"&gt;SourceForge&lt;/a&gt;) there is a logical error: the &lt;span style="font-weight: bold;"&gt;result&lt;/span&gt; column of the &lt;span style="font-weight: bold;"&gt;position&lt;/span&gt; presentation contains wrong values.&lt;br /&gt;I will publish a new version of &lt;span style="font-style: italic;"&gt;matrexdb&lt;/span&gt; this week with (hopefully) correct values.&lt;br /&gt;This version will also contain  a readme file with more details about the structure of the &lt;span style="font-style: italic;"&gt;testdb&lt;/span&gt; project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115858222724716622?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115858222724716622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115858222724716622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115858222724716622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115858222724716622'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/09/again-matrex-database-project.html' title='Again the Matrex database project'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115788907209889427</id><published>2006-09-10T04:39:00.000-07:00</published><updated>2006-09-10T04:52:18.003-07:00</updated><title type='text'>Matrex 1.0</title><content type='html'>I'm working on the first production version of Matrex 1.0.&lt;br /&gt;The changes from version 1.0 RC1 will probably be:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Virtual tables on presentations, to be able to show presentations based on very big matrices/vectors.&lt;/li&gt;&lt;li&gt;Row header for matrix viewer and presentation viewer.&lt;/li&gt;&lt;li&gt;Simplification of the  Expression Parser when saving the produced matrices and functions. It will ask for the names of the final matrix but not of the intermediate ones.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;New function templates (e.g. sumby, sort, asinh...). I'm trying to cover the most common needs.&lt;/li&gt;&lt;li&gt;Possibility to create matrices from the clipboard content, so you build a matrix directly from the copied block of a spreadsheet.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Better function debugging.&lt;/li&gt;&lt;li&gt;Better terminology (less X,Y more columns,rows).&lt;/li&gt;&lt;/ul&gt;If you have other ideas or needs please let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115788907209889427?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115788907209889427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115788907209889427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115788907209889427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115788907209889427'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/09/matrex-10.html' title='Matrex 1.0'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115766412603871846</id><published>2006-09-07T14:13:00.000-07:00</published><updated>2006-09-07T14:38:20.646-07:00</updated><title type='text'>The Matrex database project</title><content type='html'>I published yesterday a Matrex sample project, &lt;span style="font-weight: bold;"&gt;matrexdb&lt;/span&gt;. You can find it under the &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=133398"&gt;Matrex download page in Sourceforge&lt;/a&gt;.&lt;br /&gt;I published the project zip file alone because it is big (around 2.5 Mb), since it contains an entire database and the embedded &lt;a href="http://www.mckoi.com/database/"&gt;McKoi&lt;/a&gt; library to access it from Matrex.&lt;br /&gt;&lt;br /&gt;The database contains the data of a fake &lt;span style="font-style: italic;"&gt;chocolate market&lt;/span&gt; (oh yeah), with products, spot and closing prices and more than 4000 contracts.&lt;br /&gt;The database has been generated automatically by a &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; script (also in the zip file), since it was impossible to find free data to build it. Even if fake, the data looks realistic.&lt;br /&gt;&lt;br /&gt;The project &lt;span style="font-weight: bold;"&gt;queries&lt;/span&gt; the database using JDBC and contains a presentation (something like a read-only spreadsheet) showing the &lt;span style="font-weight: bold;"&gt;positions&lt;/span&gt; built with the contracts in the database (average prices, results).&lt;br /&gt;The project contains also &lt;span style="font-weight: bold;"&gt;time charts&lt;/span&gt; showing the spot prices and the closing prices of two products.&lt;br /&gt;&lt;br /&gt;The projects uses the function templates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;query&lt;/span&gt; to query the database&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sumby&lt;/span&gt; to build the positions by product&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;lookup&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;at&lt;/span&gt; to connect the contracts with their products hours.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I think it is good demonstration of the features of Matrex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115766412603871846?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115766412603871846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115766412603871846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115766412603871846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115766412603871846'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/09/matrex-database-project.html' title='The Matrex database project'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115754658980704094</id><published>2006-09-06T05:43:00.000-07:00</published><updated>2006-09-06T14:35:50.413-07:00</updated><title type='text'>FindBugs</title><content type='html'>Since I have the need to find the most possible amount of bugs in Matrex to come to version 1.0, which is supposed to be stable, I tried &lt;span style="font-weight: bold;"&gt;FindBugs&lt;/span&gt; (http://findbugs.sourceforge.net/) with success.&lt;br /&gt;&lt;br /&gt;FindBugs finds possible bugs in your code.&lt;br /&gt;Or better, as th FindBugs site says: "FindBugs looks for bugs in Java programs.  It is based on the concept of bug patterns.  A bug pattern is a code idiom that is often an error."&lt;br /&gt;&lt;br /&gt;FindBugs can be used as a standalone application or as an Eclipse plugin. Since Matrex is an Eclipse project I tried both the installations. The Eclipse plugin is easier for me to use, because I don't need to configure anything, just install it and use it on my project.&lt;br /&gt;That's how it looks:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6756/3671/1600/findbugs_views.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/6756/3671/320/findbugs_views.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can see that the potential bugs are listed in the &lt;span style="font-weight: bold;"&gt;Problems &lt;/span&gt;view on the bottom; Clicking on a bug line, you get a good explanation of the problem in the &lt;span style="font-weight: bold;"&gt;Bug Details&lt;/span&gt; view on the left.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FindBugs does not pretend to be infallible. The idea is to find areas in your code that can potentially produce problems. So it can happen that some of the potential bugs FindBugs found in your project are &lt;span style="font-style: italic;"&gt;false positives&lt;/span&gt;, i.e. not bugs. When you can see that one of the bugs of FindBugs is, in all cases, a false positive, you can remove it from the list of bugs FindBugs checks, changing the configuration:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6756/3671/1600/findbugs_config.0.jpg"&gt;&lt;img style="cursor: pointer;" src="http://photos1.blogger.com/blogger/6756/3671/320/findbugs_config.0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As I told, my experience of FindBugs in my project Matrex is positive.&lt;br /&gt;I have to tell that the current version of Matrex is beta, but it was tested several times, so I would not expect to find too many errors.&lt;br /&gt;Findbugs found around 200 possible bugs, which is a considerable number, but not too high to check them one by one.&lt;br /&gt;These are the bugs it found:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;EI2: public method exposed internal rapresentation&lt;/span&gt;: FindBugs found this bug several times in the code of Matrix.&lt;br /&gt;One of the examples is in the &lt;span style="font-style: italic;"&gt;Matrix&lt;/span&gt; class.&lt;br /&gt;The &lt;span style="font-style: italic;"&gt;Matrix&lt;/span&gt; class is a light wrapper around a double array, that gives to it some features, among them thread synchronization.&lt;br /&gt;The array can be directly accessed from outside a &lt;span style="font-style: italic;"&gt;Matrix&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;object using the &lt;span style="font-style: italic;"&gt;getValues&lt;/span&gt; method.&lt;br /&gt;Another method, &lt;span style="font-style: italic;"&gt;setValues&lt;/span&gt;, has to be used to change the array.&lt;br /&gt;But some code could potentially access the array using &lt;span style="font-style: italic;"&gt;getValues&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;and change its content, causing inconsistencies.&lt;br /&gt;FindBugs proposes that &lt;span style="font-style: italic;"&gt;getValues&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;returns a copy of the array instead the array itself. That's generally a good solution, but cannot be applied to Matrex, which needs high performance, expecially when accessing matrices.&lt;br /&gt;So in this case all I could do is to add comment to the &lt;span style="font-style: italic;"&gt;getValues&lt;/span&gt; method to tell how to use it.&lt;br /&gt;Since all the warning of this kind are not bugs in Matrex and the code cannot be changed to remove them, I remove EI2 from the list of bugs pattern  in the configuration.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;IS2: inconsistent synchronization&lt;/span&gt;:&lt;br /&gt;In some Matrex classes some of the methods was synchronized, some not.&lt;br /&gt;That is actually very dangerous and I fixed it.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;MS: is not final but it should be&lt;/span&gt;:&lt;br /&gt;I forgot to declare some static constants as final. I don't find that dangerous because I know what is supposed to be constant in the Matrex code, but if more developers will work on the same code this bug could result in some problems.&lt;br /&gt;I fixed it.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;RCN: null check of previously referenced value&lt;/span&gt;:&lt;br /&gt;I was calling a method of an object, then I was checking if the object was null (which is totally meaningless).  In this case, I looked at the code and I could see that the object could not possibly be null. So, I removed the check. Nothing dangerous but confusing for someone reading the code.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;SIC: should be a static inner class (was not static)&lt;/span&gt;:&lt;br /&gt;There was some cases in Matrex in which a class had an inner class that was not declared static, even if it could. No danger, but better to have clean code.&lt;br /&gt;I fixed it.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;URF: unread field&lt;/span&gt;:&lt;br /&gt;I use the java.util.logging API to trace Matrex. This requires to declare a static log variable in the class that needs to be traced. It happens that sometimes the variable is declared but never used. Again no danger, but better to have clean code.&lt;br /&gt;I removed the redundant declaration.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;These potential bugs, expecially IS2 and RCN, are dangerous. So, I think FindBugs worked well, and I will re-examine the code of Matrex every time I will release a new version of it.&lt;br /&gt;&lt;br /&gt;The only thing I can ask for is the possibility to exclude the checking of a potential bug category (like EI2) only for a certain &lt;span style="font-weight: bold;"&gt;set of classes&lt;/span&gt;: it can be that I know that these classes are correct even if FindBugs finds the bug pattern in them, but I still want to check the rest of the code for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115754658980704094?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115754658980704094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115754658980704094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115754658980704094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115754658980704094'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/09/findbugs_06.html' title='FindBugs'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115674447406991836</id><published>2006-08-27T22:54:00.000-07:00</published><updated>2006-08-27T22:54:34.106-07:00</updated><title type='text'>Virtual tables</title><content type='html'>In version 1.0 RC1 I used a feature of the &lt;a href="http://www.eclipse.org/swt/"&gt;SWT library&lt;/a&gt;, the &lt;a href="http://www.eclipse.org/articles/Article-SWT-Virtual/Virtual-in-SWT.html"&gt; virtual tables&lt;/a&gt; (&lt;b&gt;SWT.VIRTUAL&lt;/b&gt;), in the matrix viewer.&lt;br /&gt;This feature allows to show in the matrix viewer a matrix of thousand of rows and columns with a very good performance.&lt;br /&gt;The idea is simple: since a table shows only a few rows at a time, you don't need to load the whole matrix in the table in one shot; you need to load &lt;b&gt;only the rows that are shown in that moment&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;My plan is to use the same feature also in the presentation viewer in a future version of the system (1.0 RC2?).&lt;br /&gt;&lt;br /&gt;In this entry, I wanted to explain how I used the virtual tables in the matrix viewer.&lt;br /&gt;For the implementation you can look in the &lt;a href="http://matrex.cvs.sourceforge.net/matrex/"&gt;CVS tree&lt;/a&gt; for the classes:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;matrex.gui.viewer.matrix.MatrixViewer&lt;/b&gt;, the viewer&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;matrex.gui.viewer.matrix.MatrixViewerCache&lt;/b&gt; the cache for the viewer, containing the current version of the matrix (in other words, the viewer's model)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I based my code on the article &lt;a href="http://www.publicobject.com/glazedlists/documentation/swt_virtual_tables.html"&gt;SWT - Virtual Tables Tutorial&lt;/a&gt;.&lt;br /&gt;As in the tutorial, I use the &lt;b&gt;SWT.SetData event&lt;/b&gt; to fill the rows of the table. When the table shows a new row, it triggers a SWT.SetData event; in this event the code fills the row with data.&lt;br /&gt;Differently from the tutorial, the matrix showed in the table can change its content at any time, and when this happens the table content must be updated.&lt;br /&gt;&lt;br /&gt;Each time the matrix is updated, the code checks how big is the change, examining a small sample of items of the matrix:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;if only a &lt;b&gt;small amount&lt;/b&gt; of items of the matrix is changed, only those items in the viewer need to be changed.&lt;br /&gt;&lt;br /&gt;Doing some test I discovered that extracting a row that the table did not show, using the statement table.getItem, the row is not null but each of its item is empty and the table does not try to populate it triggering a SWT.SetData event.&lt;br /&gt;Therefore &lt;i&gt;it does not make sense to update a row that was not shown before&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;So, the viewer cache keeps an array that tells for each row if the row was shown before (for which an SWT.SetData event has been triggered).&lt;br /&gt;When an item of a row needs to be updated:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;If the row was shown before it is updated immediately using the table.getItem.setText statement.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Otherwise &lt;b&gt;nothing is done&lt;/b&gt;: if the table later shows the row, it triggers the SWT.SetData event for that row, which reads its current, updated content from the cache.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Otherwise the table is cleared and &lt;b&gt;filled up again&lt;/b&gt; with the new matrix; as we saw in this case the performances are good because the only rows that are loaded are the ones that are shown.&lt;br /&gt;To clear the table I used the following statements:&lt;br /&gt;&lt;br /&gt;        table.clearAll();&lt;br /&gt;        table.redraw();                                   &lt;br /&gt;        table.setItemCount([number of rows of the matrix]);&lt;br /&gt;&lt;br /&gt;The last statement triggers the SWT.SetData events for the shown rows.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I tested this solution with small and big matrices, small and big changes and it seems to work correctly and with good performances.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115674447406991836?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115674447406991836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115674447406991836' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674447406991836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674447406991836'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/08/virtual-tables.html' title='Virtual tables'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115674445126966992</id><published>2006-08-27T22:53:00.001-07:00</published><updated>2006-08-27T22:54:11.270-07:00</updated><title type='text'>The Matrex API</title><content type='html'>From version RC1, the Matrex executable code is divided in 3 jar files:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;matrex_api.jar&lt;/b&gt; containing the Matrex underlying structure, engine and file system interaction&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;matrex_fun.jar&lt;/b&gt; containing the java executable code for the function templates&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;matrex_gui.jar&lt;/b&gt; containing the code for the GUI&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;matrex_fun.jar was already there in version M2 (it was called function.jar), matrex_api.jar and matrex_gui.jar was merged in a single jar file, matrex.jar.&lt;br /&gt;&lt;br /&gt;So what's the big deal?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Now you can use matrex_api.jar (probably together with matrex_fun.jar) as library in your own application.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;For example if you have an application that needs to calculate a special function you can:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;start Matrex and build a project that calculates the function (with several matrix and function items)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Let the application use that project (through matrex_api.jar and matrex_fun.jar) to calculate the function&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;In the future I will produce:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Javadoc documentation of matrex_api.jar&lt;/li&gt;&lt;br /&gt;&lt;li&gt;a guide for building an application that uses it&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115674445126966992?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115674445126966992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115674445126966992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674445126966992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674445126966992'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/08/matrex-api.html' title='The Matrex API'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115674442495333264</id><published>2006-08-27T22:53:00.000-07:00</published><updated>2006-08-27T23:20:17.850-07:00</updated><title type='text'>Matrix editor: custom headers</title><content type='html'>Often in a spreadsheet you need to work in the same time with two (or more) vectors that are connected by a key-value relationship.&lt;br /&gt;For example:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;days in a period and the quantity of rain in these days&lt;/li&gt;&lt;br /&gt;&lt;li&gt;categories of people with the average books they read in a year&lt;/li&gt;&lt;br /&gt;&lt;li&gt;cities with their population amount&lt;/li&gt;&lt;br /&gt;&lt;li&gt;bank accounts and the amount of money in them&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;In a spreadsheet you normally write them as two consecutive columns or rows.&lt;br /&gt;In this way you can use the static vector (days, categories, cities, bank accounts) as &lt;b&gt;ruler&lt;/b&gt; for the value vector (rain, books, population, money).&lt;br /&gt;&lt;br /&gt;In Matrex that was not possible before version RC1. Matrex uses a "spreadsheet" concept only in the data presentation; to edit the vectors/matrices, it uses a matrix editor:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6756/3671/1600/newmatrix.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6756/3671/320/newmatrix.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The editor can only edit one single vector/matrix, not two in the same time.&lt;br /&gt;&lt;br /&gt;In version RC1 I solved the problem using &lt;b&gt;customized headers&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;In the editor popup menu, I added the &lt;i&gt;Set header&lt;/i&gt; menu. It has the sub-menus:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Set vertical header&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Set horizontal header&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;With the first sub-menu (vertical) you select a matrix int the project. The first, static, gray column will show the content of the first column of the selected matrix:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6756/3671/1600/matrix_customheader.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6756/3671/320/matrix_customheader.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The second sub-menu (horizontal) you change the content of the first, static, gray row so that it shows the content of the first row of another matrix selected in the project.&lt;br /&gt;&lt;br /&gt;In this way you can use the header data as ruler to write the content of the edited matrix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115674442495333264?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115674442495333264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115674442495333264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674442495333264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674442495333264'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/08/matrix-editor-custom-headers.html' title='Matrix editor: custom headers'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115674439097812979</id><published>2006-08-27T22:52:00.000-07:00</published><updated>2006-08-27T23:23:22.160-07:00</updated><title type='text'>Navigation</title><content type='html'>Matrex RC1 has a new feature, named &lt;b&gt;navigation&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6756/3671/1600/navigation.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6756/3671/320/navigation.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Navigation is based on the &lt;b&gt;info&lt;/b&gt; window, which appear clicking on the &lt;b&gt;info&lt;/b&gt; menu (Ctrl-I) on a tree item (matrix, function, chart ...).&lt;br /&gt;&lt;br /&gt;The info windows are not new: they show some textual information about the item and the &lt;b&gt;lists of items&lt;/b&gt; to which it is connected.&lt;br /&gt;For example, the info window related to a matrix shows the function that calculates the matrix, the functions calculated with that matrix, the chart showing that matrix and the presentations containing that matrix.&lt;br /&gt;&lt;br /&gt;What is new is that the each connected item displayed in the info window has a popup menu (view, edit, info).&lt;br /&gt;Using the info menu you can &lt;b&gt;navigate&lt;/b&gt; the connections of the project items: for example you can open the info window of a function, from it open the info window of one of the matrices that it calculates, from it open the info window of a chart that shows that matrix.&lt;br /&gt;&lt;br /&gt;In this way you can, for example, know which items in the project change if you change the content of a matrix.&lt;br /&gt;&lt;br /&gt;It is a powerful feature to understand the &lt;b&gt;structure&lt;/b&gt; of a project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115674439097812979?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115674439097812979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115674439097812979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674439097812979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674439097812979'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/08/navigation.html' title='Navigation'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33438045.post-115674435201914953</id><published>2006-08-27T22:51:00.000-07:00</published><updated>2006-08-27T23:21:51.276-07:00</updated><title type='text'>The Matrex idea</title><content type='html'>I'm working with Excel in my job.&lt;br /&gt;Generally we use Excel to calculate formulas on data extracted from a database and present everything as sheets and charts.&lt;br /&gt;This is how we do it:&lt;br /&gt;- write the SQL query&lt;br /&gt;- get the result set in a sheet&lt;br /&gt;- write the formulas for the cells of the result set's first row&lt;br /&gt;- copy the formulas for all the other rows of the result set&lt;br /&gt;&lt;br /&gt;It is easy to copy formulas from one cell to the other in Excel, but why we need to do it at all?&lt;br /&gt;It would not be easier to get the result set as one vector for each column, and calculate the formulas on this vectors, not on sheet cells?&lt;br /&gt;&lt;br /&gt;So I wrote &lt;a href="http://matrex.sourceforge.net/"&gt;Matrex&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6756/3671/1600/screenshot.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6756/3671/320/screenshot.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Matrex is equivalent to a spreadsheet, but works with vectors, not cells.&lt;br /&gt;&lt;br /&gt;So, to do the same in Matrex, we need to:&lt;br /&gt;- write a function that produces vector/columns from an SQL query&lt;br /&gt;- apply the functions/formulas on the resulting vectors (only once).&lt;br /&gt;&lt;br /&gt;Working with Matrex you have also these advantages:&lt;br /&gt;- you can name vectors/matrices and functions (formulas)&lt;br /&gt;- multithreading&lt;br /&gt;- in the future, client/server and distributed calculation&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33438045-115674435201914953?l=matrexblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matrexblog.blogspot.com/feeds/115674435201914953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33438045&amp;postID=115674435201914953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674435201914953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33438045/posts/default/115674435201914953'/><link rel='alternate' type='text/html' href='http://matrexblog.blogspot.com/2006/08/matrex-idea.html' title='The Matrex idea'/><author><name>Andrea Ferrandi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='23' src='http://upload.wikimedia.org/wikipedia/it/thumb/7/79/La_Linea.png/180px-La_Linea.png'/></author><thr:total>0</thr:total></entry></feed>
