From ittay.dror at gmail.com Sat Dec 6 16:21:18 2008 From: ittay.dror at gmail.com (Ittay Dror) Date: Sat, 06 Dec 2008 23:21:18 +0200 Subject: [Rake-devel] @lock.synchronize Message-ID: <493AECCE.2050802@gmail.com> Hi, I wanted to share my findings about @lock.synchronize, used in invoke_with_call_chain. This method is implemented as def mon_synchronize mon_enter begin yield ensure mon_exit end end The downside here is that creating a block requires resources and since the body of this particular block creates a potentially large recursion (esp. in Buildr), this can end up waisting a lot of memory. In my case, replacing: @lock.synchronize do ... end with begin @lock.mon_enter .... ensure @lock.mon_exit end made the difference between a segmentation fault and a successful build. ittay -- -- Ittay Dror -------------- next part -------------- An HTML attachment was scrubbed... URL: From quixoticsycophant at gmail.com Fri Dec 12 02:06:40 2008 From: quixoticsycophant at gmail.com (James M. Lawrence) Date: Fri, 12 Dec 2008 02:06:40 -0500 Subject: [Rake-devel] Status of Rake for Windows? In-Reply-To: <64B5F3BF-CF16-4C7F-88B8-C30193E69F4F@gmail.com> References: <64B5F3BF-CF16-4C7F-88B8-C30193E69F4F@gmail.com> Message-ID: <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> On Sun, Nov 23, 2008 at 12:15 AM, Jim Weirich wrote: > I'm wanting to get a new release of rake out soon. IIRC, there were some > windows compatibility issues that some people on the list were evaluating. > What's the status of the current code base on windows? Is it ready to go? > Does it need more tweaking. X:\rake>ruby --version ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32] X:\rake>ruby bin/rake ta (in X:/rake) RCov is not available mkdir -p testdata UNABLE TO RUN FUNCTIONAL TESTS No Session Found (gem install session) Loaded suite X:/rake/lib/rake/rake_test_loader Started .............................................................. .............................................................. .............................................................. .............................................................. ................................. Finished in 23.123 seconds. 353 tests, 986 assertions, 0 failures, 0 errors Tested with one-click ruby186-27_rc2.exe running in a VirtualBoxed Windows 2000. (I assume the functional tests don't apply to Windows since the session gem is filled with forks.) http://github.com/quix/rake/tree/mainline-rake Pull request sent to Jim. I fixed a couple unrelated warnings/errors then dropped in my system() replacement to cover the remaining problems. That skipped test is no longer being skipped. http://drake.rubyforge.org/tmp/system_spec_new.html http://drake.rubyforge.org/tmp/system_spec_old.html http://github.com/quix/system/tree/master Should Rake fix Windows problems ahead of Ruby? Or if Rake aims to be a cross-platform command-line tool, while Ruby does not, then these aren't Ruby problems after all. I suppose I'll post the spec to ruby-core. James M. Lawrence From luislavena at gmail.com Fri Dec 12 08:18:59 2008 From: luislavena at gmail.com (Luis Lavena) Date: Fri, 12 Dec 2008 08:18:59 -0500 Subject: [Rake-devel] Status of Rake for Windows? In-Reply-To: <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> References: <64B5F3BF-CF16-4C7F-88B8-C30193E69F4F@gmail.com> <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> Message-ID: <71166b3b0812120518m291efa71pb5403b47d207e5c0@mail.gmail.com> On Fri, Dec 12, 2008 at 2:06 AM, James M. Lawrence wrote: > On Sun, Nov 23, 2008 at 12:15 AM, Jim Weirich wrote: >> I'm wanting to get a new release of rake out soon. IIRC, there were some >> windows compatibility issues that some people on the list were evaluating. >> What's the status of the current code base on windows? Is it ready to go? >> Does it need more tweaking. > > X:\rake>ruby --version > ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32] > > X:\rake>ruby bin/rake ta > (in X:/rake) > RCov is not available > mkdir -p testdata > UNABLE TO RUN FUNCTIONAL TESTS > No Session Found (gem install session) > Loaded suite X:/rake/lib/rake/rake_test_loader > Started > .............................................................. > .............................................................. > .............................................................. > .............................................................. > ................................. > Finished in 23.123 seconds. > > 353 tests, 986 assertions, 0 failures, 0 errors > > Tested with one-click ruby186-27_rc2.exe running in a VirtualBoxed > Windows 2000. (I assume the functional tests don't apply to Windows > since the session gem is filled with forks.) > > http://github.com/quix/rake/tree/mainline-rake > > Pull request sent to Jim. I fixed a couple unrelated warnings/errors > then dropped in my system() replacement to cover the remaining > problems. That skipped test is no longer being skipped. > > http://drake.rubyforge.org/tmp/system_spec_new.html > http://drake.rubyforge.org/tmp/system_spec_old.html > http://github.com/quix/system/tree/master > > Should Rake fix Windows problems ahead of Ruby? Or if Rake aims to be > a cross-platform command-line tool, while Ruby does not, then these > aren't Ruby problems after all. I suppose I'll post the spec to > ruby-core. > > James M. Lawrence Hey Lawrence, I'll pulling from your branch and see what happens tonight. Very interested in your fixes. You can run "rake test" which will run the functional ones. The warnings you got shouldn't be happening. That's the purpose of mocking... if it's going back to the OS, then means the mocks didn't work at all. Other than that, awesome job on RepairedSystem... I guess that should be part of Ruby, not Rake. Other projects can take advantage of it. Thank you again for following and nailing this down. -- Luis Lavena AREA 17 - Perfection in design is achieved not when there is nothing more to add, but rather when there is nothing more to take away. Antoine de Saint-Exup?ry From quixoticsycophant at gmail.com Fri Dec 12 10:14:17 2008 From: quixoticsycophant at gmail.com (James M. Lawrence) Date: Fri, 12 Dec 2008 10:14:17 -0500 Subject: [Rake-devel] Status of Rake for Windows? In-Reply-To: <71166b3b0812120518m291efa71pb5403b47d207e5c0@mail.gmail.com> References: <64B5F3BF-CF16-4C7F-88B8-C30193E69F4F@gmail.com> <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> <71166b3b0812120518m291efa71pb5403b47d207e5c0@mail.gmail.com> Message-ID: <996afcbc0812120714u4c7ad450g17e23def9ba5d22f@mail.gmail.com> On Fri, Dec 12, 2008 at 8:18 AM, Luis Lavena wrote: > On Fri, Dec 12, 2008 at 2:06 AM, James M. Lawrence wrote: >> (I assume the functional tests don't apply to Windows since the >> session gem is filled with forks.) > > You can run "rake test" which will run the functional ones. > The Rakefile says "rake test" is an alias for test_units. I did test_all, which encompasses test_functional, test_contribs, and test_units. Is there some way to get the functional tests on Windows? From jim.weirich at gmail.com Sat Dec 13 21:56:57 2008 From: jim.weirich at gmail.com (Jim Weirich) Date: Sat, 13 Dec 2008 21:56:57 -0500 Subject: [Rake-devel] Status of Rake for Windows? In-Reply-To: <996afcbc0812120714u4c7ad450g17e23def9ba5d22f@mail.gmail.com> References: <64B5F3BF-CF16-4C7F-88B8-C30193E69F4F@gmail.com> <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> <71166b3b0812120518m291efa71pb5403b47d207e5c0@mail.gmail.com> <996afcbc0812120714u4c7ad450g17e23def9ba5d22f@mail.gmail.com> Message-ID: On Dec 12, 2008, at 10:14 AM, James M. Lawrence wrote: > Is there some way to get the functional tests on Windows? The functional test are disabled if the session gem is not installed. AFAIK the session gem doesn't work on windows. You will need the session gem or something equivalent. -- -- Jim Weirich -- jim.weirich at gmail.com From jim.weirich at gmail.com Sat Dec 13 22:04:17 2008 From: jim.weirich at gmail.com (Jim Weirich) Date: Sat, 13 Dec 2008 22:04:17 -0500 Subject: [Rake-devel] Status of Rake for Windows? In-Reply-To: <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> References: <64B5F3BF-CF16-4C7F-88B8-C30193E69F4F@gmail.com> <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> Message-ID: <644F3564-E176-4AE9-90B9-CA6E018A24C1@gmail.com> On Dec 12, 2008, at 2:06 AM, James M. Lawrence wrote: > Pull request sent to Jim. I fixed a couple unrelated warnings/errors > then dropped in my system() replacement to cover the remaining > problems. That skipped test is no longer being skipped. Thanks for the hard work. I've pulled and merged to main, and triggered a github gem build. I encourage folks to give it a look, especially our windows users. Thanks. James, I looked over the changes, and originally found the implementation to be a bit strange, as if you were patching rake rather than modifying it. Then I realized that you were purposefully keeping the changes separate so that it might be used elsewhere. Is that an accurate assessment? -- -- Jim Weirich -- jim.weirich at gmail.com From jim.weirich at gmail.com Sat Dec 13 22:12:39 2008 From: jim.weirich at gmail.com (Jim Weirich) Date: Sat, 13 Dec 2008 22:12:39 -0500 Subject: [Rake-devel] Rake import VS JRuby import Message-ID: <5B9878BD-EFBE-4EDB-BDCE-861AE087F53F@gmail.com> Someone has pointed out that the top level import command in Rake conflicts with the JRuby import command. They were wondering if the import command could be moved out of the global scope. I'm not sure how many people are using import currently, so I thought I would as here and get a feel. If I make the change, it would happen in Rake 0.9. I would probably move it to something like Rake.import. A command line option could be provided to provide backward compatibility (something the the -- classic-namespace option currently supported by Rake). Any feedback? -- -- Jim Weirich -- jim.weirich at gmail.com From mgassmann at amberg.ch Sun Dec 14 04:01:40 2008 From: mgassmann at amberg.ch (mgassmann at amberg.ch) Date: Sun, 14 Dec 2008 10:01:40 +0100 Subject: [Rake-devel] Michael Gassmann is abroad. Message-ID: Ich werde ab 28.11.2008 nicht im B?ro sein. Ich kehre zur?ck am 15.12.2008. i'll answer your mail as soon as i am back. in urgent cases please send me a message on my mobile (+41 79 355 9367). thank you. From luislavena at gmail.com Sun Dec 14 11:31:31 2008 From: luislavena at gmail.com (Luis Lavena) Date: Sun, 14 Dec 2008 11:31:31 -0500 Subject: [Rake-devel] Rake import VS JRuby import In-Reply-To: <5B9878BD-EFBE-4EDB-BDCE-861AE087F53F@gmail.com> References: <5B9878BD-EFBE-4EDB-BDCE-861AE087F53F@gmail.com> Message-ID: <71166b3b0812140831r6b44c366g23bc7a3232aac7d6@mail.gmail.com> On Sat, Dec 13, 2008 at 10:12 PM, Jim Weirich wrote: > Someone has pointed out that the top level import command in Rake conflicts > with the JRuby import command. They were wondering if the import command > could be moved out of the global scope. > > I'm not sure how many people are using import currently, so I thought I > would as here and get a feel. > > If I make the change, it would happen in Rake 0.9. I would probably move it > to something like Rake.import. A command line option could be provided to > provide backward compatibility (something the the --classic-namespace option > currently supported by Rake). > > Any feedback? > I'm relying on the top level import for loading the tasks in rake-compiler: http://github.com/luislavena/rake-compiler/tree/master/Rakefile#L23 But I guess using a simple 'load' will be enough. Since it's the end of the Rakefile, I guess there is no benefit of using import versus load for my case. -- Luis Lavena AREA 17 - Perfection in design is achieved not when there is nothing more to add, but rather when there is nothing more to take away. Antoine de Saint-Exup?ry From quixoticsycophant at gmail.com Sun Dec 14 17:06:42 2008 From: quixoticsycophant at gmail.com (James M. Lawrence) Date: Sun, 14 Dec 2008 17:06:42 -0500 Subject: [Rake-devel] Status of Rake for Windows? In-Reply-To: <644F3564-E176-4AE9-90B9-CA6E018A24C1@gmail.com> References: <64B5F3BF-CF16-4C7F-88B8-C30193E69F4F@gmail.com> <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> <644F3564-E176-4AE9-90B9-CA6E018A24C1@gmail.com> Message-ID: <996afcbc0812141406h789285e6j666d2bec79f2f57d@mail.gmail.com> On Sat, Dec 13, 2008 at 10:04 PM, Jim Weirich wrote: > > James, I looked over the changes, and originally found the implementation to > be a bit strange, as if you were patching rake rather than modifying it. > Then I realized that you were purposefully keeping the changes separate so > that it might be used elsewhere. Is that an accurate assessment? Yes, I probably wasn't clear enough. I was asking the question, "Should Rake fix system()?" and sent a pull request showing what it would look like *if* Rake did fix system(). But it still remains to be decided what to do. Last month I posted my replacement system() with a spec showing the differences between the old and new. I asked what the outstanding issues were, and whether tests existed for them. There was a skipped test due to system() problems, but was that Rake's concern? The spec showed the standard system() had bugs not even encountered by the Rake tests. The new system() and its spec have been in a separate repository on github. It's intended as a drop-in replacement for those having problems with system() on Windows. Due to my recent discovery of an odd quirk with 'cmd /c', many of my comments from November are now obsolete. The new system() should solve all the issues with EXEEXT, jruby vs MRI, interpolated vs non-interpolated arguments, multi-arg vs single-arg, full-path vs lookup. There's no dilemma between different flavors of brokenness, as I had previously thought. I wouldn't mind if repaired_system.rb was inserted into win32.rb, and/or if the integration with Rake was otherwise made tidier. Is that what you meant by "strange"? Leaving the system() problems to Ruby--keeping the skipped test--is reasonable. But it also makes sense to fix problems now. After all, Rake had system("call ...") for variable expansion before my involvement. My system() is just a continuation along the same route. I'm split 50/50 on it. Now that I've added a few missing tests to the spec, I'll post to ruby-core soon. From jim.weirich at gmail.com Sun Dec 14 21:59:40 2008 From: jim.weirich at gmail.com (Jim Weirich) Date: Sun, 14 Dec 2008 21:59:40 -0500 Subject: [Rake-devel] Rake import VS JRuby import In-Reply-To: <71166b3b0812140831r6b44c366g23bc7a3232aac7d6@mail.gmail.com> References: <5B9878BD-EFBE-4EDB-BDCE-861AE087F53F@gmail.com> <71166b3b0812140831r6b44c366g23bc7a3232aac7d6@mail.gmail.com> Message-ID: On Dec 14, 2008, at 11:31 AM, Luis Lavena wrote: > But I guess using a simple 'load' will be enough. > > Since it's the end of the Rakefile, I guess there is no benefit of > using import versus load for my case. Just to be clear, I'm not removing the functionality, but merely moving it into a namespace. -- -- Jim Weirich -- jim.weirich at gmail.com From okkez000 at gmail.com Mon Dec 15 00:44:19 2008 From: okkez000 at gmail.com (okkez) Date: Mon, 15 Dec 2008 14:44:19 +0900 Subject: [Rake-devel] [Q] what is "rake/runtest" ? Message-ID: <1f73ff9d0812142144w5241815dt5a2411e091e23014@mail.gmail.com> Hi, my name is okkez. In Japan, we write API refarence manual for Ruby1.8 or later. And I'm writing Rake API manual in Japanese. So I have a question. What is "rake/runtest.rb" ? There are no ' require "rake/runtest" ' in rake's test and libralies. Can you tell me the purpose of the file, please. regards, -- okkez okkez000 at gmail.com From quixoticsycophant at gmail.com Wed Dec 17 02:32:49 2008 From: quixoticsycophant at gmail.com (James M. Lawrence) Date: Wed, 17 Dec 2008 02:32:49 -0500 Subject: [Rake-devel] Status of Rake for Windows? In-Reply-To: <644F3564-E176-4AE9-90B9-CA6E018A24C1@gmail.com> References: <64B5F3BF-CF16-4C7F-88B8-C30193E69F4F@gmail.com> <996afcbc0812112306w4cc1940dqbb5aba4f79c3c9eb@mail.gmail.com> <644F3564-E176-4AE9-90B9-CA6E018A24C1@gmail.com> Message-ID: <996afcbc0812162332p714121c8u9909b58bf01bef0d@mail.gmail.com> I posted my system() implementation to ruby-core, which is now a bit simpler than the original while still passing the spec. My mainline-rake branch is updated with latest. From ittay.dror at gmail.com Tue Dec 30 01:49:15 2008 From: ittay.dror at gmail.com (Ittay Dror) Date: Tue, 30 Dec 2008 08:49:15 +0200 Subject: [Rake-devel] [DRAKE] any plans on supporting iterative DFS? Message-ID: <4959C46B.5000506@gmail.com> Hi, Currently, the collection of executions is done by recursive calls to invoke_with_call_chain (through invoke_prerequisites_parallel). In Buildr (which creates many tasks with many dependencies) and a big project, this creates a deep recursion which exhausts the stack and causes ruby to segfaults. Iteratively collecting the tasks will alleviate this problem. Thanks, Ittay -- -- Ittay Dror From djberg96 at gmail.com Wed Dec 31 06:31:12 2008 From: djberg96 at gmail.com (Daniel Berger) Date: Wed, 31 Dec 2008 04:31:12 -0700 Subject: [Rake-devel] [PATCH] Add safe_level option to Rake::TestTask Message-ID: <495B5800.1030601@gmail.com> Hi, The Rake::TestTask class currently allows both verbose and warning options, which is good. However, there may also be times when a user wants to run tests at a particular $SAFE level. This relatively simple patch provides that ability. What do you think? Regards, Dan c:\>diff -u testtask.orig testtask.rb --- testtask.orig Wed Dec 31 04:17:51 2008 +++ testtask.rb Wed Dec 31 04:29:32 2008 @@ -55,6 +55,10 @@ # E.g. warning=true implies "ruby -w" used to run the tests. attr_accessor :warning + # Request that the tests be run at the given safe level. + # E.g. safe_level=1 implies "ruby -T1" is used to run the tests. + attr_accessor :safe_level + # Glob pattern to match test files. (default is 'test/test*.rb') attr_accessor :pattern @@ -86,6 +90,7 @@ @test_files = nil @verbose = false @warning = false + @safe_level = 0 @loader = :rake @ruby_opts = [] yield self if block_given? @@ -111,6 +116,7 @@ end @ruby_opts.unshift( "-I#{lib_path}" ) @ruby_opts.unshift( "-w" ) if @warning + @ruby_opts.unshift( "-T#{@safe_level}") if @safe_level > 0 ruby @ruby_opts.join(" ") + " \"#{run_code}\" " + file_list.collect { |fn| "\"#{fn}\"" }.join(' ') + From jim.weirich at gmail.com Wed Dec 31 06:34:57 2008 From: jim.weirich at gmail.com (Jim Weirich) Date: Wed, 31 Dec 2008 06:34:57 -0500 Subject: [Rake-devel] [PATCH] Add safe_level option to Rake::TestTask In-Reply-To: <495B5800.1030601@gmail.com> References: <495B5800.1030601@gmail.com> Message-ID: <79C33833-A5B8-4DC8-875E-A338384CCF7A@gmail.com> On Dec 31, 2008, at 6:31 AM, Daniel Berger wrote: > The Rake::TestTask class currently allows both verbose and warning > options, which is good. However, there may also be times when a user > wants to run tests at a particular $SAFE level. > > This relatively simple patch provides that ability. What do you think? No objection. Add it to the redmine site so that it doesn't get lost. -- -- Jim Weirich -- jim.weirich at gmail.com From djberg96 at gmail.com Wed Dec 31 06:44:24 2008 From: djberg96 at gmail.com (Daniel Berger) Date: Wed, 31 Dec 2008 04:44:24 -0700 Subject: [Rake-devel] [PATCH] Add safe_level option to Rake::TestTask In-Reply-To: <79C33833-A5B8-4DC8-875E-A338384CCF7A@gmail.com> References: <495B5800.1030601@gmail.com> <79C33833-A5B8-4DC8-875E-A338384CCF7A@gmail.com> Message-ID: <495B5B18.50009@gmail.com> Jim Weirich wrote: > On Dec 31, 2008, at 6:31 AM, Daniel Berger wrote: > >> The Rake::TestTask class currently allows both verbose and warning >> options, which is good. However, there may also be times when a user >> wants to run tests at a particular $SAFE level. >> >> This relatively simple patch provides that ability. What do you think? > > No objection. Add it to the redmine site so that it doesn't get lost. > I totally forgot about the Redmine site until about 3 minutes after I posted the patch here. ;) Anyway, done. Feature #41. Thanks, Dan From Daniel.Berger at qwest.com Wed Dec 31 11:42:59 2008 From: Daniel.Berger at qwest.com (Daniel Berger) Date: Wed, 31 Dec 2008 09:42:59 -0700 Subject: [Rake-devel] Test failures on Solaris 10 Message-ID: <495BA113.1030303@qwest.com> Hi, This is from the latest git repo using Ruby 1.8.6-p114 on Solaris 10: Started ...................................................................................................................................................................................................................................................................................................F...F.F..................................................... Finished in 20.571438 seconds. 1) Failure: test_default_arguements_that_dont_match_names_are_ignored(TestTaskArguments) [./test/test_task_arguments.rb:87]: expected but was <"cc">. 2) Failure: test_extra_names_are_nil(TestTaskArguments) [./test/test_task_arguments.rb:50]: expected but was <"cc">. 3) Failure: test_named_args(TestTaskArguments) [./test/test_task_arguments.rb:40]: expected but was <"cc">. 351 tests, 964 assertions, 3 failures, 0 errors rake aborted! Command failed with status (1): [/usr/local/bin/ruby -w -Ilib "/usr/local/l...] I think I brought this up before, but people thought it was a Windows issue. I think the problem is that I've got my CC environment variable set to "cc". I'm not sure what's supposed to happen in that case, though. Regards, Dan From luislavena at gmail.com Wed Dec 31 19:11:08 2008 From: luislavena at gmail.com (Luis Lavena) Date: Wed, 31 Dec 2008 22:11:08 -0200 Subject: [Rake-devel] Test failures on Solaris 10 In-Reply-To: <495BA113.1030303@qwest.com> References: <495BA113.1030303@qwest.com> Message-ID: <71166b3b0812311611h4e937a53s1a9e4326ae77b08c@mail.gmail.com> On Wed, Dec 31, 2008 at 2:42 PM, Daniel Berger wrote: > Hi, > > This is from the latest git repo using Ruby 1.8.6-p114 on Solaris 10: > > Started > ...................................................................................................................................................................................................................................................................................................F...F.F..................................................... > Finished in 20.571438 seconds. > > 1) Failure: > test_default_arguements_that_dont_match_names_are_ignored(TestTaskArguments) > [./test/test_task_arguments.rb:87]: > expected but was > <"cc">. > > 2) Failure: > test_extra_names_are_nil(TestTaskArguments) > [./test/test_task_arguments.rb:50]: > expected but was > <"cc">. > > 3) Failure: > test_named_args(TestTaskArguments) [./test/test_task_arguments.rb:40]: > expected but was > <"cc">. > > 351 tests, 964 assertions, 3 failures, 0 errors > rake aborted! > Command failed with status (1): [/usr/local/bin/ruby -w -Ilib > "/usr/local/l...] > > I think I brought this up before, but people thought it was a Windows issue. > I think the problem is that I've got my CC environment variable set to "cc". > > I'm not sure what's supposed to happen in that case, though. > Basically, Rake::TaskArguments is checking for cc being defined as argument for a Task, and then fallback to ENV looking for it: def lookup(name) if @hash.has_key?(name) @hash[name] elsif ENV.has_key?(name.to_s) ENV[name.to_s] elsif ENV.has_key?(name.to_s.upcase) ENV[name.to_s.upcase] elsif @parent @parent.lookup(name) end end So, let's say I have defined a task named foo, with a named argument called cc and will default to ENV['CC'] if no CC is provided with the task (rake foo[something-for-cc] I believe that fallback on ENV is a non documented behavior of task arguments? -- Luis Lavena AREA 17 - Perfection in design is achieved not when there is nothing more to add, but rather when there is nothing more to take away. Antoine de Saint-Exup?ry