<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6969518071081462653</id><updated>2011-11-27T15:22:18.349-08:00</updated><category term='clones'/><category term='social'/><category term='architecture'/><category term='review'/><category term='analysis'/><category term='python'/><category term='program transformation'/><category term='identity'/><category term='flaws'/><category term='evolution'/><category term='web design'/><category term='latex'/><title type='text'>Spoonful of Hacking</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-1577597044414301876</id><published>2009-12-27T14:28:00.000-08:00</published><updated>2009-12-27T14:30:44.711-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web design'/><category scheme='http://www.blogger.com/atom/ns#' term='program transformation'/><title type='text'>Webdesign and Supercompilation</title><content type='html'>With supercompilation being a long-forgotten technique invented decades ago, and with “webdesign” term being usurped by graphic artists &amp;amp; HCI experts, I doubt this post will be anything close to popular, but as always, it will not stop me from expressing my opinion. But let’s take it slowly now.&lt;br /&gt;&lt;br /&gt;Let us assume the “web design” in a good, broad sense now: not just the omnipresent “logo on the right vs logo on the left” &amp;amp; “10 tips to get more clicks”. Just as software design comprises multiple heterogeneous activities concerning the making of a piece of software, just as language design is about how to create a good language suited for the target domain, web design is in general about how to make a web site, a web service or a web app well.&lt;br /&gt;&lt;br /&gt;Super-compilation is a program transformation method of aggressive optimisation: it refactors the code based on the most possible assumptions, throwing away all dead code, unused options and inactivated functionalities. If was irrelevant or at least unproductive during the structured programming epoch, but the results of super-compilation were promising before that and remain promising in our time, during the epoch of &lt;a href="http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12"&gt;multi-purpose factory factory frameworks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The current (at least since 1999) trend in web design is dynamics and more dynamics. The content and its presentation is separated, and most of the time what the end-user sees is what is being generated from the actual content stored somewhere in a database by using the representation rules expressed in anything from XSL to AJAX (in software we would call such process “pretty-printing”). However, this is necessary only for truly dynamic applications such as Google Wave. In most of the other rich internet applications the content is being accessed (pretty-printed) much more often than being changed. When the super-compilation philosophy is applied here, we quickly see that it is possible to store the pre-generated data ready for immediate end-user demonstration. If the dependencies are known, one can easily design an infrastructure that would respond to any change of data with re-generation of all the visible data that depend on it. And that is the way it can and should be — I’m running several websites, ranging from my personal page to a popular contest syndication facility, all completed with this approach: the end-user always sees the statically generated solid XHTML, which is being updated on the server whenever the need arises, be it once a minute or once a month. Being static is not necessarily a bad thing, especially if you provide the end-user with all the expected buttons and links. Saves time and computational effort on all the on-the-fly processing requests.&lt;br /&gt;&lt;br /&gt;When will it not work: for web apps that are essentially front-ends for a volatile database access; for web apps that are truly dynamic in nature; for web apps where user preferences are inexpressible in CSS &amp;amp; access rights. When will it work: pretty much everywhere else. Think about it. Have fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-1577597044414301876?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/1577597044414301876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/12/webdesign-and-supercompilation.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/1577597044414301876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/1577597044414301876'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/12/webdesign-and-supercompilation.html' title='Webdesign and Supercompilation'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-1542554357067797831</id><published>2009-12-03T04:38:00.001-08:00</published><updated>2009-12-03T07:21:28.737-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='identity'/><category scheme='http://www.blogger.com/atom/ns#' term='clones'/><title type='text'>Type V clones</title><content type='html'>&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Clone detection&lt;/span&gt; has been an active research topic for decades by now, but it’s among those that never wither. We all know the basic classification of clone types: &lt;span style="font-style:italic;"&gt;Type I&lt;/span&gt; is for two pieces of code that are identical in all aspects except perhaps for whitespace (indentation and comments), &lt;span style="font-style:italic;"&gt;Type II&lt;/span&gt; is for two structurally identical pieces of code with variations only in whitespace and naming, &lt;span style="font-style:italic;"&gt;Type III&lt;/span&gt; is for two pieces of code that have syntactically mapping constructs but can bear additional statements/expressions somewhere in the middle, and &lt;span style="font-style:italic;"&gt;Type IV&lt;/span&gt; is for two semantically equivalent pieces of code that have the same functional behaviour but can be implemented differently.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Copy-paste programming is by far not the only cause for clones, we all know that too. And recently there has been another cause evolving: syndication and aggregation. There are just too many web services and RIAs, no-one can register on each one of them. (In fact, very rare ones go half as far &lt;a href="http://userpages.uni-koblenz.de/~zaytsev/is/"&gt;as I do&lt;/a&gt;). Thus, in order to broaden one's potential audience, the users let the services propagate the same pieces of data: blog posts are fed into twitter updates, they become facebook status updates, etc. These updates are hyperlinked and heavily annotated, so I can’t help thinking about them as strictly structured grammar-abiding data (better known as “code”). The rules for propagation vary from bi-directional synchronisation to quite obfuscated schemes of one-directional non-information-preserving transformations. One the other hand, front-end grammarware (web-2.0-ware) like TweetDeck allows end users to aggregate updates from different sources on one screen (in the case of TweetDeck, we’re talking about Twitter, Facebook, MySpace and LinkedIn). In this case, the end users can receive the same information multiple times through different paths.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This leads us to the necessity of introducing &lt;span style="font-style:italic;"&gt;Type V clones&lt;/span&gt; as two pieces of differently structured data representing the same information. The main difference is that such clones will most of the time be non-equivalent, with one derived from the other in a known (or partially unknown) manner. Some other scenarios exemplifying the non-triviality of this, follow:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;“Identity X is connected to identity Y” coming from service A does not mean “identity X is connected to identity Y” on service B as well. However, these identities will appreciate being notified about the possibility to connect on service B as well (if not to be automatically connected).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;“Identity X posted text T” is the same as “identity X posted text T with link L”, if L links to one of the clones, otherwise the second one is more complete.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;“Identity X posted text T1 with link L” is a neglectable clone of “identity X posted text T2”, if T1 is a truncated version of T2 and L links to the second one.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If “identity X posted text T” often occurs together with “identity Y posted text T”, then X and Y might be the same entity.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When we have two streams which are known to be clones, we can try to establish the mapping by automated inference.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If we know the transformation R that makes an update U' on service B from an update U on service A, and we have U' at hand but U is unavailable (security issues, service is down, etc), we need to [partially] reverse R, as we did in our hacking days.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;There is much more than that to be done, I’m just providing you with the most obvious raw ideas. Of more advanced topics one can immediately name identity clone detection, data mining, topic analysis and coverage metrics.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-1542554357067797831?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/1542554357067797831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/12/type-v-clones.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/1542554357067797831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/1542554357067797831'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/12/type-v-clones.html' title='Type V clones'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-2184071048983187366</id><published>2009-09-25T06:21:00.000-07:00</published><updated>2009-09-25T09:18:35.246-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social'/><title type='text'>SCAM/ICSM/Twitter mapping</title><content type='html'>@&lt;a href="http://twitter.com/AbramH"&gt;abramh&lt;/a&gt; — Abram Hindle, PhD student, University of Waterloo, Canada&lt;br /&gt;@&lt;a href="http://twitter.com/AvanDeursen"&gt;avandeursen&lt;/a&gt; — Arie van Deursen, Software Engineering Research Group, Delft University of Technology, The Netherlands&lt;br /&gt;@&lt;a href="http://twitter.com/DSebaceous"&gt;dsebaceous&lt;/a&gt; — Sebastian Danicic, Goldsmiths College, University of London, UK&lt;br /&gt;@&lt;a href="http://twitter.com/Davema"&gt;davema&lt;/a&gt; — David Ma, Calgary, Canada&lt;br /&gt;@&lt;a href="http://twitter.com/Frama_c"&gt;frama_c&lt;/a&gt; — Pascal Cuoq, INRIA, France&lt;br /&gt;@&lt;a href="http://twitter.com/Grammarware"&gt;grammarware&lt;/a&gt; — Vadim Zaytsev, PhD student, Koblenz, Germany&lt;br /&gt;@&lt;a href="http://twitter.com/ICSMconf"&gt;ICSMconf&lt;/a&gt; — consolidated account set up by Jamie Starke&lt;br /&gt;@&lt;a href="http://twitter.com/jamiestarke"&gt;jamiestarke&lt;/a&gt; — Jamie Starke, University of Calgary, Canada&lt;br /&gt;@&lt;a href="http://twitter.com/J_Ham3"&gt;j_ham3&lt;/a&gt; — James Hamilton, PhD student, University of London, UK&lt;br /&gt;@&lt;a href="http://twitter.com/JurgenVinju"&gt;JurgenVinju&lt;/a&gt; — Jurgen Vinju, CWI, Amsterdam, The Netherlands&lt;br /&gt;@&lt;a href="http://twitter.com/NicBet"&gt;nicbet&lt;/a&gt; — Nicolas Bettenburg, PhD student, Software Analysis and Intelligence Lab, Queen’s University, Canada&lt;br /&gt;@&lt;a href="http://twitter.com/QuinnDuPont"&gt;quinndupont&lt;/a&gt; — Quinn DuPont, Algorithmics Inc., Canada&lt;br /&gt;@&lt;a href="http://twitter.com/Ssepotsdam"&gt;ssepotsdam&lt;/a&gt; — ?&lt;br /&gt;@&lt;a href="http://twitter.com/TKobabo"&gt;tkobabo&lt;/a&gt; — Takashi Kobayashi, Nagoya, Japan&lt;br /&gt;@&lt;a href="http://twitter.com/TaoXiease"&gt;taoxiease&lt;/a&gt; — Tao Xie, North Carolina State University, USA&lt;br /&gt;@&lt;a href="http://twitter.com/TiagoMLAlves"&gt;tiagomlalves&lt;/a&gt; — Tiago Alves, PhD student, SIG, Amsterdam, The Netherlands&lt;br /&gt;@&lt;a href="http://twitter.com/TomZimmermann"&gt;tomzimmermann&lt;/a&gt; — Thomas Zimmermann, Microsoft Research, University of Calgary, Canada&lt;br /&gt;@&lt;a href="http://twitter.com/YK2805"&gt;yk2805&lt;/a&gt; — Yiannis Kanellopoulos, SIG, Amsterdam, The Netherlands&lt;br /&gt;&lt;br /&gt;Please &lt;a href="http://twitter.com/?status=@grammarware%20&amp;in_reply_to_status_id=4368122023&amp;in_reply_to=grammarware"&gt;send updates&lt;/a&gt; or comment them here if necessary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-2184071048983187366?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/2184071048983187366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/09/scamicsmtwitter-mapping.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/2184071048983187366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/2184071048983187366'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/09/scamicsmtwitter-mapping.html' title='SCAM/ICSM/Twitter mapping'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-7764560833276233347</id><published>2009-09-24T05:41:00.000-07:00</published><updated>2009-09-24T05:42:18.501-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='evolution'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Architecture Evaluation</title><content type='html'>During the &lt;a href="http://icsm2009.cs.ualberta.ca/"&gt;ICSM&lt;/a&gt; presentation of &lt;a href="http://www.st.ewi.tudelft.nl/~bouwers/main/"&gt;Eric Bouwers&lt;/a&gt; about criteria for assessing implemented architectures I asked a question that raised a discussion that was proposed by &lt;a href="http://www.cs.drexel.edu/~yfcai/"&gt;Yuanfang Cai&lt;/a&gt; to be taken off-line. Since I already left Edmonton, I’m taking it &lt;span style="font-weight:bold;font-style:italic;"&gt;on&lt;/span&gt;-line instead. There is no doubt Eric has made considerable contribution by analysing &lt;a href="http://www.sig.eu/"&gt;SIG&lt;/a&gt; expert opinions, reports and interviews, my question was more about the relation between architecture evaluation and architecture evolution and his proposal to integrate regular architecture re-evaluation into maintenance activities.&lt;br /&gt;&lt;br /&gt;One of the definition of architecture that I remember from the time working in the same department with &lt;a href="http://www.cs.vu.nl/~hans/"&gt;Hans van Vliet&lt;/a&gt; is that it comprises those components, dependencies, properties, configuration elements, etc—in other words, those parts of a system design that do not change with time or are the most reluctant to change with time. I.e., the easier it is to discard or to change something, the less place it deserves in the architecture. If you think the problem is purely terminological, please direct me to a perfect definition, and I will shut up. However, I believe there are some deeper issues here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Can architecture re-evaluation be used as a system analysis tool that can deliver useful and non-trivial results?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So far I can imagine three scenarios: (1) the software system evolves without changing its architecture; hence, re-evaluation is redundant since it will provide the same results we already obtained; (2) the software system is redesigned in the meantime in such a way that its architecture changes as well; hence, re-evaluation is needed since we can no longer rely on the outdated data; (3) the software system evolves in such a way that the properties of its architecture can shift without noticing; hence, the answer to the question from the previous paragraph is definitely "YES". The first two scenarios are trivial, the third one is not, and I call for examples. So far I can think of only external ones, like when a new technology is introduced and makes parts of the existing system outdated/obsolete/incompatible/… Are there internal ones?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-7764560833276233347?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/7764560833276233347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/09/architecture-evaluation.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/7764560833276233347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/7764560833276233347'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/09/architecture-evaluation.html' title='Architecture Evaluation'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-1667994878963384779</id><published>2009-07-09T23:34:00.000-07:00</published><updated>2009-07-17T06:03:58.437-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social'/><title type='text'>GTTSE/Twitter mapping</title><content type='html'>@&lt;a href="http://twitter.com/1TTechnologies"&gt;1TTechnologies&lt;/a&gt; — Denis Avrilionis, One Tree Technologies, Luxembourg&lt;br /&gt;@&lt;a href="http://twitter.com/BBasten"&gt;BBasten&lt;/a&gt; — Bas Basten, CWI, Amsterdam, The Netherlands&lt;br /&gt;@&lt;a href="http://twitter.com/Elsvene"&gt;Elsvene&lt;/a&gt; — Sven Jörges, Ruhrpott, Germany&lt;br /&gt;@&lt;a href="http://twitter.com/Felienne"&gt;Felienne&lt;/a&gt; — Felienne Hermans, PhD student, Delft, The Netherlands&lt;br /&gt;@&lt;a href="http://twitter.com/GorelHedin"&gt;GorelHedin&lt;/a&gt; — Görel Hedin, Lund University, Sweden&lt;br /&gt;@&lt;a href="http://twitter.com/GorkaZubia"&gt;GorkaZubia&lt;/a&gt; — Gorka Puente, PhD student, University of the Basque Count, Spain&lt;br /&gt;@&lt;a href="http://twitter.com/Grammarware"&gt;grammarware&lt;/a&gt; — Vadim Zaytsev, PhD student, Koblenz, Germany&lt;br /&gt;@&lt;a href="http://twitter.com/Inkytonik"&gt;inkytonik&lt;/a&gt; — Anthony Sloane, Macquarie University, Sydney, Australia&lt;br /&gt;@&lt;a href="http://twitter.com/JeanMarieFavre"&gt;JeanMarieFavre&lt;/a&gt; — Jean-Marie Favre, University of Grenoble, France&lt;br /&gt;@&lt;a href="http://twitter.com/JurgenVinju"&gt;JurgenVinju&lt;/a&gt; — Jurgen Vinju, CWI, Amsterdam, The Netherlands&lt;br /&gt;@&lt;a href="http://twitter.com/MedeaMelana"&gt;MedeaMelana&lt;/a&gt; — Martijn van Steenbergen, MSc student, Utrecht, The Netherlands&lt;br /&gt;@&lt;a href="http://twitter.com/MichalPise"&gt;MichalPise&lt;/a&gt; — Michal Pise, Czech Technical University, Czech Republic&lt;br /&gt;@&lt;a href="http://twitter.com/Notquiteabba"&gt;notquiteabba&lt;/a&gt; — Ralf Lämmel, Koblenz, Germany&lt;br /&gt;@&lt;a href="http://twitter.com/PaulKlint"&gt;PaulKlint&lt;/a&gt; — Paul Klint, CWI, Amsterdam, The Netherlands&lt;br /&gt;@&lt;a href="http://twitter.com/PauloBorba"&gt;PauloBorba&lt;/a&gt; — Paulo Borba, Software Productivity Group, Pernambuco, Brazil&lt;br /&gt;@&lt;a href="http://twitter.com/Radkat"&gt;radkat&lt;/a&gt; — Ekaterina Pek, PhD student, Koblenz, Germany&lt;br /&gt;@&lt;a href="http://twitter.com/TerjeGj"&gt;TerjeGj&lt;/a&gt; — Terje Gjøsæter, PhD student, Grimstad, Norway&lt;br /&gt;@&lt;a href="http://twitter.com/TvdStorm"&gt;TvdStorm&lt;/a&gt; — Tijs van der Storm, CWI, Amsterdam, The Netherlands&lt;br /&gt;&lt;br /&gt;Please &lt;a href="http://twitter.com/home?status=@grammarware%20&amp;in_reply_to_status_id=2564580840&amp;in_reply_to=grammarware"&gt;send updates&lt;/a&gt; or comment them here if necessary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-1667994878963384779?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/1667994878963384779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/07/gttsetwitter-mapping.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/1667994878963384779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/1667994878963384779'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/07/gttsetwitter-mapping.html' title='GTTSE/Twitter mapping'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-6374323380006644668</id><published>2009-06-10T05:34:00.000-07:00</published><updated>2009-06-10T05:56:46.173-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='latex'/><title type='text'>Floating code snippets in LaTeX</title><content type='html'>Last week I decided to separate “figures” that contain diagrams, graphs and parse trees with “figures” that contained source code snippets. In LaTeX it means the former kind stays in &lt;tt&gt;figure&lt;/tt&gt; environment, while the latter needs to reside within its own. I googled for solution and was quite surprised how the web was full of cluttered random hacks that were done without any understanding of TeX internals. My solution is 9 lines long, and it solves three problems: the environment itself, the list of them and referencing issues.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#6ab825;"&gt;\usepackage&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;float&lt;span style="color:#24909d;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#6ab825;"&gt;\usepackage&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;tocloft&lt;span style="color:#24909d;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#6ab825;"&gt;\newcommand&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;&lt;span style="color:#6ab825;"&gt;\listofsnippetname&lt;/span&gt;&lt;span style="color:#24909d;"&gt;}{&lt;/span&gt;List of Listings&lt;span style="color:#24909d;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#6ab825;"&gt;\newlistof&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;snippet&lt;span style="color:#24909d;"&gt;}{&lt;/span&gt;lol&lt;span style="color:#24909d;"&gt;}{&lt;/span&gt;&lt;span style="color:#6ab825;"&gt;\listofsnippetname&lt;/span&gt;&lt;span style="color:#24909d;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#6ab825;"&gt;\floatstyle&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;boxed&lt;span style="color:#24909d;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#6ab825;"&gt;\newfloat&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;snippet&lt;span style="color:#24909d;"&gt;}{&lt;/span&gt;thp&lt;span style="color:#24909d;"&gt;}{&lt;/span&gt;lol&lt;span style="color:#24909d;"&gt;}&lt;/span&gt;[chapter]&lt;br /&gt;&lt;span style="color:#6ab825;"&gt;\floatname&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;snippet&lt;span style="color:#24909d;"&gt;}{&lt;/span&gt;Listing&lt;span style="color:#24909d;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#6ab825;"&gt;\newcommand&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;&lt;span style="color:#6ab825;"&gt;\snippetautorefname&lt;/span&gt;&lt;span style="color:#24909d;"&gt;}{&lt;/span&gt;Listing&lt;span style="color:#24909d;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#6ab825;"&gt;\renewcommand&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;&lt;span style="color:#6ab825;"&gt;\thesnippet&lt;/span&gt;&lt;span style="color:#24909d;"&gt;}{&lt;/span&gt;&lt;span style="color:#6ab825;"&gt;\thechapter&lt;/span&gt;.&lt;span style="color:#6ab825;"&gt;\arabic&lt;/span&gt;&lt;span style="color:#24909d;"&gt;{&lt;/span&gt;snippet&lt;span style="color:#24909d;"&gt;}}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The first two lines connect two packages: one for a mechanism of defining new floating object types, one for toc-ish lists. On the next two lines we define the new list — at this point the new LaTeX counter is already created but not used anywhere. &lt;tt&gt;floatstyle&lt;/tt&gt; can be &lt;tt&gt;plain&lt;/tt&gt;, &lt;tt&gt;boxed&lt;/tt&gt; or &lt;tt&gt;ruled&lt;/tt&gt; — I decided for &lt;tt&gt;boxed&lt;/tt&gt; since I was using boxedminipage inside the old-style figures anyway. Then we define a new float type which fails to define a new counter and has to use the one for the list we already made, just as planned. We finish up by giving the new floating environment some names.&lt;br /&gt;&lt;br /&gt;That’s it, we’re done. Just use &lt;tt&gt;\begin{snippet}…\end{snippet}&lt;/tt&gt; and &lt;tt&gt;\autoref{…}&lt;/tt&gt; as you usually would with figures and tables. I see no need to create more counters, to brutally mess with &lt;tt&gt;@addtoreset&lt;/tt&gt; and &lt;tt&gt;theHsnippet&lt;/tt&gt;, etc. Hacks must be simple, effective and beautiful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-6374323380006644668?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/6374323380006644668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/float.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/6374323380006644668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/6374323380006644668'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/float.html' title='Floating code snippets in LaTeX'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-3807563437286895992</id><published>2009-06-08T07:32:00.000-07:00</published><updated>2009-06-08T07:34:26.782-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='flaws'/><title type='text'>Python pains, part 3</title><content type='html'>Another thing I miss is perfect matching in &lt;tt&gt;in&lt;/tt&gt; and &lt;tt&gt;not in&lt;/tt&gt; operators. And when I say ‘perfect’, I mean prolog. Yes, I’m mad at python because it’s not prolog. Just take a look at this wonderful code:&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/2547617268c4fee944ef82a28d22d2e6"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Neat, eh? So, why can’t I do this, then?&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/83a3a0dc698805787f1c256c4764eb20"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;(Yes, I know what the underscore variable in python is for, just pretend you don’t and roll along, ok?)&lt;br /&gt;&lt;br /&gt;The nastiest thing about this issue is that it is not universally solvable. Once you’ve implemented a special magic matching function for this particular case, there will be someone who wants to write:&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/f7d07381bcb964eb7ca98ff67ae5fbf1"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;If the whole tuple on the left hand side is defined, one can do the matching perfectly in python. If some parts ain’t, one cannot and has to write an awkward external matching/traversal function. Too bad!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-3807563437286895992?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/3807563437286895992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/python3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/3807563437286895992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/3807563437286895992'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/python3.html' title='Python pains, part 3'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-7481612914593783801</id><published>2009-06-05T09:32:00.000-07:00</published><updated>2009-06-05T09:54:43.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='flaws'/><title type='text'>Python pains, part 2</title><content type='html'>Binary operators are not directly reimplementable, this ain’t Ruby. Some of them can be changed implicitly with a bit of &lt;tt&gt;__smth__&lt;/tt&gt; magic, others are implemented in the class of one side with a parameter of the other side—and it happens that I often need it the other way around. Suppose the idea of the script is to open the file, read all the lines, stick them together, strip the result, parse it, perform some xpath and create an new element for each element found that way. Easy? Yes. Realistic? Well, the &lt;a href="http://slps.svn.sourceforge.net/viewvc/slps/shared/python/reroot2nts.py?view=markup"&gt;reroot2nonterminals&lt;/a&gt; transformation generator is written that way. What do we see there?&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/ff0debd17bf6c410119a89dc473dd909"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And how this would have looked like in my dream python?&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/6cf9768e05c70dc082950fb6d5e53d7f"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Yeah, I know, I know. The problem is inhererent and not really the sole fault of python. However, python already has that nifty &lt;tt&gt;self&lt;/tt&gt; mechanism, which eliminates the difference between &lt;tt&gt;a.method()&lt;/tt&gt; and &lt;tt&gt;method(a)&lt;/tt&gt;, and that duality is commonly exploited with &lt;tt&gt;string&lt;/tt&gt; module, for instance. The only thing I need here is two &lt;tt&gt;self&lt;/tt&gt;s for binary expressions. Or more, for n-ary… Or even…&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/2fc41c290cb32936e8307795c3dd813f"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;(The ElementTree is intentionally left out for its side effects, don’t bother). This code actually &lt;em&gt;works&lt;/em&gt;, with some magic woven in the &lt;tt&gt;Wrapper&lt;/tt&gt; class. Anyway, if any language ever does this kind of &lt;a href="http://twitter.com/grammarware/status/2043506681"&gt;meta-programming&lt;/a&gt; naturally, it would be beyond good and evil, I could honestly retire as a language engineer, shave my head, get a peg leg and become a pirate ninja. For now at least it is implementable as meta-hack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-7481612914593783801?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/7481612914593783801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/python2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/7481612914593783801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/7481612914593783801'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/python2.html' title='Python pains, part 2'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-7286670414729523733</id><published>2009-06-04T18:09:00.001-07:00</published><updated>2009-06-04T19:02:57.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Ten Dying IT Skills</title><content type='html'>The main problem with the article &lt;a href="http://www.globalknowledge.com/training/generic.asp?pageid=2347"&gt;Ten Dying IT Skills&lt;/a&gt; is sloppiness. The author, &lt;a href="mailto:leungllh@gmail.com"&gt;Linda Leung&lt;/a&gt;, is apparently not knowledgeable enough in the areas she writes about, hence the weird choice for list items, hence the complete mess in the explanation.&lt;br /&gt;&lt;br /&gt;Take (3), for instance. ‘Microsoft eventually replaced J++ with Microsoft .Net.’ It is plain impossible to replace a language (J++) by a platform (.NET). J++ has been superseded by J#, MS VS 6.0 grew up to be become MS VS .NET, and the underlying infrastructure is CLI instead of JVM (if anyone cares). Even then, why is this a ‘dying skill’? One of the main design goals for J# was to make a language that would allow experienced Java programmers to develop software for .NET. If you possess a good knowledge of J++, it’s not a problem to find a job as a J# programmer.&lt;br /&gt;&lt;br /&gt;Now take (6). She maintains that Extreme Programming is a dying skill, which is utter nonsense. From the article it seems that XP is dead since 2003. In reality, Agile Manifesto has been published in 2001 and the methodology only began blooming ever since. ‘Losing ground due to the proliferation of offshore outsourcing of applications development’ also seems unlikely—outsourcing or in-house development, but the software needs to be developed and go through its life-cycle, which is almost never waterfall nowadays. XP is not the only rapid application development/agile software development method, by the way, there’s also Scrum, DSDM, FDD and many others. Even on Twitter, look at @KentBeck, @WardCunningham, @RonJeffries, etc, they are all alive and kicking liek whoa. Look at Ruby on Rails, for crying out loud! If that’s not hot, I don’t know what is. In modern language engineering DSLs also tend to be produced in an iterative fashion.&lt;br /&gt;&lt;br /&gt;Skip to (9). I fail to see how the conclusion that HTML is a dying skill is drawn from the fact that ‘good grasp of HTML isn't the only skill required of a Web developer’. Sure, it’s not the only one, but a crucial one. Yes, no-one is writing HTML in text editors anymore like we did ten and fifteen years ago. However, the value of validation and conformance has been understood and appreciated since then, and there are so many HTML embedded languages and technologies—like PHP or ASP—that are simply dangerous to use without HTML knowledge. Bottom line: HTML is not a dying skill, it’s an absolute must. A ‘web programmer’ that states (s)he doesn’t know HTML will never get it to a job interview, (s)he will be scratched out at the first line of HR folks by a big fat red marker. Don’t call us, we’ll call you (or maybe not).&lt;br /&gt;&lt;br /&gt;And, finally, (10), the good old Cobol. &lt;del&gt;Leave Cobol alone!&lt;/del&gt; Oops, I meant, &lt;a href="http://www.cs.vu.nl/Cobol/stop-bashing-cobol.pdf"&gt;stop bashing it&lt;/a&gt;! A lot of people have been talking for decades about how dead Cobol is, and those are the same people that use hole in the wall machines, ticket booking services and other Cobol applications on a daily basis. Their salary is surely being calculated either in Cobol or in ABAP (which is another step from Cobol to hell). Nobody seems to be aware that most business-critical software is run in Cobol. Why? Because it works. It just works. And I’m not talking about some legacy systems that maintenance programmers are afraid to touch—I’ve been to a couple of Cobol conferences and talked to people from industry (IBM, ABN AMRO, ING Group, Micro Focus, SOGETI, Getronics-PinkRoccade, etc), they are well aware of all pros and cons, and they want to stick to Cobol, at least for backend. SOA is not used to get rid of Cobol, but rather to support it and to introduce new interfaces to the same applications. New applications are being developed in Cobol, too. It takes a lot of time to train a Cobol programmer, and let’s be honest, it is not the most exciting job in the world, but there’s always a market for that, and Cobol programmers and mainframe experts are paid much, much better than Java programmers. Not the least reason for that is the constant lack of new blood.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-7286670414729523733?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/7286670414729523733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/skills.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/7286670414729523733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/7286670414729523733'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/skills.html' title='Ten Dying IT Skills'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6969518071081462653.post-3289047673486763855</id><published>2009-06-04T14:49:00.000-07:00</published><updated>2009-06-04T15:14:07.622-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='flaws'/><title type='text'>Python pains, part 1</title><content type='html'>I’ve been a devoted python hacker for almost a decade, and I don’t plan to back off (at least unless Python 3000 forces out 2.x). I program in dozens of other languages, but whenever I need to hack something up, python’s almost always the choice for me. Still, there are things I miss/dislike about it, and I plan to dedicate a couple of posts to them.&lt;br /&gt;&lt;br /&gt;The first thing I don’t like is the semantics of list methods. Those methods always disrupt the &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;fp&lt;/a&gt;-ish flow of my script. I want to write:&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/1426f52c6682494c0b36a0318f4d1186"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;But I have to write:&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/2b1e8effbf25badd5d05f7170b214ff1"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And that only if I won’t need the original value of &lt;tt&gt;a&lt;/tt&gt;!&lt;br /&gt;&lt;br /&gt;The point is: if I ever want to mutate the original list, I’d be willing to write something like &lt;tt&gt;a = a.reverse()&lt;/tt&gt;. On the other hand, assuming that this is what I always want is far-fetched and limiting to my functional way of thinking.&lt;br /&gt;&lt;br /&gt;The universal solution would be to make a library of wrappers like this:&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://snipt.net/embed/31f7de1f2a09038dd780a3a46db8393d"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Which is ugly (see for yourself), not integrated (&lt;tt&gt;a.append(b)&lt;/tt&gt; vs &lt;tt&gt;append_(a,b)&lt;/tt&gt;) and involves a lot of copying—more than probably really required. So, for better or worse, I end up each time implementing only wrappers specific to my current app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6969518071081462653-3289047673486763855?l=spoonfulofhacking.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spoonfulofhacking.blogspot.com/feeds/3289047673486763855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/python.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/3289047673486763855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6969518071081462653/posts/default/3289047673486763855'/><link rel='alternate' type='text/html' href='http://spoonfulofhacking.blogspot.com/2009/06/python.html' title='Python pains, part 1'/><author><name>Spider</name><uri>http://www.blogger.com/profile/16222038272608154261</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xWzKWJUdok/Sig_ZtiWopI/AAAAAAAAAH8/WZ5XYu7cqMo/s1600-R/ebe50260b3179e3937c34123e27af804.jpeg'/></author><thr:total>2</thr:total></entry></feed>
