<?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:blogger='http://schemas.google.com/blogger/2008' 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-3504073133976639188</id><updated>2026-02-02T01:02:31.448+01:00</updated><category term="python"/><category term="java"/><category term="apache"/><category term="django"/><category term="typescript"/><category term="vim"/><category term="Angularjs"/><category term="Augeas"/><category term="Brunch"/><category term="GTD"/><category term="Music VLC"/><category term="Packer"/><category term="PuPHPet"/><category term="SQL"/><category term="Vagrant"/><category term="Yeoman"/><category term="angular"/><category term="atomikos"/><category term="cohesion.nl"/><category term="debugging"/><category term="eclipse"/><category term="flask"/><category term="functional programming"/><category term="google"/><category term="javascript"/><category term="jta"/><category term="lighttpd"/><category term="oop"/><category term="php"/><category term="platformcon"/><category term="platformengineering"/><category term="puppet"/><category term="tapestry"/><category term="trac"/><category term="virtualenv"/><title type='text'>Rofl&#39;s Compressions</title><subtitle type='html'>These are compressed experiences from my mind. Sometimes  they may be humorous sometimes serious.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>rolfst</name><uri>http://www.blogger.com/profile/05784533719837716030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVodF-wptdrgCW3H5en5M9oVmjoxqwlBbDqwvM0VIOrgUh5A6pyVqAN_FPDU8k_1OouD7HCX7as4IRudYhfIGHzrwSTpb4-V4Zi9zJRPRn-vGdhYb8r3NbYiWE-kuixWg/s1600/IMG_20110616_155614.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-9161871356277187086</id><published>2025-07-18T08:59:00.008+02:00</published><updated>2025-07-18T11:57:59.703+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cohesion.nl"/><category scheme="http://www.blogger.com/atom/ns#" term="platformcon"/><category scheme="http://www.blogger.com/atom/ns#" term="platformengineering"/><title type='text'></title><content type='html'>&lt;p dir=&quot;ltr&quot; id=&quot;docs-internal-guid-3fd3f899-7fff-fdaa-f5e5-0adb84204a4d&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;PlatformCon2025&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;border: none; display: inline-block; height: 214px; overflow: hidden; width: 293px;&quot;&gt;&lt;img height=&quot;214&quot; src=&quot;https://lh7-rt.googleusercontent.com/docsz/AD_4nXc51S9AlsYQtXis8M0BJ5RyL4m98W5rwceM8iduKu0m47kcpAwkhBish5FhbQgRPG_eR8MTSsvn9sC7Gg5wLzCQ3gMzpZCj2IJyvm0NbtzqPcZx4jYa5rxG6rFHUTVW6DaNmdUS?key=cSDuq5KnSK7-yWHhF3WJtw&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;293&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; white-space-collapse: preserve;&quot;&gt;After a nice walk though London city, I arrived at the st.Paul’s Convene, a great location for the current size of PlatformCon (I do hope they’ll grow even bigger and more important in the near future).&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;The conference opened with a nice breakfast, beautifully displayed for all participants&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;But let&#39;s take a flashback to the evening before.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Tuesday 17:00 local time, a meeting started. People from all over the world gathered around a round table to talk about platform engineering and A.I., and the platform as a whole, facilitated by the people from Thoughtworks and PlatformCon.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;border: none; display: inline-block; height: 533px; overflow: hidden; width: 408px;&quot;&gt;&lt;img height=&quot;533&quot; src=&quot;https://lh7-rt.googleusercontent.com/docsz/AD_4nXcmSx_oSlqyRzPXnckKig-zXPo41_3L2r8fkJ_jMDc8NZDN0ztvHWaphIc3MzzWDkx47hxvcYDpkJnyGDpuKa4z5QufuQItLGEeWTul3lzVGcxBCOg7iN7qaixDt6FaXy5WqBzK?key=cSDuq5KnSK7-yWHhF3WJtw&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;408&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Honestly every conclusion in this relay is my own, since we kept the discussion open and never drove to any settlement.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;We spoke about quite a few topics. 2 Still remain fresh in my mind.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;The last one was about how to deal with teams that don’t wish to follow the path set out by the platform teams.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;I couldn’t escape the notion this was either a forced hypothesis or in a startup (perhaps a scale-up), the organisation wasn’t that well explained but in my opinion in those lifecycle stadiums of an organisation you don’t need a platform. The next day I would learn from another participant in the same room that some startups definitely need a platform, this is because they extensively work with huge amounts of data and calculations on that data that need to be handled by data scientists.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;But, in the first phase of an organisation you generally don’t need a platform, yes you’ll need an environment, be it your favorite cloud provider or your own. It&#39;s just, the costs are too high for the startup. The startup needs to go fast , push out new features or products like there’s no tomorrow.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Then later the organisation needs to start thinking about and implementing guardrails. Don’t forget a platform isn’t cheap, let alone the endeavor to build one, but at one point the platform will start to provide a return on investment that makes it a necessity. When that is? I don’t know exactly. But when I talk about one of my own clients idea of growing 200 new personnel each month, it was way overdue. Adding more people to the organisation is definitely a scalability issue of the highest order. Not only for that particular enterprise but also for the market as a whole (the enterprise sucks all the professional out of the market).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;The other topic was about A.I.. What’s interesting is that a lot of times it’s the business that tells the developers to use A.I., because why? Don’t know.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Jokes aside, often the idea is to remain competitive. We did get the advice to steer away from the cost competitive argumentation. Go for the question the organisation really needs solved and then cost goals will be achieved because of that.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;The main day.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;The main stage started with a panel. Very insightful and I want to give you this quote from Richey Zachery: `With platformengineering we’re building developer success teams`.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;From that moment onward I proceeded to my first workshop: improving ci/cd pipelines. I didn’t like that one. It felt more like a sales pitch and for that I’d go to the booths in the central area.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Speaking of which, there were some excellent companies at those booths. It was easy to engage with them and not all of them were there to do their sales. I had some pretty good conversations that gave me good ideas for my plans with the platformteam at Cohesion.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Anyway, me leaving the workshop early lead me to a chance meeting the exellent Ana Bogdan. We started to discus the previous evening’s meeting and we came down on some conclusions I came up with. I hope she liked my explanations and arguments because she immediately invited me to another (smaller sized) table discussion session. So how could I decline? The prior evening session gave me already great insights, so would probably give me another batch, right?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;It would require me to miss out on some other session, but hey that’s why we went to this event with a small delegation. Dilyano would have to take those honeurs.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;border: none; display: inline-block; height: 428px; overflow: hidden; width: 643px;&quot;&gt;&lt;img height=&quot;428&quot; src=&quot;https://lh7-rt.googleusercontent.com/docsz/AD_4nXcLeaOxtxgN8tgHPesey_ZEqVyzuANnCqf9SiIyC4gY07iVYB73XSiY6McS9PrQqzt3WyAIrp4M6fa4lpGlvh0Kd3ePe-WG1C8OSNFhNoPVdN-P6cNuahgI8KnN6bPriSkN0JFI5g?key=cSDuq5KnSK7-yWHhF3WJtw&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;643&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;In the meantime before the table session, it was time for lunch, to which I must give great kudos. Well fabricated selection of vegan and non-vegan bites.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Afterwards another session about CDE (cloud development environment) that I don’t like to integrate in an IDP. Those things make me feel like with an earlier attempt in the early 0s. Boy am I glad I’m no longer forced to work with WSAD or Vscode for that matter. I strongly believe the developer experience should augment the developers’ preferred workflow and not restrict it. A developer’s workflow (when one is more experienced) has oftentimes evolved around a set of tools according to the preferences of said developer.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Then the table session started and we discussed topics like difficulties for dataengineering, how to deal with finding the right items/topics to find for an IDP. A nice takeaway is that at some point RFCs no longer work, the scale of the enterprise is just too big and the RFCs deal with matters that is not really the problem that an IDP does need to solve. Does this coincide with when a company grows in the size when an IDP becomes a thing (just a curiosity of mine now)? It is better to do surveys and interviews with your developers to collect the adjustments needed.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;And finally the topic on, what kind of persons does one need to search for the development team of an IDP. Something we at Cohesion are trying to find out as well.&lt;/span&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;I must commend Sam and Ana for creating a healthy environment with such fruitful discussions. And,,, I hope to see more like these in the coming PlatformCons.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;border: none; display: inline-block; height: 426px; overflow: hidden; width: 643px;&quot;&gt;&lt;img height=&quot;426&quot; src=&quot;https://lh7-rt.googleusercontent.com/docsz/AD_4nXdrWzptY1WIkkziVV3kgcIjfhrGrVD_clhf1Jdk25J1ki0FqF-Fx7-xrMOL7K-fk-D-MQCkC0JM6iDQcouAeIqSD7uzbIcgB74fpr4oOtz0QDp85ZSaR0yMoXJWdTzBPVRnQ3vN?key=cSDuq5KnSK7-yWHhF3WJtw&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;643&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;Lastly, my encounter with Cornelia Davis from Temporal. She and I spoke on something about measurement on the ci/cd pipelines. What we’re lacking is metrics inside the whole pipeline. Vendors like github and gitlab are great but they don’t give us much insights about the jobs we’re running, and where we could improve on those (this was the stuff I wanted to deal with during the work I prematurely left by another vendor). We should push these vendors to allow for (at least) hooks to examine those metrics.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p dir=&quot;ltr&quot; style=&quot;line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Liberation Serif&amp;quot;; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;&quot;&gt;To end this relay: I loved &lt;a href=&quot;https://platformcon.com&quot; target=&quot;_blank&quot;&gt;PlatformCon2025&lt;/a&gt;, I hope to see you next year.&lt;/span&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/9161871356277187086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/9161871356277187086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/9161871356277187086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/9161871356277187086'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2025/07/platformcon2025-after-nice-walk-though.html' title=''/><author><name>rolfst</name><uri>http://www.blogger.com/profile/05784533719837716030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVodF-wptdrgCW3H5en5M9oVmjoxqwlBbDqwvM0VIOrgUh5A6pyVqAN_FPDU8k_1OouD7HCX7as4IRudYhfIGHzrwSTpb4-V4Zi9zJRPRn-vGdhYb8r3NbYiWE-kuixWg/s1600/IMG_20110616_155614.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc51S9AlsYQtXis8M0BJ5RyL4m98W5rwceM8iduKu0m47kcpAwkhBish5FhbQgRPG_eR8MTSsvn9sC7Gg5wLzCQ3gMzpZCj2IJyvm0NbtzqPcZx4jYa5rxG6rFHUTVW6DaNmdUS=s72-c?key=cSDuq5KnSK7-yWHhF3WJtw" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-3784332674866150861</id><published>2025-06-06T13:26:00.003+02:00</published><updated>2025-06-06T13:30:13.390+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="typescript"/><title type='text'>Typescript Classes exposed as Interfaces</title><content type='html'>&lt;p&gt;&amp;nbsp;Suppose you want to do some Dependency Injection magic, or you just want to use the best practice to talk to interfaces instead of implementations.&lt;br /&gt;For some reason language designers made constructs like `interface` and `class` and gave developers the idea that the construct being defined by the interface keyword is the actual type of interface we should program against.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Well lets humor me for a bit and deal with this type of pattern. We are gonna define interfaces and type aliases and classes for this exercise, but we&#39;re also gonna think about naming.&lt;br /&gt;One thing I really don&#39;t like about naming conventions is deterring from the actual semantic meaning of a type. With this I mean all these kind of naming conventions like pre- or post-fixing interfaces with an `I`, or post-fixing concrete classes with `Impl`.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;brrrr...&lt;/p&gt;&lt;p&gt;A few months ago I learned that you can have code like this:&lt;/p&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre&gt;&lt;code&gt;export const RiskFactor = {    
    Low: &#39;low&#39;,
    Medium: &#39;Medium&#39;,
    High: &#39;High&#39;,
} as const;

