nosql-tutorial 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +20 -0
- data/Rakefile +34 -0
- data/VERSION.yml +5 -0
- data/lib/config.ru +12 -0
- data/lib/nosql.rb +64 -0
- data/lib/public/doc/mail/body.txt +1 -0
- data/lib/public/doc/mail/mail-00.rb +31 -0
- data/lib/public/doc/mail/mail-01.rb +29 -0
- data/lib/public/doc/mail/mail-10.rb +24 -0
- data/lib/public/doc/mail/motylek.jpeg +0 -0
- data/lib/public/doc/plain-text-files/contacts.yaml +11 -0
- data/lib/public/doc/plain-text-files/contacts_g.rb +105 -0
- data/lib/public/doc/plain-text-files/contacts_g_test.rb +51 -0
- data/lib/public/doc/plain-text-files/contacts_y.rb +57 -0
- data/lib/public/doc/plain-text-files/contacts_y_test.rb +39 -0
- data/lib/public/doc/plain-text-files/gdbm-example.rb +22 -0
- data/lib/public/doc/using-plain-text-files-for-data-persistence.pdf +0 -0
- data/lib/public/favicon.ico +0 -0
- data/lib/public/images/conan_doyle.jpg +0 -0
- data/lib/public/images/datamapper.png +0 -0
- data/lib/public/images/datamapper.svg +95 -0
- data/lib/public/stylesheets/fonts/Cyklop-Italic.otf +0 -0
- data/lib/public/stylesheets/icons/cross.png +0 -0
- data/lib/public/stylesheets/icons/doc.png +0 -0
- data/lib/public/stylesheets/icons/email.png +0 -0
- data/lib/public/stylesheets/icons/external.png +0 -0
- data/lib/public/stylesheets/icons/feed.png +0 -0
- data/lib/public/stylesheets/icons/im.png +0 -0
- data/lib/public/stylesheets/icons/key.png +0 -0
- data/lib/public/stylesheets/icons/pdf.png +0 -0
- data/lib/public/stylesheets/icons/tick.png +0 -0
- data/lib/public/stylesheets/icons/visited.png +0 -0
- data/lib/public/stylesheets/icons/xls.png +0 -0
- data/lib/public/stylesheets/ie.css +27 -0
- data/lib/public/stylesheets/nosql.css +166 -0
- data/lib/public/stylesheets/print.css +30 -0
- data/lib/public/stylesheets/screen.css +249 -0
- data/lib/public/stylesheets/src/body.png +0 -0
- data/lib/public/stylesheets/src/grid.png +0 -0
- data/lib/public/stylesheets/src/make_background_images.sh +11 -0
- data/lib/public/stylesheets/src/shattered_mirror.png +0 -0
- data/lib/public/stylesheets/uv.css +121 -0
- data/lib/views/ar.rdiscount +5 -0
- data/lib/views/datamapper.rdiscount +43 -0
- data/lib/views/layout.rdiscount +38 -0
- data/lib/views/main.rdiscount +47 -0
- data/lib/views/mongodb.rdiscount +41 -0
- data/lib/views/redis.rdiscount +20 -0
- data/lib/views/ruby-intro.rdiscount +37 -0
- data/lib/views/serializacja-danych.rdiscount +75 -0
- data/lib/views/skel.rdiscount +3 -0
- data/lib/views/summary.rdiscount +32 -0
- metadata +175 -0
Binary file
|
Binary file
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
convert -size 1x913 xc:'#FEF9F0' a.png
|
4
|
+
convert -size 1x22 xc:'#0B030C' -alpha set -channel A -fx '0.61' b.png
|
5
|
+
convert a.png b.png -append -rotate 90 body.png
|
6
|
+
rm a.png b.png
|
7
|
+
#convert -size 1x913 xc:'#0B030C' -alpha set -channel A -fx '0.61' a.png
|
8
|
+
#convert -size 1x22 xc:'#0B030C' -alpha set -channel A -fx '0.61' b.png
|
9
|
+
#convert a.png b.png -append -rotate 90 h1.png
|
10
|
+
#rm a.png b.png
|
11
|
+
#convert -size 1024x100 xc:'#0B030C' -alpha set -channel A -fx '0.61' h1.png
|
Binary file
|
@@ -0,0 +1,121 @@
|
|
1
|
+
pre.dawn .MetaSeparator {
|
2
|
+
font-weight: bold;
|
3
|
+
background-color: #DCDCDC;
|
4
|
+
color: #19356D;
|
5
|
+
}
|
6
|
+
pre.dawn .SupportVariable {
|
7
|
+
color: #234A97;
|
8
|
+
}
|
9
|
+
pre.dawn .Constant {
|
10
|
+
font-weight: bold;
|
11
|
+
color: #811F24;
|
12
|
+
}
|
13
|
+
pre.dawn .EmbeddedSource {
|
14
|
+
background-color: #829AC2;
|
15
|
+
}
|
16
|
+
pre.dawn .StringRegexpConstantCharacterEscape {
|
17
|
+
font-weight: bold;
|
18
|
+
color: #811F24;
|
19
|
+
}
|
20
|
+
pre.dawn .Support {
|
21
|
+
color: #691C97;
|
22
|
+
}
|
23
|
+
pre.dawn .MarkupList {
|
24
|
+
color: #693A17;
|
25
|
+
}
|
26
|
+
pre.dawn .Storage {
|
27
|
+
color: #A71D5D;
|
28
|
+
font-style: italic;
|
29
|
+
}
|
30
|
+
pre.dawn .line-numbers {
|
31
|
+
background-color: #7496CF;
|
32
|
+
color: #000000;
|
33
|
+
}
|
34
|
+
pre.dawn .StringConstant {
|
35
|
+
font-weight: bold;
|
36
|
+
color: #696969;
|
37
|
+
}
|
38
|
+
pre.dawn .MarkupUnderline {
|
39
|
+
text-decoration: underline;
|
40
|
+
color: #080808;
|
41
|
+
}
|
42
|
+
pre.dawn .MarkupHeading {
|
43
|
+
font-weight: bold;
|
44
|
+
color: #19356D;
|
45
|
+
}
|
46
|
+
pre.dawn .SupportConstant {
|
47
|
+
color: #B4371F;
|
48
|
+
}
|
49
|
+
pre.dawn .MarkupQuote {
|
50
|
+
background-color: #C5C5C5;
|
51
|
+
color: #0B6125;
|
52
|
+
font-style: italic;
|
53
|
+
}
|
54
|
+
pre.dawn .StringRegexpSpecial {
|
55
|
+
font-weight: bold;
|
56
|
+
color: #CF5628;
|
57
|
+
}
|
58
|
+
pre.dawn .InvalidIllegal {
|
59
|
+
background-color: #B52A1D;
|
60
|
+
color: #F8F8F8;
|
61
|
+
font-style: italic;
|
62
|
+
}
|
63
|
+
pre.dawn .MarkupDeleted {
|
64
|
+
color: #B52A1D;
|
65
|
+
}
|
66
|
+
pre.dawn .MarkupRaw {
|
67
|
+
background-color: #C5C5C5;
|
68
|
+
color: #234A97;
|
69
|
+
}
|
70
|
+
pre.dawn .SupportFunction {
|
71
|
+
color: #693A17;
|
72
|
+
}
|
73
|
+
pre.dawn .PunctuationSeparator {
|
74
|
+
color: #794938;
|
75
|
+
}
|
76
|
+
pre.dawn .StringRegexp {
|
77
|
+
color: #CF5628;
|
78
|
+
}
|
79
|
+
pre.dawn .StringEmbeddedSource {
|
80
|
+
background-color: #829AC2;
|
81
|
+
color: #080808;
|
82
|
+
}
|
83
|
+
pre.dawn .MarkupLink {
|
84
|
+
color: #234A97;
|
85
|
+
font-style: italic;
|
86
|
+
}
|
87
|
+
pre.dawn .MarkupBold {
|
88
|
+
font-weight: bold;
|
89
|
+
color: #080808;
|
90
|
+
}
|
91
|
+
pre.dawn .StringVariable {
|
92
|
+
color: #234A97;
|
93
|
+
}
|
94
|
+
pre.dawn .String {
|
95
|
+
color: #0B6125;
|
96
|
+
}
|
97
|
+
pre.dawn .Keyword {
|
98
|
+
color: #794938;
|
99
|
+
}
|
100
|
+
pre.dawn {
|
101
|
+
background-color: #F5F5F5;
|
102
|
+
color: #080808;
|
103
|
+
}
|
104
|
+
pre.dawn .MarkupItalic {
|
105
|
+
color: #080808;
|
106
|
+
font-style: italic;
|
107
|
+
}
|
108
|
+
pre.dawn .InvalidDeprecated {
|
109
|
+
font-weight: bold;
|
110
|
+
color: #B52A1D;
|
111
|
+
}
|
112
|
+
pre.dawn .Variable {
|
113
|
+
color: #234A97;
|
114
|
+
}
|
115
|
+
pre.dawn .Entity {
|
116
|
+
color: #BF4F24;
|
117
|
+
}
|
118
|
+
pre.dawn .Comment {
|
119
|
+
color: #5A525F;
|
120
|
+
font-style: italic;
|
121
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#### {% title "Datamapper" %}
|
2
|
+
|
3
|
+
# Datamapper: dm-couchdb, …
|
4
|
+
|
5
|
+
|
6
|
+
## Instalacja
|
7
|
+
|
8
|
+
Instalujemy następujące gemy:
|
9
|
+
|
10
|
+
sudo gem install dm-core dm-more
|
11
|
+
sudo gem install do_sqlite3 do_postgres
|
12
|
+
sudo gem install dm-validations dm-timestamps
|
13
|
+
sudo gem install dm-aggregates dm-types
|
14
|
+
|
15
|
+
oraz trochę wtyczek. Wszystkie są
|
16
|
+
[opisane tutaj](http://datamapper.org/doku.php?id=docs:more).
|
17
|
+
|
18
|
+
|
19
|
+
## Zestawianie połączenia z bazą SQL
|
20
|
+
|
21
|
+
SQLite
|
22
|
+
|
23
|
+
:::ruby
|
24
|
+
# baza danych w RAM
|
25
|
+
DataMapper.setup(:default, 'sqlite3::memory:')
|
26
|
+
# baza danych plikiem
|
27
|
+
DataMapper.setup(:default, "sqlite3:///#{Dir.pwd}/test.sqlite")
|
28
|
+
|
29
|
+
PostgreSQL
|
30
|
+
|
31
|
+
:::ruby
|
32
|
+
# Postgres 8.2+
|
33
|
+
DataMapper.setup(:default, 'postgres://localhost/test')
|
34
|
+
|
35
|
+
**Uwaga**: You may be wondering how to be more specific about your database
|
36
|
+
connection. The second argument can be a hash, containing :host,
|
37
|
+
:adapter, :database, :username, :password, :socket, etc. These are
|
38
|
+
database-specific but this ought to get you going.
|
39
|
+
|
40
|
+
|
41
|
+
## Zestawianie połączenia z bazą noSQL
|
42
|
+
|
43
|
+
TODO
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
5
|
+
|
6
|
+
<%= stylesheet_link_tag "/stylesheets/screen.css", "/stylesheets/uv.css", "/stylesheets/nosql.css" %>
|
7
|
+
<%= stylesheet_link_tag "/stylesheets/print.css", :media => "print" %>
|
8
|
+
<!--[if IE]>
|
9
|
+
<%= stylesheet_link_tag "css/blueprint/ie.css" %>
|
10
|
+
<![endif]-->
|
11
|
+
|
12
|
+
<title><%= "WB_NOSQL" + page_title %></title>
|
13
|
+
</head>
|
14
|
+
<body>
|
15
|
+
<div class="span-21" id="header">
|
16
|
+
<div class="push-1 span-7">
|
17
|
+
<a href="/nosql/"><span id="wb">WB</span>@<span id="tutorial">NOSQL</span></a>
|
18
|
+
</div>
|
19
|
+
<div class="span-13 last">
|
20
|
+
<div class="append-1" id="links">
|
21
|
+
<a href="http://sigma.ug.edu.pl/~wbzyl/">home</a>
|
22
|
+
<a href="http://sigma.ug.edu.pl/~wbzyl/galeria/zakopane/2009-08-28-zawrat/">galeria</a>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
|
27
|
+
<div class="span-21 container"><!-- showgrid -->
|
28
|
+
<div class="push-1 span-12" id="content">
|
29
|
+
|
30
|
+
<%= yield %>
|
31
|
+
|
32
|
+
</div>
|
33
|
+
<div class="span-8 last">
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
</body>
|
38
|
+
</html>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Not only SQL – Data Persistence
|
2
|
+
|
3
|
+
<blockquote>
|
4
|
+
{%= image_tag "/images/conan_doyle.jpg", :alt => "[Sir Arthur Conan Doyle]" %}
|
5
|
+
<p>
|
6
|
+
I never guess. It is a capital mistake to theorize before one has
|
7
|
+
data. Insensibly one begins to twist facts to suit theories, instead
|
8
|
+
of theories to suit facts.
|
9
|
+
</p>
|
10
|
+
<p class="author">— Sir Arthur Conan Doyle</p>
|
11
|
+
</blockquote>
|
12
|
+
|
13
|
+
Na początek dwa cytaty.
|
14
|
+
|
15
|
+
[L. Carlson, L. Richardson][ruby receptury]:
|
16
|
+
Wszyscy chcą pozostawić po sobie coś trwałego. […]
|
17
|
+
Każdy program, który piszemy, pozostawia jakiś ślad swojego działania
|
18
|
+
(w najprostszym przypadku są to dane wyświetlane na standardowym
|
19
|
+
urządzeniu wyjściowym). Większość bardziej rozbudowanych programów
|
20
|
+
idzie o krok dalej: zapisują one – w pliku o określonej strukturze –
|
21
|
+
dane stanowiące rezultat jednego uruchomienia, by przy następnym
|
22
|
+
uruchomieniu rozpocząć działanie w stanie, w którym zakończyła się
|
23
|
+
poprzednia sesja. **Istnieje wiele sposobów takiego
|
24
|
+
*utrwalania danych*, zarówno bardzo prostych, jak i wielce
|
25
|
+
skomplikowanych.**
|
26
|
+
|
27
|
+
[K. Haines][key-value stores part 1]:
|
28
|
+
„Applications, whether web apps, simple dynamic websites or command
|
29
|
+
line apps, frequently need some sort of persistent data store. As a
|
30
|
+
result, databases have become ubiquitous on modern systems, and
|
31
|
+
because of this chicken and egg relationship, programmers will often
|
32
|
+
habitually reach for a relational database when the project only calls
|
33
|
+
for a way to persist data.”
|
34
|
+
|
35
|
+
## Notatki do wykładów
|
36
|
+
|
37
|
+
1. {%= link_to "Co już było…", "/summary" %}
|
38
|
+
1. {%= link_to "Wprowadzenie do języka Ruby", "/ruby-intro" %}
|
39
|
+
1. {%= link_to "Serializacja danych", "/serializacja-danych" %}
|
40
|
+
1. {%= link_to "Redis datastore", "/redis" %}
|
41
|
+
1. {%= link_to "ORM na przykładzie ActiveRecord", "/ar" %}
|
42
|
+
1. {%= link_to "Datamapper dla SQL i noSQL", "/datamapper" %}
|
43
|
+
1. {%= link_to "MongoDB", "/mongodb" %}
|
44
|
+
|
45
|
+
|
46
|
+
[key-value stores part 1]: http://www.engineyard.com/blog/2009/key-value-stores-in-ruby/ "Kirk Haines, Key-Value Stores in Ruby: Part 1"
|
47
|
+
[ruby receptury]: http://helion.pl/ksiazki/rubyre.htm "Ruby Receptury, Bazy danych i trwałość obiektów."
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#### {% title "MongoDB" %}
|
2
|
+
|
3
|
+
# [MongoDB] [mongodb]
|
4
|
+
|
5
|
+
MongoDB can be thought of as the goodness that erupts when a
|
6
|
+
traditional key-value store collides with a relational database
|
7
|
+
management system, mixing their essences into something that’s not
|
8
|
+
quite either, but rather something novel and fascinating.
|
9
|
+
|
10
|
+
MongoDB is written in C++ and offers the following features:
|
11
|
+
|
12
|
+
* Collection oriented storage: easy storage of object/JSON-style data
|
13
|
+
* Dynamic queries
|
14
|
+
* Full index support, including on inner objects and embedded arrays
|
15
|
+
* Query profiling
|
16
|
+
* Replication and fail-over support
|
17
|
+
* Efficient storage of binary data including large objects (e.g. photos and videos)
|
18
|
+
* Auto-sharding for cloud-level scalability (currently in alpha)
|
19
|
+
|
20
|
+
MongoDB is a document-oriented database.
|
21
|
+
|
22
|
+
Zob. też [Ruby driver for MongoDB] [mongodb ruby].
|
23
|
+
|
24
|
+
[MongoDB: A Light in the Darkness!] [mongodb-light]
|
25
|
+
|
26
|
+
[MongoDB Example: centralized logging](http://blog.mongodb.org/post/172254834/mongodb-is-fantastic-for-logging)
|
27
|
+
|
28
|
+
[MongoDB Blog] [mongodb-blog]
|
29
|
+
|
30
|
+
[Getting Started With MongoMapper and Rails](http://railstips.org/2009/7/23/getting-started-with-mongomapper-and-rails)
|
31
|
+
|
32
|
+
[MongoMapper Indy.rb Presentation](http://railstips.org/2009/8/19/mongomapper-indy-rb-presentation)
|
33
|
+
|
34
|
+
[What If A Key/Value Store Mated With A Relational Database System?](http://railstips.org/2009/6/3/what-if-a-key-value-store-mated-with-a-relational-database-system)
|
35
|
+
|
36
|
+
|
37
|
+
[mongodb-light]: http://www.engineyard.com/blog/2009/mongodb-a-light-in-the-darkness-key-value-stores-part-5/ "A Light in the Darkness"
|
38
|
+
[mongodb-blog]: http://blog.mongodb.org/ "MongoDB Blog"
|
39
|
+
|
40
|
+
[mongodb]: http://www.engineyard.com/blog/2009/mongodb-a-light-in-the-darkness-key-value-stores-part-5/ "A Light in the Darkness"
|
41
|
+
[mongodb ruby]: "http://github.com/mongodb/mongo-ruby-driver" "Ruby driver for the 10gen MongoDB"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#### {% title "Redis" %}
|
2
|
+
|
3
|
+
# Redis datastore
|
4
|
+
|
5
|
+
[To Redis or Not To Redis?] [redis-or-not]
|
6
|
+
|
7
|
+
[Redis] [redis] is key/value store:
|
8
|
+
|
9
|
+
* which is blazingly fast
|
10
|
+
* works best when data set is small enough that it can fit in available RAM
|
11
|
+
* it's OK if some recently updated records are lost in a catastrophic failure
|
12
|
+
* makes your life would a lot easier whenever you want cheap and easy
|
13
|
+
set and list operations
|
14
|
+
|
15
|
+
Zob. też [Object-Hash Mapping for Redis] [ohm].
|
16
|
+
|
17
|
+
|
18
|
+
[redis]: http://www.engineyard.com/blog/2009/key-value-stores-for-ruby-part-4-to-redis-or-not-to-redis/ "Redis or not…"
|
19
|
+
[ohm]: "http://ohm.keyvalue.org/" "Object-Hash Mapping for Redis"
|
20
|
+
[redis-or-not]: http://www.engineyard.com/blog/2009/key-value-stores-for-ruby-part-4-to-redis-or-not-to-redis/ "Redis orn not…"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#### {% title "Wprowadzenie do języka Ruby" %}
|
2
|
+
|
3
|
+
# Wprowadzenie do języka Ruby
|
4
|
+
|
5
|
+
* David Flanagan, Yukihiro Matsumoto.
|
6
|
+
[Ruby. Programowanie] [ruby]
|
7
|
+
* Aleksander Pohl. [Ruby Intro] [apohllo ruby]
|
8
|
+
* [Why's (Poignant) Guide to Ruby] [poignant guide]
|
9
|
+
* [Mr. Neighborly's Humble Little Ruby Book] [humblelittlerubybook]
|
10
|
+
([pdf](http://www.humblelittlerubybook.com/book/hlrb.pdf)
|
11
|
+
|
12
|
+
|
13
|
+
## Kilka przykładów na początek
|
14
|
+
|
15
|
+
TODO
|
16
|
+
|
17
|
+
|
18
|
+
## Klasy IO, File, Dir…
|
19
|
+
|
20
|
+
[Dokumentacja klasy IO][ruby io].
|
21
|
+
|
22
|
+
|
23
|
+
## Gemy: Mail, ActionMailer
|
24
|
+
|
25
|
+
TODO: wysyłanie i pobieranie.
|
26
|
+
|
27
|
+
|
28
|
+
## Pobieramy dane za pomocą RSS
|
29
|
+
|
30
|
+
TODO: repertuar kin w trójmieście.
|
31
|
+
|
32
|
+
|
33
|
+
[ruby]: http://helion.pl/ksiazki/rubypr.htm "Ruby. Programowanie"
|
34
|
+
[apohllo ruby]: http://www.apohllo.pl/dydaktyka/ruby/intro/ "Ruby Intro"
|
35
|
+
[poignant guide]: http://www.ember.co.nz/files/resources/whys-poignant-guide-to-ruby.pdf "Poignant Guide to Ruby"
|
36
|
+
[humblelittlerubybook]: http://www.humblelittlerubybook.com/book/html/index.html
|
37
|
+
[ruby io]: http://ruby-doc.org/core/classes/IO.html "Class: IO"
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#### {% title "Serializacja danych" %}
|
2
|
+
|
3
|
+
# Serializacja danych
|
4
|
+
|
5
|
+
Po kolei: Marshal, PStore, CSV, YAML
|
6
|
+
|
7
|
+
|
8
|
+
## Marshall
|
9
|
+
|
10
|
+
TODO
|
11
|
+
|
12
|
+
|
13
|
+
## PStore datastore
|
14
|
+
|
15
|
+
Ruby comes with a simple hash based key-value store called *PStore*.
|
16
|
+
If you’ve never used it, it’s definitely worth learning. For simple
|
17
|
+
data storage, PStore can be very useful.
|
18
|
+
|
19
|
+
[PStore] [pstore] implements a file based persistance mechanism based
|
20
|
+
on a Hash. User code can store hierarchies of Ruby objects (values)
|
21
|
+
into the data store file by name (keys). An object hierarchy may be
|
22
|
+
just a single object.
|
23
|
+
|
24
|
+
|
25
|
+
## YAML
|
26
|
+
|
27
|
+
Sesja irb:
|
28
|
+
|
29
|
+
:::ruby
|
30
|
+
hash = { :one => 1, :two => 2, :colors => ["red", "green", "blue"] }
|
31
|
+
require 'yaml'
|
32
|
+
puts hash.to_yaml
|
33
|
+
y_hash = hash.to_yaml
|
34
|
+
new_hash = YAML.load(y_hash)
|
35
|
+
new_hash == hash #=> true
|
36
|
+
|
37
|
+
<b>You need a way</b> to automate the storage and retrieval of professional
|
38
|
+
and personal contacts (an address book), but you want it to be in
|
39
|
+
plain text so that you can edit the entries in a text editor as well
|
40
|
+
as alter them <i>programmatically</i>.
|
41
|
+
|
42
|
+
|
43
|
+
## Proste bazy danych
|
44
|
+
|
45
|
+
You want a simple contact manager, and you need to share the files
|
46
|
+
with someone who may not have access to YAML.
|
47
|
+
|
48
|
+
### Rozwiązanie
|
49
|
+
|
50
|
+
Our hypothetical YAML crisis provides a chance to look at a gdbm-based
|
51
|
+
solution. We'll aim for something that's as close as possible to
|
52
|
+
the YAML version of the contact manager, and the best way to guarantee
|
53
|
+
that closeness is to use a similar test suite.
|
54
|
+
|
55
|
+
|
56
|
+
## Stone: Dead-Simple Data Persistence
|
57
|
+
|
58
|
+
To może być ciekawe [Dead-Simple Data Persistence] [stone].
|
59
|
+
|
60
|
+
For small applications, a database can be overkill for storing your
|
61
|
+
data in a consistent and organized manner. Therefore, Stone was built
|
62
|
+
to provide plug-and-play data persistence for any application or
|
63
|
+
framework. It is fast, and it is easy… therefore it is good.
|
64
|
+
|
65
|
+
Instalacja:
|
66
|
+
|
67
|
+
sudo gem install stone
|
68
|
+
|
69
|
+
Czy to będzie działać z Sinatrą? Przykład: Fortunka?
|
70
|
+
|
71
|
+
|
72
|
+
#### Linki
|
73
|
+
|
74
|
+
[stone]: http://stone.rubyforge.org/ "Dead-Simple Data Persistence"
|
75
|
+
[pstore]: http://www.ruby-doc.org/stdlib/libdoc/pstore/rdoc/classes/PStore.html "PStore"
|