tag:blogger.com,1999:blog-8520262311759501972024-02-08T06:34:27.655+01:00Riverside SoftwareRiverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.comBlogger27125tag:blogger.com,1999:blog-852026231175950197.post-56219370470912680542015-12-16T16:37:00.004+01:002023-09-14T16:32:31.620+02:00Nice OpenEdge DB charts with Docker + InfluxDB + Grafana<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpjH5j3VWn1CVvBrtokdxFvSpZzUNLhyCy-JQam9GAizgftyvzN_1rxHkQBzlUgU2548FsNzB_01hSMzVlbmGqjXGqishS6s-YazSyFa1F30HEPc-JxyRY7e1u3b2jfypsMe5xVObOrFo/s1600/pic1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpjH5j3VWn1CVvBrtokdxFvSpZzUNLhyCy-JQam9GAizgftyvzN_1rxHkQBzlUgU2548FsNzB_01hSMzVlbmGqjXGqishS6s-YazSyFa1F30HEPc-JxyRY7e1u3b2jfypsMe5xVObOrFo/s400/pic1.png" /></a></div><br />
<p>As part of a migration project, I wanted to be able to monitor a few database statistics in a quick way, but also be able to provide nice and useful charts without having to rely on a huge analytics layer. A quick Google search later (oh, that wasn't so quick as I lost a lot of time reading various blogs and websites completely unrelated to the topic !), <a href="http://grafana.org/">Grafana</a> was the tool I was looking for (at least on the paper^Hscreen). As advertised on their website, Grafana is "The leading graph and dashboard builder for visualizing time series metrics". I couldn't be wrong...</p><br />
<h3>Step 0: install Docker</h3><p><a href="https://www.docker.com/">Docker</a> is a kind of lightweight virtualization technology, where you can run multiple applications independently in containers, without having to virtualize the entire operating system. Looking for a new Tomcat instance ? Just install Docker from your favorite package manager ('yum install docker' for example), then execute the image with 'docker run -p 8888:8080 tomcat:8.0'. In a few seconds, you'll have a new Tomcat 8 container running, and you'll be able to access http://localhost:8888. Need another one ? Execute 'docker run -p 8889:8080 tomcat:8.0'. A few seconds later, another Tomcat 8 instance will be up and running, accessible from http://localhost:8889.</p><p>So why Docker here ? InfluxDB and Grafana are based on languages I'm not used to, and I didn't want to spend time pushing various knobs and triggers to make them work. By using pre-configured images, I knew it would work out of the box, and I would just have to redirect a few ports</p><br />
<h3>Step 1: install InfluxDB</h3><p>If you're an OpenEdge Management user, you probably know that the trend database stores metrics. Same story here, we'll have to store a lot of metrics, but why bother installing a full RDBMS system ? While I find OpenEdge extremely powerful, there's no one size fits all. And when it comes to time-series data, <a href="https://influxdata.com/">InfluxDB</a> is extremely powerful !</p><p>Using Docker, starting a new InfluxDB instance is :</p><pre>docker run -d -p 8083:8083 -p 8086:8086 --name influxdb tutum/influxdb</pre><p>Now, just verify that you can connect to http://localhost:8083, and create a new database with 'CREATE DATABASE foo'</p><br />
<h3>Step 2: install Grafana</h3><p>Grafana is the Web layer which fetch data from InfluxDB, and display them as gorgeous charts</p><p>Using Docker, it's still easy:</p><pre>docker run -d -p 3000:3000 --link influxdb:influxdb --name grafana grafana/grafana</pre><p>The --link switch let Docker know that those two containers will be able to see each other. You can now verify that you can connect to http://localhost:3000</p><br />
<h3>Step 3: collect OpenEdge metrics</h3><p>George Potemkin <a href="ftp://ftp.progress-tech.ru/pub/Users/george/Programs/DbStatDump/">published</a> some time ago a set of procedures to collect metrics from OpenEdge databases. With a few lines of code, I've been able to change the output (the OpenEdge EXPORT statement) to something which can be read by InfluxDB.<br />
You can find those updated procedures on <a href="https://github.com/jakejustus/oestatdump">GitHub</a></p><p>If you know how to start an OpenEdge session, it won't be difficult the collect metrics. Just define the PROPATH variable to point at the proceures, execute _progres connected to the set of DB you want to monitor, and execute DbStatDump.p with '-param /path/to/snapshot.d'. This file will store a snapshot of the latest values, so that the next execution will compute the difference. In short, if you trigger the statistics every five minutes, the generated metrics will only show what happened during the last five minutes.</p><p>The working directory will now contain a set of *.txt files you'll have to send to InfluxDB. This part is extremely easy as InfluxDB can be fed using a REST interface ; in my case, I'm just using curl this way :</p><pre>find /path/to/stats -name "*.txt" -print | while read filename ; do /usr/local/bin/curl -X POST -i --data-binary @${filename} "http://localhost:8086/write?db=foo" && rm ${filename} ; done</pre><br />
<h3>Step 4: enjoy nice charts !</h3>Once data are flowing in the DB, you can starting designing charts, and that's the really easy part. An example for the query editor of the main buffer pool reads :<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Lm_ou01WCKhJVO8AhIYbCe_8b1anV7NAbee9DHgyTX-VFtcI82brti4j0VJKSjVAp0YaSbaLm0LaIi56sw3lqgAO7XJWTbWOkQGWdUeTkqJBJp3-RM8h0Ala7j2VBy3bqGHBikCFxak/s1600/pic2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Lm_ou01WCKhJVO8AhIYbCe_8b1anV7NAbee9DHgyTX-VFtcI82brti4j0VJKSjVAp0YaSbaLm0LaIi56sw3lqgAO7XJWTbWOkQGWdUeTkqJBJp3-RM8h0Ala7j2VBy3bqGHBikCFxak/s400/pic2.png" /></a></div><br />
<h3>A few screenshots</h3><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiuEfgmajsRXwhjM1ki9kLrujKTOs4g9TXKEj0jkN9ASPbQPDi7g049U_wr7GGUfs-MSEvY3i9N6lgcGZuio8N25RuzpgXDFhsV1VxdXE5r37IRS7S4GcfEFfoo2ZmTthVd0RlsAZ3b9s/s1600/pic3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiuEfgmajsRXwhjM1ki9kLrujKTOs4g9TXKEj0jkN9ASPbQPDi7g049U_wr7GGUfs-MSEvY3i9N6lgcGZuio8N25RuzpgXDFhsV1VxdXE5r37IRS7S4GcfEFfoo2ZmTthVd0RlsAZ3b9s/s400/pic3.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYRMP_oE528KiiP1h3BSjkc27w8ynsJ4EpQQneErG3236QVbCp9kado_8SRMU45ZMZn5eeZaXYvHNvxddbyXP9IStKetYZVRc8CioQ84y3T4dYeMWDfTEx6KDCHrLcSubVGDGCduMA4aU/s1600/pic4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYRMP_oE528KiiP1h3BSjkc27w8ynsJ4EpQQneErG3236QVbCp9kado_8SRMU45ZMZn5eeZaXYvHNvxddbyXP9IStKetYZVRc8CioQ84y3T4dYeMWDfTEx6KDCHrLcSubVGDGCduMA4aU/s400/pic4.png" /></a></div><br />
<h3>A few more facts</h3><ul><li>In order to use the latest InfluxDB version, I had to regenerate the Docker image. Quite easy to do by editing the Dockerfile at https://github.com/tutumcloud/influxdb. EDIT : this has been fixed in the main GitHub repository.</li>
<li>Same problem for Grafana, the Docker image wasn't up to date. Regenerating the image was also really easy, just had to change the version number in the Dockerfile.</li>
<li>InfluxDB and Grafana were installed on an EC2 instance, behind a reverse proxy. A riverside-software.fr subdomain was used to redirect the calls to the Docker instance, without any problem</li>
<li>The statistics are collected on an HP-UX 11.31 box, running OpenEdge 11.3. Twelve databases are monitored, with around 400 concurrent sessions, and the biggest DB is around 170 Gb, with 350 tables and 1200 indexes</li>
<li>Statistics are triggered from a remote Jenkins server, every 5 minutes, as sending metrics require an Internet connection. This Jenkins server is also running on HP-UX, and <a href="http://hpux.connect.org.uk/">depothelper</a> has been used to install curl. It takes approximately 5 to 6 seconds to fetch statistics from the 12 databases.</li>
<li>Retention policy can be defined in InfluxDB, especially useful if you don't want to keep your data for a long time, and if you don't want to manually clean data (compact job anymore ? :-) )</li>
<li>Don't expect Grafana to display any kind of chart. Grafana displays time-based series, so no piechart for example (although such a serie could be represented as a piechart, it's still not possible).</li>
<li>Have fun !</li>
</ul><br />
Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com1tag:blogger.com,1999:blog-852026231175950197.post-86373317455641156222015-01-23T18:22:00.004+01:002015-01-23T18:22:59.432+01:00OpenEdge plugin for JenkinsOpenEdge plugin for Jenkins : <a class="ot-anchor aaTEdf" dir="ltr" href="https://github.com/jakejustus/openedge-jenkins-plugin" rel="nofollow" target="_blank">https://github.com/jakejustus/openedge-jenkins-plugin</a><br /><br />A
simple project to configure OpenEdge versions, install locations on
master and slaves, and to define OpenEdge axis in matrix jobs<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTQd23KpHVxvHujWSw5GUzE5qi8oVsNEM2ApvIzT1ZY4_tugIHkvf3JPAd6vSBefs12qlu9kcSG4SnIKjw-NBDexvxNVtpTioMcQfUs1yl0NRg31bXasQXCtwOScBUlddpAIyk9Mppyp0/s1600/OpenEdgeMatrix.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTQd23KpHVxvHujWSw5GUzE5qi8oVsNEM2ApvIzT1ZY4_tugIHkvf3JPAd6vSBefs12qlu9kcSG4SnIKjw-NBDexvxNVtpTioMcQfUs1yl0NRg31bXasQXCtwOScBUlddpAIyk9Mppyp0/s1600/OpenEdgeMatrix.png" height="160" width="320" /></a></div>
Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com1tag:blogger.com,1999:blog-852026231175950197.post-56006143782094806482013-11-29T10:17:00.000+01:002013-11-29T10:17:18.400+01:00De retour du PUG Challenge à Bruxelles<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfOiRwY_LEhZeQqzaM0GjGtdnrI50YGuLNte1oRmz0CCyjz3Kb3ETEYB-9gfwtvWo1mqeTGXoAfnAwLT68Cnb6qUuQUBOaAHnNSmYZW8OBrOzvr1l-VHIJT4D9FL_VOHN6a-VGh46wJ2g/s1600/131107_PUG+Conference+Preview_96dpi+(1+von+29).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfOiRwY_LEhZeQqzaM0GjGtdnrI50YGuLNte1oRmz0CCyjz3Kb3ETEYB-9gfwtvWo1mqeTGXoAfnAwLT68Cnb6qUuQUBOaAHnNSmYZW8OBrOzvr1l-VHIJT4D9FL_VOHN6a-VGh46wJ2g/s400/131107_PUG+Conference+Preview_96dpi+(1+von+29).jpg" width="400" /></a></div>
<br />
Fruit de la collaboration des différents clubs utilisateurs Progress européens, le PUG Challenge s'est tenu cette année à Bruxelles au Radisson Blu Royal Hotel. Plus de 450 participants de 24 pays ont été réunis pour trois jours de sessions (dont une journée complète dédiée aux workshops) sur des sujets tels que l'administration de bases de données, la modernisation d'applications, le développement avec OpenEdge Mobile, l'intégration Corticon, Rollbase, la roadmap des prochains mois, etc...<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaOl8LU_c2GLXXkWqhUTLPqEf6qoKyzhHag4mjoYg6m9FWLb5yx1f8NjIrMKzryISZqT5fejhlMKBW-6OKzFkb-J6EyCLJ7fss8nYeTfbM6Y2F_6u5RMnOwKPQVQJX_jsCH1lMHA8bEpY/s1600/131107_PUG+Conference+Preview_96dpi+(18+von+29).jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaOl8LU_c2GLXXkWqhUTLPqEf6qoKyzhHag4mjoYg6m9FWLb5yx1f8NjIrMKzryISZqT5fejhlMKBW-6OKzFkb-J6EyCLJ7fss8nYeTfbM6Y2F_6u5RMnOwKPQVQJX_jsCH1lMHA8bEpY/s200/131107_PUG+Conference+Preview_96dpi+(18+von+29).jpg" width="132" /></a> Phil Pead (PDG de Progress) est intervenu avec Karen Padir (Chief Technical Officer) pour présenter leur vision du futur de Progress Software. Et comme à leur habitude, ils sont restés disponibles plusieurs heures pour discuter et échanger les points de vue avec les participants.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNRy_xQSDNrfxjbXUeTfWMUA1UCaqGJLKB6w5Ji103mnR1E4Mdalhez2G7FRwa31_-4K8fU6g2DUHmV2N_vdF9H-vlaBKN3UzO_onvCPsxa8UtsrVrOKMXUas57tz8wmp7O1IbEaDH7N4/s1600/131107_PUG+Conference_96dpi+%252875+von+328%2529.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNRy_xQSDNrfxjbXUeTfWMUA1UCaqGJLKB6w5Ji103mnR1E4Mdalhez2G7FRwa31_-4K8fU6g2DUHmV2N_vdF9H-vlaBKN3UzO_onvCPsxa8UtsrVrOKMXUas57tz8wmp7O1IbEaDH7N4/s1600/131107_PUG+Conference_96dpi+%252875+von+328%2529.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNRy_xQSDNrfxjbXUeTfWMUA1UCaqGJLKB6w5Ji103mnR1E4Mdalhez2G7FRwa31_-4K8fU6g2DUHmV2N_vdF9H-vlaBKN3UzO_onvCPsxa8UtsrVrOKMXUas57tz8wmp7O1IbEaDH7N4/s1600/131107_PUG+Conference_96dpi+%252875+von+328%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNRy_xQSDNrfxjbXUeTfWMUA1UCaqGJLKB6w5Ji103mnR1E4Mdalhez2G7FRwa31_-4K8fU6g2DUHmV2N_vdF9H-vlaBKN3UzO_onvCPsxa8UtsrVrOKMXUas57tz8wmp7O1IbEaDH7N4/s320/131107_PUG+Conference_96dpi+%252875+von+328%2529.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: center;">Le PUG Challenge a également réuni une quinzaine de sponsors (dont Riverside Software), pour présenter leurs nouveautés, produits et technologies.</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: center;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: center;">Au niveau de club utilisateurs français, je tiens à adresser mes félicitations à Proginov qui a envoyé deux personnes pour faire une présentation technique sur les méthodes de gestion d'un très grand nombre de bases de données. A noter que toutes les présentations sont disponibles sur le site de l'événement (http://www.pugchallenge.eu, section Agenda).</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: center;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: center;">Rendez-vous l'année prochaine soit à Amsterdam ou à Dusseldorf, et en espérant que la délégation française soit plus importante que cette année !</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-43642640778368170632013-04-29T23:53:00.000+02:002013-04-29T23:53:11.589+02:00PCT - 10th anniversaryAccording to the <a href="https://code.google.com/p/pct/source/browse/CHANGELOG">changelog</a>, the first version of <a href="http://code.google.com/p/pct">PCT</a> was released on June 6th, 2003. Although it's a simple project, it changed the way many companies are working with OpenEdge. Some facts about PCT :<br />
<br />
<ul>
<li>It started as a side project when I was working for Phenix Engineering, dealing with multiple combinations of the same product, on version 9 and 10, Linux and Windows, and OpenEdge / Oracle / SQL Server databases</li>
<li>While the first version was released on June 6th, the first commit in the repository is only from July 28th</li>
<li>The first patch by an external contributor was committed on November 3rd 2003 by Flurix (don't know his real name, or the company)</li>
<li>The first version included PCTCompile, PCTCreateBase, PCTLibrary, PCTLoadSchema and PCTDumpSchema tasks. No PCTRun at this time.</li>
<li>The first unit tests were committed on October 26th, 2003 : 7 tests for this first commit</li>
<li>There are now more than 230 unit tests, multiplied by 7 test platforms, so approximately 1600 test cases for each build</li>
<li>There was no Hudson, no Jenkins in 2003. PCT was compiled every night on a Pentium (60 MHz or so) sitting under my desk</li>
<li>As of today, there were 1358 commits (a bit more a commit every 3 days, not a very big project !)</li>
<li>I included some statistics on PCT usage in September 2009, to know if it was worth working on PCT. I don't remember the exact results, but they were good enough to continue...</li>
<li>The latest build of PCT (released mid-March) was downloaded 160 times. Not bad for an OpenEdge only dev toolkit.</li>
<li>I will create a 1.0 (or 10.0 ?) version to celebrate this anniversary</li>
<li>In the mean time, I released 18 versions from 2003 to 2011...</li>
<li>And a bit less than 40 continuous integration builds since 2011</li>
<li>Under the hood, more than 200 builds from the test repository</li>
<li>PCT started on SourceForge, and migrated to Google Code and Mercurial (unknown date, I'd say in 2009 or 2010)</li>
<li>The first time PCT was presented in a public conference was the German PUG event in 2009 (along with Padeo, a deployment solution for OpenEdge, using MSI installers)</li>
<li>Multi-threaded compilations were introduced in 2007 because I needed a test project to play with Java synchronization mechanisms. I never really expected people would use it, and was a bit surprised when the first bug reports came in</li>
<li>PCT will be a foundation of a brand new source code analysis project, based on Sonar Source. A preview can be seen <a href="http://sonar.riverside-software.fr/">here</a></li>
<li>If you're working with PCT (or not) and would like to improve it : you can test it, report bugs, suggest improvements, provide patches... You can also correct my bad english in the documentation. </li>
</ul>
<br />
<br />
<br />
As the 1.0 (or 10.0) version will be released during the <a href="http://www.pugchallenge.org/">US PUG Challenge</a>, I'll be happy to share a drink with PCT users and contributors ! And on the good side of the ocean :-) I'll be happy to do the same during the <a href="http://www.pugchallenge.eu/">EU PUG Challenge</a> !<br />
<br />
GillesRiverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com1tag:blogger.com,1999:blog-852026231175950197.post-65309347205919513372013-04-28T20:02:00.003+02:002013-04-28T20:02:59.539+02:00Next conferencesI'm pleased to be invited at the <a href="http://www.puguk.org/index.php?option=com_content&view=article&id=251&Itemid=113">UK Spring conference</a> on May 25th, and <a href="http://pugchallenge.org/agenda.html">PUG Challenge Americas</a> on June 9th-12th. I'll present continuous integration best practices with OpenEdge, and a new session on source code analysis with <a href="http://www.sonarsource.com">Sonar Source</a>.<br />
<br />
If you're looking for a way to streamline your OpenEdge application development lifecycle or to improve your code quality, you just have to attend those sessions!Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-34450947401294528672013-04-20T10:10:00.002+02:002013-04-20T10:10:51.283+02:00OpenEdge source code analysis - Teaser #2<a href="http://code.google.com/p/pct">PCT</a> source code <a href="http://sonar.riverside-software.fr">analysis</a> with <a href="http://www.sonarsource.com">SonarSource</a>Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-70072075080410121132013-03-11T20:55:00.001+01:002013-03-11T20:55:24.315+01:00Source code analysis - Teaser<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjHRw9c4SPYh6kI-gjyeKTs6UoPeuFN1LuPsjJgh6pkRrWjJaDOefAspoEnBRpL0utvB0Q7hG7o-XVyaG70AiMSb8DXwhIIbiUwGiZa1l4wyVJUexnVmTOx03MPgozsZrz93w7IbBFLCE/s1600/sonar.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjHRw9c4SPYh6kI-gjyeKTs6UoPeuFN1LuPsjJgh6pkRrWjJaDOefAspoEnBRpL0utvB0Q7hG7o-XVyaG70AiMSb8DXwhIIbiUwGiZa1l4wyVJUexnVmTOx03MPgozsZrz93w7IbBFLCE/s320/sonar.png" /></a><br />
<br />
Guess what's coming next...Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com6tag:blogger.com,1999:blog-852026231175950197.post-57305070834979689542013-02-10T18:43:00.000+01:002013-02-10T18:43:40.677+01:00OpenEdge class documentationThanks to <a href="http://www.consultingwerk.de">ConsultingWerk</a>, it's now possible to generate an HTML documentation for OpenEdge classes. An example can be downloaded <a href="http://riverside-software.fr/pct/HtmlDocumentation.zip">here</a>. Thanks Mike and Sebastian for sharing this code.<br />
<br />
A <a href="http://code.google.com/p/pct/wiki/HtmlDocumentation">PCT task</a> has been created, to be able to generate the documentation as part of your continuous integration process. Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-33866341922720948972012-09-11T13:02:00.001+02:002012-09-11T13:02:43.393+02:00Javadoc-like documentation for OpenEdge classesRiverside Software is proud to announce the availability of a new task in <a href="http://code.google.com/p/pct/">PCT</a> to automatically generate <a href="http://docs.oracle.com/javase/7/docs/api/">Javadoc-like</a> documentation from your OpenEdge classes. OK, I'm lying, this is not Javadoc-like at the moment, it's just <a href="http://pct.rssw.eu/OpenEdge.DataAdmin.Binding.DataAdminContext.xml">XML</a> ! Conversion from XML files to nice looking HTML pages is being worked on, and should be available soon.<br />
<br />
This task is based on the implementation of the ABL parser included in OpenEdge Architect, and this first successful attempt of source code parsing offers an extremely large range of possibilities in source code analysis (conformance to coding standards, potential problems, deprecated features, ...).<br />
<br />
Be sure to read the requirements for the new <a href="http://code.google.com/p/pct/wiki/ClassDocumentation">ClassDocumentation</a> task, and leave comments or <a href="mailto:contact@riverside-software.fr">contact us directly</a> !Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-79117389861536017962012-08-30T09:46:00.000+02:002015-03-07T22:10:15.300+01:00Webspeed setup on TomcatThe latest versions of OpenEdge allow simple serialization of temp-tables and prodatasets to JSON, and in this context, Webspeed may become more and more popular as it can serve the JSON result directly, without having to rely on Java/ASP/Whatever.<br />
As I'm mainly working with Java, I always have a servlet container ready to run. But the Progress documentation doesn't mention Tomcat as a deployment plaftorm ; here is this guide !<br />
<br />
<h3>Step 1 : Download Tomcat</h3><div>This guide is for Tomcat 6, but any other version should work. So grab Tomcat from <a href="http://tomcat.apache.org/download-60.cgi">http://tomcat.apache.org/download-60.cgi</a> and install it (for the Windows installer version) or extract it (for the standalone ZIP file).</div><div>In this documentation, $CATALINA_HOME will represent the installation path.</div><h3>Step 2 : create a new webapp</h3><div>Create a new directory in $CATALINA_HOME/webapps. This directory has to called webspeed followed by the version number, i.e. if you're running OpenEdge 11.0, the directory will be $CATALINA_HOME/webapps/webspeed110.</div><div>In this documentation, $WEBAPP will represent this directory</div><div>In this directory, create a subdirectory WEB-INF (case-sensitive).</div><h3>Step 3 : copy static files</h3><div>Copy the content of $DLC/webspeed to $WEBAPP, then copy $DLC/bin/cgiip.exe to $WEBAPP/WEB-INF/cgi (create a subdirectory for it).</div><h3>Step 4 : create web.xml</h3><div>The file web.xml is the webapp description file : </div><pre class="brush:xml"><?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value>WEB-INF/cgi</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>passShellEnvironment</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi/*</url-pattern>
</servlet-mapping>
</web-app>
</pre><h3>Step 5 : privileged application</h3>Create an XML file in $CATALINA_HOME/conf/Catalina/localhost, with the same name as the webapp directory : if you created in step 2 a directory called webspeed110, then create webspeed110.xml.<br />
The content of this file is :<br />
<pre class="brush:xml"><Context privileged="true" />
</pre><h3>Step 6 : configure your webspeed broker</h3>This is OpenEdge configuration, and it won't be covered here...<br />
<h3>Step 7 : play !</h3>Start Tomcat, and go to http://localhost:8080/webspeed110/cgi/cgiip.exe/WService=wsbroker1/workshop<br />
This URL assumes that you're running with the default Webspeed broker wsbroker1.<br />
<h3>Bonus step 1 : URL rewriting</h3><div>Using URL like /webspeed110/cgi/cgiip.exe/WService=wsbroker1/programName can be dangerous, as it gives users the knowledge that CGI is being used and active, allows anybody to change the broker name, and so on...</div><div>A Tomcat filter is already available to rewrite URL, available <a href="http://tuckey.org/urlrewrite/">here</a>.</div><div>To setup this filter, you'll need to create a new directory $WEBAPP/WEB-INF/lib and drop <a href="http://urlrewritefilter.googlecode.com/files/urlrewritefilter-4.0.3.jar">this JAR file</a>.</div><div>Update your web.xml file to declare this filter :</div><pre class="brush:xml"><filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>confReloadCheckInterval</param-name>
<param-value>0</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
</pre><div>Then create a file urlrewrite.xml in $WEBAPP/WEB-INF, with this content :</div><pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
<from>/cgiip/(.*)</from>
<to>/cgi/cgiip.exe/WService=wsbroker1/$1</to>
</rule>
<!-- default rules included with urlrewrite -->
<rule>
<note>
The rule means that requests to /test/status/ will be redirected to /rewrite-status
the url will be rewritten.
</note>
<from>/test/status/</from>
<to type="redirect">%{context-path}/rewrite-status</to>
</rule>
<outbound-rule>
<note>
The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
the url /rewrite-status will be rewritten to /test/status/.
The above rule and this outbound-rule means that end users should never see the
url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
in your pages.
</note>
<from>/rewrite-status</from>
<to>/test/status/</to>
</outbound-rule>
</urlrewrite>
</pre><div>Restart Tomcat, and then you'll be able to access the workshop at http://localhost:8080/webspeed110/cgiip/workshop<br />
<br />
<h3>Bonus step 2 : cgi.bat (and a reminder for myself)</h3><pre class="brush:xml"><?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value>WEB-INF/cgi</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value>c:\windows\system32\cmd.exe</param-value>
</init-param>
<init-param>
<param-name>executable-arg-1</param-name>
<param-value>/c</param-value>
</init-param>
<init-param>
<param-name>passShellEnvironment</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi/*</url-pattern>
</servlet-mapping>
</web-app></pre></div><div>With cgi.bat like that :</div><div><pre class="brush:xml">@echo off
set DLC=C:\Progress\OPENED~1.5
set PROMSGS=%DLC%\promsgs
set WRKDIR=%TEMP%
REM 3055 is default port of wsbroker1
%DLC%\bin\cgiip.exe localhost 3055
</pre></div><div></div>Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-22851588861610694062011-11-07T09:58:00.003+01:002011-11-07T09:58:28.635+01:00PUG Challenge 2011 - AmsterdamFirst of all, many thanks to the PUG committee for setting up such a great event.<br />
Here are my presentations about <a href="http://riverside-software.fr/files/ContinuousIntegration.pdf">continuous integration</a> and <a href="http://riverside-software.fr/files/vmware-EC2.pdf">deployment to vmware/EC2</a>.Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com1tag:blogger.com,1999:blog-852026231175950197.post-87771721941427801672011-09-20T13:47:00.000+02:002011-09-20T13:47:13.045+02:00Progress RevolutionI'm currently attending Progress Revolution in Boston, and waiting for the first session to start ! People who want to discover continuous integration and deployment automation should really attend Mr Preece session "A 21st century revolution in development methods" today afternoon. I'll attend this session and will be available with Brian Preece to answer questions.Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com2tag:blogger.com,1999:blog-852026231175950197.post-616233643788461452011-03-15T14:48:00.000+01:002011-03-15T14:50:07.278+01:00IE9 is out<div class="separator" style="clear: both; text-align: center;">
<a href="http://riverside-software.fr/files/ie9.png"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcIiCrvj3HQyvTjIhAhkD1NvULgE0-jkTaQxZ-L1xwQgtKbamF6qbqD92Xo8f__J7-9TRSW_Dkz2lYkVX1fXpAZihhF2l-uXPCU976wn_0jSEsGRD0sSOZUERVhO1oatXl1AS07CR-sPo/s320/ie9.png" width="320" /></a></div>
Nice landing page ! But it seems that UTF-8 is still a problem in 2011...Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com1tag:blogger.com,1999:blog-852026231175950197.post-13058540187940536732011-03-09T16:52:00.000+01:002011-03-09T16:52:33.429+01:00PUG UK & Ireland - Spring conferenceFor those who were not able to attend my session at the latest PUG Challenge, I'll do it again in Birmingham on Wednesday 23rd March 2011. As a reminder, my session is about build automation and continuous integration in an OpenEdge environment. Target audience is mainly developers and architects, but managers willing to know how to keep developers working on real code and not on useless things should attend this session !<br />
<br />
<br /><a href="http://puguk.org/index.php?option=com_content&view=article&id=160&Itemid=75">PUG UK & Ireland - Spring conference</a>Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-43787582680843090732011-02-22T18:54:00.000+01:002011-02-22T18:54:13.716+01:00PCT 0.18 is releasedA regression was introduced in 0.17, released a few days ago ; incremental dumps were only working on 10.2A+. A bug fix release (named 0.18, but could have been named 0.17.1) was released yesterday. Download it from <a href="http://code.google.com/p/pct/downloads/list">Google code</a> !Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-81966737670956180552011-02-14T23:18:00.000+01:002011-02-14T23:18:51.480+01:00Return values, exceptions and error status shouldn't be left unread...I just lost three hours. Not really the end of the world, but really annoying when you find it was a stupid mistake, combined with badly written code.<br />
I was working on an enhancement for <a href="http://pct.rssw.eu/">PCT</a>, allowing database connections to be made either with the standard dbName/dbDir/hostName/portNumber attributes, or with just a paramFile attribute. Just a few lines of code to change so that aliases are not broken, a few new test cases, done in half an hour, everything's working. In fact, no, database connections are done differently with background compilations. Spent two minutes correcting this mistake, copied/pasted test case for this task, and boom... Ran tests again, it works... Ran again, boom...<br />
Test cases working half the time when you're working with thread and forked processes communicating with a main server usually mean that you're running into synchronization issues. Just in case, I take "Java concurrency in practice" from my bookshelf, ready to debug this problem. Adding some debug messages in OpenEdge sessions, trying different combinations, re-doing a complete schema of this inter-process and inter-thread communication, I'm unable to find the cause of the problem.<br />
Until I find the "Ha ha" ! My test case is creating a Progress database, and two spawned sessions are compiling programs. But I'm running those sessions with single user connections. And there's NO ERROR HANDLING FOR CONNECTION FAILURES !!! So depending on the mood of my computer, compilation was sometimes done by the first thread, and sometimes by the second thread. No problem for the first thread, DB connection was OK, but the second thread was never able to connect the database (and so compile programs). But I never got a warning or error message saying that it wasn't able to connect...<br />
<br />
Result : just lost time, and I have to modify error handling so that DB connections are gracefully handled. Connection failure was handled in OpenEdge, pushed back to the first OpenEdge procedure, pushed back to the Java thread, and there it was dropped silently.<br />
<br />
Error status and exceptions are not there to bother the programmer, it's just that something is wrong. So unless you're absolutely sure that you want to skip this error (and you should document that in your code), just let the exception bubble up (with a RuntimeException if possible in Java) or don't use NO-ERROR in Progress if you don't know what to do with it.<br />
<br />Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com2tag:blogger.com,1999:blog-852026231175950197.post-62379132850321910282011-02-09T14:08:00.000+01:002012-09-18T12:26:13.151+02:00Quick and easy setup of Mercurial server on WindowsInstalling <a href="http://mercurial.selenic.com/">Mercurial</a> on a Linux server is a matter of minutes (depending on your Linux distro). But I had to install it on a Windows server, and there are subtle pitfalls you're likely to encounter when doing that. This post is by no mean a full and detailed installation process for every configuration, it will just focus on a simple install.<br />
<br />
<br />
<span style="font-size: large;">Step 1 : HTTPD install</span><br />
HTTPD is one of the widely used HTTP server. The Windows version can be downloaded from <a href="http://httpd.apache.org/download.cgi">here</a>. I'm using the 2.2.17 Win32 Binary including OpenSSL 0.9.8o. Choosing a typical install will use C:\Program Files (x86)\Apache Software Foundation\Apache2.2 as the default directory. The only specific step during install is this screen :<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6GIZk-JYWrmAexD-FTCHKjj93J_8GdEw5z2NTMHRrMQZLKfcD6kLuqFSTUCVp8TlQoa_rBkwzfFGNYluisYqmH0jluAoUdq79JT4DMcBi3YGh5X4t1vBJkCQpTmzlUj9xFKkBsxquR4A/s1600/httpd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6GIZk-JYWrmAexD-FTCHKjj93J_8GdEw5z2NTMHRrMQZLKfcD6kLuqFSTUCVp8TlQoa_rBkwzfFGNYluisYqmH0jluAoUdq79JT4DMcBi3YGh5X4t1vBJkCQpTmzlUj9xFKkBsxquR4A/s320/httpd.png" width="320" /></a></div>Just fill with appropriate values depending on your network.<br />
<br />
<span style="font-size: large;">Step 2 : Python install</span><br />
Python is needed by Mercurial. You always have to use the same Python version as the one used by Mercurial. The current Mercurial version (1.7.5) is still using 2.6, so download this version from <a href="http://www.python.org/download/releases/">Python website</a>. Even if you're running Win x64, download the x86 version as I encountered some bugs with the 64 bits package (no idea why). Use the default settings for everything (especially installation directory).<br />
<br />
<span style="font-size: large;">Step 3 : Mercurial install</span><br />
Mercurial compiled for Windows can be downloaded from <a href="http://mercurial.selenic.com/release/windows/">here</a>. Never use TortoiseHg to setup a Mercurial server, it won't work correctly (and easily). Always download *.win32-py2.6.exe packages, they're easier to setup.<br />
Setup should detect your Python version and so compile Mercurial with Python 2.6.<br />
<br />
<span style="font-size: large;">Step 4 : Create directory structure</span><br />
This test installation will use 3 differents directories to host repositories. We will use subfolders of C:\Repositories , named /Production, /QA and /Dev<br />
We will keep them empty for now, just create this structure.<br />
<br />
<span style="font-size: large;">Step 5 : HTTPD setup</span><br />
Create a new file called hgweb.cgi in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\cgi-bin with this content :<br />
<blockquote style="font-family: "Courier New",Courier,monospace;">#!C:/Python26/python.exe -u<br />
<br />
# See also http://mercurial.selenic.com/wiki/PublishingRepositories<br />
# Path to repo or hgweb config to serve (see 'hg help hgweb')<br />
config = "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin/hgweb.config"<br />
<br />
# Uncomment and adjust if Mercurial is not installed system-wide:<br />
# import sys; sys.path.insert(0, "SomeDirectory")<br />
<br />
# Uncomment to send python tracebacks to the browser if an error occurs:<br />
import cgitb; cgitb.enable()<br />
<br />
from mercurial import demandimport; demandimport.enable()<br />
from mercurial.hgweb import hgweb, wsgicgi<br />
application = hgweb(config)<br />
wsgicgi.launch(application)</blockquote><div style="font-family: inherit;">Create a new file called hgweb.config in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\cgi-bin with this content :<br />
<blockquote><div style="font-family: "Courier New",Courier,monospace;">[paths]</div><div style="font-family: "Courier New",Courier,monospace;">/Production = C:/Repositories/Production/*</div><div style="font-family: "Courier New",Courier,monospace;">/QA = C:/Repositories/QA/*</div><div style="font-family: "Courier New",Courier,monospace;">/Dev = C:/Repositories/Dev/*</div><div style="font-family: "Courier New",Courier,monospace;">[web]</div><div style="font-family: "Courier New",Courier,monospace;">allow_push = *</div><div style="font-family: "Courier New",Courier,monospace;">style = monoblue</div><div style="font-family: "Courier New",Courier,monospace;">contact = mercurial@riverside-software.fr</div><div style="font-family: "Courier New",Courier,monospace;">push_ssl = false</div></blockquote> Add this line in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\httpd.conf in the <IfModule alias_module=""> section :</div><br />
<blockquote><div style="font-family: "Courier New",Courier,monospace;">ScriptAlias /hg "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin/hgweb.cgi</div></blockquote>This line allows HTTPD to map the /hg query directly to Mercurial (instead of calling /cgi-bin/hgweb.cgi).<br />
Don't forget to restart HTTPD.<br />
<br />
<span style="font-size: large;">Step 6 : Test !</span><br />
Open your web browser at http://localhost/hg and voilà ! You should have this page :<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ0MMSV7WGAivWDaa0vIruaLD_WP4xXYgvbzWykJiNsCp67c9yhu4RNBfNcpqXAxFPWuEspOSzW4Wp_PnElG80C9jAJWNjU5nHhWDkvO3PcxlcRfukMJuuEL-IdjP_q4p7akCoApSma0U/s1600/mercurial.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ0MMSV7WGAivWDaa0vIruaLD_WP4xXYgvbzWykJiNsCp67c9yhu4RNBfNcpqXAxFPWuEspOSzW4Wp_PnElG80C9jAJWNjU5nHhWDkvO3PcxlcRfukMJuuEL-IdjP_q4p7akCoApSma0U/s320/mercurial.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br />
<span style="font-size: large;">Step 7 : Enjoy</span><br />
You can now import/clone your repositories Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com4tag:blogger.com,1999:blog-852026231175950197.post-6303389182599822982011-02-07T22:53:00.000+01:002011-02-07T22:53:28.989+01:00PCT 0.17 is releasedI just released a new version of PCT. Almost 16 months after 0.16, it was time to have another standard release, as continuous integration is not something you can rely on in the long term.<br />
<br />
Download it from <a href="http://pct.rssw.eu/download.html">here</a> !<br />
<br />
Included is the changelog :<br />
<pre style="font-family: inherit;"><span style="font-size: small;"> * Several improvements on PLReader. Still one bug remaining when extracting adecomm.pl
* Removed PLExtract task, in favor of PLFileSet type which can be nested in any FileSet capable task
Only in read tasks, PCTLibrary still needs to be used when creating libraries
* Replaced CRCDifferent with RCodeSelector. Now able to use MD5 to compare r-code
* Another bug when XREF when importing XREF on classes
Bug reported by Sascha Hofmann
* Added environment variables to PCT tasks
* If dlcHome attribute isn't set, try to use DLC property then DLC environment variable
* PCTConnection was not allowing user name with no password
Enhancement by Sascha Hofmann
* Upgrading to ANT 1.8
Edit : To 1.8.1
Edit : To 1.8.2
* Changed the way $DLC/version is parsed
Thanks to Matt Baker for reporting bug and additional infos
* Adding languages and textSegGrowth attributes to PCTCompile and PCTCompileExt tasks
* Corrected warning message when compiling classes
* antlib.xml for pct namespace was not included in JAR file
* Updated documentation for pct namespace
* Changed setPropath to addPropath in PCTRun, so that multiple propath definitions can be combined
* Cleanup when tasks create a new subtask instance. Fixed a bug when using pct namespace
* GC Bug #1 : upgraded pct/_dmpincr.p to 10.2B
* Added PCTVersion task
* If pctX.pl is not available for your version of Progress, fall back to source code
Compilation licence required in this case.
* Reads PCT-SRC property from the command line, to force source code instead of compiled version
* GC Bug #2 : more detailed error messages during connection (patch by Dan Dragut)
</span></pre>Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-59891295683831540872011-01-03T22:01:00.000+01:002011-01-03T22:01:21.557+01:00PUG Challenge 2010Here is <a href="http://riverside-software.fr/FBATCI.pdf">my presentation</a> (From build automation to continuous integration) during <a href="http://pugchallenge.eu/">PUG Challenge</a> in November 2010.Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-50502667731055852122011-01-03T13:43:00.000+01:002011-01-03T13:43:54.500+01:00Happy new year (and happy birthday) !I wish everybody a happy new year, and I'm ready to celebrate the 4th birthday of Riverside Software !Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-45017326631011080202010-09-15T12:35:00.000+02:002010-09-15T12:35:55.631+02:00Managing remote appservers with PCTI started working a few months ago on remote management of Appservers directly from PCT, so that creating an appserver on a remote server can be automated in a deployment script. I'm looking for some early adopters (meaning beta testers...) who have a need to maintain appservers from a central location in automated fashion ; the aim is to provide some feedback, report bugs, and see if there are missing features.<br />
<br />
As always, this part of PCT will remain open-source and available free of charge, so <a href="mailto:g.querret@gmail.com">contact me</a> (put PCT in the title) or add comments !<br />
<br />Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-40819778117178175962010-05-16T21:44:00.000+02:002010-05-16T21:48:14.314+02:00PCT now using MercurialSome of you may already have noticed, but <a href="http://pct.rssw.eu/">PCT</a> switched from Subversion to <a href="http://mercurial.selenic.com/">Mercurial</a>. If you are already working with Subversion and don't know about Mercurial or <a href="http://en.wikipedia.org/wiki/Distributed_Version_Control_System">DVCS</a> in general, I really advise you to have a look at them. Mercurial solves a lot of problems frequently occuring in Subversion, especially branching and merging. Joel Spolsky wrote a <a href="http://hginit.com/">Mercurial tutorial</a>, with a nice first chapter for Subversion users.<br />
<br />
At this time, I really enjoy the followings :<br />
<ul>
<li>It's fast : as you have a local copy of the entire repository, there's no network traffic involved in common usage</li>
<li>You can work in the plane/train/hotel room with no Internet connection : doing local commits, revert back to any revision without being connected is an absolute must for me. I've been stuck so many times not being able to compare local versions with previous commits, not being able to keep track of my work during an entire week.</li>
<li>As I know that merging is so easy, I easily create a new clone when I need to work on a specific task. This way, I can work with a clean tree, do local commits, and merge when I'm finished. </li>
</ul>
PCT is now hosted at <a href="http://code.google.com/p/pct/">GoogleCode</a> which is quite fast (and especially fast compared to Sourceforge SVN servers). Take your time to study Mercurial and enjoy working with your own <a href="http://code.google.com/p/pct/source/clones">PCT clone</a> !Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-25235583374902213542010-01-28T10:42:00.000+01:002010-01-28T10:42:40.182+01:00Padeo trial versionA trial version of Padeo is available <a href="http://riverside-software.fr/trial.html">here</a>. This version is only limited in time (expires on 1st March), but without any limitation on functionalities. If you're using OpenEdge WebClient, you definitely should try this tool !<br />Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0tag:blogger.com,1999:blog-852026231175950197.post-18004234310986395982010-01-12T18:16:00.000+01:002010-01-12T18:25:18.338+01:00OpenEdge client deployment using Windows installers (part 1)When it comes to client deployment, the OpenEdge documentation is rather light. In this blog post, we'll see how to bundle an application with a client networking licence in a single Windows installer.<br />
<br />
The advantages of this kind of deployment over a separate installation of Client networking followed by dropping rcode in a specific directory are multiple :<br />
<ul>
<li>No need to feed OpenEdge installer with parameters (licence code, installation directory, components and so on) : include exactly what you want, with a specific licence code, and install where you want.</li>
<li>ActiveX and .Net assemblies can be automatically registered</li>
<li>Installation can be done over Windows Update using Microsoft SMS, scheduled to every host in an Active Directory, or pushed using standard scripting processes.</li>
<li>Package creation can be easily automated : generate your installer directly from your build script !<br /></li>
</ul>
Generating installers will require a few tools :<br />
<ul>
<li><a href="http://wix.sourceforge.net/">WiX</a> version 3 : generates MSI installers from XML sources. Created by Microsoft. CPL licence.</li>
<li>.Net framework : needed by WiX</li>
<li>a working Client Networking installation. In our case, we'll use a 10.2B installation</li>
</ul>
First of all, we'll prepare the working environment. Create a new directory on your local disk, and download here those files : <a href="http://riverside-software.fr/files/ClientNetworking.wxs">ClientNetworking.wxs</a>, <a href="http://riverside-software.fr/files/WixBanner.bmp">WixBanner.bmp</a>, <a href="http://riverside-software.fr/files/WixDialog.bmp">WixDialog.bmp</a>, and <a href="http://riverside-software.fr/files/EULA.rtf">EULA.rtf</a>. Then create a <span style="font-family: "Courier New",Courier,monospace;">Binaries</span> directory, in which we will create this directory structure :<br />
<div style="font-family: "Courier New",Courier,monospace;">
bin<br />
</div>
<div style="font-family: "Courier New",Courier,monospace;">
winforms<br />
</div>
<div style="font-family: "Courier New",Courier,monospace;">
prolang<br />
</div>
<div style="font-family: "Courier New",Courier,monospace;">
ame<br />
</div>
<div style="font-family: "Courier New",Courier,monospace;">
properties<br />
</div>
<div style="font-family: "Courier New",Courier,monospace;">
schemas<br />
</div>
<div style="font-family: "Courier New",Courier,monospace;">
myapp<br />
</div>
<div style="font-family: "Courier New",Courier,monospace;">
<br />
</div>
<br />
This <span style="font-family: "Courier New",Courier,monospace;">Binaries</span> directory will be the exact copy of what will be installed on target computers (this is why you could recognize a standard OpenEdge structure). Due to licencing restrictions, no link will be provided to download a working copy of the <span style="font-family: "Courier New",Courier,monospace;">Binaries</span> structure and files. To keep things simple, just copy every file from $DLC/bin[/winforms], $DLC/prolang/ame, $DLC/properties[/schemas] to this structure. The build script will take care of including only the needed files.<br />
<br />
In addition to the OpenEdge standard files, we will also deploy application specific files (in <span style="font-family: "Courier New",Courier,monospace;">myapp</span> directory). In this example, we will just deploy a single window called mywin.r. Feel free to create any window from the AppBuilder, and save it as rcode in the myapp subdirectory.<br />
<br />
Now we'll copy a few files from $DLC to the root Binaries directory :<br />
<ul>
<li>promsgs</li>
<li>version</li>
<li>convmap.cp</li>
<li>proword.def </li>
<li>progress.cfg (this file must contain at least a Client Networking licence !)<br /></li>
<li>startup.pf</li>
<li>runtime.ini</li>
</ul>
Update startup.pf to meet your needs, then update PROPATH section in runtime.ini to add the myapp directory (just a relative reference, doing PROPATH=.,myapp is sufficent).<br />
Then create a myapp.bat file running your application :<br />
<span style="font-family: "Courier New",Courier,monospace;">set DLC=%~dp0</span><br />
<span style="font-family: "Courier New",Courier,monospace;">pushd %~dp0</span><br />
<span style="font-family: "Courier New",Courier,monospace;">start "MyApp" "%DLC%\bin\prowin32" -basekey INI -ininame runtime.ini -T "%TEMP%" -p myapp.r</span><br />
<br />
You can now open your favorite shell (i.e. cmd.exe), add the Wix path to your PATH, change the working directory to the one you just created, and type the following commands :<br />
<span style="font-family: "Courier New",Courier,monospace;">candle ClientNetworking.wxs</span><br />
<span style="font-family: "Courier New",Courier,monospace;">light -ext WixUIExtension ClientNetworking.wixobj</span><br />
<br />
If everything goes well, it will result in a ClientNetworking.msi in your current directory. Enjoy !!<br />
<br />
The next blog posts will explain various sections of ClientNetworking.xml, and provide a few examples on how to deploy your installers.<br />Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com6tag:blogger.com,1999:blog-852026231175950197.post-87384994847951964302010-01-12T14:51:00.000+01:002010-01-12T14:53:02.107+01:00PUG DE and NL presentation (November 09)The presentation I've made during PUG events in Germany and Netherlands is available <a href="http://riverside-software.fr/PadeoConference.pdf">here</a>.<br />
<br />
Outline of this presentation :<br />
While
Webclient has several advantages, it suffers from a poor UI to generate
packages, and from multiples constraints when rolling out the initial
deployment and updates.
This presentation will explain how you could overcome those limitations
and be able to completely automate this process with the help of Padeo,
an integrated software package.
After a short demonstration of the product, we will focus on a real use
case, by demonstrating how to integrate upstream with Hudson, a
continuous integration system, and downstream with a software
deployment package. After having attended this presentation, you should
be able to roll out a new update with a single mouse click (or keyboard
shortcut if you don't like mice !)
<br />Riverside Softwarehttp://www.blogger.com/profile/05558448878539545358noreply@blogger.com0