export type RiskFactor = keyof typeof RiskFactor;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;
&lt;p&gt;As you can see we have both a type alias and a const named as RiskFactor.&lt;/p&gt;&lt;p&gt;This is possible because types live in a different context as the const does.&lt;/p&gt;&lt;p&gt;In fact I rather like this I don&#39;t want to name the keys anything different than the const because I will use the same type everywhere interchangeably, so it&#39;s kinda bothersome to make the types have a different name.&lt;/p&gt;&lt;p&gt;Now comes the kicker:&lt;/p&gt;&lt;p&gt;when I program against an interface I actually want to use the type defined by the interface so and my class is of that type defined by the interface.&lt;/p&gt;&lt;p&gt;when I export a class `Foo` it will also export the type `Foo`. Remember that types and const live in different contexts so the classname `Foo` can both be used as a type and the identifier of the class construct like this:&lt;/p&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre&gt;&lt;code&gt;
export class Foo = {};

const bar: Foo = new Foo();
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;
&lt;p&gt;So when I thought of this, I thought that well this way I can actually use the real word to describe the type I want to use for both the interface (aka type definition) and the class:&lt;/p&gt;&lt;div class=&quot;code-block&quot;&gt;&lt;pre&gt;&lt;code&gt;
export interface Foo {
  name: string;
  help(): string;
};

export class Foo implements Foo {}
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;
&lt;p&gt;To my surprise this works too well???&lt;/p&gt;&lt;p&gt;Why doesn&#39;t my code editor tell me to implement the missing properties?&lt;/p&gt;&lt;p&gt;to take this further:&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code-block&quot;&gt;
&lt;pre&gt;&lt;code&gt;
 ...
 const bar = new Foo()
 bar.help() // this now fails with a runtime error not with a compiltime error!!!!
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;
&lt;p&gt;Was I doing something wrong? Cuz this fails immediately:&lt;/p&gt;&lt;div class=&quot;code-block&quot;&gt;
  &lt;pre&gt;&lt;code&gt;
export interface IFoo {
  name: string;
  help(): string;
};

export class Foo implements IFoo {} // compile time error must implement missing properties name, help from IFoo
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;
&lt;p&gt;This fails as well:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
  &lt;pre&gt;&lt;code&gt;
  export type Foo = {
  name: string;
  help(): string;
};

export class Foo implements Foo {}
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;
&lt;p&gt;This fails with the following warnings:
&lt;/p&gt;&lt;ul&gt;
  &lt;li&gt;Duplicate identifier &#39;Foo&#39;. typescript (2300)&lt;/li&gt;
  &lt;li&gt;Class &#39;Foo&#39; incorrectly implements interface &#39;Foo&#39;.&lt;br /&gt;
       Type &#39;Foo&#39; is missing the following properties from type &#39;Foo&#39;: name, help typescript (2420)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I recon from this is that a class exports its definition as an interface and conflicts with type.&lt;/p&gt;&lt;p&gt;The reason I think why the duplicate name of the interface with class does work is due to the typescript feature of interface merging.&lt;/p&gt;&lt;p&gt;When you have 2 or more interfaces with the same name, yes this is allowed in typescript, it merges the definitions of these interfaces into one. I think classes and interfaces behave in the same way and that&#39;s why we don&#39;t have a compiletime error when using classes and interfaces with the same name.&lt;/p&gt;&lt;p&gt;But now the practical part.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This doesn&#39;t make any sense. I want the compile to direct me with helping me syncing the concrete implementation with the interface(s) it implements, but now typescript suddenly says to me: &quot;Hey dude it&#39;s all up to you now, you&#39;re back in javascript-land except you aren&#39;t cuz interfaces aren&#39;t part of the javascript specifications. Well your problem not mine.....&quot;&lt;/p&gt;&lt;p&gt;I guess I still have to deal with types that don&#39;t mean anything or classes that have a suffix that is just noice.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/3784332674866150861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/3784332674866150861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/3784332674866150861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/3784332674866150861'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2025/06/typescript-classes-exposed-as-interfaces.html' title='Typescript Classes exposed as Interfaces'/><author><name>rolfst</name><uri>http://www.blogger.com/profile/05784533719837716030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVodF-wptdrgCW3H5en5M9oVmjoxqwlBbDqwvM0VIOrgUh5A6pyVqAN_FPDU8k_1OouD7HCX7as4IRudYhfIGHzrwSTpb4-V4Zi9zJRPRn-vGdhYb8r3NbYiWE-kuixWg/s1600/IMG_20110616_155614.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-2208034126748450767</id><published>2018-10-30T09:49:00.003+01:00</published><updated>2021-11-27T12:08:11.190+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="functional programming"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="oop"/><category scheme="http://www.blogger.com/atom/ns#" term="typescript"/><category scheme="http://www.blogger.com/atom/ns#" term="vim"/><title type='text'>The use of TypeScript. Why?</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnsVYr8lZhDkaKcrukct2Ro2-RXhV3YrVfyyKYvWRutCQVgv67mJEMt1jmRukHKAQoKzwBEiyo3_dJ3c5OuojrMpVXPr3lU4NpKtHsgqFe-rxO168SSPHt7otx0p4sdwqK8w94aR7A1hIB/s1600/typescript-logo.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;490&quot; data-original-width=&quot;490&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnsVYr8lZhDkaKcrukct2Ro2-RXhV3YrVfyyKYvWRutCQVgv67mJEMt1jmRukHKAQoKzwBEiyo3_dJ3c5OuojrMpVXPr3lU4NpKtHsgqFe-rxO168SSPHt7otx0p4sdwqK8w94aR7A1hIB/s320/typescript-logo.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;I am searching for the real use of TypeScript.&lt;/span&gt;&lt;/div&gt;
