localmemcache 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/README +18 -11
  2. data/Rakefile +22 -7
  3. data/VERSION +1 -1
  4. data/bench/common.rb +7 -0
  5. data/bench/gdbm_vs_lmc +10 -0
  6. data/bench/gdbm_vs_lmc.rb +29 -0
  7. data/bench/lmc_bench +11 -0
  8. data/bench/lmc_bench.rb +27 -0
  9. data/bench/memcached_bench +8 -0
  10. data/bench/memcached_bench.rb +19 -0
  11. data/bench/tyrant_bench +10 -0
  12. data/bench/tyrant_bench.rb +19 -0
  13. data/example/hello.c +1 -1
  14. data/site/doc/classes/LocalMemCache/ArgError.html +113 -0
  15. data/site/doc/classes/LocalMemCache/InitError.html +113 -0
  16. data/site/doc/classes/LocalMemCache/LocalMemCacheError.html +111 -0
  17. data/site/doc/classes/LocalMemCache/LockError.html +113 -0
  18. data/site/doc/classes/LocalMemCache/LockTimedOut.html +113 -0
  19. data/site/doc/classes/LocalMemCache/MemoryPoolClosed.html +113 -0
  20. data/site/doc/classes/LocalMemCache/MemoryPoolFull.html +113 -0
  21. data/site/doc/classes/LocalMemCache/OutOfMemoryError.html +113 -0
  22. data/site/doc/classes/LocalMemCache/RecoveryFailed.html +113 -0
  23. data/site/doc/classes/LocalMemCache/ShmError.html +113 -0
  24. data/site/doc/classes/LocalMemCache/ShmLockFailed.html +113 -0
  25. data/site/doc/classes/LocalMemCache/ShmUnlockFailed.html +113 -0
  26. data/site/doc/classes/LocalMemCache.html +515 -0
  27. data/site/doc/classes/LocalMemCache.src/M000001.html +19 -0
  28. data/site/doc/classes/LocalMemCache.src/M000002.html +18 -0
  29. data/site/doc/classes/LocalMemCache.src/M000003.html +18 -0
  30. data/site/doc/classes/LocalMemCache.src/M000004.html +39 -0
  31. data/site/doc/classes/LocalMemCache.src/M000005.html +29 -0
  32. data/site/doc/classes/LocalMemCache.src/M000006.html +23 -0
  33. data/site/doc/classes/LocalMemCache.src/M000007.html +23 -0
  34. data/site/doc/classes/LocalMemCache.src/M000008.html +22 -0
  35. data/site/doc/classes/LocalMemCache.src/M000009.html +24 -0
  36. data/site/doc/classes/LocalMemCache.src/M000010.html +24 -0
  37. data/site/doc/classes/LocalMemCache.src/M000011.html +22 -0
  38. data/site/doc/classes/LocalMemCache.src/M000012.html +22 -0
  39. data/site/doc/created.rid +1 -0
  40. data/site/doc/files/__/src/ruby-binding/extconf_rb.html +108 -0
  41. data/site/doc/files/__/src/ruby-binding/localmemcache_rb.html +108 -0
  42. data/site/doc/files/__/src/ruby-binding/rblocalmemcache_c.html +101 -0
  43. data/site/doc/fr_class_index.html +39 -0
  44. data/site/doc/fr_file_index.html +28 -0
  45. data/site/doc/fr_method_index.html +38 -0
  46. data/site/doc/index.html +24 -0
  47. data/site/doc/rdoc-style.css +208 -0
  48. data/site/index.html +50 -46
  49. data/src/lmc_common.c +22 -0
  50. data/src/lmc_common.h +4 -0
  51. data/src/lmc_hashtable.h +1 -1
  52. data/src/lmc_lock.c +17 -3
  53. data/src/lmc_shm.c +4 -2
  54. data/src/lmc_valloc.c +6 -5
  55. data/src/lmc_valloc.h +1 -0
  56. data/src/localmemcache.c +56 -35
  57. data/src/localmemcache.h +161 -4
  58. data/src/ruby-binding/localmemcache.rb +48 -16
  59. data/src/ruby-binding/rblocalmemcache.c +131 -24
  60. data/src/tests/bench.rb +1 -1
  61. data/src/tests/lmc.rb +11 -2
  62. metadata +48 -7
  63. data/INTERNALS +0 -26
  64. data/example/hello.bin +0 -0
data/README CHANGED
@@ -1,26 +1,30 @@
1
1
  Localmemcache README
2
2
  =====================
3
3
 
4
- The beauty of memcached. For local data. Blazingly fast.
4
+ A persistent key-value database based on mmap()'ed shared memory.
5
5
 
