Changes between Version 126 and Version 127 of DeveloperGuidelines/Tips


Ignore:
Timestamp:
07/04/13 10:19:36 (12 years ago)
Author:
Fran Boon
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DeveloperGuidelines/Tips

    v126 v127  
    11DeveloperGuidelines
     2= Tips =
    23[[TOC]]
     4
    35== Python debugging ==
    4  * WSGI likes print statements to go to {{{sys.stderr}}} not {{{sys.stdout}}}: http://code.google.com/p/modwsgi/wiki/DebuggingTechniques
    5  * use Web2Py shell: http://www.vimeo.com/879939
    6  * use [http://ipython.scipy.org/moin/ IPython] for interactive exploration (on Windows, install [http://ipython.scipy.org/moin/PyReadline/Intro PyReadline])
    7  * use [http://groups.google.com/group/web2py/browse_thread/thread/cc13960a5079b2d5# FirePy] to see logging output to Console (to view with Firebug)
    8  * Log to a File: http://groups.google.com/group/web2py/browse_thread/thread/e20d0bd2e542aa14
    9  * Debug Tools: http://docs.python.org/library/debug.html
    10  * Use [http://stackoverflow.com/questions/2654113/python-how-to-get-the-callers-method-name-in-the-called-method Inspect] to check which function called the one you're troubleshooting:
     6* WSGI likes print statements to go to {{{sys.stderr}}} not {{{sys.stdout}}}: http://code.google.com/p/modwsgi/wiki/DebuggingTechniques
     7* use Web2Py shell: http://www.vimeo.com/879939
     8* use [http://ipython.scipy.org/moin/ IPython] for interactive exploration (on Windows, install [http://ipython.scipy.org/moin/PyReadline/Intro PyReadline])
     9* use [http://groups.google.com/group/web2py/browse_thread/thread/cc13960a5079b2d5# FirePy] to see logging output to Console (to view with Firebug)
     10* Log to a File: http://groups.google.com/group/web2py/browse_thread/thread/e20d0bd2e542aa14
     11* Debug Tools: http://docs.python.org/library/debug.html
     12* Use [http://stackoverflow.com/questions/2654113/python-how-to-get-the-callers-method-name-in-the-called-method Inspect] to check which function called the one you're troubleshooting:
    1113{{{
    1214import inspect
     
    2628                print >> sys.stderr, "SQL: %s" % sql
    2729}}}
    28  * [http://aymanh.com/python-debugging-techniques Python Debugging Techniques]
    29   * Insert these statements into your code
    30    * Get a Python shell up to explore interactively: {{{import code; code.interact(locals=locals()}}}
    31    * Get a full stack trace: {{{import pdb; pdb.set_trace()}}}
    32  * winpdb: http://groups.google.com/group/web2py/msg/ee46125b7c93fdd4
    33  * WingIDE: http://www.wingware.com/
    34   * Using with Web2Py: http://www.wingware.com/doc/howtos/web2py
    35  * [DeveloperGuidelines/Eclipse Eclipse] IDE
    36 
    37 === Reserved Keywords ===
    38  * 'request' -> web2py internal use
    39  * 'key' as a db row name -> MySQL confuses it with internal keyword KEY
    40  * http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-0.html
    41  * http://www.postgresql.org/docs/8.1/static/sql-keywords-appendix.html
    42 
    43 == CSS & Javascript debugging ==
    44  * use Firebug: http://code.google.com/support/bin/answer.py?answer=77412&topic=12044
    45  * use [http://www.sprymedia.co.uk/article/Visual+Event Visual Event] to see which events are active.
    46  * use Venkman: http://www.mozilla.org/projects/venkman/
    47  * use Fiddler for compressed files: http://www.yuiblog.com/blog/2008/06/27/fiddler
    48  * http://pastebin.me (allows edits of HTML & previews)
    49  * http://jsfiddle.net (allows edits of JS & previews)
    50  * http://yura.thinkweb2.com/domlint/
    51   * http://www.jslint.com/lint.html
    52  * IE6 cheatsheet: http://www.virtuosimedia.com/tutorials/ultimate-ie6-cheatsheet-how-to-fix-25-internet-explorer-6-bugs
    53 
    54 == Python ==
     30* [http://aymanh.com/python-debugging-techniques Python Debugging Techniques]
     31 * Insert these statements into your code
     32  * Get a Python shell up to explore interactively: {{{import code; code.interact(locals=locals()}}}
     33  * Get a full stack trace: {{{import pdb; pdb.set_trace()}}}
     34* winpdb: http://groups.google.com/group/web2py/msg/ee46125b7c93fdd4
     35* WingIDE: http://www.wingware.com/
     36 * Using with Web2Py: http://www.wingware.com/doc/howtos/web2py
     37* [DeveloperGuidelines/Eclipse Eclipse] IDE
    5538* Unicode:
    5639 * "Decode early, Unicode everywhere, Encode late": http://farmdev.com/talks/unicode/
     
    5942 * http://www.youtube.com/watch?v=Er5K_nR5lDQ
    6043 * http://videolectures.net/youtube_martelli_python/
     44
     45=== Reserved Keywords ===
     46* 'request' -> web2py internal use
     47* 'key' as a db row name -> MySQL confuses it with internal keyword KEY
     48* http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-0.html
     49* http://www.postgresql.org/docs/8.1/static/sql-keywords-appendix.html
     50
    6151== Web2Py ==
    62  * [wiki:Web2pyInternalsAndTips Web2py Internals and Tips]
    63  * http://web2py.com/examples/default/docs
    64  * Prevent HTML tags being escaped in views: {{{{{=XML("<p>Not escaped!</p>")}}}}}
    65  * HTML Helpers: http://web2py.com/AlterEgo/default/show/217
    66  * Arbitrary HTML tags using TAG, e.g. TAG.LEGEND('a','b',_c='d')
    67  * HTML Helpers can be navigated/manipulated like the DOM: http://groups.google.com/group/web2py/browse_thread/thread/ac045f3b1d3846d9
    68  * https://web2py.com/web2py_wiki/default/wiki/tips
    69  * https://web2py.com/web2py_wiki/default/wiki/widgets
    70  * Pagination:
    71   * Basic server-side pagination: http://web2py.com/AlterEgo/default/show/95
    72   * Grid to replace SQLTABLE with server-side pagination included: http://www.web2pyslices.com/main/slices/take_slice/39
    73  * New syntax for low-level database record create/update/delete: http://groups.google.com/group/web2py/browse_thread/thread/d79a6e52824d4221
    74  * Default field values with crud.create(): http://groups.google.com/group/web2py/browse_thread/thread/717e2349f0f8e93d
    75  * Edit multiple records at once: http://groups.google.com/group/web2py/browse_thread/thread/401b4c192871194c/a96cc8c7923a8565#
    76  * Prevent multiple concurrent logins: http://groups.google.com/group/web2py/browse_thread/thread/4e1c62a0d9255160
    77  * Process uploaded files manually (e.g. to unzip KMZ): http://groups.google.com/group/web2py/browse_thread/thread/63809c06cac3b0d5
    78  * Access DB models from a Python script: http://groups.google.com/group/web2py/browse_thread/thread/147b47069a9c1ea2
    79  * Custom Forms
    80   * Debug by setting the return to just a plain dict() (=> can read values of vars in 'request')
    81   * Latest code method: http://groups.google.com/group/web2py/browse_thread/thread/1d7c1e31b5f66534
    82    * Suggested workflow for customising HTML: http://groups.google.com/group/web2py/browse_thread/thread/95e571e49b7d77ed/8c998b226f5a0437
    83   * less retyping of code in view using SQLFORM extensions: http://groups.google.com/group/web2py/browse_thread/thread/2d8cc57352d158bd
    84   * Simple version: http://groups.google.com/group/web2py/browse_thread/thread/7245cab0df469d5f
    85   * Alternate approach: http://www.wellbehavedsystems.co.uk/web2py/examples/
    86   * Helper field2html(): http://groups.google.com/group/web2py/browse_thread/thread/1012c11c977aa05e
    87   * Multiple per page: http://groups.google.com/group/web2py/browse_thread/thread/57e452d186d48fa4
    88   * Values retrieved from DB are stored for re-referencing:  http://mdp.cti.depaul.edu/AlterEgo/default/show/205
    89   * Summary of MVC options: http://groups.google.com/group/web2py/browse_thread/thread/7da38e0d32d01076
    90   * form.accepts AJAX submission: http://groups.google.com/group/web2py/browse_thread/thread/e583a1e377cc7dea
    91  * Lambda tricks: http://p-nand-q.com/python/stupid_lambda_tricks.html
    92  * THIS_NOT_IN_DB custom validator: http://groups.google.com/group/web2py/browse_thread/thread/27b14433976c0540?pli=1
    93  * IS_IN_DB (...,order_by=...): http://groups.google.com/group/web2py/browse_thread/thread/5fe6e343d115590d/2a8c38fccb2cf3cf#2a8c38fccb2cf3cf
    94  * Multiple field validation example:
     52* [wiki:Web2pyInternalsAndTips Web2py Internals and Tips]
     53* http://web2py.com/examples/default/docs
     54* Prevent HTML tags being escaped in views: {{{{{=XML("<p>Not escaped!</p>")}}}}}
     55* HTML Helpers: http://web2py.com/AlterEgo/default/show/217
     56* Arbitrary HTML tags using TAG, e.g. TAG.LEGEND('a','b',_c='d')
     57* HTML Helpers can be navigated/manipulated like the DOM: http://groups.google.com/group/web2py/browse_thread/thread/ac045f3b1d3846d9
     58* https://web2py.com/web2py_wiki/default/wiki/tips
     59* https://web2py.com/web2py_wiki/default/wiki/widgets
     60* Pagination:
     61 * Basic server-side pagination: http://web2py.com/AlterEgo/default/show/95
     62 * Grid to replace SQLTABLE with server-side pagination included: http://www.web2pyslices.com/main/slices/take_slice/39
     63* New syntax for low-level database record create/update/delete: http://groups.google.com/group/web2py/browse_thread/thread/d79a6e52824d4221
     64* Default field values with crud.create(): http://groups.google.com/group/web2py/browse_thread/thread/717e2349f0f8e93d
     65* Edit multiple records at once: http://groups.google.com/group/web2py/browse_thread/thread/401b4c192871194c/a96cc8c7923a8565#
     66* Prevent multiple concurrent logins: http://groups.google.com/group/web2py/browse_thread/thread/4e1c62a0d9255160
     67* Process uploaded files manually (e.g. to unzip KMZ): http://groups.google.com/group/web2py/browse_thread/thread/63809c06cac3b0d5
     68* Access DB models from a Python script: http://groups.google.com/group/web2py/browse_thread/thread/147b47069a9c1ea2
     69* Custom Forms
     70 * Debug by setting the return to just a plain dict() (=> can read values of vars in 'request')
     71 * Latest code method: http://groups.google.com/group/web2py/browse_thread/thread/1d7c1e31b5f66534
     72  * Suggested workflow for customising HTML: http://groups.google.com/group/web2py/browse_thread/thread/95e571e49b7d77ed/8c998b226f5a0437
     73 * less retyping of code in view using SQLFORM extensions: http://groups.google.com/group/web2py/browse_thread/thread/2d8cc57352d158bd
     74 * Simple version: http://groups.google.com/group/web2py/browse_thread/thread/7245cab0df469d5f
     75 * Alternate approach: http://www.wellbehavedsystems.co.uk/web2py/examples/
     76 * Helper field2html(): http://groups.google.com/group/web2py/browse_thread/thread/1012c11c977aa05e
     77 * Multiple per page: http://groups.google.com/group/web2py/browse_thread/thread/57e452d186d48fa4
     78 * Values retrieved from DB are stored for re-referencing:  http://mdp.cti.depaul.edu/AlterEgo/default/show/205
     79 * Summary of MVC options: http://groups.google.com/group/web2py/browse_thread/thread/7da38e0d32d01076
     80 * form.accepts AJAX submission: http://groups.google.com/group/web2py/browse_thread/thread/e583a1e377cc7dea
     81* Lambda tricks: http://p-nand-q.com/python/stupid_lambda_tricks.html
     82* THIS_NOT_IN_DB custom validator: http://groups.google.com/group/web2py/browse_thread/thread/27b14433976c0540?pli=1
     83* IS_IN_DB (...,order_by=...): http://groups.google.com/group/web2py/browse_thread/thread/5fe6e343d115590d/2a8c38fccb2cf3cf#2a8c38fccb2cf3cf
     84* Multiple field validation example:
    9585{{{
    9686db.Wedding.location.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db(db.Wedding.weddingDateTime == request.vars.weddingDateTime), 'Wedding.location', error_message="Date/Time for Venue is Booked")]
    9787}}}
    98  * CGI co-existence: http://groups.google.com/group/web2py/browse_thread/thread/1520b84d144f0b0c
    99  * Inline Images in T2 CRUD: http://groups.google.com/group/web2py/browse_thread/thread/d954bf883baf7adc/3b55a819b425a741
    100  * PIL to create thumbnails:
    101   * http://groups.google.com/group/web2py/browse_thread/thread/3523f9a12edc6836
    102   * http://groups.google.com/group/web2py/browse_thread/thread/380cfb61a1fa1596
    103  * Download Images with original filename:
    104   * http://groups.google.com/group/web2py/browse_thread/thread/484a2d04bdd7606f
    105   * http://groups.google.com/group/web2py/browse_thread/thread/1df80dbf52d401fb
    106  * TEXTAREA options: http://groups.google.com/group/web2py/browse_thread/thread/482ecab0878689d5
    107  * nicEdit integration: http://groups.google.com/group/web2py/msg/ff491af9382f6c39
    108  * Multi-column unique constraint: http://groups.google.com/group/web2py/browse_thread/thread/f5ab94cc7d511e0b
    109  * Modified preorder Tree Traversal (for large Hierarchical trees): http://groups.google.com/group/web2py/browse_thread/thread/70efddab62dfe73
    110  * Hierarchical References: http://groups.google.com/group/web2py/browse_thread/thread/a4f57635d4a05f83
    111  * JSON datetime serialization: https://web2py.com/web2py_wiki/default/wiki/JSONdatetime
    112  * Enter key in ajaxified forms: http://groups.google.com/group/web2py/browse_thread/thread/bae7b19ff35b896b#
    113  * Limiting access to a controller function to just certain IPs: http://groups.google.com/group/web2py/msg/df000860c707d3d3
    114  * Auto-complete (for when Dropdowns get too long):
    115   * AutoComplete guidelines proposal
    116   * use the [wiki:ajaxS3 ajaxS3] calls: ''getS3'', ''getJSONS3'', or ''postS3''
    117   * use the [wiki:IS_ONE_OF_EMPTY IS_ONE_OF_EMPTY] validator
    118   * http://trac.sahanapy.org/browser/views/msg/email_outbox_create.html
    119   * http://groups.google.com/group/web2py/browse_thread/thread/e1034df0091b5bfd
    120   * http://groups.google.com/group/web2py/browse_thread/thread/f6e0170273b14241
    121   * http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ (Also: http://plugins.jquery.com/project/autocompletex)
    122   * http://dyve.net/jquery/?autocomplete (Older version: http://www.pengoworks.com/workshop/jquery/autocomplete.htm)
    123   * http://code.google.com/p/js-autocomplete/
    124   * http://github.com/ReinH/jquery-autocomplete/tree/master (Also: http://plugins.jquery.com/project/jq-autocomplete)
    125   * http://plugins.jquery.com/project/YA_AutoComplete
    126  * EPB: http://groups.google.com/group/web2py/browse_thread/thread/c090560680b65db2
    127  * Implementing Plone's Indexing & Workflow: http://groups.google.com/group/web2py/browse_thread/thread/496edd88f6298653
    128  * Importing Legacy Data: http://groups.google.com/group/web2py/browse_thread/thread/5bd8f85b21444858
    129  * Upload progress: http://www.web2pyslices.com/main/slices/take_slice/10
    130  * Use the StatusBar for dynamic status updates
    131  * http://code.google.com/p/web2pyorm/
     88* CGI co-existence: http://groups.google.com/group/web2py/browse_thread/thread/1520b84d144f0b0c
     89* Inline Images in T2 CRUD: http://groups.google.com/group/web2py/browse_thread/thread/d954bf883baf7adc/3b55a819b425a741
     90* PIL to create thumbnails:
     91 * http://groups.google.com/group/web2py/browse_thread/thread/3523f9a12edc6836
     92 * http://groups.google.com/group/web2py/browse_thread/thread/380cfb61a1fa1596
     93* Download Images with original filename:
     94 * http://groups.google.com/group/web2py/browse_thread/thread/484a2d04bdd7606f
     95 * http://groups.google.com/group/web2py/browse_thread/thread/1df80dbf52d401fb
     96* TEXTAREA options: http://groups.google.com/group/web2py/browse_thread/thread/482ecab0878689d5
     97* nicEdit integration: http://groups.google.com/group/web2py/msg/ff491af9382f6c39
     98* Multi-column unique constraint: http://groups.google.com/group/web2py/browse_thread/thread/f5ab94cc7d511e0b
     99* Modified preorder Tree Traversal (for large Hierarchical trees): http://groups.google.com/group/web2py/browse_thread/thread/70efddab62dfe73
     100* Hierarchical References: http://groups.google.com/group/web2py/browse_thread/thread/a4f57635d4a05f83
     101* JSON datetime serialization: https://web2py.com/web2py_wiki/default/wiki/JSONdatetime
     102* Enter key in ajaxified forms: http://groups.google.com/group/web2py/browse_thread/thread/bae7b19ff35b896b#
     103* Limiting access to a controller function to just certain IPs: http://groups.google.com/group/web2py/msg/df000860c707d3d3
     104* Auto-complete (for when Dropdowns get too long):
     105 * AutoComplete guidelines proposal
     106 * use the [wiki:ajaxS3 ajaxS3] calls: ''getS3'', ''getJSONS3'', or ''postS3''
     107 * use the [wiki:IS_ONE_OF_EMPTY IS_ONE_OF_EMPTY] validator
     108 * http://trac.sahanapy.org/browser/views/msg/email_outbox_create.html
     109 * http://groups.google.com/group/web2py/browse_thread/thread/e1034df0091b5bfd
     110 * http://groups.google.com/group/web2py/browse_thread/thread/f6e0170273b14241
     111 * http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ (Also: http://plugins.jquery.com/project/autocompletex)
     112 * http://dyve.net/jquery/?autocomplete (Older version: http://www.pengoworks.com/workshop/jquery/autocomplete.htm)
     113 * http://code.google.com/p/js-autocomplete/
     114 * http://github.com/ReinH/jquery-autocomplete/tree/master (Also: http://plugins.jquery.com/project/jq-autocomplete)
     115 * http://plugins.jquery.com/project/YA_AutoComplete
     116* EPB: http://groups.google.com/group/web2py/browse_thread/thread/c090560680b65db2
     117* Implementing Plone's Indexing & Workflow: http://groups.google.com/group/web2py/browse_thread/thread/496edd88f6298653
     118* Importing Legacy Data: http://groups.google.com/group/web2py/browse_thread/thread/5bd8f85b21444858
     119* Upload progress: http://www.web2pyslices.com/main/slices/take_slice/10
     120* Use the StatusBar for dynamic status updates
     121* http://code.google.com/p/web2pyorm/
     122
     123== CSS & Javascript debugging ==
     124* use Firebug: http://code.google.com/support/bin/answer.py?answer=77412&topic=12044
     125* use [http://www.sprymedia.co.uk/article/Visual+Event Visual Event] to see which events are active.
     126* use Venkman: http://www.mozilla.org/projects/venkman/
     127* use Fiddler for compressed files: http://www.yuiblog.com/blog/2008/06/27/fiddler
     128* http://pastebin.me (allows edits of HTML & previews)
     129* http://jsfiddle.net (allows edits of JS & previews)
     130* http://yura.thinkweb2.com/domlint/
     131 * http://www.jslint.com/lint.html
     132* IE6 cheatsheet: http://www.virtuosimedia.com/tutorials/ultimate-ie6-cheatsheet-how-to-fix-25-internet-explorer-6-bugs
    132133
    133134== !JavaScript ==
    134  * http://trac.openlayers.org/wiki/Documentation#BeforeGettingStarted--TheTechnologiesBehindOpenLayers
    135  * http://eloquentjavascript.net
    136  * Dynamically load additional JS: http://unixpapa.com/js/dyna.html
    137  * [http://aymanh.com/9-javascript-tips-you-may-not-know#String_Concatenation_vs._Array.join array.join instead of string concatenation] (& other tips)
    138  * Ensure variable names use only Word characters:
    139   * Python: {{{variable_name = re.sub('\W', '_', string)}}}
    140   * JS: {{{var RE_JSVAR = new RegExp("\W", "g"); var variable_name = string.replace(RE_JSVAR, '_');}}}
    141  * Loop timings: http://blogs.sun.com/greimer/entry/best_way_to_code_a
    142  * Closures: http://www.javascriptkit.com/javatutors/closures.shtml
    143  * Memory Leaks: http://www.javascriptkit.com/javatutors/closuresleak/index.shtml
     135* http://trac.openlayers.org/wiki/Documentation#BeforeGettingStarted--TheTechnologiesBehindOpenLayers
     136* http://eloquentjavascript.net
     137* Dynamically load additional JS: http://unixpapa.com/js/dyna.html
     138* [http://aymanh.com/9-javascript-tips-you-may-not-know#String_Concatenation_vs._Array.join array.join instead of string concatenation] (& other tips)
     139* Ensure variable names use only Word characters:
     140 * Python: {{{variable_name = re.sub('\W', '_', string)}}}
     141 * JS: {{{var RE_JSVAR = new RegExp("\W", "g"); var variable_name = string.replace(RE_JSVAR, '_');}}}
     142* Loop timings: http://blogs.sun.com/greimer/entry/best_way_to_code_a
     143* Closures: http://www.javascriptkit.com/javatutors/closures.shtml
     144* Memory Leaks: http://www.javascriptkit.com/javatutors/closuresleak/index.shtml
     145
    144146=== jQuery ===
    145  * http://www.smashingmagazine.com/2008/09/16/jquery-examples-and-best-practices/
    146  * http://www.tvidesign.co.uk/blog/improve-your-jquery-25-excellent-tips.aspx
    147  * http://james.padolsey.com/javascript/things-you-may-not-know-about-jquery/
    148  * http://15daysofjquery.com/
    149  * http://jqueryfordesigners.com/jquery-tabs/
    150  * http://devsnippets.com/reviews/using-jquery-to-style-design-elements-20-impressive-plugins.html
    151  * http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN
    152  * http://www.learningjquery.com/2009/03/43439-reasons-to-use-append-correctly
    153  * Web2Py HTML Helper: http://groups.google.com/group/web2py/browse_thread/thread/ec63ee9af3ee659f
    154  * jqGrid in Web2Py: http://groups.google.com/group/web2py/browse_thread/thread/2caa0e4e0161bb8d
     147* http://www.smashingmagazine.com/2008/09/16/jquery-examples-and-best-practices/
     148* http://www.tvidesign.co.uk/blog/improve-your-jquery-25-excellent-tips.aspx
     149* http://james.padolsey.com/javascript/things-you-may-not-know-about-jquery/
     150* http://15daysofjquery.com/
     151* http://jqueryfordesigners.com/jquery-tabs/
     152* http://devsnippets.com/reviews/using-jquery-to-style-design-elements-20-impressive-plugins.html
     153* http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN
     154* http://www.learningjquery.com/2009/03/43439-reasons-to-use-append-correctly
     155* Web2Py HTML Helper: http://groups.google.com/group/web2py/browse_thread/thread/ec63ee9af3ee659f
     156* jqGrid in Web2Py: http://groups.google.com/group/web2py/browse_thread/thread/2caa0e4e0161bb8d
    155157
    156158=== Ext ===
    157  * http://extjs.com/learn/Tutorial:Introduction_to_Ext_2.0
    158  * http://extjs.com/learn/Manual:Basic_Application_Design
    159  * http://extjs.com/learn/Tutorial:Writing_a_Big_Application_in_Ext
    160  * http://extjs.com/forum/showthread.php?t=26728
    161  * http://extjs.com/learn/Ext_FAQ_Debugging
    162  * http://www.extjs.com/blog/2009/05/13/introducing-ext-direct/
    163   * http://blog.extjs.eu/know-how/mastering-ext-direct-part-1/
     159* http://extjs.com/learn/Tutorial:Introduction_to_Ext_2.0
     160* http://extjs.com/learn/Manual:Basic_Application_Design
     161* http://extjs.com/learn/Tutorial:Writing_a_Big_Application_in_Ext
     162* http://extjs.com/forum/showthread.php?t=26728
     163* http://extjs.com/learn/Ext_FAQ_Debugging
     164* http://www.extjs.com/blog/2009/05/13/introducing-ext-direct/
     165 * http://blog.extjs.eu/know-how/mastering-ext-direct-part-1/
    164166
    165167== HTML/CSS ==
    166  * http://enhance.qd-creative.co.uk/2008/06/28/the-misunderstood-div/
    167  * http://enhance.qd-creative.co.uk/2008/10/14/7-things-you-can-do-so-your-users-wont-leave/
    168  * Usability: http://www.useit.com
    169  * Progressive Enhancement (better than Graceful Degradation):
    170   * http://developer.yahoo.com/yui/articles/gbs/
    171   * http://accessites.org/site/2007/02/graceful-degradation-progressive-enhancement/
    172   * http://www.alistapart.com/articles/understandingprogressiveenhancement
    173    * http://www.alistapart.com/articles/progressiveenhancementwithcss
    174    * http://www.alistapart.com/articles/progressiveenhancementwithjavascript
    175   * http://webtips.dan.info/graceful.html
     168* http://enhance.qd-creative.co.uk/2008/06/28/the-misunderstood-div/
     169* http://enhance.qd-creative.co.uk/2008/10/14/7-things-you-can-do-so-your-users-wont-leave/
     170* Usability: http://www.useit.com
     171* Progressive Enhancement (better than Graceful Degradation):
     172 * http://developer.yahoo.com/yui/articles/gbs/
     173 * http://accessites.org/site/2007/02/graceful-degradation-progressive-enhancement/
     174 * http://www.alistapart.com/articles/understandingprogressiveenhancement
     175  * http://www.alistapart.com/articles/progressiveenhancementwithcss
     176  * http://www.alistapart.com/articles/progressiveenhancementwithjavascript
     177 * http://webtips.dan.info/graceful.html
    176178
    177179== SQL ==
     
    202204* Django ORM & JOINs: http://slott-softwarearchitect.blogspot.com/2009/07/object-models-and-relational-joins.html
    203205* Especially useful for USB (minimise disk access): http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html
     206
    204207== XSLT ==
    205  * XPath: http://www.w3schools.com/xpath/default.asp
    206  * XSLT: http://www.w3schools.com/xsl/default.asp
     208* DeveloperGuidelines#XSLT
    207209
    208210== Visualization ==
    209  * http://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen.html
    210  * http://www.ted.com/talks/david_mccandless_the_beauty_of_data_visualization.html
     211* http://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen.html
     212* http://www.ted.com/talks/david_mccandless_the_beauty_of_data_visualization.html
     213
    211214== Misc ==
    212  * Bugmail add-on for Thunderbird: https://addons.mozilla.org/en-US/thunderbird/addon/9584
     215* Bugmail add-on for Thunderbird: https://addons.mozilla.org/en-US/thunderbird/addon/9584
    213216
    214217----