&lt;b id=&quot;docs-internal-guid-200c8840-7fff-1b5c-04eb-4d5b6b1938ac&quot; style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;disclaimer: I am going to write TypeScript as Typescript, just as a heads-up for the critical reader.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;In my life as a developer I tried to understand why people want to make certain choices for languages and tools. I don’t want to go pick a tool or language just because people order me to do that. I always wonder why they do that. Is it policy or is did they actually think of it. &lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;I mean I understand why people want to use Typescript from certain perspectives.&lt;/span&gt;&lt;/div&gt;
&lt;b style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;ul style=&quot;margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;The use of types,&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;My framework uses typescript (Eg. Angular),&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;The ease of use of OOP programming,&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;My Java developers can immediately start programming because of the familiarity Typescript has with Java, &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li dir=&quot;ltr&quot; style=&quot;background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;Typescript allows me to use my tooling like autocompletion,&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;Of all these arguments I can just as easily say a counter argument. For me the only really valid point is the second argument in above list. &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
When you choose a framework where all the documentation is written in a language it is hard to break out of that language.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Let me try to explain why I am not convinced in these arguments.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
Types&lt;/h4&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyWQxWbWXBH61suBLUG0XNBVGKIukOW3dChgpgyWqeKnbOaA2TrnktYN_qv6SLTY9bpdDxHrExBsaBk4IJCOMbHENHlI4_Xuf0ACdoylheEN5PRITGm2EB5w9WvpYdp3mbPeF4ktYyPxSa/s1600/carl-jung-personality-types-toolshero-696x348.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;348&quot; data-original-width=&quot;696&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyWQxWbWXBH61suBLUG0XNBVGKIukOW3dChgpgyWqeKnbOaA2TrnktYN_qv6SLTY9bpdDxHrExBsaBk4IJCOMbHENHlI4_Xuf0ACdoylheEN5PRITGm2EB5w9WvpYdp3mbPeF4ktYyPxSa/s400/carl-jung-personality-types-toolshero-696x348.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In using good programming (mind you I say programming not Typescript) we make use of Types (often seen as objects in OOP).Types are defined by a contract not by using a keyword that loses its purpose in runtime.&lt;/div&gt;
&lt;div&gt;
The use of types in Typescript&amp;nbsp;are only used to satisfy the compiler, but then we added this compiler as a language tool (like any compiler). But here it comes, the angular compiler is not so much as a compiler but more of a transpiler. It transforms the Typescript&amp;nbsp;to Javascript and it erases all type information once the resulting code is left as Javascript. Also what I have found is that the use of types is often neglected as I will argue in a later reasoning here.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I like dynamic languages. The give me an feeling of productivity that I cannot achieve with statically typed languages like Java (or Typescript).&lt;/div&gt;
&lt;div&gt;
I like to work with the mantra:&amp;nbsp;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
if it walks like a duck and if it talks like a duck, it&#39;s probably a duck&lt;/blockquote&gt;
&lt;div&gt;
For me this is all about the contract.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
When the object in question does not follow the contract it just isn&#39;t the type we need in this context. If we use Typescript&amp;nbsp;to define our types we know it is fine during compilation however in runtime there is no such confirmation or construct that we are using the expected type. The only way to way to verify this is to test.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Why do I say we have no such confirmation in runtime? Well too often I see developers make use of the &#39;any&#39; type. &#39;any&#39; basically says: I don&#39;t know what type we&#39;re using here but trust me it&#39;s gonna be alright.... 😑&lt;/div&gt;
&lt;div&gt;
This &#39;any&#39; and the loosing of typing in runtime can give us false safety.&lt;br /&gt;&lt;br /&gt;*Update november 27th 2021,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The latest versions of Typescript have undergone some much improved additions to the typesystem. This makes the use of types much stronger and I dare say even better as you can no even use types (to some degree) in such a way it will contain logic that foregoes the use of unit tests. This means the compiler is able to apply logic to the output of some functions so the functions no longer need to be tested. I even saw a usage of this that is able to &lt;a href=&quot;https://github.com/eamonnboyle/sudoku-type-solver&quot; target=&quot;_blank&quot;&gt;solve sudokus&lt;/a&gt; at compile-time. Though this seems great it costs a whole lot of understanding new ways to solving solutions programatically. The complexity is really big when using this approach and leads to other costs during development. Eric Elliott calls this&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://medium.com/javascript-scene/the-typescript-tax-132ff4cb175b&quot; target=&quot;_blank&quot;&gt;Typing overhead&lt;/a&gt;. In my opinion if you really want to use typesafety in your web development you should thing of languages like &lt;a href=&quot;https://rescript-lang.org/&quot; target=&quot;_blank&quot;&gt;ReScript&lt;/a&gt;. ReScript offers typing but due to superb type-inference you will hardly notice this when creating your code, but your IDE and compiler will still be able to confirm to your used types.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div&gt;*end update&lt;/div&gt;
&lt;h4&gt;
Frameworks&lt;/h4&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMNmGBTFqZko5q2wIvmvJ-Ay9f6T4CgexGxPWt4MtiwRXVnfEGnNSRQDrpVSrzb91mqoIGuA0qWiiTnLFdSbssgoSNe2z0HCjWlXNRsVRpoTvxZnhmdfYkhCWvgpcnd1G4-bbGY1-8vy-7/s1600/Competency-framework-structure.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;500&quot; data-original-width=&quot;1000&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMNmGBTFqZko5q2wIvmvJ-Ay9f6T4CgexGxPWt4MtiwRXVnfEGnNSRQDrpVSrzb91mqoIGuA0qWiiTnLFdSbssgoSNe2z0HCjWlXNRsVRpoTvxZnhmdfYkhCWvgpcnd1G4-bbGY1-8vy-7/s640/Competency-framework-structure.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Currently amongst the most used frameworks in the enterprise is Angular. Angular is written in Typescript. All the documentation is written in Typescript. All the examples likewise. I understand this as a valid point in using Typescript. It makes your productivity much higher especially when you program and use the likes as stack overflow and the official examples as your way to solve your programming issues. No questions asked no answers given. I take this as fact. However, I still wonder why these frameworks would be written in Typescript&amp;nbsp;in the first place.&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;h4&gt;
OOP&lt;/h4&gt;
&lt;div&gt;
Typescript promotes the use of object oriented programming. I agree. Since Typescript&amp;nbsp;is modelled after C# and Java, it promotes the use of the class construct and hence object constructs. Typescript however also is a so called supertyped javascript it allows you to write plain javascript without the added features Typescript has. The class construct is not the classical construct as we know from Java and C#, basically it is syntactic sugar over the prototypal inheritance structure Javascript offers.&lt;/div&gt;
&lt;div&gt;
In fact ES6 offers this construct so it is not even exclusive to Typescript.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now I favor the use of functional programming over oop, while this is not entirely so. I really prefer the use of a hybrid approach of using both functional and oop in my code.&lt;/div&gt;
&lt;div&gt;
I see the use of services best described in a functional pattern, not in the way Java promotes. Java services are often a collection of related methods combined in an object. To me this is more or less a &lt;a href=&quot;https://en.wikipedia.org/wiki/Facade_pattern&quot; target=&quot;_blank&quot;&gt;Façade&lt;/a&gt; without the usage of multiple delegated extra components.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
Coming from a different language&lt;/h4&gt;
&lt;div&gt;
I heard a few of my peers tell me: &quot;well thanks to Typescript&amp;nbsp;my java developers were able to code for the frontend because the language is practically the same.&quot;&lt;/div&gt;
&lt;div&gt;
There is so much wrong with this argumentation, I hardly know where to begin. Let me try though.&lt;/div&gt;
&lt;div&gt;
Being able to program in another language because the syntax is so familiar is like saying you can use oranges for your apple pie because they are both fruits and hang both on a tree and you have to peel their skin off.&lt;/div&gt;
&lt;div&gt;
Go and tell an average Java programmer to start programming in C# because the syntax is nearly the same. It just doesn&#39;t work that way. Sure the programmer is able to produce some code, but let&#39;s call it at that ok? Tell a windows engineer to setup a linux server, they are both servers and have a cli. I think you got my meaning.&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTOgBH2xzZ6eyIbZTH9Pnnpz7l6ozbix_LCMShk-pVaUdaV-8TOE4nvvgl_qvTFSp9GeTbdCKD2kX2obGr5OaiYknicENHy3anFafqZ6Lx-tQfO8VHukzkMo46S53eMf2fkQqUG36JdgFF/s1600/Apple-Pie-Fruit-Salad.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;591&quot; data-original-width=&quot;591&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTOgBH2xzZ6eyIbZTH9Pnnpz7l6ozbix_LCMShk-pVaUdaV-8TOE4nvvgl_qvTFSp9GeTbdCKD2kX2obGr5OaiYknicENHy3anFafqZ6Lx-tQfO8VHukzkMo46S53eMf2fkQqUG36JdgFF/s320/Apple-Pie-Fruit-Salad.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;apples and oranges who cares?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Typescript is just no Java. Don&#39;t pretend it is because of syntax similarity. We hide behind a layer of semantics that we try to map on javascript.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
We hide the concept of the actual workings of prototypal inheritance in Typescript&amp;nbsp;or even in ES6 for that matter. The interface semantics are different in Typescript&amp;nbsp;than in Java. In Java an interface is meant to be a contract, in Typescript it is meant as a struct a type without any specific behaviour. Though the documentation claims the interface to be a contract as well, I even see &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks&quot; target=&quot;_blank&quot;&gt;this&lt;/a&gt; construct in a Typescript&amp;nbsp;interface:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
[propertyName: string]: any;&lt;/blockquote&gt;
&lt;div&gt;
What this allows you to do, is to basically say: any property you add to this interface is allowed.&lt;/div&gt;
&lt;div&gt;
Object literal? Any? (pun intended).&lt;/div&gt;
&lt;div&gt;
We basically leave the contract so wide open it basically becomes void.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I just think you just need to take the fear of using a different language away from the Java developer Typescript is just another trick to persuade the Java developer to become a frontend developer, but it leaves the developer in no-mans land.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
The real solution is to just educate the Java developer in javascript. But don&#39;t fool the developer. It&#39;s just not right. Either point out he has to do the dam job and suck it up or stay out of webdevelopment, just be honest.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;
Tools&lt;/h4&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLyQ1mwiJZpwo8MiNPcmzR3IHTimaymIhY0obsZ2Mjqt9ohugNnCzO2yX3G43iGqcYrcWkE87zlEuzxiq2bMCZ3e2pFN5XaEJgI_Y7yjyqrbCc-E-vq2fpret9yYzPAWUy6W3It6V-GhxM/s1600/sustainableroofing_main.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;tools&quot; border=&quot;0&quot; data-original-height=&quot;550&quot; data-original-width=&quot;900&quot; height=&quot;391&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLyQ1mwiJZpwo8MiNPcmzR3IHTimaymIhY0obsZ2Mjqt9ohugNnCzO2yX3G43iGqcYrcWkE87zlEuzxiq2bMCZ3e2pFN5XaEJgI_Y7yjyqrbCc-E-vq2fpret9yYzPAWUy6W3It6V-GhxM/s640/sustainableroofing_main.jpg&quot; title=&quot;&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Typescript allows me to use tooling for my productivity.&lt;/div&gt;
&lt;div&gt;
Well this seems to me it&#39;s the other way around. Aren&#39;t tools used to enhance our productivity? Shouldn&#39;t tools provide a means to make our work easier? In that way Typescript is a tool but so is javascript. And this is exactly my question: Why should I use Typescript?&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Visual Studio is an editor that allows me to use plugins to enhance my writing of code. but it also allows me to enhance me my writing of javascript code, not just Typescript.&lt;/div&gt;
&lt;div&gt;
Personally I have a multitude of tools I write my code in. I am a vim user (&lt;a href=&quot;https://neovim.io/&quot; target=&quot;_blank&quot;&gt;neovim&lt;/a&gt; for that matter). I have found lots of ways to increase my productivity in that editor.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Do I want to be convinced to use Typescript?&lt;/div&gt;
&lt;div&gt;
Well I certainly want to understand why I should use Typescript&amp;nbsp;over javascript. I just don&#39;t see it.&lt;/div&gt;
&lt;div&gt;
I would be very happy if someone could point out to me what I am missing. I want to share knowledge and I certainly will try to provide this found knowledge to others in helping them.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: black; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;&quot;&gt;For references I also direct you too these documents&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: #1155cc; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre;&quot;&gt;&lt;a href=&quot;https://itnext.io/why-use-typescript-good-and-bad-reasons-ccd807b292fb&quot; style=&quot;text-decoration: none;&quot;&gt;https://itnext.io/why-use-typescript-good-and-bad-reasons-ccd807b292fb&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;span style=&quot;background-color: transparent; color: #1155cc; font-family: &amp;quot;arial&amp;quot;; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;a href=&quot;https://medium.com/@wittydeveloper/typescript-the-honest-trailer-ae19e7bc0f7e&quot; style=&quot;text-decoration: none;&quot;&gt;https://medium.com/@wittydeveloper/typescript-the-honest-trailer-ae19e7bc0f7e&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;&quot;&gt;
&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/interfaces.html&quot;&gt;https://www.typescriptlang.org/docs/handbook/interfaces.html&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/2208034126748450767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/2208034126748450767' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/2208034126748450767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/2208034126748450767'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2018/10/the-use-of-typescript-why.html' title='The use of TypeScript. Why?'/><author><name>rolfst</name><uri>http://www.blogger.com/profile/05784533719837716030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVodF-wptdrgCW3H5en5M9oVmjoxqwlBbDqwvM0VIOrgUh5A6pyVqAN_FPDU8k_1OouD7HCX7as4IRudYhfIGHzrwSTpb4-V4Zi9zJRPRn-vGdhYb8r3NbYiWE-kuixWg/s1600/IMG_20110616_155614.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnsVYr8lZhDkaKcrukct2Ro2-RXhV3YrVfyyKYvWRutCQVgv67mJEMt1jmRukHKAQoKzwBEiyo3_dJ3c5OuojrMpVXPr3lU4NpKtHsgqFe-rxO168SSPHt7otx0p4sdwqK8w94aR7A1hIB/s72-c/typescript-logo.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-5466171073534652526</id><published>2014-08-13T13:40:00.002+02:00</published><updated>2014-08-13T13:40:33.510+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache"/><category scheme="http://www.blogger.com/atom/ns#" term="Augeas"/><category scheme="http://www.blogger.com/atom/ns#" term="Packer"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="PuPHPet"/><category scheme="http://www.blogger.com/atom/ns#" term="puppet"/><category scheme="http://www.blogger.com/atom/ns#" term="Vagrant"/><title type='text'>Becoming DevOps</title><content type='html'>I&#39;ve been working on creating development environments a while now and my current employer wants to have a quick way of setting up a development environment for the projects that we do.&lt;br /&gt;
Since I&#39;ve worked with &lt;a href=&quot;http://www.vagrantup.com/&quot;&gt;Vagrant&lt;/a&gt;&amp;nbsp;before it befell to me to do the setting up of it all.&lt;br /&gt;
&lt;br /&gt;
Vagrant is a tool that can make use of virtualisation software like Virtualbox or VMWare. It provides means to run the vm image (box) with a provisioned state specifically for your (development) needs.&lt;br /&gt;
&lt;br /&gt;
I started by making use of &lt;a href=&quot;http://www.packer.io/&quot;&gt;packer&lt;/a&gt;. Packer allows me to setup a vagrant box in much less time than it would take me to if I used Vagrant itself for creating boxes.&lt;br /&gt;
Packer allows you to select the iso and the virtualisation software and also provides hooks to provision the box with the tools you would need to do your job once you start developing on the box within your project.&lt;br /&gt;
This provisioning is obviously the hard part and needs the play-rewind-repeat cycle to really put the stuff on the box that you want.&lt;br /&gt;
&lt;br /&gt;
Let me tell you what I did without the repeat cuz of course I did it right in one time *cough*.&lt;br /&gt;
&lt;br /&gt;
I found a set of packer &lt;a href=&quot;https://github.com/shiguredo/packer-templates&quot;&gt;templates&lt;/a&gt; on the web that allowed me to jumpstart the creation of the boxes.&lt;br /&gt;
Although I might now use &lt;a href=&quot;https://puphpet.com/&quot;&gt;PuPHPet&lt;/a&gt; with some adjustments I learned quite a bit about provisioning.&lt;br /&gt;
First the basics:&lt;br /&gt;
I modified the template I needed and I added an extra script for my provisioning needs.&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/rolfst/aa7f5c092c7a794fe70c.js&quot;&gt;&lt;/script&gt;

I added this script in my template.json.&lt;br /&gt;
&lt;br /&gt;
Then I added the puppet locations to my template.json within the provision section:&lt;br /&gt;
&amp;nbsp; {&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&quot;type&quot;: &quot;puppet-masterless&quot;,&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&quot;manifest_file&quot;: &quot;/tools/vagr_build/puppet/manifests/default.pp&quot;,&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&quot;manifest_dir&quot;: &quot;/tools/vagr_build/puppet/manifests&quot;,&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&quot;module_paths&quot;: [&quot;/tools/vagr_build/puppet/modules&quot;]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
Obviously I have my build environment in tools/vagr_build as you can see here, you might have other locations.&lt;br /&gt;
I also make use of puppet-masterless because we do not have a puppet server within our company and I didn&#39;t want to invest time to set that up as well.&lt;br /&gt;
&lt;br /&gt;
Now comes the big part, the real provisioning. I created my provisioning command in the default.pp file&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/rolfst/c13393a9ddd3686111f1.js&quot;&gt;&lt;/script&gt;

I first install some base packages and mysql with apache. Then comes the PHP part and this part needed some extra configuration&lt;br /&gt;
To configure PHP correctly I needed to create a php.ini within /etc/php5/conf.d/ I updated its content using a tool called augeas Puppet knows how to use this but it needs to be installed serparately, so I did that with the base packages.&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;Note the context within a augeas part starts with /files/ this is a nessecary part to edit files.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
From here I made my box file:&lt;br /&gt;
&amp;gt; packer build -only=virtualbox-iso .\template.json&lt;br /&gt;
and once this was done I did&lt;br /&gt;
&amp;gt; vagrant box add ubuntu_12_php53 .\ubuntu-12-04-x64-virtualbox.box&lt;br /&gt;
to place my box with vagrant&lt;br /&gt;
&lt;br /&gt;
Later use of this box is just how you would normally use a vagrant box.</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/5466171073534652526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/5466171073534652526' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/5466171073534652526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/5466171073534652526'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2014/08/becoming-devops.html' title='Becoming DevOps'/><author><name>rolfst</name><uri>http://www.blogger.com/profile/05784533719837716030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVodF-wptdrgCW3H5en5M9oVmjoxqwlBbDqwvM0VIOrgUh5A6pyVqAN_FPDU8k_1OouD7HCX7as4IRudYhfIGHzrwSTpb4-V4Zi9zJRPRn-vGdhYb8r3NbYiWE-kuixWg/s1600/IMG_20110616_155614.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-5495789324989978164</id><published>2013-12-19T19:30:00.000+01:00</published><updated>2013-12-19T19:30:01.260+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="debugging"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="vim"/><category scheme="http://www.blogger.com/atom/ns#" term="virtualenv"/><title type='text'>Debugging python with vim in a virtualenv</title><content type='html'>Yay I finally got it working my debugging of a python script with Vdebug in vim&lt;br /&gt;
Vdebug is a vim plugin that lets you debug all kinds of scripts/languages in vim.&lt;br /&gt;
It supports these languages:&lt;br /&gt;
Python&lt;br /&gt;
Perl&lt;br /&gt;
PHP&lt;br /&gt;
Ruby&lt;br /&gt;
Node.js&lt;br /&gt;
&lt;br /&gt;
At work I use it to debug Perl code and I wanted to use it to debug my python code for personal projects.&lt;br /&gt;
&lt;br /&gt;
the key is: pip install&amp;nbsp;&amp;nbsp;komodo-python-dbgp within your virtualenv once that is done it will create the executable pydbgp in your virtualenv. so you can launch in vim vdbug and then in the shell:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
pydbgp &amp;lt;script&amp;gt;&lt;/blockquote&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/5495789324989978164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/5495789324989978164' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/5495789324989978164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/5495789324989978164'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2013/12/debugging-python-with-vim-in-virtualenv.html' title='Debugging python with vim in a virtualenv'/><author><name>rolfst</name><uri>http://www.blogger.com/profile/05784533719837716030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVodF-wptdrgCW3H5en5M9oVmjoxqwlBbDqwvM0VIOrgUh5A6pyVqAN_FPDU8k_1OouD7HCX7as4IRudYhfIGHzrwSTpb4-V4Zi9zJRPRn-vGdhYb8r3NbYiWE-kuixWg/s1600/IMG_20110616_155614.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-8929865251687930183</id><published>2013-12-16T19:49:00.000+01:00</published><updated>2013-12-18T18:17:22.670+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Angularjs"/><category scheme="http://www.blogger.com/atom/ns#" term="Brunch"/><category scheme="http://www.blogger.com/atom/ns#" term="django"/><category scheme="http://www.blogger.com/atom/ns#" term="flask"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="Yeoman"/><title type='text'>Working on a new web project</title><content type='html'>Ok, so I started working on a web project for a friend of mine.&lt;br /&gt;
I want to work with some new stuff so I decided to implement this application with some neat new technologies (well new for me anyway).&lt;br /&gt;
&lt;br /&gt;
All the while I have been dabbling with some stuff during the years now and I came up with a basic installation to get my workflow ready.&lt;br /&gt;
For this I am making use of a script that I execute to setup my projects environment:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/rolfst/7984448.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
This installs an isolated python environment and an isolated node.js environment for webdevelopment.&lt;br /&gt;
The script will also offer the option to work either with a Yeoman workflow or a Brunch based workflow.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When I start my work I just use another script that will launch my work environment in correct settings.&lt;br /&gt;
For that I make use of tmux a screen multiplexer that enters in the activated virtualenv:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/rolfst/7984601.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
I&#39;ve decided to build this all with Angularjs in the frontend and flask or django on the backend. The backend I will decide later on.&lt;br /&gt;
For the workflow I will use Brunch because it is a fairly basic webapplication and the speed of usage in a Brunch workflow outweighs the flexibility/complexity of the Yeomand/Grunt &amp;nbsp;configuration.&lt;br /&gt;
I made a skeleton to work with coffeescript and Angularjs and made that available on &lt;a href=&quot;https://github.com/rolfst/angular-brunch-seed-with-coffee&quot;&gt;github&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I will provide details of my progress.</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/8929865251687930183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/8929865251687930183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/8929865251687930183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/8929865251687930183'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2013/12/working-on-new-web-project.html' title='Working on a new web project'/><author><name>rolfst</name><uri>http://www.blogger.com/profile/05784533719837716030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVodF-wptdrgCW3H5en5M9oVmjoxqwlBbDqwvM0VIOrgUh5A6pyVqAN_FPDU8k_1OouD7HCX7as4IRudYhfIGHzrwSTpb4-V4Zi9zJRPRn-vGdhYb8r3NbYiWE-kuixWg/s1600/IMG_20110616_155614.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-6519220536254830966</id><published>2011-10-14T09:50:00.000+02:00</published><updated>2011-10-14T09:53:09.440+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Music VLC"/><title type='text'>VLC and AirportExpress</title><content type='html'>At work we got our hands on an Airport Express. So the first thing of course is &quot;MUSIC&quot;.&lt;br /&gt;
Well we do have some people here that want to use iTunes. But for personal reasons I don&#39;t like iTunes.&lt;br /&gt;
So I normally use VLC like any sane person would do :) But while all of my co-workers were laughing at me cuz i couldn&#39;t join with the music streaming.&lt;br /&gt;
Not taken aback I was strolling the internet to find if there was a solution of streaming to Airport. There was a program called Airfoil but hey I&#39;m dutch so i really don&#39;t want to pay for programs unless necessary. At the VLC forums i stumbled on a post by &lt;a href=&quot;http://forum.videolan.org/viewtopic.php?f=12&amp;amp;t=79400#p263662&quot;&gt;crzyhanko&lt;/a&gt; and he posted some great code you can put in the standard streamchain field of the VLC player:&lt;br /&gt;
&lt;code&gt;#transcode{acodec=alac,channels=2,samplerate=44100}:raop{host=&lt;ip address=&quot;&quot; airport=&quot;&quot; express=&quot;&quot; of=&quot;&quot;&gt;&lt;/ip&gt;&lt;/code&gt;&lt;code&gt;&amp;lt;ip address of airport express&amp;gt;&lt;/code&gt;&lt;code&gt;&lt;ip address=&quot;&quot; airport=&quot;&quot; express=&quot;&quot; of=&quot;&quot;&gt;,volume=175}&lt;/ip&gt;&lt;/code&gt;&lt;br /&gt;
It works :D so who is laughing now</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/6519220536254830966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/6519220536254830966' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/6519220536254830966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/6519220536254830966'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2011/10/vlc-and-airportexpress.html' title='VLC and AirportExpress'/><author><name>rolfst</name><uri>http://www.blogger.com/profile/05784533719837716030</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVodF-wptdrgCW3H5en5M9oVmjoxqwlBbDqwvM0VIOrgUh5A6pyVqAN_FPDU8k_1OouD7HCX7as4IRudYhfIGHzrwSTpb4-V4Zi9zJRPRn-vGdhYb8r3NbYiWE-kuixWg/s1600/IMG_20110616_155614.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-317790417833696149</id><published>2011-03-10T12:45:00.002+01:00</published><updated>2011-03-10T12:48:04.933+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type='text'>SQL remove of constraints</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Note to self:&lt;br /&gt;
&lt;br /&gt;
when doing large imports using a sql script in oracle. here&#39;s how to remove constrains and then enable them after insert:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This code is useful to disable the constraints in the database.&lt;br /&gt;
&lt;pre class=&quot;brush: sql&quot;&gt;set serveroutput on;
begin
  for c in (select constraint_name, table_name from user_constraints where constraint_type=&#39;R&#39;) loop
    execute immediate(&#39;alter table &#39;||c.table_name||&#39; disable constraint &#39;||c.constraint_name);
  end loop;
end;
/
&lt;/pre&gt;the &#39;/&#39; at the end lets sql developer know that this is the end of an inline pl/sql script&lt;br /&gt;
&lt;br /&gt;
then insert the normal sql insert script and when done include this code:&lt;br /&gt;
&lt;pre class=&quot;brush: sql&quot;&gt;begin
  for c in (select constraint_name, table_name from user_constraints where constraint_type=&#39;R&#39;) loop
    execute immediate(&#39;alter table &#39;||c.table_name||&#39; enable constraint &#39;||c.constraint_name);
  end loop;
end;
/
-- SHOW ENABLED --
select constraint_name, status from user_constraints where constraint_type=&#39;R&#39;;
&lt;/pre&gt;When the last line still shows disabled constraints the data is corrupt.&lt;br /&gt;
&lt;br /&gt;
Blobs of type String can be inserted via a workaround:&lt;br /&gt;
&lt;pre class=&quot;brush: sql&quot;&gt;declare myBLobVar varchar2(32767) := &#39;paste string here&#39; ;
begin
  update tableWithBlob set blobCol = myBlobVar where id = blah ;
end;
&lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/317790417833696149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/317790417833696149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/317790417833696149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/317790417833696149'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2011/03/sql-remove-of-constraints.html' title='SQL remove of constraints'/><author><name>Rolf Strijdhorst</name><uri>http://www.blogger.com/profile/07626013407256435126</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_koY-_i9pygA/SLKSP0OcflI/AAAAAAAAABY/65SgRJNucA4/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-4834657336103995941</id><published>2009-07-20T15:38:00.000+02:00</published><updated>2009-07-20T15:38:11.374+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Eclipse Templates</title><content type='html'>&lt;div xmlns=&#39;http://www.w3.org/1999/xhtml&#39;&gt;Templates are a usefull thing when working with code as we know.&lt;br /&gt;
A simple template is a simple thing to do but using an import is a different beast.&lt;br /&gt;
&lt;br /&gt;
so here is a example to make sure that the import is also included in the java file.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&#39;brush: plain&#39;&gt;/** Tapestry render phase method. Called before component body is rendered.*/
@BeforeRenderBody
public void beforeRenderBody(){
${cursor}
}
${:import(org.apache.tapestry5.annotations.BeforeRenderBody)}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/4834657336103995941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/4834657336103995941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/4834657336103995941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/4834657336103995941'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2009/07/eclipse-templates.html' title='Eclipse Templates'/><author><name>Rolf Strijdhorst</name><uri>http://www.blogger.com/profile/07626013407256435126</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_koY-_i9pygA/SLKSP0OcflI/AAAAAAAAABY/65SgRJNucA4/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-8527296844023126165</id><published>2009-05-21T22:53:00.008+02:00</published><updated>2009-07-20T15:37:46.031+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="atomikos"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jta"/><title type='text'>JTA</title><content type='html'>&lt;p&gt;Most applications using ORM tooling have need of a transaction management system.&lt;br /&gt;
One of these transaction managers is Atomikos. Atomikos provides several products. One transaction essentials is an opensource variant.&lt;br /&gt;
However you cannot get it via a maven repository. You&#39;ll have to register for a download link.&lt;br /&gt;
Transaction essentials is easy embeddable within a jetty container or even within a spring context.&lt;p&gt;&lt;p&gt;First here&#39;s how to implement transaction essentials within a jetty container configured with maven.&lt;/p&gt;&lt;p&gt;Lets start with the jetty configuration within a maven pom file:&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;brush: xml&quot;&gt;&amp;lt;!-- Run the application using &quot;mvn jetty:run&quot; --&gt;
            &amp;lt;plugin&gt;
                &amp;lt;groupId&gt;org.mortbay.jetty&amp;lt;/groupId&gt;
                &amp;lt;artifactId&gt;maven-jetty-plugin&amp;lt;/artifactId&gt;
                &amp;lt;version&gt;6.1.15&amp;lt;/version&gt;
                &amp;lt;configuration&gt;
                    &amp;lt;!-- Log to the console. --&gt;
                    &amp;lt;requestLog implementation=&quot;org.mortbay.jetty.NCSARequestLog&quot;&gt;
                        &amp;lt;!--
                        This doesn&#39;t do anything for Jetty, but is a workaround for a
                        Maven bug that prevents the requestLog from being set.
                        --&gt;
                        &amp;lt;append&gt;true&amp;lt;/append&gt;
                    &amp;lt;/requestLog&gt;
                   
                    &amp;lt;scanIntervalSeconds&gt;0&amp;lt;/scanIntervalSeconds&gt;
                    &amp;lt;webAppConfig&gt;
                      &amp;lt;contextPath&gt;/rbudisplay&amp;lt;/contextPath&gt;
                      &amp;lt;tempDirectory&gt;${project.build.directory}/work&amp;lt;/tempDirectory&gt;
                    &amp;lt;/webAppConfig&gt;
                    &amp;lt;jettyConfig&gt;src/etc/jetty/tx-jetty.xml&amp;lt;/jettyConfig&gt;
                    &amp;lt;jettyEnvXml&gt;src/etc/jetty/jetty-env.xml&amp;lt;/jettyEnvXml&gt;
                &amp;lt;/configuration&gt;
                &amp;lt;dependencies&gt;
                    &amp;lt;dependency&gt;
                        &amp;lt;groupId&gt;javax.transaction&amp;lt;/groupId&gt;
                        &amp;lt;artifactId&gt;jta&amp;lt;/artifactId&gt;
                        &amp;lt;version&gt;1.1&amp;lt;/version&gt;
                    &amp;lt;/dependency&gt;
                    &amp;lt;dependency&gt;
                        &amp;lt;groupId&gt;com.atomikos&amp;lt;/groupId&gt;
                        &amp;lt;artifactId&gt;atomikos-util&amp;lt;/artifactId&gt;
                        &amp;lt;version&gt;3.5.4&amp;lt;/version&gt;
                    &amp;lt;/dependency&gt;
                    &amp;lt;dependency&gt;
                        &amp;lt;groupId&gt;com.atomikos&amp;lt;/groupId&gt;
                        &amp;lt;artifactId&gt;transactions&amp;lt;/artifactId&gt;
                        &amp;lt;version&gt;3.5.4&amp;lt;/version&gt;
                    &amp;lt;/dependency&gt;
                    &amp;lt;dependency&gt;
                        &amp;lt;groupId&gt;com.atomikos&amp;lt;/groupId&gt;
                        &amp;lt;artifactId&gt;transactions-api&amp;lt;/artifactId&gt;
                        &amp;lt;version&gt;3.5.4&amp;lt;/version&gt;
                    &amp;lt;/dependency&gt;
                    &amp;lt;dependency&gt;
                        &amp;lt;groupId&gt;com.atomikos&amp;lt;/groupId&gt;
                        &amp;lt;artifactId&gt;transactions-jta&amp;lt;/artifactId&gt;
                        &amp;lt;version&gt;3.5.4&amp;lt;/version&gt;
                    &amp;lt;/dependency&gt;
                    &amp;lt;dependency&gt;
                        &amp;lt;groupId&gt;com.atomikos&amp;lt;/groupId&gt;
                        &amp;lt;artifactId&gt;transactions-hibernate3&amp;lt;/artifactId&gt;
                        &amp;lt;version&gt;3.5.4&amp;lt;/version&gt;
                    &amp;lt;/dependency&gt;
                    &amp;lt;dependency&gt;
                        &amp;lt;groupId&gt;postgresql&amp;lt;/groupId&gt;
                        &amp;lt;artifactId&gt;postgresql&amp;lt;/artifactId&gt;
                        &amp;lt;version&gt;8.3-603.jdbc4&amp;lt;/version&gt;
                    &amp;lt;/dependency&gt;
                    &amp;lt;dependency&gt;
                        &amp;lt;groupId&gt;log4j&amp;lt;/groupId&gt;
                        &amp;lt;artifactId&gt;log4j&amp;lt;/artifactId&gt;
                        &amp;lt;version&gt;1.2.14&amp;lt;/version&gt;
                    &amp;lt;/dependency&gt;
                &amp;lt;/dependencies&gt;
            &amp;lt;/plugin&gt;
&lt;/pre&gt;&lt;p&gt;The jettyConfig tx-jetty contains the configuration for the atomikos usertransactionmanager and will be applied before other setting set in the maven pom:&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;brush: xml&quot;&gt;&amp;lt;Call class=&quot;java.lang.System&quot; name=&quot;setProperty&quot;&gt;
      &amp;lt;Arg&gt;com.atomikos.icatch.file&amp;lt;/Arg&gt;
      &amp;lt;Arg&gt;src/etc/jetty/jta.properties&amp;lt;/Arg&gt;
   &amp;lt;/Call&gt;

   &amp;lt;!-- Atomikos --&gt;
   &amp;lt;New id=&quot;tx&quot; class=&quot;org.mortbay.jetty.plus.naming.Transaction&quot;&gt;
      &amp;lt;Arg&gt;
         &amp;lt;New class=&quot;com.atomikos.icatch.jta.UserTransactionImp&quot; /&gt;
      &amp;lt;/Arg&gt;
   &amp;lt;/New&gt;
&lt;/pre&gt;&lt;p&gt;The jetty-env contains the configuration for a specif webapplication in jetty and consists in part of the datasources for the webapp:&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;brush: xml&quot;&gt;&amp;lt;Set name=&quot;configurationClasses&quot;&gt;
    &amp;lt;Array type=&quot;java.lang.String&quot;&gt;
      &amp;lt;Item&gt;org.mortbay.jetty.webapp.WebInfConfiguration&amp;lt;/Item&gt;
      &amp;lt;Item&gt;org.mortbay.jetty.plus.webapp.EnvConfiguration&amp;lt;/Item&gt;
      &amp;lt;Item&gt;org.mortbay.jetty.annotations.Configuration&amp;lt;/Item&gt;
      &amp;lt;Item&gt;org.mortbay.jetty.webapp.JettyWebXmlConfiguration&amp;lt;/Item&gt;
      &amp;lt;Item&gt;org.mortbay.jetty.webapp.TagLibConfiguration&amp;lt;/Item&gt;
    &amp;lt;/Array&gt;
  &amp;lt;/Set&gt;
 
  &amp;lt;!-- Add a mapping from name in web.xml to the environment --&gt;
  &amp;lt;New id=&quot;map1&quot; class=&quot;org.mortbay.jetty.plus.naming.Link&quot;&gt;
    &amp;lt;Arg&gt;&amp;lt;Ref id=&#39;rbudisplay&#39;/&gt;&amp;lt;/Arg&gt;
    &amp;lt;Arg&gt;jdbc/rbuconverter&amp;lt;/Arg&gt; &amp;lt;!-- name in web.xml --&gt;
    &amp;lt;Arg&gt;jdbc/rbu&amp;lt;/Arg&gt;  &amp;lt;!-- name in environment --&gt;
  &amp;lt;/New&gt;
 
  &amp;lt;New id=&quot;rbuconverter&quot; class=&quot;org.mortbay.jetty.plus.naming.Resource&quot;&gt;
     &amp;lt;Arg&gt;&amp;lt;Ref id=&quot;rbudisplay&quot;/&gt;&amp;lt;/Arg&gt;
     &amp;lt;Arg&gt;jdbc/rbu&amp;lt;/Arg&gt;
     &amp;lt;Arg&gt;
      &amp;lt;New class=&quot;com.atomikos.jdbc.AtomikosDataSourceBean&quot;&gt;
       &amp;lt;Set name=&quot;minPoolSize&quot;&gt;2&amp;lt;/Set&gt;
       &amp;lt;Set name=&quot;maxPoolSize&quot;&gt;50&amp;lt;/Set&gt;
       &amp;lt;Set name=&quot;xaDataSourceClassName&quot;&gt;org.postgresql.xa.PGXADataSource&amp;lt;/Set&gt;
       &amp;lt;Set name=&quot;UniqueResourceName&quot;&gt;rbuconverter&amp;lt;/Set&gt;
       &amp;lt;Get name=&quot;xaProperties&quot;&gt;
         &amp;lt;Call name=&quot;setProperty&quot;&gt;
            &amp;lt;Arg&gt;databaseName&amp;lt;/Arg&gt;
            &amp;lt;Arg&gt;rbuconverter&amp;lt;/Arg&gt;
         &amp;lt;/Call&gt;
         &amp;lt;Call name=&quot;setProperty&quot;&gt;
           &amp;lt;Arg&gt;serverName&amp;lt;/Arg&gt;
           &amp;lt;Arg&gt;localhost&amp;lt;/Arg&gt;
         &amp;lt;/Call&gt;
         &amp;lt;Call name=&quot;setProperty&quot;&gt;
            &amp;lt;Arg&gt;portNumber&amp;lt;/Arg&gt;
            &amp;lt;Arg&gt;5432&amp;lt;/Arg&gt;
         &amp;lt;/Call&gt;
         &amp;lt;Call name=&quot;setProperty&quot;&gt;
           &amp;lt;Arg&gt;user&amp;lt;/Arg&gt;
           &amp;lt;Arg&gt;postgres&amp;lt;/Arg&gt;
         &amp;lt;/Call&gt;
         &amp;lt;Call name=&quot;setProperty&quot;&gt;
           &amp;lt;Arg&gt;password&amp;lt;/Arg&gt;
           &amp;lt;Arg&gt;BlahBlah&amp;lt;/Arg&gt;
         &amp;lt;/Call&gt;
       &amp;lt;/Get&gt;
      &amp;lt;/New&gt;
     &amp;lt;/Arg&gt;
   &amp;lt;/New&gt;
&lt;/pre&gt;&lt;p&gt;The first part sets up the jetty plus environment for jndi.&lt;br /&gt;
The second part sets up the reference for the jetty-env configuration and to bind the datasource to jndi so the web.xml can make a refernce to the configured datasource.&lt;br /&gt;
The third part sets up the datasource itself. Here an XADataSource is configured for PostgreSQL Note that the com.atomikos.jdbc.AtomikosDataSourceBean is the prefered DataSource since Atomikos 3.4.x.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The web.xml needs to have these lines in place for the above configured datasource:&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;brush: xml&quot;&gt;&amp;lt;resource-ref&gt;
      &amp;lt;res-ref-name&gt;jdbc/rbuconverter&amp;lt;/res-ref-name&gt;
      &amp;lt;res-type&gt;javax.sql.DataSource&amp;lt;/res-type&gt;
      &amp;lt;res-auth&gt;Container&amp;lt;/res-auth&gt;
   &amp;lt;/resource-ref&gt;
&lt;/pre&gt;&lt;p&gt;It is also possible to configure Atomikos transaction Essentials completely in a spring context. In this case do not use the jettyConfig and jettyEnvXml in the pom file and omit the resource-ref within the web.xml:&lt;br /&gt;
I have a tx-context.xml:&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;brush: xml&quot;&gt;&amp;lt;bean class=&quot;com.atomikos.jdbc.AtomikosDataSourceBean&quot; destroy-method=&quot;close&quot; id=&quot;dataSource&quot; init-method=&quot;init&quot;&gt;
        &amp;lt;property name=&quot;uniqueResourceName&quot; value=&quot;rbudatasource&quot;/&gt;
        &amp;lt;property name=&quot;xaDataSourceClassName&quot; value=&quot;org.postgresql.xa.PGXADataSource&quot;/&gt;
        &amp;lt;property name=&quot;xaProperties&quot;&gt;
              &amp;lt;props&gt;
              &amp;lt;prop key=&quot;databaseName&quot;&gt;rbuconverter&amp;lt;/prop&gt;
              &amp;lt;prop key=&quot;serverName&quot;&gt;localhost&amp;lt;/prop&gt;
              &amp;lt;prop key=&quot;portNumber&quot;&gt;5432&amp;lt;/prop&gt;
              &amp;lt;prop key=&quot;user&quot;&gt;postgres&amp;lt;/prop&gt;
              &amp;lt;prop key=&quot;password&quot;&gt;BlahBlah&amp;lt;/prop&gt;
              &amp;lt;/props&gt;
        &amp;lt;/property&gt;
        &amp;lt;property name=&quot;minPoolSize&quot; value=&quot;5&quot;&gt;
        &amp;lt;property name=&quot;maxPoolSize&quot; value=&quot;50&quot;&gt;
    &amp;lt;/bean&gt;

    &amp;lt;bean class=&quot;com.atomikos.icatch.config.UserTransactionServiceImp&quot; destroy-method=&quot;shutdownForce&quot; id=&quot;userTransactionService&quot;&gt;
        &amp;lt;constructor-arg&gt;
             &amp;lt;props&gt;
                &amp;lt;prop key=&quot;com.atomikos.icatch.service&quot;&gt;
                    com.atomikos.icatch.standalone.UserTransactionServiceFactory
                &amp;lt;/prop&gt;
                &amp;lt;prop key=&quot;com.atomikos.icatch.output_dir&quot;&gt;/tmp&amp;lt;/prop&gt;
                &amp;lt;prop key=&quot;com.atomikos.icatch.output_dir&quot;&gt;/tmp&amp;lt;/prop&gt;
            &amp;lt;/props&gt;
        &amp;lt;/constructor-arg&gt;
   &amp;lt;/bean&gt;           
 
   &amp;lt;!-- Construct Atomikos UserTransactionManager, needed to configure Spring --&gt;
   &amp;lt;bean id=&quot;AtomikosTransactionManager&quot; class=&quot;com.atomikos.icatch.jta.UserTransactionManager&quot; init-method=&quot;init&quot; destroy-method=&quot;close&quot; depends-on=&quot;userTransactionService&quot;&gt;
      &amp;lt;!-- when close is called, should we force transactions to terminate or not? --&gt;
      &amp;lt;property name=&quot;forceShutdown&quot; value=&quot;false&quot; /&gt;
      &amp;lt;property name=&quot;transactionTimeout&quot; value=&quot;300&quot;/&gt;
   &amp;lt;/bean&gt;

   &amp;lt;!-- Also use Atomikos UserTransactionImp, needed to configure Spring --&gt;
   &amp;lt;bean id=&quot;AtomikosUserTransaction&quot; class=&quot;com.atomikos.icatch.jta.UserTransactionImp&quot; /&gt;

   &amp;lt;!-- Configure the Spring framework to use JTA transactions from Atomikos --&gt;
   &amp;lt;bean id=&quot;transactionManager&quot; class=&quot;org.springframework.transaction.jta.JtaTransactionManager&quot; depends-on=&quot;userTransactionService&quot;&gt;
      &amp;lt;property name=&quot;transactionManager&quot; ref=&quot;AtomikosTransactionManager&quot; /&gt;
      &amp;lt;property name=&quot;userTransaction&quot; ref=&quot;AtomikosUserTransaction&quot; /&gt;
   &amp;lt;/bean&gt;
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/8527296844023126165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/8527296844023126165' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/8527296844023126165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/8527296844023126165'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2009/05/jta.html' title='JTA'/><author><name>Rolf Strijdhorst</name><uri>http://www.blogger.com/profile/07626013407256435126</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_koY-_i9pygA/SLKSP0OcflI/AAAAAAAAABY/65SgRJNucA4/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-9061012552510836088</id><published>2009-04-04T23:10:00.005+02:00</published><updated>2009-04-04T23:25:28.731+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tapestry"/><title type='text'>Tapestry activation passivation</title><content type='html'>&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Tapestry 5 can make use of the client to make information set to a page from another page available to the client.&lt;br /&gt;
For instance Page Origin places a message during a submit onto Page Next and using the mechanism of passivation and activation&lt;br /&gt;
the client will act as the middle man to make this information available to the client itself.&lt;br /&gt;
Tapestry will issue an HTTP 302 redirect after the post and thus the passivation of Page Next so the client recieves some information and will ask tapestry for that information to be acted upon.&lt;br /&gt;
&lt;table style=&quot;width:auto;&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://lh5.ggpht.com/_koY-_i9pygA/SdfHo4iiG9I/AAAAAAAAADU/gpDWbaN0kEU/s800/passivate0.jpg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;Here you see that the value of &#39;Howdy&#39; is submitted and using a redirect is send to the server again to be used in its activation event.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/9061012552510836088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/9061012552510836088' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/9061012552510836088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/9061012552510836088'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2009/04/tapestry-activation.html' title='Tapestry activation passivation'/><author><name>Rolf Strijdhorst</name><uri>http://www.blogger.com/profile/07626013407256435126</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_koY-_i9pygA/SLKSP0OcflI/AAAAAAAAABY/65SgRJNucA4/S220/me.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_koY-_i9pygA/SdfHo4iiG9I/AAAAAAAAADU/gpDWbaN0kEU/s72-c/passivate0.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-2330577323342272967</id><published>2009-02-02T12:13:00.079+01:00</published><updated>2009-07-13T08:44:14.326+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apache"/><category scheme="http://www.blogger.com/atom/ns#" term="lighttpd"/><category scheme="http://www.blogger.com/atom/ns#" term="trac"/><title type='text'>Apache2 VirtualHost and trac behind a lighttpd proxy</title><content type='html'>Note to self:&lt;br /&gt;
setup of trac for Apache2&lt;br /&gt;
&lt;p&gt;follow this instructions on this site: &lt;a href=&quot;http://robertbasic.com/blog/trac-on-ubuntu&quot;&gt;Robert Basic: Trac on Ubuntu&lt;/a&gt;. &lt;br /&gt;
Although I use mercurial as scm.&lt;br /&gt;
make sure that the line containing VirtualHost points to port 81 or another port except port 80.&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;brush: xml&quot;&gt;&amp;lt;VirtualHost *:81&amp;gt;&lt;/pre&gt;and make sure apache listens to this port by changing /etc/apache2/ports.conf&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;bash&quot;&gt;NameVirtualHost *:81
Listen 81
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;Now install lighttpd:&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;brush: bash&quot;&gt;sudo apt-get install lighttpd&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;edit /etc/lighttpd/conf-available/10-proxy&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;brush: php&quot;&gt;$HTTP[&quot;host&quot;] == &quot;localhost&quot; {
proxy.debug = 1
proxy.server     = ( &quot;/trac&quot; =&gt;
                     ( 
                       ( &quot;host&quot; =&gt; &quot;127.0.0.1&quot;,
                         &quot;port&quot; =&gt; 81,
                       )
                     )
                    )
}
&lt;/pre&gt;and symlink:&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;brush: bash&quot;&gt;sudo ln -s /etc/lighttpd/conf-available/10-proxy /etc/lighttpd/conf-enabled/10-proxy&lt;/pre&gt;&lt;/p&gt;&lt;br /&gt;
and start lighttpd&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;brush: bash&quot;&gt;sudo /etc/init.d/lighttpd restart
&lt;/pre&gt;et voilà&lt;br /&gt;
the trac instance works both under localhost/trac as well as localhost:81/trac</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/2330577323342272967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/2330577323342272967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/2330577323342272967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/2330577323342272967'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2009/02/apache2-virtualhost-and-trac-behind.html' title='Apache2 VirtualHost and trac behind a lighttpd proxy'/><author><name>Rolf Strijdhorst</name><uri>http://www.blogger.com/profile/07626013407256435126</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_koY-_i9pygA/SLKSP0OcflI/AAAAAAAAABY/65SgRJNucA4/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-3751637277675123641</id><published>2009-01-05T11:53:00.011+01:00</published><updated>2009-07-13T08:46:08.510+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Setting up my python development environment</title><content type='html'>Note to self:&lt;br /&gt;
my setup for a python development environment&lt;br /&gt;
sketch so far:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
use &lt;a href=&quot;http://www.doughellmann.com/projects/virtualenvwrapper/&quot; linkindex=&quot;7&quot;&gt;virtualenv wrapper&lt;/a&gt; changed mkvirtualenv function to to virtualenvwrapper_bashrc&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;brush: bash&quot;&gt;function mkvirtualenv () {
    verify_workon_home
    (cd &amp;quot;$WORKON_HOME&amp;quot;; virtualenv $*)
    if [ ! -f $WORKON_HOME/$1/bin/postactivate ]
    then
        workon &amp;quot;${@:-1}&amp;quot;
        easy_install ipython
        easy_install pysmell
        wget http://www.eletztrick.de/software/mkvimproject/releases/0.4.2.3/mkvimproject-0.4.2.3.tar.gz
        easy_install mkvimproject-0.4.2.3.tar.gz
        rm mkvimproject-0.4.2.3.tar.gz
        deactivate
        touch $WORKON_HOME/$1/bin/postactivate
        postactivate=&amp;quot;$WORKON_HOME/$1/bin/postactivate&amp;quot;
        echo &amp;quot;cd $WORKON_HOME/$1&amp;quot; &amp;gt;&amp;gt; $postactivate 
        echo &amp;quot;export PYTHONPATH=$WORKON_HOME/$1/scr:$PYTHONPATH&amp;quot; &amp;gt;&amp;gt; $postactivate    
        echo &amp;quot;if [ ! -d $WORKON_HOME/$1/src ]&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;then&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;    mkdir -p $WORKON_HOME/$1/src&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;fi&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;if [ ! -f $WORKON_HOME/$1/$1.vpj ]&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;then&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;    mkvimproject -o $1.vpj -s python&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;fi&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;if [ ! -f $WORKON_HOME/$1/PYSMELLTAGS ]&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;then&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;    pysmell src;&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;  cd lib/python2.5;&amp;quot; &amp;gt;&amp;gt; $postactivate;
        echo &amp;quot;  pysmell . -x site-packages -o ../../PYSMELLTAGS.stdlib;&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;  cd ../..;&amp;quot; &amp;gt;&amp;gt; $postactivate 
        echo &amp;quot;fi&amp;quot; &amp;gt;&amp;gt; $postactivate
        echo &amp;quot;pproject -U&amp;quot; &amp;gt;&amp;gt; $postactivate
    fi
    workon &amp;quot;${@:-1}&amp;quot;
}
&lt;/pre&gt;&lt;br /&gt;
then create a new virtual env with mkvirtualenv projectName --no-site-packages&lt;br /&gt;
this will setup the environment for vim and allow for the use of pysmell omnicompletion&lt;br /&gt;
and allows a ipython shell within the environment.</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/3751637277675123641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/3751637277675123641' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/3751637277675123641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/3751637277675123641'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2009/01/setting-up-my-python-developement.html' title='Setting up my python development environment'/><author><name>Rolf Strijdhorst</name><uri>http://www.blogger.com/profile/07626013407256435126</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_koY-_i9pygA/SLKSP0OcflI/AAAAAAAAABY/65SgRJNucA4/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-8672695437524683252</id><published>2008-04-08T11:52:00.006+02:00</published><updated>2008-04-08T13:57:10.376+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="django"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>Google app engine</title><content type='html'>On april 7 google released the google app engine.&lt;br /&gt;This is great news.&lt;br /&gt;&lt;p&gt;An application environment that can host with the scalability of google itself.&lt;br /&gt;And whats even better currently the engine is implemented in &lt;a href=&quot;http://www.python.org/&quot;&gt;python&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Python is a dynamic language a la ruby.  And created by a Dutchman ;-)&lt;br /&gt;It&#39;s fully object-oriented. and it is fun to work with.&lt;br /&gt;here is a video on how to develop with the google app engine&lt;br /&gt;&lt;br /&gt;&lt;a style=&quot;left: 0px ! important; top: 0px ! important;&quot; title=&quot;Click here to block this object with Adblock Plus&quot; class=&quot;abp-objtab-0030749460387626604 visible ontop&quot; href=&quot;http://www.youtube.com/v/bfgO-LXGpTM&amp;amp;hl=en&quot;&gt;&lt;/a&gt;&lt;a style=&quot;left: 0px ! important; top: 0px ! important;&quot; title=&quot;Click here to block this object with Adblock Plus&quot; class=&quot;abp-objtab-0030749460387626604 visible ontop&quot; href=&quot;http://www.youtube.com/v/bfgO-LXGpTM&amp;amp;hl=en&quot;&gt;&lt;/a&gt;&lt;a style=&quot;left: 0px ! important; top: 0px ! important;&quot; title=&quot;Click here to block this object with Adblock Plus&quot; class=&quot;abp-objtab-0030749460387626604 visible ontop&quot; href=&quot;http://www.youtube.com/v/bfgO-LXGpTM&amp;amp;hl=en&quot;&gt;&lt;/a&gt;&lt;a style=&quot;left: 0px ! important; top: 0px ! important;&quot; title=&quot;Click here to block this object with Adblock Plus&quot; class=&quot;abp-objtab-0030749460387626604 visible ontop&quot; href=&quot;http://www.youtube.com/v/bfgO-LXGpTM&amp;amp;hl=en&quot;&gt;&lt;/a&gt;&lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/bfgO-LXGpTM&amp;amp;hl=en&quot;&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/bfgO-LXGpTM&amp;amp;hl=en&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;As you can see the development process is way faster than the development process of lets say &lt;a href=&quot;http://java.sun.com/&quot;&gt;Java&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is a video of the introduction of app:&lt;br /&gt;&lt;br /&gt;&lt;a style=&quot;left: 0px ! important; top: 15px ! important;&quot; title=&quot;Click here to block this object with Adblock Plus&quot; class=&quot;abp-objtab-0030749460387626604 visible ontop&quot; href=&quot;http://www.youtube.com/v/3Ztr-HhWX1c&quot;&gt;&lt;/a&gt;&lt;object height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/3Ztr-HhWX1c&quot;&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;embed src=&quot;http://www.youtube.com/v/3Ztr-HhWX1c&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; height=&quot;355&quot; width=&quot;425&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I already have an account and will experiment with in the near future.&lt;br /&gt;BTW This is a real cool way to start working with &lt;a href=&quot;http://www.djangoproject.com&quot;&gt;Django&lt;/a&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/8672695437524683252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/8672695437524683252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/8672695437524683252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/8672695437524683252'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2008/04/google-app-engine.html' title='Google app engine'/><author><name>Rolf Strijdhorst</name><uri>http://www.blogger.com/profile/07626013407256435126</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_koY-_i9pygA/SLKSP0OcflI/AAAAAAAAABY/65SgRJNucA4/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3504073133976639188.post-8209472902107117627</id><published>2008-02-19T20:57:00.008+01:00</published><updated>2008-02-22T11:03:42.349+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GTD"/><title type='text'>Getting Things Done</title><content type='html'>Today I went to attend a course in task management or better yet on how to order the way to handle input.&lt;br /&gt;The mechanism that was offered on how to manage the information input, was by using the system Getting Things Done by David Allen (GTD). All in all a very practical way.&lt;br /&gt;The course offered a few steps to follow, to get to a realistic task management system in order.&lt;br /&gt;&lt;br /&gt;I attended this course by advice from a colleague of mine so I didn&#39;t really know what to expect (I can often follow his advice blindly). But during the morning I found out that most of the things I learned how to use, I already had noticed somewhere else reading the site &lt;a href=&quot;http://www.lifehacker.com/&quot;&gt;Lifehacker.com&lt;/a&gt;&lt;br /&gt;and the book by the same name and some of these things I already used but not in a way most practical.&lt;br /&gt;&lt;br /&gt;The promise they made is: when you practice their methods in ordering your electronic and conventional input like they suggested you will get a clear head free from nagging voices from your subconscious.&lt;br /&gt;&lt;br /&gt;There was also demo of a tool they used in  their  documentation writing or email writing and adding items to your outlook or opening websites called fingertips &lt;a href=&quot;http://www.getfingertips.com/&quot;&gt;http://www.getfingertips.com/ &lt;/a&gt;&lt;br /&gt;This tool makes use of something that java developers using Intellij may know as live templates and eclipse users may know as templates the difference is that this tool can be used within every windows application.&lt;br /&gt;&lt;br /&gt;I&#39;ll keep you posted on my experiences</content><link rel='replies' type='application/atom+xml' href='http://rofl.jobiroxa.com/feeds/8209472902107117627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/3504073133976639188/8209472902107117627' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/8209472902107117627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3504073133976639188/posts/default/8209472902107117627'/><link rel='alternate' type='text/html' href='http://rofl.jobiroxa.com/2008/02/getting-things-done.html' title='Getting Things Done'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>