6
6
  * http://localmemcache.rubyforge.org/
7
7
 
8
8
  WHAT IS IT?
9
9
  ===========
10
10
 
11
- Localmemcache is a library for C and ruby that aims to provide an interface
12
- similar to memcached but for accessing local data instead of remote data. It's
13
- based on mmap()'ed shared memory for maximum speed.
11
+ Localmemcache is a library for C and ruby that aims to provide
12
+ an interface similar to memcached but for accessing local data instead of
13
+ remote data. It's based on mmap()'ed shared memory for maximum speed.
14
+ Since version 0.3.0 it supports persistence, also making it a fast
15
+ alternative to GDBM and Berkeley DB.
14
16
 
15
17
  SUPPORTED SYSTEMS
16
18
  =================
17
19
 
18
- - Unix (for mmap)
19
- - A CPU architecture with more than 32 bits is recommended, since otherwise you
20
- might run out of virtual address space when you use larger shared memory
21
- segments.
22
- - OS X is not supported, because it doesn't have sem_timedwait() and
23
- sem_getvalue().
20
+ - a >=64bit Unix
21
+ - a file system that offers sparse files
22
+
23
+ Note for OS X: OS X disqualifies as HFS+ doesn't have sparse files and
24
+ sem_timedwait() and sem_getvalue() aren't supported as well.
25
+
26
+ Note for FreeBSD: It has been reported that Localmemcache sometimes hangs
27
+ there, it is not yet clear what the problem is.
24
28
 
25
29
  EXAMPLE
26
30
  =======
@@ -28,7 +32,10 @@ EXAMPLE
28
32
  In Ruby:
29
33
 
30
34
  require 'localmemcache'
31
- $lm = LocalMemCache.new :namespace => "viewcounters"
35
+ # 1. the memcached way
36
+ # $lm = LocalMemCache.new :namespace => :viewcounters
37
+ # 2. the GDBM way
38
+ $lm = LocalMemCache.new :filename => "./viewcounters.lmc"
32
39
  $lm[:foo] = 1
33
40
  $lm[:foo]
34
41
  $lm.delete(:foo)
data/Rakefile CHANGED
@@ -32,6 +32,18 @@ task :sanity_test do
32
32
  "make -C src/tests/ && ./src/tests/lmc "
33
33
  end
34
34
 
35
+ task :performance_test do
36
+ sh "./configure && make -C src clean && make -C src && " +
37
+ "(cd src/ruby-binding; ruby extconf.rb) && " +
38
+ "make -C src/ruby-binding/ && " +
39
+ "(cd src/tests; ruby extconf.rb) && " +
40
+ "make -C src/tests/ && ./src/tests/lmc; " +
41
+ "./src/tests/bench; " +
42
+ "ls -al /var/tmp/localmemcache/speed-comparison.lmc && " +
43
+ "du -h /var/tmp/localmemcache/speed-comparison.lmc && " +
44
+ "uname -a && ruby -v "
45
+ end
46
+
35
47
  task :c_api_package do
36
48
  tgz = "pkg/localmemcache-#{version}.tar.gz"
37
49
  sh "test -d pkg || mkdir pkg"
@@ -42,8 +54,8 @@ end
42
54
  #task :pushsite => [:rdoc] do
43
55
  task :pushsite do
44
56
  sh "chmod 755 site"
45
- sh "chmod 644 site/*.html"
46
- sh "chmod 644 site/*.css"
57
+ sh "find site -type d | xargs chmod go+rx"
58
+ sh "find site -type f | xargs chmod go+r"
47
59
  sh 'rsync --rsh="ssh -i $HOME/.ssh/id_rsa_oss -l sck" -avz site/ sck@localmemcache.rubyforge.org:/var/www/gforge-projects/localmemcache/'
48
60
  end
49
61
 
@@ -62,19 +74,22 @@ else
62
74
  s.name = "localmemcache"
63
75
  s.version = version
64
76
  s.platform = Gem::Platform::RUBY
65
- s.summary = "The beauty of memcached. For local data. " +
66
- "Blazingly fast"
77
+ s.summary = "A persistent key-value database based on mmap()'ed shared memory."
67
78
 
68
79
  s.description = <<-EOF
69
80
 
70
- Localmemcache aims to be faster than using memcached locally by using shared
71
- memory, but providing a similar interface.
81
+ Localmemcache is a library for C and ruby that aims to provide
82
+ an interface similar to memcached but for accessing local data instead of
83
+ remote data. It's based on mmap()'ed shared memory for maximum speed.
84
+ Since version 0.3.0 it supports persistence, also making it a fast
85
+ alternative to GDBM and Berkeley DB.
86
+
72
87
  EOF
