Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://submarine.org.uk/b2evolution/xmlsrv/rss2.php?blog=3

  1. <?xml version="1.0"?><!-- generator="b2evolution/0.9.1" -->
  2. <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  3.    <!-- X-Clacks-Overhead: GNU Terry Pratchett -->
  4. <channel>
  5. <title>carbon14 Blog</title>
  6. <link>http://submarine.org.uk/b2evolution/../blog.php</link>
  7. <description>My blog</description>
  8. <language>en-UK</language>
  9. <docs>http://backend.userland.com/rss</docs>
  10. <admin:generatorAgent rdf:resource="http://b2evolution.net/?v=0.9.1"/>
  11. <ttl>360</ttl>
  12. <item>
  13. <title>Bug in BizTalk LogicalAnd functoid</title>
  14. <link>http://submarine.org.uk/b2evolution/../blog.php?title=bug_in_biztalk_logicaland_functoid&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1</link>
  15. <pubDate>Fri, 16 Jun 2017 08:38:52 +0000</pubDate>
  16. <category domain="alt">Technology</category>
  17. <category domain="main">Rant</category> <guid isPermaLink="false">[email protected]://submarine.org.uk/b2evolution</guid>
  18. <description>While unit testing my own functoids, I came across an odd scenario where my map was working with inline C#, but if I switched to testing the external assembly version, the results were completely different. Obviously I started with the assumption that my functoid was broken, but in fact it appears that it's Microsoft's LogicalAnd functoid which is broken, and has been since BizTalk 2006.
  19.  
  20. I must stress, that the failure only occurs when you are using the external assembly version of the functoid, which would occur only when you have set the script type preference on your map to give higher priority to the external assembly script type than the inline C# script type.  And frankly I still don't know why you would ever want to do that. But if you do, the LogicalAnd functoid is broken.
  21.  
  22. In BizTalk 2004, the functoid used this code which works:
  23.  
  24.  
  25. // Microsoft.BizTalk.BaseFunctoids.FunctoidScripts
  26. public bool LogicalAnd(string val1, string val2)
  27. {
  28. bool flag = false;
  29. try
  30. {
  31. flag = bool.Parse(val1);
  32. }
  33. catch (Exception)
  34. {
  35. if (BaseFunctoid.IsNumeric(val1))
  36. {
  37. int num = Convert.ToInt32(val1, CultureInfo.get_InvariantCulture());
  38. flag = (0 &#60; num);
  39. }
  40. else
  41. {
  42. flag = false;
  43. }
  44. }
  45. if (flag)
  46. {
  47. try
  48. {
  49. bool flag2 = bool.Parse(val2);
  50. flag = (flag &#38;&#38; flag2);
  51. }
  52. catch (Exception)
  53. {
  54. if (BaseFunctoid.IsNumeric(val2))
  55. {
  56. int num2 = Convert.ToInt32(val2, CultureInfo.get_InvariantCulture());
  57. bool flag3 = true;
  58. if (0 >= num2)
  59. {
  60. flag3 = false;
  61. }
  62. flag = (flag &#38;&#38; flag3);
  63. }
  64. else
  65. {
  66. flag = false;
  67. }
  68. }
  69. }
  70. return flag;
  71. }
  72.  
  73.  
  74. but at some point, either in BizTalk 2006 or in 2006r2 they changed to this code:
  75.  
  76. // Microsoft.BizTalk.BaseFunctoids.FunctoidScripts
  77. public bool LogicalAnd(string val1, string val2)
  78. {
  79. bool flag = false;
  80. if (!bool.TryParse(val1, out flag))
  81. {
  82. if (BaseFunctoid.IsNumeric(val1))
  83. {
  84. int num = Convert.ToInt32(val1, CultureInfo.InvariantCulture);
  85. flag = (0 &#60; num);
  86. }
  87. else
  88. {
  89. flag = false;
  90. }
  91. }
  92. if (flag)
  93. {
  94. bool flag2 = false;
  95. if (!bool.TryParse(val2, out flag2))
  96. {
  97. flag = (flag &#38;&#38; flag2);
  98. }
  99. else if (BaseFunctoid.IsNumeric(val2))
  100. {
  101. int num2 = Convert.ToInt32(val2, CultureInfo.InvariantCulture);
  102. flag2 = true;
  103. if (0 >= num2)
  104. {
  105. flag2 = false;
  106. }
  107. flag = (flag &#38;&#38; flag2);
  108. }
  109. else
  110. {
  111. flag = false;
  112. }
  113. }
  114. return flag;
  115. }
  116.  
  117.  
  118.  
  119. The new code is cleaner, and uses the TryParse method of the Boolean, presumably to avoid the overhead of the try..catch block.   But the sense of the second parse test is the wrong way round; that second exclamation mark shouldn't be there; and as a result this function will almost always return false.
  120.  
  121. The fact that this bug appears to have survived for a decade suggests that no-one ever chooses to prioritise external assemblies in their maps, but you never know.
  122.  
  123. A Boolean and function should be the easiest thing to get right, and it certainly shouldn't be difficult to have unit testing this function.</description>
  124. <content:encoded><![CDATA[ <p>While unit testing my own functoids, I came across an odd scenario where my map was working with inline C#, but if I switched to testing the external assembly version, the results were completely different. Obviously I started with the assumption that my functoid was broken, but in fact it appears that it's Microsoft's LogicalAnd functoid which is broken, and has been since BizTalk 2006.</p>
  125. <p>I must stress, that the failure only occurs when you are using the external assembly version of the functoid, which would occur only when you have set the script type preference on your map to give higher priority to the external assembly script type than the inline C# script type.  And frankly I still don't know why you would ever want to do that. But if you do, the LogicalAnd functoid is broken.</p>
  126. <p>In BizTalk 2004, the functoid used this code which works:</p>
  127. <pre><code>
  128. // Microsoft.BizTalk.BaseFunctoids.FunctoidScripts
  129. public bool LogicalAnd(string val1, string val2)
  130. {
  131. bool flag = false;
  132. try
  133. {
  134. flag = bool.Parse(val1);
  135. }
  136. catch (Exception)
  137. {
  138. if (BaseFunctoid.IsNumeric(val1))
  139. {
  140. int num = Convert.ToInt32(val1, CultureInfo.get_InvariantCulture());
  141. flag = (0 &lt; num);
  142. }
  143. else
  144. {
  145. flag = false;
  146. }
  147. }
  148. if (flag)
  149. {
  150. try
  151. {
  152. bool flag2 = bool.Parse(val2);
  153. flag = (flag &amp;&amp; flag2);
  154. }
  155. catch (Exception)
  156. {
  157. if (BaseFunctoid.IsNumeric(val2))
  158. {
  159. int num2 = Convert.ToInt32(val2, CultureInfo.get_InvariantCulture());
  160. bool flag3 = true;
  161. if (0 >= num2)
  162. {
  163. flag3 = false;
  164. }
  165. flag = (flag &amp;&amp; flag3);
  166. }
  167. else
  168. {
  169. flag = false;
  170. }
  171. }
  172. }
  173. return flag;
  174. }
  175. </code></pre> <p>
  176. but at some point, either in BizTalk 2006 or in 2006r2 they changed to this code:</p>
  177. <pre><code>// Microsoft.BizTalk.BaseFunctoids.FunctoidScripts
  178. public bool LogicalAnd(string val1, string val2)
  179. {
  180. bool flag = false;
  181. if (!bool.TryParse(val1, out flag))
  182. {
  183. if (BaseFunctoid.IsNumeric(val1))
  184. {
  185. int num = Convert.ToInt32(val1, CultureInfo.InvariantCulture);
  186. flag = (0 &lt; num);
  187. }
  188. else
  189. {
  190. flag = false;
  191. }
  192. }
  193. if (flag)
  194. {
  195. bool flag2 = false;
  196. if (!bool.TryParse(val2, out flag2))
  197. {
  198. flag = (flag &amp;&amp; flag2);
  199. }
  200. else if (BaseFunctoid.IsNumeric(val2))
  201. {
  202. int num2 = Convert.ToInt32(val2, CultureInfo.InvariantCulture);
  203. flag2 = true;
  204. if (0 >= num2)
  205. {
  206. flag2 = false;
  207. }
  208. flag = (flag &amp;&amp; flag2);
  209. }
  210. else
  211. {
  212. flag = false;
  213. }
  214. }
  215. return flag;
  216. }
  217. </code></pre> <p>
  218. The new code is cleaner, and uses the TryParse method of the Boolean, presumably to avoid the overhead of the try..catch block.   But the sense of the second parse test is the wrong way round; that second exclamation mark shouldn't be there; and as a result this function will almost always return false.</p>
  219. <p>The fact that this bug appears to have survived for a decade suggests that no-one ever chooses to prioritise external assemblies in their maps, but you never know.</p>
  220. <p>A Boolean and function should be the easiest thing to get right, and it certainly shouldn't be difficult to have unit testing this function.
  221. </p>
  222. ]]></content:encoded>
  223. <comments>http://submarine.org.uk/b2evolution/../blog.php?p=1227&amp;c=1&amp;tb=1&amp;pb=1#comments</comments>
  224. </item>
  225. <item>
  226. <title>Unexpected Execution Order of Pipeline Components in BizTalk</title>
  227. <link>http://submarine.org.uk/b2evolution/../blog.php?title=unexpected_execution_order_of_pipeline_c&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1</link>
  228. <pubDate>Mon, 28 Nov 2016 16:26:34 +0000</pubDate>
  229. <category domain="main">Technology</category> <guid isPermaLink="false">[email protected]://submarine.org.uk/b2evolution</guid>
  230. <description>Recently I ran into an unexpected problem with a custom pipeline component which I thought had been working fine. Suddenly it stopped working, but with an unexpected workaround. Today I worked out what the problem is, and although it makes perfect sense it caught me by surprise. I can't find any mention of this gotcha elsewhere on the internet, so I thought I'd write about it here.
  231.  
  232. Last year I wrote a custom pipeline component (Message Dump component) which optionally dumps the message body and/or the context of the message, and I use it regularly in my pipelines. Because the dumping is optional, and can be quickly controlled at runtime, I place the component in pretty much all of the pipelines that I use. When turned off, the overhead is minimal, but when you want to check what's going through any given stage of a pipeline you can quickly turn it on and get what you need.
  233.  
  234. This year we decided that one of our pipelines should always dump a copy of the message body and so I created another cut down version of this component (Archive component) that didn't have the optional switch. It has just 1 configuration option which is the path to the file that should be written, and that file path can contain various macros which can be expanded from the message context.
  235.  
  236. Everything seemed to work in the development and test environments; we went live with it and it was great. After a period of live commissioning I turned off the Message Dump components in the pipeline, and that's when it all went wrong.
  237.  
  238. [...] Read more!</description>
  239. <content:encoded><![CDATA[ <p>Recently I ran into an unexpected problem with a custom pipeline component which I thought had been working fine. Suddenly it stopped working, but with an unexpected workaround. Today I worked out what the problem is, and although it makes perfect sense it caught me by surprise. I can't find any mention of this gotcha elsewhere on the internet, so I thought I'd write about it here.</p>
  240. <p>Last year I wrote a custom pipeline component (Message Dump component) which optionally dumps the message body and/or the context of the message, and I use it regularly in my pipelines. Because the dumping is optional, and can be quickly controlled at runtime, I place the component in pretty much all of the pipelines that I use. When turned off, the overhead is minimal, but when you want to check what's going through any given stage of a pipeline you can quickly turn it on and get what you need.</p>
  241. <p>This year we decided that one of our pipelines should <em>always</em> dump a copy of the message body and so I created another cut down version of this component (Archive component) that didn't have the optional switch. It has just 1 configuration option which is the path to the file that should be written, and that file path can contain various macros which can be expanded from the message context.</p>
  242. <p>Everything seemed to work in the development and test environments; we went live with it and it was great. After a period of live commissioning I turned off the Message Dump components in the pipeline, and that's when it all went wrong.</p>
  243. <p class="bMore"><a href="http://submarine.org.uk/b2evolution/../blog.php?p=1211&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1#more1211"><img src="http://submarine.org.uk/b2evolution/img/smilies/icon_arrow.gif" alt="&#61;&#62;" class="middle" /> Read more!</a></p>
  244. ]]></content:encoded>
  245. <comments>http://submarine.org.uk/b2evolution/../blog.php?p=1211&amp;c=1&amp;tb=1&amp;pb=1#comments</comments>
  246. </item>
  247. <item>
  248. <title>If..Then..Else mapping in BizTalk</title>
  249. <link>http://submarine.org.uk/b2evolution/../blog.php?title=if_then_else_mapping_in_biztalk&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1</link>
  250. <pubDate>Tue, 15 Sep 2015 15:34:04 +0000</pubDate>
  251. <category domain="main">Technology</category> <guid isPermaLink="false">[email protected]://submarine.org.uk/b2evolution</guid>
  252. <description>Starting some serious development in Microsoft BizTalk 2013 and I was looking for a way to streamline some of our maps. One common place where we have clutter is in the if..then..else design pattern. Typically you want to map one element if something is true, and if it's not true, you want to map something else instead.
  253.  
  254. BizTalk doesn't provide functoids that do that neatly, and over the years several people have commented on this; it's a problem that goes right back to at least BizTalk 2006.
  255.  
  256. In this post I'm going to show you the custom functoids that I created to try to streamline my maps.
  257.  
  258. [...] Read more!</description>
  259. <content:encoded><![CDATA[ <p>Starting some serious development in Microsoft BizTalk 2013 and I was looking for a way to streamline some of our maps. One common place where we have clutter is in the if..then..else design pattern. Typically you want to map one element if something is true, and if it's not true, you want to map something else instead. </p>
  260. <p>BizTalk doesn't provide functoids that do that neatly, and over the years several people have commented on this; it's a problem that goes right back to at least BizTalk 2006. </p>
  261. <p>In this post I'm going to show you the custom functoids that I created to try to streamline my maps.</p>
  262. <p class="bMore"><a href="http://submarine.org.uk/b2evolution/../blog.php?p=1167&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1#more1167"><img src="http://submarine.org.uk/b2evolution/img/smilies/icon_arrow.gif" alt="&#61;&#62;" class="middle" /> Read more!</a></p>
  263. ]]></content:encoded>
  264. <comments>http://submarine.org.uk/b2evolution/../blog.php?p=1167&amp;c=1&amp;tb=1&amp;pb=1#comments</comments>
  265. </item>
  266. <item>
  267. <title>ISP Muppetry</title>
  268. <link>http://submarine.org.uk/b2evolution/../blog.php?title=isp_muppetry&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1</link>
  269. <pubDate>Fri, 09 Nov 2007 13:09:18 +0000</pubDate>
  270. <category domain="alt">Technology</category>
  271. <category domain="main">Rant</category> <guid isPermaLink="false">[email protected]://submarine.org.uk/b2evolution</guid>
  272. <description>I've just had to help a friend with here broadband email service. It was working on Monday, but at some point during the week it stopped.
  273.  
  274. It was complaining that it couldn't get a response from the POP3 server. So I double checked all the documentation and rechecked the password. No good.
  275.  
  276. I had a look through her existing emails and discovered that she'd been sent details of a new email service that she was being moved onto. So I checked through the settings for that.
  277. There were quite a few settings changes and I thought that would sort it, but no.
  278.  
  279. So then I went to the ISPs extremely slow, and badly organised AJAX enabled website, where eventually I managed to get the help pages to open for me. There I double checked all the settings, still OK and then looked for more help.
  280.  
  281. "Perhaps your password has become desynchronised in the move to the new service. Go to this page and change your password." It suggested.
  282.  
  283. I eventually had to find a different computer to get through the website without the AJAX choking and then I changed the password.
  284.  
  285.  
  286.  
  287.  
  288. It still wasn't working.
  289.  
  290. I logged into the provider's site again, to be sure the password was right.
  291. I logged into the provider's webmail service, which I discover is now a GMail solution.
  292.  
  293. There I find, in my friend's inbox, sent after the changeover, a new, and subtly different set of instructions on what to do to get POP3 working. Now you have to log into the webmail service and ENABLE POP3 apparently.
  294.  
  295.  
  296.  
  297.  
  298. IF you move someone to a new email service.
  299. AND some changes are necessary for them to continue to use it as before
  300. sending them instructions AFTER the changeover is NOT GOOD ENOUGH!!! </description>
  301. <content:encoded><![CDATA[ <p>I've just had to help a friend with here broadband email service. It was working on Monday, but at some point during the week it stopped.</p>
  302. <p>It was complaining that it couldn't get a response from the POP3 server. So I double checked all the documentation and rechecked the password. No good.</p>
  303. <p>I had a look through her existing emails and discovered that she'd been sent details of a new email service that she was being moved onto. So I checked through the settings for that.<br />
  304. There were quite a few settings changes and I thought that would sort it, but no.</p>
  305. <p>So then I went to the ISPs extremely slow, and badly organised AJAX enabled website, where eventually I managed to get the help pages to open for me. There I double checked all the settings, still OK and then looked for more help.</p>
  306. <p>"Perhaps your password has become desynchronised in the move to the new service. Go to this page and change your password." It suggested.</p>
  307. <p>I eventually had to find a different computer to get through the website without the AJAX choking and then I changed the password. </p>
  308. <p>It still wasn't working.</p>
  309. <p>I logged into the provider's site again, to be sure the password was right.<br />
  310. I logged into the provider's webmail service, which I discover is now a GMail solution. </p>
  311. <p>There I find, in my friend's inbox, sent after the changeover, a new, and subtly different set of instructions on what to do to get POP3 working. Now you have to log into the webmail service and ENABLE POP3 apparently.</p>
  312. <p>IF you move someone to a new email service.<br />
  313. AND some changes are necessary for them to continue to use it as before<br />
  314. sending them instructions AFTER the changeover is NOT GOOD ENOUGH!!!
  315. </p>
  316. ]]></content:encoded>
  317. <comments>http://submarine.org.uk/b2evolution/../blog.php?p=474&amp;c=1&amp;tb=1&amp;pb=1#comments</comments>
  318. </item>
  319. <item>
  320. <title>Fishcakes</title>
  321. <link>http://submarine.org.uk/b2evolution/../blog.php?title=fishcakes&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1</link>
  322. <pubDate>Thu, 05 Jul 2007 18:51:53 +0000</pubDate>
  323. <category domain="alt">Food</category>
  324. <category domain="main">Recipe</category> <guid isPermaLink="false">[email protected]://submarine.org.uk/b2evolution</guid>
  325. <description>I made some fishcakes yesterday, very easy and extremely tasty.
  326.  
  327. This should make 4 fishcakes. Enough for 2 people as a main meal with a salad or a handful of chips.
  328.  
  329. Boil some potatoes, around 250g, until tender. I used new potatoes and then peeled them, but you can use any floury potatoes and peel them first if they have thicker skins. While they were boiling, I was able to steam 180g of fish fillet above the boiling water. You can use any firm fish, cod, haddock or salmon for example. I went for coley because I had some in. It's a little darker in colour than cod, but with a similar flavour, a little less delicate.
  330.  
  331. Take 2 handfuls of fresh parsley and blend with 15g of cold butter. Then mix with the hot potatoes and mash them with a fork until smooth. Flake the steamed fish into the mash, add two handfuls of fine breadcrumbs and combine thoroughly.
  332.  
  333. Form the mixture into patties and then chill in the fridge for at least half an hour. They will become a good deal less sticky as the breadcrumbs absorb some of the moisture, and the cooling potato congeals.
  334.  
  335. When you are ready to cook the fishcakes, beat an egg into a shallow bowl, dip the patties into the egg, coating both sides, and then cover them with a mixture of breadcrumbs and polenta grains. Shallow fry for a few minutes on each side until they are golden brown and the coating has become crispy.
  336.  
  337. Serve immediately.</description>
  338. <content:encoded><![CDATA[ <p>I made some fishcakes yesterday, very easy and extremely tasty.</p>
  339. <p>This should make 4 fishcakes. Enough for 2 people as a main meal with a salad or a handful of chips.</p>
  340. <p>Boil some potatoes, around 250g, until tender. I used new potatoes and then peeled them, but you can use any floury potatoes and peel them first if they have thicker skins. While they were boiling, I was able to steam 180g of fish fillet above the boiling water. You can use any firm fish, cod, haddock or salmon for example. I went for coley because I had some in. It's a little darker in colour than cod, but with a similar flavour, a little less delicate.</p>
  341. <p>Take 2 handfuls of fresh parsley and blend with 15g of cold butter. Then mix with the hot potatoes and mash them with a fork until smooth. Flake the steamed fish into the mash, add two handfuls of fine breadcrumbs and combine thoroughly.</p>
  342. <p>Form the mixture into patties and then chill in the fridge for at least half an hour. They will become a good deal less sticky as the breadcrumbs absorb some of the moisture, and the cooling potato congeals.</p>
  343. <p>When you are ready to cook the fishcakes, beat an egg into a shallow bowl, dip the patties into the egg, coating both sides, and then cover them with a mixture of breadcrumbs and polenta grains. Shallow fry for a few minutes on each side until they are golden brown and the coating has become crispy. </p>
  344. <p>Serve immediately.
  345. </p>
  346. ]]></content:encoded>
  347. <comments>http://submarine.org.uk/b2evolution/../blog.php?p=372&amp;c=1&amp;tb=1&amp;pb=1#comments</comments>
  348. </item>
  349. </channel>
  350. </rss>
  351.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//submarine.org.uk/b2evolution/xmlsrv/rss2.php%3Fblog%3D3

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda