My main research interest is computer security, in particular the so-called Man-At-The-End Attack which occurs in settings where an adversary has physical access to a device and compromises it by tampering with its hardware or software. My current research interests include

  • remote man-at-the-end attacks which occur in distributed systems where untrusted clients are in frequent communication with trusted servers over a network, and a malicious user can get an advantage by compromising an untrusted device;
  • man-at-the-end security of Provenance Systems, where we are building a system to protect provenance chains in documents, in particular OpenOffice;
  • repeatability in Computer Systems research.

  • Recent Grants

    • August 2011---August 2013, Mitigating Insider Attacks in Provenance Systems, National Science Foundation Grant CNS-1318955, $496,066, PI: Christian Collberg, co-PIs: Sudha Ram, Saumya K. Debray.
    • September 2011---August 2013, Man-at-the-End Attacks: Defenses and Evaluation, National Science Foundation Grant CNF-1145913, $269,649, PI: Christian Collberg, co-PIs: Saumya Debray, Loukas Lazos.
    • October 2009---September 2013, Theoretical and Practical Approaches to Remote White-Box Security, United States--Israel Binational Science Foundation grant BSF-2008362, $90,684, PI: Amir Hertzberg (Bar Ilan University, Israel), co-PIs: Christian Collberg, Shafi Goldwasser (MIT and Weizmann Institute).

    Recent Students

    • David Christy
    • Patrick P.F. Chan (Postdoc)
    • Sam Martin (Masters)
    • Alex Warren (Undergraduate)
    • Keith Alcock (Research Programmer)

With Jasvir Nagra, I am the author of the first comprehensive textbook on software protection, Surreptitious Software: Obfuscation, Watermarking, and Tamperproofing for Software Protection, published in Addison-Wesley's computer security series.

Surreptitious Software has also been translated into Portuguese and Chinese:


Publications

  1. Christian Collberg, Jasvir Nagra, Surreptitious Software --- Obfuscation, Watermarking, and Tamperproofing for Software Protection, Addison-Wesley Software Security Series, Editor: Gary McGraw, 792 pages, ISBN: 0-321-54925-2, August 2009. buy
  2. Christian Collberg, Jasvir Nagra, Sub-Reptício Software - Ofuscamento, Aplicaçăo de Marcas D´Água e Resistęncia a Alteraçőes para Proteçăo de Software, 832 pages, ISBN: 8573939117, 2010, Brazilian Portuguese Translation of Surreptitious Software. buy
  3. Christian Collberg, Jasvir Nagra, Simplified Chinese Translation of Surreptitious Software.

The ACM/DAPA International Summer School on Information Security and Protection (ISSISP) is held yearly, alternating between Asia, Europe, and the Americas.

The Software Security and Protection Workshop has run three times, in 2011 in Beijing, China, in 2012 in Beijing, China (invited speakers: Dawn Song and Dusko Pavlovic), and in 2014 in Scottsdale, Arizona (invited speakers: Amit Sahai and Moti Yung).

In the Tigress project we are studying diversity-based defenses against Remote Man-At-The-End (R-MATE) attacks. These attacks occur in distributed systems where untrusted clients are in frequent communication with trusted servers over a network, and malicious users can get an advantage by compromising an untrusted device.

Currently, the Tigress backend (the diversifying C virtualizer/obfuscator) is available for download here.


R-MATE vulnerabilities occur in a variety of settings, including
  1. The Advanced Metering Infrastructure} (AMI) for controlling the electrical power grid, where networked devices (smart meters) are installed at individual house-holds to allow two-way communication with control servers of the utility company. In an R-MATE attack against the AMI, a malicious consumer tampers with the meter to emulate an imminent blackout, or to trick a control server to send disconnect commands to other customers.
  2. MMOGs (massive multiplayer online games) are susceptible to R-MATE attacks since a malicious player who tampers with the game client can get an advantage over other players.
  3. Wireless sensors are often deployed in unsecured environments (such as theaters of war) where they are vulnerable to tampering attempts. A compromised sensor could be coached into supplying the wrong observations to a base station, causing real-world damage.
  4. Electronic health records (EHR) are typically protected by encryption while stored in databases and in transit to doctors' offices, but they are vulnerable to R-MATE attack if an individual doctor's client machine is compromised.

In our system, the trusted server overwhelms the untrusted client's analytical abilities by continuously and automatically generating and pushing to him diverse client code variants. The diversity subsystem employs a set of primitive code transformations that provide an ever-changing attack target for the adversary, making tampering difficult without this being detected by the server.


Grants

Tigress is supported through the following grants:

  1. September 2011---August 2013, Man-at-the-End Attacks: Defenses and Evaluation, National Science Foundation Grant CNF-1145913, $269,649, PI: Christian Collberg, co-PIs: Saumya Debray, Loukas Lazos.
  2. October 2009---September 2013, Theoretical and Practical Approaches to Remote White-Box Security, United States--Israel Binational Science Foundation grant BSF-2008362, $90,684, PI: Amir Hertzberg (Bar Ilan University, Israel), co-PIs: Christian Collberg, Shafi Goldwasser (MIT and Weizmann Institute).


Publications

  1. Patrick P.F. Chan, Christian Collberg, A Method to Evaluate CFG Comparison Algorithms QSIC'2014. pdf
  2. Christian Collberg, Sam Martin, Jonathan Myers, Jasvir Nagra, Distributed application tamper detection via continuous software updates, ACSAC'12.

Collaborators

  • Sam Martin
  • Jonathan Myers
  • Jasvir Nagra

In the Haathi project we are studying the design of a secure provenance management system for documents kept on cloud storage systems. Our system supports collaboration on documents by authorized individuals, and maintains detailed provenance records of the documents. Provenance meta data allows the recovery of information about the sequence of significant events relevant to history of the documents.

Our goal is to design a system that is practical and holistic, addressing major considerations which are often discussed in isolation, including security, privacy, usability and efficiency. Our design provides a practical solution for provenance of documents co-authored via not-fully-trusted cloud systems, with support for provenance of both exposure and editing events.


More information about the project can be found here.


Collaborators


Supporting Grants and Contracts

  1. August 2011---August 2013, Mitigating Insider Attacks in Provenance Systems, National Science Foundation Grant CNS-1318955, $496,066, PI: Christian Collberg, co-PIs: Sudha Ram, Saumya K. Debray.
  2. October 2009---September 2013, Theoretical and Practical Approaches to Remote White-Box Security, United States--Israel Binational Science Foundation grant BSF-2008362, $90,684, PI: Amir Hertzberg (Bar Ilan University, Israel), co-PIs: Christian Collberg, Shafi Goldwasser (MIT and Weizmann Institute).

In this project we investigate the extent to which Computer Science researchers share their code and data, and the extent to which this code will build with reasonable effort.


More information is available here.


Collaborators


Publications

  1. Patrick P.F. Chan, Christian Collberg, A Method to Evaluate CFG Comparison Algorithms QSIC'2014. pdf
  2. Christian Collberg, Sam Martin, Jonathan Myers, Jasvir Nagra, Distributed application tamper detection via continuous software updates, ACSAC'12. pdf
  3. Christian Collberg, Defeating Real Bad Guys in a Virtual World, Arizona Star Science Supplement, December 11, 2011. pdf
  4. Paolo Falcarin, Christian Collberg, Mikhail J. Atallah, Mariusz H. Jakubowski, Guest Editors' Introduction: Software Protection, IEEE Software, Volume 28, Number 2, pp. 24--27, 2011. pdf
  5. Christian Collberg, The Case for Dynamic Digital Asset Protection Techniques, IRDETO Whitepaper, pdf, June 2011.
  6. Christian Collberg, Jack Davidson, Roberto Giacobazzi, Yuan Xiang Gu, Amir Herzberg, Fei-Yue Wang, Toward Digital Asset Protection, IEEE Intelligent Systems, Volume 26, Number 6, pp. 8--13, 2011. pdf
  7. Christian Collberg, Clark Thomborson, Software Watermarking Techniques, US Patent Application, 2011/0214188, Assignee: University of Auckland, Filed November 15, 2010. pdf
  8. Christian Collberg, Jasvir Nagra, Surreptitious Software --- Obfuscation, Watermarking, and Tamperproofing for Software Protection, Addison-Wesley Software Security Series, Editor: Gary McGraw, 792 pages, ISBN: 0-321-54925-2, August 2009. buy
  9. Christian Collberg, Andrew Huntwork, Edward Carter, Gregg Townsend, Michael Stepp, More on graph theoretic software watermarks: Implementation, analysis, and attacks, Information and Software Technology, Volume 51, Number 1, January 2009. pdf
  10. Mariano Ceccato, Mila Dalla Preda, Jasvir Nagra, Christian Collberg, Paolo Tonella, Trading-off Security and Performance in Barrier Slicing for Remote Software Entrusting, Automated Software Engineering, Volume 16, Number 2, pp. 235--261, 2009. pdf
  11. Christian Collberg, Jasvir Nagra, Sub-Reptício Software - Ofuscamento, Aplicaçăo de Marcas D´Água e Resistęncia a Alteraçőes para Proteçăo de Software, 832 pages, ISBN: 8573939117, 2010, Brazilian Portuguese Translation of Surreptitious Software. buy
  12. Christian Collberg, Jasvir Nagra, Simplified Chinese Translation of Surreptitious Software.
  13. Changjiang Zhang, Jianmin Wang, Clark D. Thomborson, Chaokun Wang, Christian Collberg, A Semi-dynamic Multiple Watermarking Scheme for Java Applications, Digital Rights Management Workshop, pp. 59--72, 2009. pdf
  14. M. Ceccato, M. Dalla Preda, J. Nagra, Christian Collberg, P. Tonella, Barrier Slicing for Remote Software Trusting, 7th IEEE International Working Conference on Source Code Analysis and Manipulation (SCAM'07), pp, 27-36, IEEE Computer Society Press. October 2007. pdf
  15. Christian Collberg, Michael Stepp, Ginger Myles, An Empirical Study of Java Bytecode Programs, Software --- Practice & Experience, Volume 37, Number 6, pp: 581 - 641, May 2007. pdf
  16. Christian Collberg, Clark Thomborson, Gregg M. Townsend, Dynamic Graph-Based Software Fingerprinting, ACM Transactions of Programming Languages and Systems, Volume 29, Number 6, October 2007. pdf
  17. Michael Stepp, Christian Collberg, Browser Toolbars, Book chapter, in, Phishing and Countermeasures: Understanding the Increasing Problem of Electronic Identity Theft, Editors Markus Jakobsson and Steve Myers, Wiley, 2007, ISBN: 0-471-78245-9. buy
  18. Christian Collberg, Jasvir Nagra, Fei-Yue Wang, Surreptitious Software: Models from Biology and History, Fourth International Conference on Mathematical Methods, Models, and Architectures for Computer Network Security, (MMM-ACNS 2007), Communications in Computer and Information Science, Volume 1, Computer Network Security, Springer, 2007, pp. 1-21. pdf
  19. Ginger Myles, Christian Collberg, Software Watermarking via Opaque Predicates: Implementation, Analysis, and Attacks, Electronic Commerce Research Journal, Volume 6, Number 2, pp. 155-171, 2006. pdf
  20. Jan Camenisch, Christian Collberg, Neil F. Johnson, Phil Sallee (Editors), 8th International Workshop of Information Hiding (IH 2006), Springer LNCS 4437, ISBN 978-3-540-74123-7, July 10-12, 2006. buy
  21. Ginger Myles, Christian Collberg, k-gram Based Software Birthmarks, Proceedings of the 2005 ACM Symposium on Applied Computing, Computer Security Track, pp. 314-318, 2005. pdf
  22. Christian Collberg, Stephen Kobourov, Self-Plagiarism in Computer Science, Communications of the ACM, April 2005. pdf
  23. Christian Collberg, Tapas Sahoo, Software Watermarking in the Frequency Domain: Implementation, Analysis, and Attacks, Journal of Computer Security, Volume 13, Number 5, 721--755, 2005. pdf
  24. Ginger Myles, Christian Collberg, Zachary Heidepriem, Armand Navabi, The evaluation of two software watermarking algorithms, Software - Practice and Experience Volume 35, Number 10, pp 923-938, 2005. pdf
  25. Christian Collberg, John H. Hartman, Sridivya Babu, Sharath K. Udupa, Slinky: Static Linking Reloaded, Usenix, 2005. pdf
  26. C. M. Linn, M. Rajagopalan, S. Baker, Christian Collberg, S. K. Debray, J. H. Hartman, Protecting Against Unexpected System Calls, Usenix Security, 2005. pdf
  27. Christian Collberg, Edward Carter, Saumya Debray, Andrew Huntwork, John Kececioglu, Cullen Linn, Michael Stepp, Dynamic Path-Based Software Watermarking, ACM Programming Languages Design and Implementation (PLDI), 2004. pdf
  28. Christian Collberg, Todd Proebsting, Problem identification using program checking, Discrete Applied Mathematics, Volume 144, Number 3,pp. 270--280, 2004. pdf
  29. Richard T. Snodgrass, Shilong Yao, Christian Collberg, Tamper Detection in Audit Logs, International Conference on Very Large Data Bases (VLDB), 2004. pdf
  30. Christian Collberg, Andrew Huntwork, Edward Carter, Gregg Townsend, Graph Theoretic Software Watermarks: Implementation, Analysis, and Attacks, 6thInformation Hiding Workshop, 2004. pdf
  31. Ginger Myles, Christian Collberg, Software Watermarking via Opaque Predicates: Implementation, Analysis, and Attack, The Seventh International Conference on Electronic Commerce Research (ICECR-7), June 2004. pdf
  32. Kelly Heffner, Christian Collberg, The Obfuscation Executive, 7th Information Security Conference (ISC'04), September 2004. pdf
  33. Ginger Myles, Christian Collberg, Detecting Software Theft via Whole Program Path Birthmarks, 7th Information Security Conference (ISC'04), September 2004. pdf
  34. Christian Collberg, Stephen Kobourov, Suzanne Westbrook, AlgoVista: an algorithmic search tool in an educational setting, Technical Symposium on Computer Science Education (SIGCSE), pp. 462-466, March 2004. acm
  35. Christian Collberg, Stephen Kobourov, Jasvir Nagra, Jacob Pitts, Kevin Wampler, A System for Graph-Based Visualization of the Evolution of Software, ACM symposium on Software visualization (Softvis), 2003.
  36. pdf
  37. Christian Collberg, Ginger Myles, Andrew Huntwork, Sandmark--A Tool for Software Protection Research, IEEE Security & Privacy, Volume 1, Number 4, pp. 40--49, 2003. pdf
  38. Christian Collberg, Stephen Kobourov, Steven Kobes, Ben Smith, Stephen Trush, Gary Yee, TetraTetris: an Application of Multi-User Touch-Based Human-Computer Interaction, 9th IFIP International Conference on Human-Computer Interaction (INTERACT), 2003. pdf
  39. Christian Collberg, Edward Carter, Stephen Kobourov, Clark Thomborson, Error-Correcting Graphs for Software Watermarking, 29th Workshop on Graph Theoretic Concepts in Computer Science (WG'2003), June 2003. pdf
  40. Christian Collberg, Stephen Kobourov, Joshua Louie, Thomas Slattery, SPLAT: A System for Self-Plagiarism Detection, IADIS International Conference WWW/Internet (ICWI 2003), pp. 508-514, November 2003. pdf
  41. Ginger Myles, Christian Collberg, Software Watermarking Through Register Allocation: Implementation Analysis, and Attacks, 6th Annual International Conference on Information Security and Cryptology (ICISC), November 2003. springer
  42. Christian Collberg, Clark Thomborson, Douglas Low, Obfuscation techniques for enhancing software security, United States Patent 6,668,325, Assignee: InterTrust Technologies (Santa Clara, CA), Filed June 9, 1998, Issued December 23, 2003. pdf
  43. Christian Collberg, A Fuzzy Visual Query Language for a Domain-Specific Web Search Engine, Diagrammatic Representation and Inference, Second International Conference (DIAGRAMS'02), 18-20 April 2002, LNAI 2317. pdf
  44. Christian Collberg, Automatic Derivation of Compiler Machine Descriptions, ACM Transactions on Programming Languages and Systems, Volume 24, Number 4, July 2002, pp. 369--408. pdf
  45. Christian Collberg, Clark Thomborson, Watermarking, Tamper-Proofing, and Obfuscation -- Tools for Software Protection, IEEE Transactions on Software Engineering, Volume 28, Number 8, pp. 735--746, August 2002, This paper was among the most cited journal articles in software engineering from 2002 based on a citation study conducted by Prof. Claes Wohlin, pdf
  46. Jasvir Nagra, Clark Thomborson, Christian Collberg, A Functional Taxonomy for Software Watermarking, Twenty-Fifth Australasian Computer Science Conference (ACSC'2002), January 2002. pdf
  47. Christian Collberg, Todd A. Proebsting, Problem Classification using Program Checking, Fun with Algorithms (FUN '01), May 29--31, 2001. pdf
  48. Christian Collberg, Sean Davey, Todd Proebsting, Language-Agnostic Program Rendering for Presentation, Debugging and Visualization, IEEE Symposium on Visual Languages (VL'2000), September 2000. pdf
  49. Christian Collberg, Clark Thomborson, Software Watermarking --- Models and Dynamic Embeddings, ACM Principles of Programming Languages (POPL'99), January 1999. pdf
  50. Christian Collberg, Clark Thomborson, and Douglas Low, Manufacturing Cheap, Resilient, and Stealthy Opaque Constructs, ACM Principles of Programming Languages (POPL'98), January 1998. pdf (scanned), pdf (clean)
  51. Christian Collberg, Clark Thomborson, Douglas Low, Breaking Abstractions and Unstructuring Data Structures, IEEE International Conference on Computer Languages (ICCL'98), May 1998. pdf
  52. Christian Collberg, Automatic Derivation of Machine Descriptions, Proceedings of the Twentieth Australasian Computer Science Conference, February 1997. pdf
  53. Christian Collberg, Reverse Interpretation + Mutation Analysis = Automatic Re" targeting, ACM SIGPLAN Conference on Programming Language Design and Implementation, (PLDI'97), June 1997. pdf
  54. Christian Collberg, Distributed High-Level Module Binding for Flexible Encapsulation and Fast Inter-Modular Optimization, International Conference on Programming Languages and Systems Architectures, LNCS 782, March 1994. pdf
  55. Christian Collberg, Flexible Encapsulation, Ph.D. Thesis, Lund University, December 1992. pdf(A4), pdf(letter), bibtex.
  56. Christian Collberg, Data Structures, Algorithms, and Software Engineering, 3rd SEI Conference on Software Engineering Education, LNCS 376, July 1989. pdf
  57. Christian Collberg, Magnus Krampell, Design and Implementation of Modular Languages Supporting Information Hiding, 6th International Phoenix Conference on Computers and Communications, February 1987.
  58. Christian Collberg, Magnus Krampell, A Property-Based Method for Selecting Among Multiple Implementations of Modules, 1st European Software Engineering Conference, LNCS 289, September 1987. acm

Static linking has many advantages over dynamic linking. It is simple to understand, implement, and use. It ensures that an executable is self-contained and does not require a particular set of libraries during execution. As a consequence, the executable image that was tested by the developer is exactly the same as gets executed by the user, diminishing the risk that the user's environment will affect correct behavior. The major disadvantages of static linking are increases in the memory required to run an executable, network bandwidth to transfer it, and disk space to store it.

The Slinky system uses digest-based sharing to combine the simplicity of static linking with the space savings of dynamic linking: Slinky executables are completely self-contained, although minimal performance and disk-space penalties are incurred if two executables use the same library.


The source code is here.


Collaborators


Publications

  1. Christian Collberg, John H. Hartman, Sridivya Babu, Sharath K. Udupa, Slinky: Static Linking Reloaded, Usenix, 2005. pdf

SandMark

SandMark is a tool developed at the University of Arizona for software watermarking, tamperproofing, birthmarking, and code obfuscation of Java bytecode. The tool incorporates several dynamic and static watermarking algorithms, a large collection of obfuscation algorithms, a code optimizer, and tools for viewing and analyzing Java bytecode.

The SandMark website is here. The latest version of the SandMark tool is here: sandmark.jar.


Publications

  1. Christian Collberg, Clark Thomborson, Gregg M. Townsend, Dynamic Graph-Based Software Fingerprinting, ACM Transactions of Programming Languages and Systems, Volume 29, Number 6, October 2007. pdf
  2. Ginger Myles, Christian Collberg, Software Watermarking via Opaque Predicates: Implementation, Analysis, and Attacks, Electronic Commerce Research Journal, Volume 6, Number 2, pp. 155-171, 2006. pdf
  3. Ginger Myles, Christian Collberg, k-gram Based Software Birthmarks, Proceedings of the 2005 ACM Symposium on Applied Computing, Computer Security Track, pp. 314-318, 2005. pdf
  4. Christian Collberg, Tapas Sahoo, Software Watermarking in the Frequency Domain: Implementation, Analysis, and Attacks, Journal of Computer Security, Volume 13, Number 5, 721--755, 2005. pdf
  5. Ginger Myles, Christian Collberg, Zachary Heidepriem, Armand Navabi, The evaluation of two software watermarking algorithms, Software - Practice and Experience Volume 35, Number 10, pp 923-938, 2005. pdf
  6. Christian Collberg, Edward Carter, Saumya Debray, Andrew Huntwork, John Kececioglu, Cullen Linn, Michael Stepp, Dynamic Path-Based Software Watermarking, ACM Programming Languages Design and Implementation (PLDI), 2004. pdf
  7. Christian Collberg, Andrew Huntwork, Edward Carter, Gregg Townsend, Graph Theoretic Software Watermarks: Implementation, Analysis, and Attacks, 6thInformation Hiding Workshop, 2004. pdf
  8. Ginger Myles, Christian Collberg, Software Watermarking via Opaque Predicates: Implementation, Analysis, and Attack, The Seventh International Conference on Electronic Commerce Research (ICECR-7), June 2004. pdf
  9. Kelly Heffner, Christian Collberg, The Obfuscation Executive, 7th Information Security Conference (ISC'04), September 2004. pdf
  10. Ginger Myles, Christian Collberg, Detecting Software Theft via Whole Program Path Birthmarks, 7th Information Security Conference (ISC'04), September 2004. pdf
  11. Christian Collberg, Ginger Myles, Andrew Huntwork, Sandmark--A Tool for Software Protection Research, IEEE Security & Privacy, Volume 1, Number 4, pp. 40--49, 2003. pdf
  12. Christian Collberg, Edward Carter, Stephen Kobourov, Clark Thomborson, Error-Correcting Graphs for Software Watermarking, 29th Workshop on Graph Theoretic Concepts in Computer Science (WG'2003), June 2003. pdf
  13. Ginger Myles, Christian Collberg, Software Watermarking Through Register Allocation: Implementation Analysis, and Attacks, 6th Annual International Conference on Information Security and Cryptology (ICISC), November 2003. springer
  14. Christian Collberg, Clark Thomborson, Douglas Low, Obfuscation techniques for enhancing software security, United States Patent 6,668,325, Assignee: InterTrust Technologies (Santa Clara, CA), Filed June 9, 1998, Issued December 23, 2003. pdf
  15. Christian Collberg, Clark Thomborson, Watermarking, Tamper-Proofing, and Obfuscation -- Tools for Software Protection, IEEE Transactions on Software Engineering, Volume 28, Number 8, pp. 735--746, August 2002, This paper was among the most cited journal articles in software engineering from 2002 based on a citation study conducted by Prof. Claes Wohlin, pdf
  16. Christian Collberg, Clark Thomborson, Software Watermarking --- Models and Dynamic Embeddings, ACM Principles of Programming Languages (POPL'99), January 1999. pdf
  17. Christian Collberg, Clark Thomborson, and Douglas Low, Manufacturing Cheap, Resilient, and Stealthy Opaque Constructs, ACM Principles of Programming Languages (POPL'98), January 1998. pdf (scanned), pdf (clean)
  18. Christian Collberg, Clark Thomborson, Douglas Low, Breaking Abstractions and Unstructuring Data Structures, IEEE International Conference on Computer Languages (ICCL'98), May 1998. pdf

Supporting Grants and Contracts

  1. September 1, 2000--August 1, 2004, $265,000 from the NSF: Software Watermarking, Obfuscation, and Tamper-Proofing for Software Protection, grant CCR-0073483.
  2. June 2002, $417,000 (Option/Year 1) + $417,000 (Option/Year 2), Air Force Research Lab (AFRL): Protecting Software Against Tampering and Reverse Engineering, contract F33615-02-1146.

Splat

Self-plagiarism occurs when an author reuses portions of their previous writings in subsequent research papers. Occasionally, the derived paper is simply a re-titled and reformatted version of the original one, but more frequently it is assembled from bits and pieces of previous work.

It is our belief that self-plagiarism is detrimental to scientific progress and bad for our academic community. Flooding conferences and journals with near-identical papers makes searching for information relevant to a particular topic harder than it has to be. It also rewards those authors who are able to break down their results into overlapping least-publishable-units over those who publish each result only once. Finally, whenever a self-plagiarized paper is allowed to be published, another, more deserving paper, is not.

You can read more about Splat here.


Collaborators


Publications

  1. Christian Collberg, Stephen Kobourov, Self-Plagiarism in Computer Science, Communications of the ACM, April 2005. pdf
  2. Christian Collberg, Stephen Kobourov, Joshua Louie, Thomas Slattery, SPLAT: A System for Self-Plagiarism Detection, IADIS International Conference WWW/Internet (ICWI 2003), pp. 508-514, November 2003. pdf

Automatic Retargeting

There are three popular methods for constructing highly retargetable compilers: (1) the compiler emits abstract machine code which is interpreted at run-time, (2) the compiler emits C code which is subsequently compiled to machine code by the native C compiler, or (3) the compiler's code-generator is generated by a back-end generator from a formal machine description produced by the compiler writer. These methods incur high costs at run-time, compile-time, or compiler-construction time, respectively.

We're interested in a fourth method which combines the fast retargeting of C code generating compilers with the efficiency of specification-driven code generators.

The basic idea is to use the native C compiler at compiler construction time to discover architectural features of the new architecture. From this information a formal machine description is produced. Given this machine description, a native code-generator can be generated by a back-end generator such as BEG or burg.

You can download the tool here.


Publications

  1. Christian Collberg, Automatic Derivation of Compiler Machine Descriptions, ACM Transactions on Programming Languages and Systems, Volume 24, Number 4, July 2002, pp. 369--408. pdf
  2. Christian Collberg, Reverse Interpretation + Mutation Analysis = Automatic Re" targeting, ACM SIGPLAN Conference on Programming Language Design and Implementation, (PLDI'97), June 1997. pdf
  3. Christian Collberg, Automatic Derivation of Machine Descriptions, Proceedings of the Twentieth Australasian Computer Science Conference, February 1997. pdf

Code Rendering

ART is a language-independent and specification-driven program rendering tool that is able to produce high-quality code renderings of arbitrary complexity. The tool can incorporate arbitrary types of information together with the program code, allowing it to be used for debugging and profiling as well as for producing beautiful renderings of programs for publication.

You can download the tool here and the README file here.


Collaborators


Publications

  1. Christian Collberg, Sean Davey, Todd Proebsting, Language-Agnostic Program Rendering for Presentation, Debugging and Visualization, IEEE Symposium on Visual Languages (VL'2000), September 2000. pdf

AlgoVista

AlgoVista is a web-based search engine designed to allow applied computer scientists to classify problems and find algorithms and implementations that solve these problems. Unlike other search engines, AlgoVista is not keyword based. Rather, users provide a set of input=>output samples that describe the behavior of the problem they wish to classify. This type of query-by-example requires no knowledge of specialized terminology, only an ability to formalize the problem. The search mechanism of AlgoVista is based on a novel application of program checking, a technique developed as an alternative to program verification and testing.

You can download the tool here.


Collaborators


Publications

  1. Christian Collberg, Stephen Kobourov, Suzanne Westbrook, AlgoVista: an algorithmic search tool in an educational setting, Technical Symposium on Computer Science Education (SIGCSE), pp. 462-466, March 2004. acm
  2. Christian Collberg, Todd A. Proebsting, Problem Classification using Program Checking, Fun with Algorithms (FUN '01), May 29--31, 2001. pdf
  3. Christian Collberg, Stephen Kobourov, Suzanne Westbrook, AlgoVista: an algorithmic search tool in an educational setting, Technical Symposium on Computer Science Education (SIGCSE), pp. 462-466, March 2004. acm

Flexible Encapsulation

Most modular programming languages provide an encapsulation concept. Such concepts are used to protect the representational details of the implementation of an abstraction from abuse by its clients. Unfortunately, strict encapsulation is hindered by the separate compilation facilities provided by modern languages. The goal of the work presented here is to introduce techniques which allow modular languages to support both separate compilation and strict encapsulation without undue translation-time or execution-time cost.

You can download the tool here.


Publications

  1. Christian Collberg, Distributed High-Level Module Binding for Flexible Encapsulation and Fast Inter-Modular Optimization, International Conference on Programming Languages and Systems Architectures, LNCS 782, March 1994. pdf
  2. Christian Collberg, Flexible Encapsulation, Ph.D. Thesis, Lund University, December 1992.
  3. Christian Collberg, Magnus Krampell, Design and Implementation of Modular Languages Supporting Information Hiding, 6th International Phoenix Conference on Computers and Communications, February 1987.
I have taught at Lund University in Sweden, for five years at the University of Auckland, New Zealand, and since 1999 at the University of Arizona, USA. I have taught in both Swedish and in English. I typically teach classes on Computer Security, Compilers, and Programming Languages.
I view Computer Science as an applied, experimental, utilitarian science whose ultimate goal it is to create artifacts that improve peoples' lives. Our goal as Computer Science Educators should therefore be to provide students with a set of mental tools (theoretical as well as practical) that will allow them to construct such artifacts, in a manner that ensures safety, efficiency, and robustness. In my pedagogical mission I therefore subscribe to the following two principles:
  • Students of Computer Science must be given a good grounding in basic, universal skills that will serve them well throughout their working lives.
  • Students must be trained in building real systems, and how to use these systems to test theoretical hypotheses under real world conditions.

Publications

  1. Christian Collberg, Stephen Kobourov, Suzanne Westbrook, AlgoVista: an algorithmic search tool in an educational setting, Technical Symposium on Computer Science Education (SIGCSE), pp. 462-466, March 2004. acm
  2. Christian Collberg, Data Structures, Algorithms, and Software Engineering, 3rd SEI Conference on Software Engineering Education, LNCS 376, July 1989. pdf



Teaching Evaluations


Humorous Student Quotes

  • This class requires a ridiculous amount of work. (372)
  • Holy shit math. (466/566)
  • [I] like [how] unstructured it [the class] is (makes it not boring). (466/566)
  • Most CS students don't have the soft hands needed for lockpicking. (466/566)

CSc 340 Foundations of Computer Systems teaches the different levels of abstraction in a computing system, assembly language programming, the basics of low-level systems software, hardware components of a system, and how these components interact with each other.


The class page for 2001 is here. Lecture notes can be found here.


Topics

  • Hardware foundations: basic machine organization, instruction fetch cycle, number systems and encodings, CPU operations.
  • Assembly language using MIPS as an example: syntax, operations and operands, using registers, control flow, addressing.
  • Program execution: Subroutines and stack, activation records/stack frames, calling conventions, parameter passing.
  • Dynamic storage (heap) management: data structures, malloc/free/realloc.
  • Assembling: structure, dealing with forward and external references, symbol tables.
  • Linking: object files, resolving external references, loading.
  • Operating systems: paging, user/supervisor mode, interrupts, traps and exceptions, concurrency and mutual exclusion.
  • Learn to program in C and use Unix.

CSc 372 Comparative Programming Languages studies several modern programming languages and the programming paradigms that each language strives to accommodate. Functional programming is studied with Haskell. Logic programming is studied with Prolog. Ruby is studied to provide an alternative perspective on traditional procedural programming.

For each language we will study data types, control structures, syntax and semantics, idiomatic constructs, translation into executable units, and the run-time environment. An emphasis of the course will be to understand the design philosophy of each language and how that philosophy is exhibited in the elements of the language.


The class page for 2009 is here. Lecture notes can be found here.

CSc 453 Compilers and Systems Software covers the design and implementation of translator-oriented systems programs, especially compilers. Topics covered include lexical analysis, top down and bottom up parsing, syntax-directed code generation, and code generation. In particular, we learn how compilers are constructed, how programming languages are designed, how to compile procedural and object-oriented languages, and how interpreters, garbage collectors, and debuggers work.


The class page for 2009 is here. Lecture notes can be found here.


Topics

  • lexing: The Chomsky hierarchy, regular expressions, DFAs, scanner implementation.
  • parsing: Context-free grammars, BNF, parse trees, abstract syntax trees, Recursive Descent parsing.
  • semantic analysis: Attribute grammars, environments, type-checking.
  • intermediate representations: stacks, tuples, trees, intermediate-code generation from abstract syntax trees.
  • code generation: control-flow graphs, code generation for arithmetic expressions, data-structure access, control-flow, and procedure calls.
  • code optimization: survey of techniques, peephole optimization.
  • code optimization: data-flow analysis, common sub-expression elimination, inlining.
  • object-orientation: compiling Java-like languages, run-time class templates, inheritance.
  • garbage collection: reference counting, pointer-maps, mark-and-sweep.
  • systems software: debuggers, profilers.

CSc 520 Principles of Programming Languages defines, analyzes and evaluates important concepts found in current programming languages. Its goals are to build an ability to evaluate and compare programming languages, both from the user's and implementor's view, and to develop precise mechanisms for specifying the semantics of programming languages.


The class page for 2011 is here. Lecture notes can be found here.


Topics

  • scope of objects and time of binding
  • module mechanisms (e.g., blocks, procedures, coroutines)
  • data abstraction, datatypes
  • control structures
  • storage management and runtime support
  • operational, denotational, and axiomatic semantic specification; attribute grammars
  • applicative and object-oriented languages

CSc 553 Principles of Compilation considers advanced topics in compilation. Emphasis will be placed on advanced topics in code generation, register allocation, and optimization.


The class page for 2011 is here. Lecture notes can be found here.


Topics

  • interpretation: Instruction sets, fast interpreter implementation.
  • fancy programming constructs: Exception handling, garbage collection, iterators, modules, object oriented language features.
  • code generation: Instruction selection, register allocation, instruction scheduling, peephole optimization.
  • program analysis: Alias and shape analysis, dependence analysis, data-flow analysis, control-flow analysis, type hierarchy analysis.
  • code optimization: Global optimization, memory hierarchy optimizations, inlining.
  • scientific code: FORTRAN, parallel computers, parallelizing compilers.

CSc 620 Surreptitious Software studies how to protect programs against intellectual property violations through obfuscation, watermarking, tamperproofing, birthmarking, and hardware protection.


The class page for 2008 is here. Lecture notes can be found here.

CSc 466/566 Computer Security is an introductory course covering the fundamentals of computer security. In particular, the course covers basic concepts of computer security such as threat models and security policies, and shows how these concepts apply to specific areas such as communication security, software security, operating system security, network security, web security, and hardware-based security.


The class page for 2012 is here. Lecture notes can be found here.


Topics

  • Communication security: cryptography and cryptographic protocols, including encryption, message authentication codes, hash functions, one-way functions, public-key cryptography, digital signatures, cryptographic protocols.
  • Software security: secure software engineering, defensive programming, control-flow hijacking attacks (buffer overflows, format string bugs, integer overflows, heap attacks), exploitation techniques (string analysis, fuzzing, bug finding), analysis of code for security errors, safe languages, sandboxing techniques, and tools for writing secure code.
  • Operating system security: memory protection, access control, authorization, authenticating users (something you know, something you have, something you are, password cracking.
  • Network security: firewalls, port scanning attacks, intrusion detection systems, denial of service attack and defense, VPNs.
  • Malware: worms, spyware, rootkits, botnets, key-loggers, and defenses against them.
  • Web security: same-origin policy, cross-site scripting attacks, SQL injection attacks.
  • Hardware-based security: The trusted computing architecture and its applications.
  • Intellectual property protection: digital rights management, copy protection, software tamper-resistance.
  • Advanced topics: privacy, mobile code, electronic voting, phishing, cybercrime, cyber-terrorism, financial security, spam, covert channels.


Guatemala



Mexico


United States



Brazil


I've played the guitar, written songs, and recorded music since I was a teenager. I currently play with my garage band The Undecidables.


Bandmates

  1. Stefan Nilsson

I'm a Professor in the Department of Computer Science at the University of Arizona. Prior to arriving in Tucson I worked at the University of Auckland, New Zealand, and before that I got my Ph.D. from Lund University, Sweden. I have also held a visiting position a the Chinese Academy of Sciences in Beijing, China.

My main research interest is computer security, in particular the so-called Man-At-The-End Attack which occurs in settings where an adversary has physical access to a device and compromises it by tampering with its hardware or software. My current research focuses on remote man-at-the-end attacks which occur in distributed systems where untrusted clients are in frequent communication with trusted servers over a network, and a malicious user can get an advantage by compromising an untrusted device.

With Jasvir Nagra, I am the author of the first comprehensive textbook on software protection, Surreptitious Software: Obfuscation, Watermarking, and Tamperproofing for Software Protection, published in Addison-Wesley's computer security series. It has also been translated into Portuguese and Chinese.

I spend most of my free time traveling. So far, I've lived in 4 countries (born and raised in Sweden, 5 years in New Zealand, 1 year in China, and now, the US) and visited a total of 31. I also enjoy learning new languages. I'm fluent in Swedish and English and have also studied German (4 years), Russian (3 years in high school and 101a and 101b at the University of Arizona), and Chinese (CHN 101, 102, 201, 202, 403, and 404 at the University of Arizona, and a semester of tutoring from Li Laoshi in Beijing).

My other passion is music. Along with friends and colleagues I play the guitar and write songs for our garage band The Undecidables.

I also enjoy baking and photography, and I hope one day to finish up my Great Swedish Novel.


Office:
Room 756
7th floor
Gould-Simpson Building
Address:
P.O. Box 210077,
1040 E. Fourth St.,
Tucson, AZ 85721-0077.
Phone: (520) 621-6612
Fax: (520) 621-4246
Email: collberg@cs.arizona.edu

I enjoy cooking and baking, in particular cakes and pastries. Below are some of my favorite recipes.


Budapest Cake

Ingredients

  • 4 dl sugar.
  • 2 dl egg whites (4-6 eggs).
  • 150 g ground hazel nuts.
  • 1-2 tsp cocoa.
  • 1 dl white flour.
  • 1 tsp vanilla.
  • 1 - 1.5 cans (300 g) of Mandarin Orange Sections.
  • 3 dl whipped cream.

Procedure

  1. Whip egg whites.
  2. Keep whipping while adding the sugar, a little at a time.
  3. Mix nuts, flour, cocoa, and vanilla.
  4. Carefully fold the nut mixture into the egg batter.
  5. Cover a baking tray with baking paper.
  6. Fill a large piping bag with the batter.
  7. Pipe the batter onto the paper in rows like this:
  8. +-------------------------------------+ 
    |                                     | 
    |  =================================  | 
    |  =================================  | 
    |  =================================  | 
    |  =================================  | 
    |  =================================  | 
    |  =================================  | 
    |  =================================  | 
    |  =================================  | 
    |  =================================  | 
    |                                     | 
    +-------------------------------------+ 
    
  9. Bake for 20 minutes at 175C.
  10. Let cool. Store in refrigerator for a few hours or over night.

Decoration

  1. Remove baking paper from bottom of cake.
  2. Spread whipped cream over bottom of cake.
  3. Place mandarin orange sections evenly on top of the cream.
  4. Roll up the cake.


Sacher Torte

Ingredients

  • 225 g dark chocolate
  • 1.5 dl almonds
  • 225 g butter
  • 3 dl sugar
  • 6 egg yolks
  • 1.5 dl white flour
  • 1.5 tsp baking powder
  • 6 egg whites

Icing and filling

  • 200 g dark chocolate
  • 1/2 Tbs cooking oil
  • Apricot jam

Procedure

  1. Set oven to 175C.
  2. Melt chocolate.
  3. Blanch, peel and grind almonds. Mix with the flour and baking powder.
  4. Blend sugar and butter until white and fluffy.
  5. Add egg yolks, one at a time, to butter-sugar mixture.
  6. Stir in melted chocolate.
  7. Stir in almond mixture.
  8. Whip egg whites to hard foam and fold in.
  9. Pour batter into baking pan lined with baking paper.
  10. Bake for 30-45 minutes.
  11. Let cool. Split in two and spread apricot jam in between.
  12. Melt chocolate and spread over cake. Let cool.
  13. Serve cold with whipped cream.


Swedish Pancakes

Ingredients

  • 2.5 dl flour (approximately 1 US cup).
  • 6 dl milk (approximately 2.5 US cups).
  • 3 eggs.
  • 50g butter (approximately 1.5oz).
  • 1/2 tea spoon salt.

Batter

  1. Melt butter and let cool to room temperature.
  2. Mix flour and salt in a bowl.
  3. Slowly pour in half the milk and blend until smooth .
  4. Slowly pour in the remaining milk and blend.
  5. Blend in the eggs, one at a time.
  6. Blend in the melted butter.

Frying

  1. Heat pancake-skillet. On a scale from 1 to 10, the stove should be at around 6.
  2. Melt some butter in the skillet.
  3. When hot, pour in approximately 1dl of the batter, just enough to cover the pan. Tilt the pan so the batter is spread out uniformly.
  4. When brown, flip over.


Swedish Meatballs

Ingredients

  • 500 g (18 oz) ground beef
  • 500 g (18 oz) ground pork
  • 5 dl (2 1/2 cup) milk
  • 3 dl (1 1/2 cup) white breadcrumbs
  • 2 eggs
  • 1 onion

Batter

  1. Soak the breadcrumbs in the milk for about 10 minutes.
  2. Blend the ground meats together.
  3. Finely mince the onion and mix into the meat together with eggs and spices.
  4. Blend in the milk/breadcrumb mixture.
  5. Shape small meatballs with the aid of two spoons and place on water-rinsed plates.

Frying

  1. Brown a generous pat of butter in a frying pan, and when it ``goes quiet'' place the meatballs (about 7 at a time) in the pan and let them brown on all sides.
  2. Put the meatballs aside until they are all browned. Mix a little water into the pan to make a broth. Put meatballs back in pan and let slowly cook until done, about 10 minutes.


Semlor

Ingredients

  • 8g dried yeast (25g fresh)
  • 100g butter
  • 2.5dl milk
  • 1 egg
  • 2ml salt
  • 2ml salt of hartshorn
  • 1dl sugar
  • 7dl flour

Dough

  1. Melt butter, mix with milk, heat to fingerwarm, add sugar and egg.
  2. Mix flour, salt, yeast, and salt of hartshorn.
  3. Mix flour mixture into liquid, work into a dough.
  4. Let rise for 30 minutes.
  5. Roll into 16 buns.
  6. Let rise for 50-60 minutes.
  7. Bake for 8 minutes at 210C/410F.
  8. Let cool covered on a rack.

Filling

  • 200g almonds
  • 1dl granulated sugar
  • 1dl powdered sugar
  • 4dl whipping cream

Almond Paste

  1. Blanch and peel almonds.
  2. Run almonds, granulated sugar, and powdered sugar in a food processor until fine.
  3. Add small amount of liquid (milk, cream, or water) until mixture makes a smooth dough.
  4. Refridgerate.

Finishing

  1. Cut lid off bun.
  2. Remove small amount of inside of the bun. Mix with almond paste and small amount of milk until smooth.
  3. Fill bun with whipped cream and almond mixture.


Kakan med choklad i

Ingredients

  • 150g butter
  • 2.5 dl sugar
  • 2 eggs
  • 1.5 dl flour
  • 1 dl cocoa
  • 1 tsp vanilla sugar
  • 100g dark chocolate

Procedure

  1. Blend sugar and butter until white and fluffy.
  2. Add one egg at a time.
  3. Mix flour, cocoa, and vanilla sugar, and blend into the butter mixture.
  4. Spread into a 20x30cm pan.
  5. Bake for 20 minutes at 175C.
  6. Chop the chocolate and put on top of cake.
  7. Bake for another 5 minutes.
  8. Spread the melted chocolate with a fork.
  9. Let cool.


Källarfranska

Ingredients

  • 25g fresh yeast
  • 13dl cold water
  • 1dl oil
  • 2 Tbs salt
  • 2kg white flour

Procedure (in the evening)

  1. Break up yeast into large bowl
  2. Add water, let stand for 3 minutes.
  3. Add oil, salt, almost all flour.
  4. Knead, cover, and let stand in fridge until next day.

Procedure (in the morning)

  1. Cut dough into 4 parts
  2. Cut each part into 12 buns.
  3. Sprinkle flour over the buns, and let rise covered for 2-3 hours.
  4. Heat oven to 275C.
  5. Bake for 8-10 minutes.
  6. Let cool uncovered.


Kuvertbröd

Ingredients

  • 50g fresh yeast
  • 100g butter
  • 4dl milk
  • 1 tsp salt
  • 1 Tsp sugar
  • 1 egg
  • 1ml salt of hartshorn
  • 750g white flour
  • 1 egg and poppy seeds for decoration

Procedure

  1. Melt the butter, add milk, and warm to 37C.
  2. Pour over the fresh yeast.
  3. Add egg, salt, sugar, most of the flour that has been mixed with the salt of hartshorn.
  4. Knead, cover, let rise for 30 minutes.
  5. Work the dough on the table, cut into 30 pieces, form into cool shapes.
  6. Let rise for 30 minutes.
  7. Brush with egg, sprinkle with poppy seeds.
  8. Bake at 225C (440F) for 7 minutes.


Basket bread

Ingredients (Day 1)

  • 4dl water
  • 3dl rye flour

Procedure (Day 1)

  1. Boil the water, pour over the flour.
  2. Work into a dough.
  3. Sprinkle flour over the dough, cover the bowl with plastic wrap, let stand until the next day.

Ingredients (Day 2)

  • 4dl 37C water
  • 50g yeast
  • 1 tsp salt
  • 11-12 dl white flour
  • 1dl rye flour (for the baskets)

Procedure (Day 2)

  1. Pour the warm water over the rye dough.
  2. Sprinkle the fresh yeast on top of the dough, and disolve.
  3. Add the salt. Work in the white flour, except for 1dl. 10 minutes, slowest speed, on a bread mixer.
  4. Cover, let rise for 60 minutes.
  5. Make two loaves, put lots of rye flour in the baskets, put the loaves in, let rise covered for 30-45 minutes.
  6. Carefully put the loaves on baking trays, remove the baskets.
  7. Bake for 60 minutes at 175C.


Mandelmusslor

Ingredients

  • 200g butter
  • 1dl sugar
  • 3.5dl (210g) flour
  • 1 egg
  • 100g ground almonds
  • 2 ground bitter almonds

Procedure

  1. Mix all ingredients on the baking table.
  2. Let cool in fridge.
  3. Push pieces into forms that have been carefully buttered.
  4. Bake at 200C (400F) for about 10 minutes, fairly low in the oven.
  5. Makes 35-40.


Pepparmyntspastiller

Ingredients

  • 200g sugar
  • 0.75 dl water
  • 150g powdered sugar
  • A few drops peppermint oil

Procedure

  1. Mix sugar and water and let boil for no more than 1 minute.
  2. Let cool somewhat and add powdered sugar and peppermint oil.
  3. Make into circles on parchment paper.
  4. If the batter gets hard, add a few drops of water, and reheat.
  5. If the batter is too soft, add more powdered sugar.
  6. Let cool, and put a dab of melted chocolate on each circle.


Rimbobullar

Ingredients (dough)

  • 25g yeast
  • 2dl cold milk
  • 200g butter, room temperature
  • 1 Tbs sugar
  • 6dl flour

Ingredients (filling)

  • 75g butter
  • 1.5 Tbs sugar
  • 2 tsp vanilla sugar

Ingredients (decoration)

  • 1 egg
  • pearl sugar

Procedure

  1. Disolve fresh yeast in some of the milk.
  2. Add the rest of the milk, butter, sugar, some of the flour.
  3. Mix into a soft dough, and add remaining flour.
  4. Put lots of flour on the baking table, and pour out the dough.
  5. Put some flour on the dough and pat into a rectangle.
  6. Roll gently using a rolling pin to a 40cm x 35cm rectangle.
  7. Cut into 7cm x 7cm squares.
  8. Mix butter, sugar, vanilla sugar and put a dab on each square.
  9. Fold the corners to the middle, press, put each bun into a paper muffin cup, let rise for 2 hours at room temperature.
  10. Brush with egg, sprinkle pearl sugar on top.
  11. Bake at 250C (480F) in the middle of the oven for 5-10 minutes.
  12. Let cool under a towel.


Scones

Ingredients

  • 100g butter (frozen or very cold)
  • 8 dl flour
  • 4 tsp baking powder
  • 1 tsp salt
  • 3 dl milk

Procedure

  1. Mix flour, salt, and baking powder.
  2. Quickly cut up the butter in the flour, by hand or in a blender. After blending, the butter should be no more than pea-sized.
  3. Add milk, and quickly make into a dough.
  4. Divide in four parts, make each into a ball, flatten, and score to make a cross.
  5. Bake at 250C (480F) for about 10 minutes.
  6. Break into pieces, and let cool on a rack.


  1. Q: Why is your website so dark and gray and dreary?
    A: It is a reflection of my soul.

All design, text, scripts, images, and media copyright Christian Collberg, unless otherwise noted. All rights reserved.


The site was implemented by Marcel Folaron at Colibris. Additional code by Jasvir Nagra.


Photo Credits

Andrew Collberg
Bart Coppens
Anders Wetterling