73
88
 
74
89
  s.files = manifest
75
90
  s.extensions = ['configure', 'src/ruby-binding/extconf.rb']
76
91
  s.require_path = 'src/ruby-binding'
77
- s.has_rdoc = false
92
+ s.has_rdoc = true
78
93
  s.test_files = Dir['src/test/*.rb']
79
94
 
80
95
  s.author = 'Sven C. Koehler'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
data/bench/common.rb ADDED
@@ -0,0 +1,7 @@
1
+ def measure_time(c, &block)
2
+ _then = Time.now
3
+ c.times { block.call }
4
+ now = Time.now
5
+ puts "#{(now - _then)*1000} ms"
6
+ end
7
+
data/bench/gdbm_vs_lmc ADDED
@@ -0,0 +1,10 @@
1
+ #! /bin/sh
2
+ D=`dirname $0`
3
+ DIR=`cd $D; pwd`
4
+ script=$DIR/gdbm_vs_lmc.rb
5
+
6
+ if test "x$1" = "x-d"; then
7
+ irb -r $script
8
+ else
9
+ ruby $script
10
+ fi
@@ -0,0 +1,29 @@
1
+ $DIR=File.dirname(__FILE__)
2
+ ['.', '../src/ruby-binding/'].each {|p| $:.unshift File.join($DIR, p) }
3
+
4
+ require 'common.rb'
5
+
6
+ def __test(n)
7
+ require 'localmemcache'
8
+ puts "LocalMemCache"
9
+ LocalMemCache.clear :filename => "/tmp/fruitstore.lmc"
10
+ $lm2 = LocalMemCache.new :filename=>"/tmp/fruitstore.lmc"
11
+ measure_time(n) {
12
+ r = rand(10000).to_s
13
+ $lm2.set(r, r)
14
+ $lm2.get(r)
15
+ }
16
+
17
+ require 'gdbm'
18
+ puts "GDBM"
19
+ h = GDBM.new("/tmp/fruitstore.db")
20
+ measure_time(n) {
21
+ r = rand(10000).to_s
22
+ h[r] = r
23
+ h[r]
24
+ }
25
+ h.close
26
+ end
27
+
28
+ __test(2_000_000)
29
+
data/bench/lmc_bench ADDED
@@ -0,0 +1,11 @@
1
+ #! /bin/sh
2
+ D=`dirname $0`
3
+ DIR=`cd $D; pwd`
4
+ script=$DIR/lmc_bench.rb
5
+
6
+ if test "x$1" = "x-d"; then
7
+ irb -r $script
8
+ else
9
+ #valgrind --leak-check=full --tool=memcheck ruby $script
10
+ ruby $script
11
+ fi
@@ -0,0 +1,27 @@
1
+ $DIR=File.dirname(__FILE__)
2
+ ['.', '../src/ruby-binding/'].each {|p| $:.unshift File.join($DIR, p) }
3
+
4
+ require 'localmemcache'
5
+ require 'common.rb'
6
+
7
+ LocalMemCache.clear_namespace("speed-comparison");
8
+ $lm2 = LocalMemCache.new :namespace=>"speed-comparison"
9
+
10
+ def compare_speed(n)
11
+ puts "LocalMemCache"
12
+ measure_time(n) {
13
+ r = rand(10000).to_s
14
+ $lm2.set(r, r)
15
+ $lm2.get(r)
16
+ }
17
+
18
+ puts "Ruby Hash with strings"
19
+ $hh = {}
20
+ measure_time(n) {
21
+ r = rand(10000).to_s
22
+ $hh[r] = r
23
+ $hh[r]
24
+ }
25
+ end
26
+
27
+ compare_speed(2_000_000)
@@ -0,0 +1,8 @@
1
+ #! /bin/sh
2
+
3
+ /usr/bin/memcached -m 3072 -p 11211 &
4
+ PID=$!
5
+
6
+ ruby ./memcached_bench.rb
7
+
8
+ kill $PID
@@ -0,0 +1,19 @@
1
+ $DIR=File.dirname(__FILE__)
2
+ ['.'].each {|p| $:.unshift File.join($DIR, p) }
3
+
4
+ require 'memcache'
5
+ require 'common.rb'
6
+
7
+ def __test(n)
8
+ memcache_ips = ['localhost:11211']
9
+ $cache = MemCache.new memcache_ips,
10
+ :namespace => 'rtn_',
11
+ :multithreaded => true
12
+ measure_time(n) {
13
+ r = rand(10000).to_s
14
+ $cache[r] = r
15
+ $cache[r]
16
+ }
17
+ end
18
+
19
+ __test(2_000_000)
@@ -0,0 +1,10 @@
1
+ #! /bin/sh
2
+
3
+ ttserver -port 2001 /tmp/foo.tch > /dev/null &
4
+ PID=$!
5
+
6
+ sleep 1
7
+
8
+ ruby ./tyrant_bench.rb
9
+
10
+ kill $PID
@@ -0,0 +1,19 @@
1
+ $DIR=File.dirname(__FILE__)
2
+ ['.'].each {|p| $:.unshift File.join($DIR, p) }
3
+
4
+ require 'memcache'
5
+ require './common.rb'
6
+
7
+ def __test(n)
8
+ memcache_ips = ['localhost:2001']
9
+ $cache = MemCache.new memcache_ips,
10
+ :namespace => 'rtn_',
11
+ :multithreaded => true
12
+ measure_time(n) {
13
+ r = rand(10000).to_s
14
+ $cache[r] = r
15
+ $cache[r]
16
+ }
17
+ end
18
+
19
+ __test(2_000_000)
data/example/hello.c CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  int main() {
5
5
  lmc_error_t e;
6
- local_memcache_t *lmc = local_memcache_create("viewcounters", 0, &e);
6
+ local_memcache_t *lmc = local_memcache_create("viewcounters", 0, 0, &e);
7
7
  if (!lmc) {
8
8
  fprintf(stderr, "Couldn't create localmemcache: %s\n", e.error_str);
9
9
  return 1;
@@ -0,0 +1,113 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: LocalMemCache::ArgError</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">LocalMemCache::ArgError</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/__/src/ruby-binding/localmemcache_rb.html">
59
+ ../src/ruby-binding/localmemcache.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ <a href="LocalMemCacheError.html">
69
+ LocalMemCacheError
70
+ </a>
71
+ </td>
72
+ </tr>
73
+ </table>
74
+ </div>
75
+ <!-- banner header -->
76
+
77
+ <div id="bodyContent">
78
+
79
+
80
+
81
+ <div id="contextContent">
82
+
83
+
84
+
85
+ </div>
86
+
87
+
88
+ </div>
89
+
90
+
91
+ <!-- if includes -->
92
+
93
+ <div id="section">
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+ <!-- if method_list -->
103
+
104
+
105
+ </div>
106
+
107
+
108
+ <div id="validator-badges">
109
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
110
+ </div>
111
+
112
+ </body>
113
+ </html>
@@ -0,0 +1,113 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: LocalMemCache::InitError</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">LocalMemCache::InitError</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/__/src/ruby-binding/localmemcache_rb.html">
59
+ ../src/ruby-binding/localmemcache.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ <a href="LocalMemCacheError.html">
69
+ LocalMemCacheError
70
+ </a>
71
+ </td>
72
+ </tr>
73
+ </table>
74
+ </div>
75
+ <!-- banner header -->
76
+
77
+ <div id="bodyContent">
78
+
79
+
80
+
81
+ <div id="contextContent">
82
+
83
+
84
+
85
+ </div>
86
+
87
+
88
+ </div>
89
+
90
+
91
+ <!-- if includes -->
92
+
93
+ <div id="section">
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+ <!-- if method_list -->
103
+
104
+
105
+ </div>
106
+
107
+
108
+ <div id="validator-badges">
109
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
110
+ </div>
111
+
112
+ </body>
113
+ </html>
@@ -0,0 +1,111 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: LocalMemCache::LocalMemCacheError</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">LocalMemCache::LocalMemCacheError</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/__/src/ruby-binding/localmemcache_rb.html">
59
+ ../src/ruby-binding/localmemcache.rb
60
+ </a>
61
+ <br />
62
+ </td>
63
+ </tr>
64
+
65
+ <tr class="top-aligned-row">
66
+ <td><strong>Parent:</strong></td>
67
+ <td>
68
+ StandardError
69
+ </td>
70
+ </tr>
71
+ </table>
72
+ </div>
73
+ <!-- banner header -->
74
+
75
+ <div id="bodyContent">
76
+
77
+
78
+
79
+ <div id="contextContent">
80
+
81
+
82
+
83
+ </div>
84
+
85
+
86
+ </div>
87
+
88
+
89
+ <!-- if includes -->
90
+
91
+ <div id="section">
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+ <!-- if method_list -->
101
+
102
+
103
+ </div>
104
+
105
+
106
+ <div id="validator-badges">
107
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
108
+ </div>
109
+
110
+ </body>
111
+ </html>