{"id":6855,"date":"2016-09-01T17:24:36","date_gmt":"2016-09-01T15:24:36","guid":{"rendered":"http:\/\/www.b.shuttle.de\/hayek\/hayek\/jochen\/wp\/blog-en\/?p=6855"},"modified":"2016-09-01T17:24:36","modified_gmt":"2016-09-01T15:24:36","slug":"a-car-and-a-website","status":"publish","type":"post","link":"https:\/\/wp.jochen.hayek.name\/blog-en\/2016\/09\/01\/a-car-and-a-website\/","title":{"rendered":"a car and a website \u2013 do they have anything in common?"},"content":{"rendered":"<p>\t\t\t\tWithin the car I have in mind and I came across, its parts communicate using CANopen. The car&#8217;s software got mostly implemented in Ada, and once there existed a (home-brewn) software generator Ada code for CANopen message definitions. From the CANopen message definitions the generator created:<\/p>\n<ul>\n<li>data structures in Ada<\/li>\n<li>marshalling code<\/li>\n<li>de-marshalling code<\/li>\n<\/ul>\n<p>There was still an ongoing development of the car, but because the generator got lost or abandoned, the software developers had to maintain and extend the generated code themselves. That&#8217;s a violation of a basic principle of course: <strong>Do not touch generated code!<\/strong>\u00a0And it&#8217;s also quite a challenging task. They did a great job, but certainly they failed occasionally, and there are some cars out there with incorrect code.<\/p>\n<p>I found the situation quite sad. And that triggered my creativity.<\/p>\n<ul>\n<li>I created a CANopen definition language in XML using RELAX-NG.<\/li>\n<li>I reconstructed the definitions of the CANopen messages used in the car.<\/li>\n<li>I developed a new generator.<\/li>\n<li>I created the code for the 1st car, compared it to the existing code step by step, \u2026 and finally the car\u00a0still worked.<\/li>\n<li>I did so for all the cars&#8217; software\u00a0I found around. But unfortunately the cars themselves were not available on site.<\/li>\n<\/ul>\n<p>Now for my current\u00a0project: web development in HTML + Perl + JavaScript + CSS + &#8220;a home-brewn web-template-framework in \u00a0Perl&#8221;. And where would be the similarity? The home-brewn web-template-framework got <span style=\"text-decoration: underline\">abandoned<\/span>. Just the generated code is still in use and gets extended and maintained continuously. So new HTML does no longer get created through the framework but rather on the fly through JavaScript. That&#8217;s quite a funny and exciting way of writing HTML. And I am deeply impressed.<\/p>\n<p>I am not sure, which framework would be the right thing to suggest for the next generation of this software.<\/p>\n<ul>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dancer_(software)\">https:\/\/en.wikipedia.org\/wiki\/Dancer_(software)<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Mojolicious\">https:\/\/en.wikipedia.org\/wiki\/Mojolicious<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Catalyst_(software)\">https:\/\/en.wikipedia.org\/wiki\/Catalyst_(software)<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Within the car I have in mind and I came across, its parts communicate using CANopen. The car&#8217;s software got mostly implemented in Ada, and once there existed a (home-brewn) software generator Ada code for CANopen message definitions. From the CANopen message definitions the generator created: data structures in Ada marshalling code de-marshalling code There [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false,"_share_on_mastodon":"0"},"categories":[382,495,550,726],"tags":[],"class_list":["post-6855","post","type-post","status-publish","format-standard","hentry","category-nxml-mode","category-relax-ng","category-software-development","category-xml"],"share_on_mastodon":{"url":"","error":""},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/paO0kP-1Mz","jetpack_likes_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/posts\/6855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/comments?post=6855"}],"version-history":[{"count":0,"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/posts\/6855\/revisions"}],"wp:attachment":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/media?parent=6855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/categories?post=6855"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-en\/wp-json\/wp\/v2\/tags?post=6855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}