text:
This guide provides information for developers who want to use the Couchbase Ruby SDK to build applications that use Couchbase Server.
This chapter will teach you the basics of Couchbase and how to interact with it through the Ruby Client SDK.
If you haven't already, download the latest Couchbase Server 2.0 release and
install it. While following the download instructions and setup wizard, make
sure install the beer-sample
default bucket. It contains sample data of beers
and breweries, which we'll be using in our examples here. If you've already
installed Couchbase Server 2.0 and didn't install the beer-sample
bucket (or
if you deleted it), just open the Web-UI and navigate to "Settings/Sample
Buckets". Activate the beer-sample
checkbox and click "Create". In the right
hand corner you'll see a notification box that will disappear once the bucket is
ready to be used.
Here's a quick outline of what you'll learn in this chapter:
Install the library with its dependencies.
Write a simple program to demonstrate connecting to Couchbase and saving some documents.
From here on, we'll assume that you have a Couchbase Server 2.0 release running
and the beer-sample
bucket configured. If you need any help on setting up
everything, there is plenty of documentation available:
Using the Couchbase Web Console, for information on using the Couchbase Administrative Console,
Couchbase CLI, for the command line interface,
Couchbase REST API, for creating and managing Couchbase resources.
Before you start you should have a working Ruby environment up and running. We recommend Ruby 1.9.2 or 1.8.7 http://ruby-lang.org.
You can verify that Ruby is installed by typing the following command:
shell> ruby -v
ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-linux]
Another dependency needed for the client is libcouchbase. Please consult C Client Library page about ways to get it on your system. Here we will assume you are using the Ubuntu/Debian GNU/Linux family and have the apt
Note that the libcouchbase dependency is not needed if you are on Microsoft Windows, as all dependencies are bundled in the source.
Once you have installed libcouchbase, you are then ready to install the most recent client using rubygems.
shell> gem install couchbase
Fetching: couchbase-1.2.0.gem (100%)
Building native extensions. This could take a while... Successfully installed
couchbase-1.2.0 1 gem installed
Lets load and verify the library version.
shell> ruby -rrubygems -rcouchbase -e 'puts Couchbase::VERSION' 1.2.0
The TCP/IP port allocation on Windows by default includes a restricted number of ports available for client communication. For more information on this issue, including information on how to adjust the configuration and increase the available ports, see MSDN: Avoiding TCP/IP Port Exhaustion.
To follow the tradition of programming tutorials, we'll start with "Hello Couchbase". In the first example, we'll connect to the Cluster, retrieve a document, print it out and modify it. This first example contains the full source code, but in later example we'll omit the preamble and assume we're already connected to the cluster.
require 'rubygems'
require 'couchbase'
client = Couchbase.connect(:bucket => "beer-sample",
:host => "localhost")
beer = client.get("aass_brewery-juleol")
puts "#{beer['name']}, ABV: #{beer['abv']}"
beer['comment'] = "Random beer from Norway"
client.replace("aass_brewery-juleol", beer)
While this code should be very easy to grasp, there is a lot going on worth a little more discussion:
Connecting: the Couchbase.connect
basically creates an instance of
class internally passing all arguments to its contructor.
You can see complete list of options on the API documentation
In our example the most interesting option is :bucket
. Because our data bucket
isn't "default" we must specify it during connection. The bucket is the
container for all your documents. Inside a bucket, a key — the identifier for a
document — must be unique.
In production environments, it is recommended to use a password on a bucket
(this can be configured during bucket creation), but when you are just starting
out using the default bucket without a password is fine. Note that the
bucket also doesn't have a password, so just change the bucket
name and you're set. Another option is :host
which tells the client library
the address of the cluster. While passing in only one host is fine, it is
strongly recommended to add two or three (of course, if your cluster has more
than one node) and use :node_list
option instead. It is important to
understand that this list does not have to contain all nodes in the
cluster — you just need to provide a few so that during the initial bootstrap
phase the Client is able to connect to the server. Any two or three nodes will
be fine, but maintain this list. After this has happened, the Client
automatically fetches the cluster configuration and keeps it up to date, even
when the cluster topology changes. This means that you don't need to change your
application config at all when you resize your cluster.
Set and get: these two operations are the most fundamental ones. You can use set
to create or completely replace a document inside your bucket and get to read it
back afterwards. There are lots of arguments and variations, but if you just use
them as shown in the previous example will get you pretty far. The sample is
using the Couchbase::Bucket#replace
operation. It behaves exactly like #set
but will raise an error if the document isn't in the bucket. Note that by
default all operations are using JSON to store your documents, so make sure it
is possible to represent your values in this format. If not, you might use
format. Find more info about the formats in the API documentation.
Disconnecting: at the end of the program (or when you shutdown your server
instance), you should use the Couchbase::Bucket#disconnect
method. But you
should know that the instance will be disconnected properly if it is destroyed
by garbage collector.
That's it. We're ready to run our first Couchbase program.
shell> ruby hello.rb Juleøl, ABV: 5.9
A document in Couchbase Server consists of a value and meta information, like a unique key, a CAS value, flags etc. These are all stored in a bucket. A document can be anything, but it is recommended to use the JSON format. JSON is very convenient for storing structured data with little overhead, and is also used inside the View engine. This means that if you want to get most out of Couchbase Server 2.0, use JSON.
The couchbase client will use any of accessible JSON libraries supported by
multi_json gem. This mean if your
values are serializable with MultiJson.dump
, you can pass them to mutator
methods and be sure you will get them later in the same form.
The following chapter introduces the basic operations that you can use as the fundamental building blocks of your application.
Here's a quick outline of what you'll learn in this chapter:
Write a program to demonstrate using Create, Read, Update, Delete (CRUD) operations on documents.
Explore some of the API methods that will take you further than what you've seen previously.
Couchbase Server provides a set of commands to store documents. The commands are very similar to each other and differ only in their meaning on the server-side. These are:
Command | Description |
set |
Stores a document in Couchbase Server (identified by its unique key) and overrides the previous document (if there was one). |
add |
Adds a document in Couchbase Server (identified by its unique key) and fails if there is already a document with the same key stored. |
replace |
Replaces a document in Couchbase Server (identified by its unique key) and fails if there is no document with the given key already in place. |
There are also additional commands mutation commands, which do make sense when
you are working in :plain
mode, because they are implemented on the server and
not JSON-aware. But still they might be useful in your application:
Command | Description |
prepend |
Prepend given string to the value. The concatenation is done on the server side. |
append |
Append given string to the value. The concatenation is also done on the server side. |
increment |
Increment, atomically, the value. The value is a string representation of an unsigned integer. The new value is returned by the operation. By default it will increment by one. See API reference for other options. |
decrement |
Decrement, atomically, the value. The value is a string representation of an unsigned integer. The new value is returned by the operation. By default it will decrement by one. See API reference for other options. |
The SDK provides several options for these operations, but to start out here are the simplest forms:
key = "aass_brewery-juleol"
doc = {"name" => "Juleøl", "abv" => 5.9}
client.add(key, doc);
client.set(key, doc);
client.replace(key, doc);
With Couchbase Server 2.0, you have two ways of fetching your documents: either by the unique key through the get method, or through Views. Since Views are more complex, let's just look at a simple get first:
doc = client.get("aass_brewery-juleol")
keys = ["foo", "bar"]
docs = client.get(keys, :quiet => true)
In this case you will receve the Hash document you stored earlier. If there no
such key in the bucket, the exception Couchbase::Error:NotFound
will be
raised. But you can suppress all NotFound
errors by using option :quiet =>
and the method will return nil
instead. The Couchbase::Bucket#get
method can also accept list of keys returning list of documents.
With Couchbase Server 2.0, the very powerful ability to query your documents across this distributed system through secondary indexes (Views) has been added to your toolbelt. This guide gets you started on how to use them through the Ruby SDK, if you want to learn more please refer to the chapter in the Couchbase Server 2.0 documentation.
Once you created your View in the UI, you can query it from the SDK in two steps. First, you grab the design document definition from the cluster, second query view with options you need and use results. In its simplest form, it looks like this:
# Step 1: Get the design document definition
ddoc = client.design_docs["beer"]
ddoc.views #=> ["brewery_beers", "by_location"]
# Step 2: Query the view and use results
ddoc.brewery_beers.each do |row|
puts row.key
puts row.value
puts row.id
puts row.doc
Note that the view request won't be executed until you will try to access the
results. This means that you can pass view object ( ddoc.brewery_beers
without executing it.
Views can be queried with a large amount of options to change what the results
of the query will contain. All supported options are available as items in
options Hash accepted either by the view method or by #each
iterator on the
view. Here are some of them:
Option | Description |
include_docs (Boolean) | Used to define if the complete documents should be fetched with the result ( false by default). Note this will actually fetch the document itself from the cache, so if it has been changed or deleted you may not receive a document that matches the view, or any at all. |
reduce (Boolean) | Used to enable/disable the reduce function (if there is one defined on the server). true by default. |
limit (Fixnum) | Limit the number of results that should be returned. |
descending (Boolean) | Revert the sorting order of the result set. ( false by default) |
stale (Boolean, Symbol) | Can be used to define the tradeoff between performance and freshness of the data. ( :update_after by default) |
Now that we have our View information in place, we can issue the query, which
actually triggers the scatter-gather data loading process on the Cluster. We can
use it to iterate over the results and print out some details (here is a more
complete example which also includes the full documents and only fetches the
first five results). The resulting information is encapsulated inside the
view = client.design_docs["beer"].brewery_beers
# Include all docs and limit to 5
view.each(:include_docs => true, :limit => 5) do |row|
puts row.id
# The full document (as a Hash) is available through row.doc
In the logs, you can see the corresponding document keys automatically sorted (ascending):
21st_amendment_brewery_cafe 21st_amendment_brewery_cafe-21a_ipa
If you want to get rid of a document, you can use the delete operation:
This chapter introduces some techniques topics that you can use to further extend your Couchbase vocabulary.
If you need to coordinate shared access on documents, Couchbase helps you with two approaches. Depending on the application you may need to use both of them, but in general it is better (if feasible) to lean towards CAS because it provides the better performance characteristics.
Each document has a unique identifier associated with it (the CAS value), which changes when the document itself is mutated. You can fetch the CAS value for a given key and pass it to any mutator operation to protect it. The update will only succeed, when the CAS value is still the same. This is why it's called optimistic locking. Someone else can still read and try to update the document, but it will fail once the CAS value has changed. Here is a example on how to do it with the Ruby SDK:
key = "eagle_brewing-golden"
# Reads the document with the CAS value.
beer, flags, cas = client.get(key, :extended => true)
# Updates the document and tries to store it back.
beer["name"] = "Some other Name"
client.set(key, beer, :cas => cas, :flags => flags)
Note that this also means that all your application need to follow the same code
path (cooperative locking). If you use #set
somewhere else in the code on the
same document, it will work even if the CAS itself is out of date (that's
because the normal #set
method doesn't care about those values at all). Of
course, the CAS itself changes then and the mutation operation would fail
There is also shortcut operation for doing optimistic locking Bucket#cas
Internally it does the same thing but abstract you from storing and passing meta
information. Here is the previous example rewritten to use this operation:
key = "eagle_brewing-golden"
client.cas(key) do |beer|
beer["name"] = "Some other Name"
# return new value from block
Note that you should return new value from the block. If you will skip it, it
will use "Some other Name"
as new value.
If you want to lock a document completely (or an object graph), you can use the
operation with :lock
option. The option accepts either boolean
(where truth does make sense really) or Fixnum meaning the time period where the
lock is valid. The server will release lock after the that period (or maximum
value, which configured on the server). Other threads can still run get
queries queries against the document, but mutation operations without a CAS will
You can determine actual default and maximum values calling Bucket#stats
without arguments and inspecting keys "ep_getl_default_timeout"
key = "eagle_brewing-golden";
# Get with Lock
beer, flags, cas = client.get(key, :lock => true, :extended => true);
# Update the document
beer["name"] = "Some other Name"
# Try to set without the lock
client.set(key, beer, :flags => flags)
#=> will raise Couchbase::Error::KeyExists
# Try to set with the CAS aquired, will be OK
client.set(key, beer, :flags => flags, :cas => cas)
Once you update the document, the lock will be released. There is also the
method available through which you can unlock the document.
By default, the mutation operations return when Couchbase Server has accepted the command and stored it in memory (disk persistence and replication is handled asynchronously by the cluster). That's one of the reason why it's so fast. For most use-cases, that's the behavior that you need. Sometimes though, you want to trade in performance for data-safety and wait until the document has been saved to disk and/or replicated to other hosts.
The Ruby SDK provides :observe
option for all mutation operations. You can
claim various persistence conditions using this option. Basically its argument
is a Hash with three possible keys, describing the condition when the mutator
will yield the result:
(Fixnum) describe how many nodes should receive replicated copy of
the document.
(Fixnum) describe how many nodes should persist the document to the
disk. The nodes include master node, where the key resides and all replica
(Fixnum) the timeout period in microseconds. After passing, the
operation condition will be considered timed out and appropriate exception will
be thrown. Default value could be addressed using
Here is an example on how to make sure that the document has been persisted on its master node, but also replicated to at least one of its replicas.
key = "important"
value = "document"
client.set(key, value, :observe => {:persisted => 1, :replicated => 1})
You can also separate persistence requirement from actual operations, and in this case, you can wait for several keys:
keys = []
(1..5).each do |nn|
key = "important-#{nn}"
keys << key
client.set(key, "document-#{nn}")
client.observe_and_wait(keys, :persisted => 1, :replicated => 1)
The goal of this chapter is to show you how to write more advanced applications using Couchbase and Rails framework.
We assume here that you finished the "Getting Started" section already, if not, we recommend to take a look, because it describes how to install and verify Ruby SDK.
For the purposes of this tutorial, we prepared an example application for you to follow along with. The application uses a bucket with one of the sample datasets which come with Couchbase Server itself: beer-sample
. If you haven't already done so, download the latest Couchbase Server 2.0 and install it. While you follow the download instructions and setup wizard, make sure you install the beer-sample
default bucket. It contains a sample data set of beers and breweries, which we'll use in our examples here. If you've already installed Couchbase Server 2.0 and didn't install the beer-sample
bucket (or if you deleted it), just open the Web-UI and navigate to "Settings/Sample Buckets". Select the beer-sample
checkbox and click "Create". In the right hand corner you'll see a notification box that will disappear once the bucket is ready to be used.
After that you can clone the complete repository from couchbaselabs on github:
shell> git clone git://github.com/couchbaselabs/couchbase-beer.rb.git Cloning
into 'couchbase-beer.rb'... remote: Counting objects: 409, done. remote:
Compressing objects: 100% (254/254), done. remote: Total 409 (delta 183), reused
340 (delta 114) Receiving objects: 100% (409/409), 235.17 KiB | 130 KiB/s, done.
Resolving deltas: 100% (183/183), done.
Navigate to the directory and install all application dependencies:
shell> cd couchbase-beer.rb/
shell> bundle install
...snip... Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
That's it. Assuming that Couchbase Server with beer-sample
bucket is up and running on localhost, you can just start the Ruby web server:
shell> rails server => Booting Thin => Rails 3.2.8 application starting in
development on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to
shutdown server >> Thin web server (v1.5.0 codename Knife) >> Maximum
connections set to 1024 >> Listening on 0.0.0.0:3000, CTRL+C to stop
Then navigate to http://localhost:3000/. You should see something like that:
If you want to learn how to create this application from scratch just continue reading. As with any Rails application we will use generators a lot. Since we don't need ActiveRecord we'll let rails new
know about this:
shell> rails new couchbase-beer.rb -O --old-style-hash
Now navigate to the project root and open up the Gemfile
in your favorite editor. First, we need to add the Couchbase client libraries there:
gem 'couchbase'
gem 'couchbase-model'
Omitting the version will get the latest stable versions of those gems. We will use the couchbase-model gem to define our models in a declarative way much like all Rails developers describe their models with ActiveRecord. Apart from that we will use yajl-ruby
, a high-performance JSON parser/generator, rdiscount
to render descriptions as Markdown, and omniauth-twitter
for authentication.
gem 'yajl-ruby'
gem 'rdiscount'
gem 'omniauth-twitter'
The complete Gemfile
will looks like this:
source 'https://rubygems.org'
gem 'rails', '3.2.8'
gem "eventmachine", "~> 1.0.0"
gem 'thin', "~> 1.5.0"
gem 'jquery-rails'
gem 'yajl-ruby'
gem 'couchbase'
gem 'couchbase-model'
gem 'rdiscount'
gem 'omniauth'
gem 'omniauth-twitter'
gem 'capistrano'
group :development, :test do
gem 'debugger'
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'uglifier', '>= 1.0.3'
The next step will be to configure Couchbase connection, this step should be familiar to the Rails developer, because couchbase-model
brings YAML-styled configuration. So if you know how config/database.yml
works, you can make some assumptions about how config/couchbase.yml
works. To generate a config, use the couchbase:config
shell> rails generate couchbase:config create config/couchbase.yml
Since our bucket name differs from the project name, you should update the bucket
property in the config. Also if your Couchbase Server is not running on the local machine, you should also change the hostname in the config. After you've made your modifications, your config should look like this:
common: &common hostname: localhost port: 8091 username: password: pool:
default development: <<: *common bucket: beer-sample production: <<: *common
bucket: beer-sample
That's it for configuration, let's move forward and create some models.
To create a model, all you need is to define the class and inherit from Couchbase::Model
. Here we dissect the Brewery
model in the application.
class Brewery < Couchbase::Model
attribute :name, :description
attribute :country, :state, :city, :address
attribute :phone
attribute :geo
attribute :updated
view :all, :limit => 31
view :all_with_beers
view :by_country, :include_docs => false, :group => true
view :points, :spatial => true
def full_address
[country, state, city, address].reject(&:blank?).join(', ')
def location
[country, state].reject(&:blank?).join(', ')
The first part of the model contains attribute definitions. The attribute
macro defines a pair of accessors and helps to maintain map of attributes-values. You can also specify default a value for each attribute:
class Post < Couchbase::Model
attribute :title, :body
attribute :timestamp, :default => lambda{ Time.now }
Post.new(:title => "Hello, World!")
#=> #<Post timestamp: 2012-12-07 16:03:56 +0300, title: "Hello, World!">
The next block is about defining views. One way to play with views is Couchbase Server Admin Console, but it may not be the best to keep parts of the code in different places. After all Views are implemented in JavaScript and contain the business logic couchbase-model
. Each time the server starts (in development mode for each request), the application will check the file system changes of the map/reduce JavaScript files and update the design document if needed. There is also the Rails generator for views. It will put view stubs for you in proper places. Here for example, is the model layout for this particular application:
app/models/ ├── beer │ ├── all │ │ └── map.js │ └── by_category │
├── map.js │ └── reduce.js ├── beer.rb ├── brewery │ ├── all │ │ └──
map.js │ ├── all_with_beers │ │ └── map.js │ ├── by_country │ │ ├──
map.js │ │ └── reduce.js │ └── points │ └── spatial.js ├──
brewery.rb ├── favorites.rb └── user.rb
For each model which has views, you should create a directory with the same name and put in the appropriate JavaScript files. Each should implement the corresponding parts of the view. For example _design/brewery/_view/by_country
does require both map and reduce parts. To generate a new view you should pass model name and view name you need to get:
shell> rails generate couchbase:view beer test create
app/models/beer/test/map.js create app/models/beer/test/reduce.js
Those automatically generated files are full of comments, so they are worth reading as a quick start about how to write View indexes. For more information about using views for indexing and querying from Couchbase Server, here are some useful resources:
For technical details on views, how they operate, and how to write effective map/reduce queries, see Couchbase Server 2.0: Views and Couchbase Sever 2.0: Writing Views.
Sample Patterns: to see examples and patterns you can use for views, see Couchbase Views, Sample Patterns.
Timestamp Pattern: many developers frequently ask about extracting information based on date or time. To find out more, see Couchbase Views, Sample Patterns.
Now we examine the controllers from the project. This is where data is selected
to display to user. For example BreweriesController
class BreweriesController < ApplicationController
def index
filter = params.extract!(:start_key, :end_key).reject{|_, v| v.blank?}
@breweries = Brewery.all(filter).to_a
if @breweries.size > 30
@last_key = @breweries.pop.try(:key)
respond_to do |format|
format.json do
render :json => {:last_key => @last_key, :items => @breweries}
def show
@brewery, *@beers = Brewery.all_with_beers(:start_key => [params[:id]],
:end_key => ["#{params[:id]}\uefff"]).to_a
It has two actions:
"index" which pulls the list of breweries. It might look complex, but it isn't.
In first line we are preparing query parameters for views. In particular, we are
interested in the start_key
and end_key
parameters, but we need them only if
they aren't blank (i.e. not nil and not empty string). The second step is to
execute the view and get results immediately. Your application might want to
fetch the entries from view on demand in a lazy manner, then you no need to call
the #to_a
method and iterate over them or call methods like #next
. In this
particular example we are fetching 31 records and are trying to pop last one to
use it later for "infinite" scrolling. The end of the method is responsible for
rendering the data in two formats, by default it will use HTML, but if the
application is responding to an AJAX request with the Accept: application/json
header, it will instead render the JSON representation of our models.
"show" uses another view from the Brewery
model, which collates breweries with
beer for easier access. Here is a map function which does that job:
function(doc, meta) { switch(doc.type) { case "brewery": emit([meta.id]);
break; case "beer": if (doc.brewery_id && doc.name) { emit([doc.brewery_id,
doc.name]); } break; } }
As you can see we are using a compound key with
brewery ID in the first position and the document name in the second position.
Because we are selecting only beers without null names, they will be sorted
after the breweries. By doing so, when we filter result by the first key only,
the @brewery
variable will receive first element of the sequence, and @beers
will get the rest of the collection because of the splat ( *
) operator.
One of the experimental features of the Couchbase Server is spatial views. These kind of views allow you to build indexes on geo attributes of your data. This sample application demonstrates spatial views. Click on the "Map" link in the menu and your browser will fetch your current location; it will position the center of the map to your location, or to Mountain View otherwise. After that it will execute a spatial query using map bounds and the Couchbase Server will give you all the breweries which are nearby. The following is part of the implementation. The core of this feature is brewery/points/spatial.js
function(doc, meta) { if (doc.geo && doc.geo.lng && doc.geo.lat && doc.name) {
emit({type: "Point", coordinates: [doc.geo.lng, doc.geo.lat]}, {name: doc.name,
geo: doc.geo}); } }
The function will emit a Point object and the name with coordinates as the payload. The action in the controller is quite trivial, it transmits the result to the application in JSON representation, and Google maps is renders markers for each object.
Except nice extensions, provided by couchbase-model
library, couchbase
gem itself has few more nice features which could be useful in the web application. For example, you can easily substitute your session or cache store in Rails (or even in rack) with Couchbase Server.
To use Couchbase as cache store in Rails, just put following line in your config/application.rb
config.cache_store = :couchbase_store
You can also pass additional connection options:
cache_options = {
:bucket => 'protected',
:username => 'protected',
:password => 'secret',
:expires_in => 30.seconds
config.cache_store = :couchbase_store, cache_options
To use Couchbase as the session store you should update your
require 'action_dispatch/middleware/session/couchbase_store'
AppName::Application.config.session_store :couchbase_store
Or remove this file and add following line to your config/application.rb
require 'action_dispatch/middleware/session/couchbase_store'
config.session_store :couchbase_store
You can also pass additional options:
require 'action_dispatch/middleware/session/couchbase_store'
session_options = {
:expire_after => 5.minutes,
:couchbase => {:bucket => "sessions", :default_format => :json}
config.session_store :couchbase_store, session_options
In the example above we specify the format as JSON which allows us to share sessions in a heterogeneous environment, and also analyze them using Map/Reduce. But keep in the mind that not everything in typical Rails application can be serialized to JSON, for example ActionDispatch::Flash::FlashHash
. This is why the library serializes sessions using Marshal.dump
by default.
One approach you can try if you get temporary out of memory errors from the server is to explicitly pace the timing of requests you make. You can do this in any SDK by creating a timer and only performing a Couchbase request after a specific timed interval. This will provide a slight delay between server requests and will reduce the risk of an out of memory error. For instance in Ruby:
c.set("foo", 100)
n = 1
c.run do
c.create_periodic_timer(500000) do |tm|
c.incr("foo") do
if n == 5
n += 1
In this example we create a sample record foo
with the initial fixnum value of
100. Then we create a increment count set to one, to indicate the first time we
will create a Couchbase request. In the event loop, we create a timing loop that
runs every.5 seconds until we have repeat the loop 5 times and our increment is
equal to 5. In the timer loop, we increment foo
each time we loop.
The Ruby SDK provides integration with EventMachine so you can perform asynchronous operations with the server. This is very important for web applications these days because a project can gather attention and grow a user base in days or even hours. You can quickly run into problems, such as the C10K problem when the number of users grow quickly. When you provide asynchronous operations, you can maintain application performance for your users while growing your user base..
Asynchronous network services can handle a lot of active connection simultaneously, and there are a lot of libraries and frameworks which make it more easier. The Ruby client use libcouchbase which is a library written in C and implements the reactor pattern.
By default libcouchbase comes with bindings to two popular event libraries: libevent and libev. There is special layer in libcouchbase which allows substitution of IO easily. The Ruby client substitutes IO in two cases, meaning it comes with two additional IO engines. The first engine in the Ruby client is Ruby thread-friendly, because it tries to release Ruby GVL as long as possible when it does IO. This is the default behavior for the Ruby SDK. The second Ruby-specific engine is one using routines from EventMachine. To understand more about the couchbase gem and EventMachine read this blog post.
The EventMachine library is Ruby implementation of the reactor
pattern. It can solve C10K
problems for applications written in Ruby, and in this section we will describe
how to write efficient application using the asynchronous server
goliath and the framework
grape. You can find all the code for
this example in the examples/chat-goliath-grape
directory of the source
First we show you how to configure a couchbase connection. We will use
so the client can handle multiple
config['couchbase'] = EventMachine::Synchrony::ConnectionPool.new(:size => 5) do
Couchbase::Bucket.new(:engine => :eventmachine)
This allocates a pool of five connection instances and stores the connections
into a config
object; this object will be available as a method on an env
object during a request.
We use grape
to declare our API endpoints and goliath
to run it
asynchronously on EventMachine. This code connects these libraries and wraps the
whole grape
application into a goliath
class App < Goliath::API
def response(env)
rescue => e
{'Content-Type' => 'application/json'},
MultiJson.dump(:error => e, :stacktrace => e.backtrace)
Here the Chat
class contains the definition of our API. Since the service
communicates JSON we catch all errors, reformat them into JSON and stream the
errors back to the client:
class Chat < Grape::API
format :json
resource 'messages' do
get do
view = env.couchbase.design_docs["messages"].all
msgs = view.map do |r|
"id" => r.id,
"key" => r.key,
"value" => r.value,
"cas" => r.meta["cas"]
{"ok" => true, "messages" => msgs}
post do
payload = {
"timestamp" => DateTime.now.iso8601,
"message" => params["message"]
id = env.couchbase.incr("msgid", :initial => 1)
id = "msg:#{id}"
cas = env.couchbase.set(id, payload)
{"ok" => true, "id" => id, "cas" => cas}
Our Chat
class defines a single resource messages
which responds to GET
and POST
HTTP methods. We first describe a post do... end
action block
first. Here we extract the message string from input parameters and build a
payload of new messages with a timestamp.
As the next step we use a incr
operation to get the next message ID. In
Couchbase this operation is atomic, so it is safe to do it in the case of
multiple application instances. After that, we store a new message document with
a set
operation and report upon success to the client. The hash we return will
be automatically converted to JSON, because of the format :json
declaration on
the top of the class.
GET /messages
handler requires no parameters and returns all the message
documents stored in the cluster. In the first line of the handler we create a
object which is bound to /_design/messages
design document.
For more information about design documents and Views, see Couchbase Manual,
Views and
view = env.couchbase.design_docs["messages"].all
Here you can pass View parameters when you create the object. For example, if
you want to load documents along with view results, just pass :include_docs =>
view = env.couchbase.design_docs["messages"].all(:include_docs => true
The Couchbase::View
class includes the
Enumerable module, which
supports convenience methods available, such as #map
, which you saw
previously. Note that the view object itself doesn't fetch data until you query
As the last note, we should probably show the server-side map function, which the server uses to index:
function(doc, meta) {
if (doc.timestamp) {
emit(meta.id, doc)
This function can be either defined using the Couchbase Web Console, or you can create it in your program (see Bucket#save_design_doc method). For more information about using the Web Console, see Couchbase Manual, Using the Views Editor.
The next examples show how you can query a view. We will use curl tool, which probably available on your distribution by default. This example was tested with recent stable version of the Ruby interpreter 2.0.0.
Start the goliath server up:
$ ruby app.rb -sv
Query the server for a single message:
$ curl -X POST -Fmessage="Hello world" http://localhost:8091/messages
Query for all messages with this command:
$ curl -X GET http://localhost:8091/messages
{"ok":true,"messages":[{"id":"msg:1","key":"msg:1","value":{"timestamp":"2013-04-11T12:43:42+03:00","message":"Hello world"},"cas":11880713153673363456}]}
More often these days we build heterogeneous application systems. They are
heterogeneous in a sense of programming languages, frameworks and even database
storage. And more often this is the case when we want to gracefully transition
an older system to newer one, and this occurs more often in this constantly
changing world. This section will describe a technique which provides custom
data formatting into an application. This feature is in the almost every
Couchbase client, and we call it Transcoders
. This feature is available in the
Ruby client since version 1.3.0.
So the transcoder API is simple; it is the class or instance, which responds to
the two methods, dump
and load
. The semantic is very straight forward: dump
returns a byte stream (String) representation of an object along with new flags.
The signature is:
def dump(obj, flags, options = {})
# do conversion
[blob, new_flags]
The options
hash will contain some context from the library which helps
identify when the conversion occurs. Currently takes only one parameter,
which means that the transcoder is explicitly passed to the operation.
Compare the two different examples of using an implicit or explicit transcoder:
# default transcoder is Couchbase::Transcoder::Document
conn = Couchbase.connect
# implicit, used default transcoder, in this case :forced => false
conn.set("foo", "bar")
# explicit, used MyCustom transcoder, and :forced => true
conn.set("foo", "bar", :transcoder => MyCustom)
The load
method is even simpler. It converts the stream back into the object:
def load(blob, flags, options = {})
# check flags and decode value
This method can also accept :forced
as an option. The Ruby library comes with
three predefined transcoders: Document, Marshal and Plain, which are in file
. You can use these transcoders with an earlier
version of the Ruby formatting API, therefore the patch won't break applications
built on earlier versions of the library:
conn.default_format = :document
conn.get("foo", :format => :marshal) # {:force => true}
Below is a transcoder which will compress and decompress all values using Gzip. Its object initializer accepts any other transcoder and can format the results:
require 'zlib'
require 'stringio'
class GzipTranscoder
FMT_GZIP = 0x04
def initialize(base = nil)
@base = base || Couchbase::Transcoder::Plain
def dump(obj, flags, options = {})
obj, flags = @base.dump(obj, flags, options)
io = StringIO.new
gz = Zlib::GzipWriter.new(io)
[io.string, flags|FMT_GZIP]
def load(blob, flags, options = {})
# decompress value only if gzip flag set
if (flags & FMT_GZIP) == FMT_GZIP
io = StringIO.new(blob)
gz = Zlib::GzipReader.new(io)
blob = gz.read
@base.load(blob, flags, options)
This shows you how you can use this transcoder after you create a connection:
conn = Couchbase.connect
conn.transcoder = GzipTranscoder.new
When your application using threads for better concurrency or parallelism, it is
become important to carefully use all data structures. For example you cannot
share Couchbase::Bucket
instance between threads. But the library contains
special class Couchbase::ConnectionPool
which designed to leverage
connection_pool gem and protect
. Note that the Couchbase::ConnectionPool
class available
only for ruby 1.9+. Here is small example, which demonstrates how to use it:
require 'rubygems'
require 'couchbase'
:node_list => ["example.net:8091"],
:key_prefix => "pool_",
:pool_size => 3
# returns the thread-safe pool object, which proxies all methods to
# the Couchbase::Bucket instance
def connection(bucket)
@servers ||= {}
@servers[bucket] ||= begin
size = CONFIG[:pool_size]
params = CONFIG.merge(:bucket => bucket)
Couchbase::ConnectionPool.new(size, params)
connection("default").set('foo', 'bar')
threads = []
5.times do
threads << Thread.new do
threads.map do |t|
puts [t.object_id, t.value].join("\t")
If you will run it in your terminal, it should printout a table of thread IDs and the values, received from the Couchbase Server like this:
shell> ruby base.rb
70236984451160 bar
70236984451080 bar
70236984451000 bar
70236984450920 bar
70236984389840 bar
The following sections provide release notes for individual release versions of Couchbase Client Library Ruby. To browse or submit new issues, see Couchbase Client Library Ruby Issues Tracker.
Fixes in 1.3.6
Fixes in 1.3.5
Honor the :environment constructor argument.
Allow inheritance from Couchbase::Bucket
. It wasn't possible to
create a view with a subclass of the Couchbase::Bucket
Ensure that an exception raised early does not prevent the finalizer from being called in the underlying client being constructed. Here's an example of a situation where this could occur:
class Couchbase::Bucket
def initialize(*args)
raise "something wrong"
New Features and Behavior Changes in 1.3.4
Build 64-bit versions of the extensions for Windows platform. Also support ruby 2.0 and 2.1.
Updated hacking section in README.
Return CAS in extended mode for incr/decr
Issues: RCBC-151
Update list of options on Cluster.create_bucket
. Added the following new options: :replica_index
, :flush_enabled
, :parallel_db_and_view_compaction
Issues: RCBC-150
Allow retries on Couchbase::Bucket#cas collisions. Now it takes a :retry
Fixnum option that specifies the maximum number of times the method should retry the entire get/update/set operation when a Couchbase::Error::KeyExists
error is encountered due to a concurrent update from another writer between its #get
and #set
MD5 and truncate ActiveSupport::Cache keys that are longer than 250 characters.
Fixes in 1.3.4
New Features and Behavior Changes in 1.3.3
Allow application to use several connections with thread-local singleton. Issues: RCBC-134
Add selection options for new IO engines: select and iocp. Issues: RCBC-137
Allow determining the version of libcouchbase:
Fixes in 1.3.3
Fixed invalid memory access which was detected by using 'GC.stress = true' in tests. Issues: RCBC-135
Build shared object for ruby 2.0 on windows. Also fixes build script when using latest rake and rake-compiler. Issues: RCBC-136:
Initialize event indexes correctly. The plug-in didn't trace event callbacks, which might lead to invalid memory access during rebalance, where libcouchbase creates or removes a lot of events because of a fast-changing topology. Issues: RCBC-141:
When setting the username field, check for password presence. Fixes segmentation fault in this code:
Couchbase.connect(:username => "default", :bucket => "default")
Fix deprecation warning on ruby 2.x. On newer versions it should use rb_thread_call_without_gvl()
ext/couchbase_ext/multithread_plugin.c: In function 'loop_run_poll':
ext/couchbase_ext/multithread_plugin.c:772:5: warning: 'rb_thread_blocking_region' is deprecated (declared at .../2.0.0-p247-dbg/include/ruby-2.0.0/ruby/intern.h:839) [-Wdeprecated-declarations]
rb_thread_blocking_region(loop_blocking_poll, args, RUBY_UBF_PROCESS, NULL);
Do not try to compile with plug-ins for Windows platform.
Force handle to be NULL on lcb_create()
failure. lcb_create()
can leave garbage in the pointer even if the call itself failed. This behavior could lead to illegal memory access on GC.
Remove usage of RARRAY_PTR
in favor of rb_ary_entry
. This improves performance significantly on Rubinius and also improves compatibility with future CRuby 2.1, which introduces generational garbage collection. This results in these arrays not having to be rescanned in Rubinius and not marked as shady in RBGCENC in CRuby 2.1. For more discussion, see https://bugs.ruby-lang.org/issues/8399.
New Features and Behavior Changes in 1.3.2
Allow application to select the strategy of reading from replica nodes. This version requires libcouchbase >= 2.0.7. Now three strategies are available:
- synonym to true
, previous behavior now the default. It means that the library will sequentially iterate over all replicas in the configuration supplied by the cluster and will return as soon as it finds a successful response, or report an error.
c.get("foo", :replica => true)
c.get("foo", :replica => :first)
#=> "bar"
c.get("foo", :replica => :first, :extended => true)
#=> ["bar", 0, 11218368683493556224]
- query all replicas in parallel. In this case the method will return the array of the values on the all replica nodes without a particular order. Also if the key isn't on the node, it will be skipped in the result array.
c.get("foo", :replica => :all)
#=> ["bar", "bar", "bar"]
c.get("foo", :replica => :all, :extended => true)
#=> [["bar", 0, 11218368683493556224],
# ["bar", 0, 11218368683493556224],
# ["bar", 0, 11218368683493556224]]
- you can also select specific replica node by its index in the cluster configuration. It should be in interval 0...c.num_replicas
#=> 0…3
c.get("foo", :replica => 1)
#=> "bar"
c.get("foo", :replica => 42)
#=> ArgumentError: replica index should be in interval 0…3
Note that applications should not assume the order of the replicas indicates more recent data is at a lower index number. It is up to the application to determine which version of a document/item it may wish to use in the case of retrieving data from a replica.
Issues : RCBC-133
Fixes in 1.3.1
Fix compatibility with multi_json 1.7.5. It removed the VERSION constant unexpectedly. github.com/intridea/multi_json/commit/f803f397d1a3ef839a80a669a09318c64b252e5f
Couchbase::Cluster instance shouldn't require persistent connections. There was an issue which lead to a Couchbase::Error::Connect exception and blocked the creation/removing of buckets.
Issues : RCBC-131
New Features and Behavior Changes in 1.3.0
Introduce Transcoders. This mechanism is more flexible, and similar to how other clients encode values.
Implement Couchbase::ConnectionPool to allow applications (and ActiveSupport::Cache::CouchbaseStore) use it in multi-threaded environment
Issues : RCBC-46
Fixes in 1.3.0
Deprecate numeric argument to 'default_format'. Instead of this style:
Couchbase.connect(:default_format => Couchbase::Bucket::FMT_MARSHAL)
Symbol notation or explicit transcoder entity should be used
Couchbase.connect(:default_format => :marshal)
Couchbase.connect(:transcoder => Couchbase::Transcoder::Marshal)
This documentation and associated software is subject to the following licenses.
This documentation in any form, software or printed matter, contains proprietary information that is the exclusive property of Couchbase. Your access to and use of this material is subject to the terms and conditions of your Couchbase Software License and Service Agreement, which has been executed and with which you agree to comply. This document and information contained herein may not be disclosed, copied, reproduced, or distributed to anyone outside Couchbase without prior written consent of Couchbase or as specifically provided below. This document is not part of your license agreement nor can it be incorporated into any contractual agreement with Couchbase or its subsidiaries or affiliates.
Use of this documentation is subject to the following terms:
You may create a printed copy of this documentation solely for your own personal use. Conversion to other formats is allowed as long as the actual content is not altered or edited in any way. You shall not publish or distribute this documentation in any form or on any media, except if you distribute the documentation in a manner similar to how Couchbase disseminates it (that is, electronically for download on a Web site with the software) or on a CD-ROM or similar medium, provided however that the documentation is disseminated together with the software on the same medium. Any other use, such as any dissemination of printed copies or use of this documentation, in whole or in part, in another publication, requires the prior written consent from an authorized representative of Couchbase. Couchbase and/or its affiliates reserve any and all rights to this documentation not expressly granted above.
This documentation may provide access to or information on content, products, and services from third parties. Couchbase Inc. and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party content, products, and services. Couchbase Inc. and its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of third-party content, products, or services.
The information contained herein is subject to change without notice and is not warranted to be error free. If you find any errors, please report them to us in writing.


text:
PyKHTML is...
A Python module for writing website scrapers/spiders. Whereas traditional methods focus on writing the code to parse HTML/forms themselves, PyKHTML uses the excellent KHTML engine to do all the trudge work. It therefore handles webpages very well (even the severely crufty ones) and is pretty darn fast (implemented in C++). As a bonus the module handles JavaScript and cookies transparently. Hurrah!
PyKHTML requires PyKDE 3 (and hence in turn PyQt 3 + KDE libs). If you would like to run PyKHTML on servers without an X display then Xvfb is required. Fortunately these requirements should come bundled with most modern Linux distributions, and support for Windows/Mac should appear in the next few months.
Show me some code
Okay. Here is an example (one of many examples included in the bundle) that scrapes the title and navigation from this page, with excessive commenting to give you a feel of what programming with PyKHTML is like:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import pykhtml
PyKHTMLUrl = "http://paul.giannaros.org/pykhtml"
def extractBitsFromPage(browser):
# getElementsByTagName returns a generator, so we convert
# to a list and access the first element
title = list(browser.document.getElementsByTagName("title"))[0]
print "Title:", title.text
# Get the text of the navigation items
navigation = []
# First get the container of the list items...
navigationElement = browser.document.getElementById("navigation")
# ... and then loop over the li elements we find
for listItem in navigationElement.getElementsByTagName("li"):
# Inside the list item is an anchor
anchor = listItem.children[0]
# And the text inside the anchor is what we want
print "Navigation:", " | ".join(navigation)
# Stop here, we're done
def main():
browser = pykhtml.Browser()
# the browser is passed as a parameter to extractBitsFromPage
# when it is called (when the page has loaded)
browser.load(PyKHTMLUrl, extractBitsFromPage)
# kick things off
Note of Thanks
Gambit Research, a software company in West London, sponsor PyKHTML development.

subset: commoncrawl


text:
Presented By:
Humanitarian In Every Way
Posted by: Matt Gaschk
James Riley was named Sounders FC Humanitarian of the Year for the second straight season and shares the honor with his teammates.
James Riley is the embodiment of the word Humanitarian.
Ever since joining the Sounders FC in 2009, he has integrated himself into the community through work with the Renton/Skyway Boys & Girls Club, Special Olympics, the Make-A-Wish Foundation, America SCORES Seattle and Susan G. Komen for the Cure, along with other organizations that he holds close to his heart.
In 2011, the James Riley 7-A-Side youth tournament raised over $15,000 for the Boys & Girls Club, where he is a board member, in just its second year. The money will go to fund hands-on projects at the club's Renton/Skyway location, where Riley has become a regular visitor to involve himself in the community that he has become a vital part of while sharing the tale of his rise from a single-parent family to success as a professional soccer player.
This week, he was named Sounders FC Humanitarian of the Year for the second straight season.
For as much as he does in the community, Riley was far from a shoe-in for the award. Fans, teammates, coaches and staff from the Sounders FC voted for Riley, Taylor Graham and Steve Zakuani for the award.
"Taylor Graham and Steve Zakuani do tremendous work and we get unbelievable support from the club and our teammates have shown up to all of our events," Riley said. "The fact that we have three fully capable guys that could have won that award is tremendous for the club. We represent the club very well and represent the city very well. I take the award on everyone's behalf."
With the money raised from last year's 7-A-Side tournament, Riley helped arrange a party for the Boys & Girls Club's Renton/Skyway location and presented them with an incredible array of items for their Marketplace project that teaches the kids who to be active members in their community be simulating their own micro-society within the club.
This year's tournament, which is becoming Riley's signature event in a year that includes dozens of appearances throughout the community, included several auction items and appearances by ten of his teammates to help raise funds for the project.
"It's a great honor. We don't do those things to get recognition, so I take it and I share it with Taylor and Steve and the rest of my teammates," he said. "Guys have done so much that goes unnoticed and that's how we like it. The club is doing something right and the team is supporting it."
Riley will go up against the winners from each team for the league-wide award, which will be announced later this year.


text:
In just a few minutes, you could be searching thousands of photos of singles who live near you!
Ready for a new relationship? Register for FREE today at BlackSingles.com and you can create your own profile, initiate contact with other members, perform searches and more!
Sign up now!
ChapmanvilleCharlestonCranberryDunbarElkinsHuntingtonInwoodLewisburgLoganMartinsburgOak HillSpriggWest LoganWheeling
127413805 is a 47yr-old single woman in Elkins, West Virginia
Meet single women near Elkins, West Virginia


text:
By Carolyn Malcoun, April 13, 2011 - 11:25am
While I always do some sort of grand spring-cleaning project, usually involving the basement, garage and my closet, I never think to clean out my pantry. But when my friend Lucy told me that she found a bottle of vinegar that expired in 2006 and boxes of gelatin with a use-by date in 2008 when she cleaned out her kitchen, I thought perhaps it was time to take a look.
Luckily, it was easier than I thought. Here's how I did it (and if you use these guidelines it'll just take you a few minutes, since you won't have to spend time debating whether to keep or not to keep).
• Almost everything in my pantry was tagged with a date and one of these phrases: "Use By," "Best By" or "Use Before." I ditched everything that was past its date (see ya, chicken gumbo soup from 2009!) and arranged similar things together.
• I put items with sooner use-by dates at the front so they'd get used first and tossed anything that was in an unlabeled random container.
• I sniffed all the dried herbs and spices and dumped the ones that didn't smell like anything anymore.
• I made a list along the way of what I needed to replace so I wouldn't be caught short making dinner one night.
Don't Miss: Our Comprehensive List for Stocking a Healthy Pantry
• Then I bagged up everything I had bought that was still good but I knew I wasn't ever going to use and dropped it off at the local food bank.
Chime In: What 5 pantry items do you always have in your kitchen?
Look at all that space! Now it's time to stock up on healthy staples! Here are my top 5 healthy-cooking staples to stock in your pantry.
Healthy-Pantry Staple #1: Whole-grain pasta
I usually make pasta for dinner once a week, but I make sure I have a few boxes in my cupboard because it makes a great I-don't-wanna-make-dinner dinner. All I have to do is heat up a jar of sauce and cook some pasta and dinner is ready in minutes.
Don't Miss: Pasta Recipes Ready in 30 Minutes or Less
Healthy-Pantry Staple #2: Beans
I like to stock my pantry with a few types of canned beans plus different kinds of dried ones for when I have more prep time. Canned beans are a great emergency-meal ingredient. I just cook some rice, heat up some beans, wilt some spinach, chard or other dark leafy green, then assemble into what I call "Mexi-bowls," topped with shredded cheese and salsa.
Don't Miss: Really Amazing Meals Starring Beans
Healthy-Pantry Staple #3: Canned tomatoes
Perhaps my favorite pantry staple, I love canned tomatoes because they can become anything from soup to sauce with just a few other pantry ingredients. Having different varieties available—sauce, crushed, diced, fire-roasted, with chiles, with herbs—lets me be more creative.
Don't Miss: 19 Ways to Use Canned Tomatoes
Healthy-Pantry Staple #4: Canned fish
Sardines, salmon, tuna—I make sure to have all three on hand at all times! They're all great sources of omega-3 fats, plus I can open a can and turn any salad into a meal.
Healthy-Pantry Staple #5: Broth
I always have a few boxes of different kinds of broth, like chicken, vegetable and beef. They're great for making "clean-out-the-fridge" soup, reheating leftovers and cooking whole grains, among other things.
TAGS: Carolyn Malcoun, Healthy Cooking Blog
Carolyn Malcoun combines her love of food and writing as a recipe contributor for EatingWell. Carolyn has a culinary arts degree from New England Culinary Institute and a degree in journalism from University of Wisconsin—Madison. Carolyn lives in Portland, Maine, and enjoys cooking, gardening, hiking and running in her free time.


text:
Tagged Content
Tags > Aon
Marketing campaigns for Accenture and Aon took home top honors Tuesday night when BMA Chicago hosted its annual Tower Awards Bash.
The campaigns faced stiff competition. Interest in the competition reached a record high, with more than 420 entrants in 24 categories.
View all tags


text:
sarah names
Don't I know it!
Example A: There were too many Sarah Kleins in the Brooklyn Public Library database, I had to use my middle name to get a library card.
Example B: Every conceivable combination of Sarah Klein was already taken when I first signed up for Gmail. Hence why I became sarklei!


text:
Click on the broken link graphic and fill in the form
Historians, Genealogists, and Collectors of Antique Family Photos, Family Bibles, and Family Documents.
Photos Returned to Families....by Ford and Nagle
Lists family photography returned to families or other interested people.
GenealogyMagazine.com - Photographic Collection
A clearinghouse of lost family photographs rescued from antique stores, flea markets and estate sales. Each photograph includes a reference number, name of the person or place, the date and location (if known), and the caption as it appears on the original. In some instances, additional information has been added from census records and other sources.
A place to post pictures of people you want to identify.
[The original link is broken. This link points to an archived copy on the Wayback Machine] -
An index of old photographs mostly pre-1900 of identified people mostly Ontario. Linking portraits with interested researchers who would like the original or a copy.
We work to help identify unknown photographs in an attempt to reunite these photographs with their families.
Julie's Genealogy & History Hub - Who Will Tell Their Story?
Blog from Julie Cahill Tarr with orphaned photos that are looking for their families.
JustaJoy.com - Family Heirloom Exchange
This site is a link between antique dealers who own surname related artifacts and the families for whom they should belong. We are promoting the natural marriage between antiques and ancestry by accepting consignments from reputable antique dealers and indexing them by surnames.
Old photographs of Lost Ancestors with identification in hopes of finding their families again.
Lost and Found Old Photographs
Old photographs of unknown persons, identified photos which are lost and need to be reunited with their own families.
Lost Faces - Family Photos Lost & Found
Search for ancestors in old photo albums I have rescued and put online. Research is done on each album to find more family information. Included is a detailed description of each photo plus photographer and location. Scans of photos and documents such as funeral cards, obits, etc. can also be viewed.
Reuniting lost photos from Joplin, Missouri with their owners.
Lost Photos of the Gogebic Range
100+ studio photos from the Gogebic Range of Michigan & Wisconsin. These are quality photos in studio folders . they are unidentified. Families may view and claim them.
Old photographs of Lost Ancestors with identification in hopes of finding their families again.
Madison County Nebraska Lost and Found Photos
Photos that need to be identified from Madison Co. NE. Some already identified.
Finding old photographs with identification in hopes to reunite with their families.
Collection of old photos, bibles, documents to be reunited with their families.
MissingPhotographs.com - Your Family Photo Search
Ive been collecting photographs for more than 40 years. I was in the photography field before retiring. Years ago, my parents gave me several old photographs and glass negatives of their families. I didnt know who some of the people in the photographs were and began researching my own ancestry to find out. This sparked my interest in collecting old photographs. As the years progressed, I went to antique stores, yard sales and flea markets, buying old photographs and negatives. I also collected birth certificates, marriage certificates, death certificates and death cards, school yearbooks, military regiment books, and family albums from 1860 to the 1970s.
Mystery Ancestors is a photo blog of unidentified old photos and tintypes. Membership is free and necessary to view all the pictures. Premium members may add their unidentified photos free. For a small fee they may advertise their website in the form of a watermark on their photo.


text:
At Google's annual I/O developer conference, an important new feature to Google Analytics was announced that's going to turn mobile marketing on its head.
Built on the back of the new Universal Analytics platform and its baked-in ability to track users across sessions and devices, Cross Device Measurement is like Multi-Channel Funnels for devices.
And it's huge....
Read more...
by Damion Brown 20 May 2013 11:41am 13 comments
My last article detailed the benefits of focusing on website analytics specifically around site search data.
This article continues with the same theme of valuing website analytics, but the focus turns to unbranded keyword traffic.
In the context of reviewing analytics, "unbranded keywords" are those words/phrases not containing the retailer's name.
People who type "Apple iPod Nano" into Google and land on the JB Hifi website is an unbranded keyword phrase from the perspective of JB Hifi. The keyword phrase "JB Hifi" is a branded term for this retailer.
Understanding the dichotomy between branded and unbranded keyword phrases is necessary in order to effectively assess site performance and build a focused plan for growth.
by Greg Randall 30 April 2013 13:46pm 2 comments
Along with custom reports (and sometiimes in conjunction with them), custom advanced segments are a great way of gaining extra insight and value from your Google Analytics account.
In this post, I'll round up ten very useful custom segments that you can import straight into your GA account, and save yourself the trouble of creating them yourself.
Please suggest any other segments you find useful in the comments...
by Graham Charlton 16 April 2013 11:37am 10 comments
Google Analytics is a great tool, but its standard reports can be limited, so a little customisation is necessary to improve the quality of insight you can gain.
One way to do this is to create custom reports, which is an excellent idea, and another is to use GA's advanced segments, which allow you to filter reports to find the insights you need.
In this post, I'll explain how to use advanced segments. It's for GA beginners really, so I apologise in advance to any GA experts reading this...
by Graham Charlton 16 April 2013 09:40am 1 comment
Last week I published a list of ready-made custom reports for Google Analytics, including ways to measure links, PPC campaigns, sales by time of day and more.
The reaction was very positive, and in the comments and related G+ discussion, more great custom reports were suggested, so I've rounded them up here.
by Graham Charlton 11 March 2013 13:56pm 18 comments
Google Analytics's standard reports can be limited, so a little customisation is necessary to improve the quality of insight you can gain.
If like me, you're a relative amateur with Google Analytics, ready-made custom reports can save you a lot of time.
There are various reports here, some useful for publishers, some for ecommerce sites, and some for SEO analysis.
Just log in to your Google Analytics account and click the links to add these to your custom reports list...
by Graham Charlton 05 March 2013 11:21am 30 comments
The average person has around 41 apps on their phone; these range from social and gaming apps, to daily deals, retail and media apps.
As mobile traffic continues to gain traction on web traffic, and as apps continue to be a vital channel for keeping the consumer engaged, it has never been more important for brands to monitor how their apps are performing to ensure they are delivering the experience users expect.
by Clair O'Neill 07 February 2013 11:32am 4 comments
At the end of 2012, Google introduced some genuinely cool changes to its Analytics products.
These were the kind of changes that get whoops from the audience when announced at the Google event in California (although in the UK the reception was predictably more… British).
The big thing is a new tracking method: user-centric, multi-sessional, multi-device tracking...
by Ben Gott 06 February 2013 13:03pm 16 comments
Data has become such a popular topic in digital marketing circles that we're running out of metaphors. But whether you think of data as the oil of marketing, a firehose of numbers or the next gold rush, chances are that your organization is still coming to grips with the possibilities and realities of "Big Data."
As a great end of the year Google Hangout, join us December 13, 2012 at 12:30 EST as we discuss cutting-edge data techniques for supercharging advertising used by global corporations for marketing as released in the latest Econsultancy report "Best Practices in Data Management." Data Management Platforms (DMPs) and Audience Management Platforms (AMPs) are all the rage, but getting the most out of data for audience segmentation, insights, and targeting takes more than just a relationship with a vendor.
by Heather Taylor 12 December 2012 16:57pm 0 comments
Data is everywhere. As the cost of storing and collecting data decreases, more of it becomes available to marketers looking to optimize the way they acquire new customers and activate existing ones.
In the right hands, data can be the key to understanding audiences, developing the right marketing messages, optimizing campaigns, and creating long-term customers. In the wrong hands, data can contribute to distraction, poor decision-making, and customer alienation.
Over the past several weeks, I asked over thirty of the world's leading digital data practitioners what marketers should be thinking about when it comes to developing a data management strategy.
The result is the newly available Best Practices in Data Management report. A few big themes emerged from my research, which I thought I would share.
by Chris O'Hara 11 December 2012 16:43pm 1 comment


text:
Decorate your table and room for a Rock Star Hero party. Dance the night away, play guitar hero for a great party theme. The Rock Star Hero group is perfect for Rocker's party both young and old. Our 9 ounce Rock Star Hero cups are sold 18 to a pack. Please order in increments of 1 pack.
Email Newsletter
Sign up for exclusive offers
Recommended Category
Shop By
Shop with confidence, our site is secure
Call Us:1-800-442-9722


text:
Click on a question to see the answer. You can also use the search box on the right.
- How do I submit a bug?
- Where Do I Go to Post Grades in Peoplesoft?
- Is there a list of technologies that the e-Learning Center supports?
- What support can I expect from Information Technology Services (ITS)?
- How do I set up a password for my email and other software accounts?
- How do I contact the Faculty Help Line at the e-Learning Center?
- Whom do I contact for technical support?
- What is a bug?
- Students using Macs cannot open PDFs
- What kind of support is not available from the e-Learning Center?
10 faqs shown


text:
Published since 1987, America's Civil War strives to deliver to our readers the best articles on the most formative and tumultuous period of American history — the Civil War. Noted authors present the many battles, personalities and fascinating stories of the period.
If you would prefer this 6-issue subscription in digital format, see link below. For print version, please enter your information in the form below and add to cart above.
Join our FREE mailing list & receive information on latest arrivals, special offers & much more !!!


text:
Details, Details, Details!
The myriad of details that surround a wedding can be overwhelming, turn to the Group Services Staff at the Chippewa Hotel Waterfront and the Lilac Tree Suites and Spa to lighten the burden. All of the resources needed to make this special day operate can be coordinated with the help of this professional staff.
Other vendors available can be researched through the links located here.
Wedding Planners | Photographers | Officiants |
Entertainment | Cakes | Favors |
Invitations | Tuxedo Rentals | Florists |
Group Services can be reached by
calling (866) 847-6575 or (800) 241-3341.
To contact via the internet, please use email@example.com


text:
use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
~4 users here now
Folk metal is a sub-genre of heavy metal that developed in Europe during the 1990s. As the name suggests, the genre is a fusion of heavy metal with traditional folk music. This includes the widespread use of folk instruments and, to a lesser extent, traditional singing styles.
Also, bagpipes.
This is a place for news, reviews, videos and discussion of your favorite folk metal bands. We also welcome Celtic metal, viking metal and medieval metal, which are all subgenres of folk metal.
An Essential Folk Metal Listening List
Other subreddits you may enjoy:
Logo courtesy of Chazward.
Wrath of Fenrir - Victory Chant (youtube.com)
submitted 1 year ago by blackwizardz
[–]MeatloafCupcake 1 point2 points3 points 1 year ago
This band kicks some serious ass.
[–]MOSh_EISLEY 1 point2 points3 points 1 year ago
[–]pfk505 1 point2 points3 points 1 year ago
all it takes is a username and password
for more information, see our privacy policy.
create account
is it really that easy? only one way to find out...
already have an account and just want to login?
π Rendered by PID 19298 on app-13 at 2014-03-16 14:29:49.895416+00:00 running a7f927f.


text:
"She gasped as she saw what he was holding in his hands. 'Why, you've brought … a pair of handcuffs!' she cried. 'Are you going to …'
"'Yes,' he smiled. 'We're going to handcuff ourselves to the door of the Selective Service office. Then the cops can't drag us away.'
"Her heart was beating wildly as she fingered her macramé handbag. It was the thrill of something forbidden, something violent. She knew she should be wishing for Alan Alda, but she couldn't keep away the fantasies about Dirty Harry.
"As he unpeeled the foil from the Jiffy Pop, the strains of their special song, the song that was playing when they first met, kept going through her mind: '… with Gilligan, the skipper too, the millionaire and his wife …'
"His voice snapped her out of her reverie. 'Hadn't you noticed,' he said, 'how I've redecorated the kitchen?'
"She looked around her. Oh! Yes! she thought. The avocado-colored refrigerator! The harvest-gold range! And was that a fondue pot on the shelf? So new, so stylish, so hip! She could restrain herself no longer. She whispered her secret desire: to be hurt, to feel pain.
"'Here's pain for you,' he hissed. 'The Sixties are over and it's now the Seventies. The Beatles have broken up, and we're left with the Partridge Family.'
"A moan escaped her lips.
"'And if that's not painful enough,' he added, 'we can put the TV on and listen to a speech by Vice President Spiro Agnew.'
"'Aaaahhhhh …"
"Afterwards, he soothed her with the comfort she craved above all others: a big bowl of Lipton's Onion-Soup-Mix California Dip."
Babble took the manuscript back from me. "What do you think?" he asked.
It has promise, I said. But you know, it probably will sell better if you put just a bit of sex into it. Are you going to have a sex scene?
"Sure. That's in the chapter where they buy a waterbed."
Reach Tony at firstname.lastname@example.com.


text:
Wickliffe Limited, founded in 1948, is a family owned New Zealand business and has 60 years' experience in supplying print and related services to the corporate and Government market in New Zealand. What started out many years ago as a traditional 'business forms manufacturing business' is now recognised as an integrated 'print and supply chain management company' with expertise in the areas of:
- Print management and procurement of all print related services
- In-house design and print manufacturing for colour, digital and rotary requirements
- Supply chain solutions including inventory management, e-commerce and technology solutions, logistics, warehousing and distribution.
The scope of Wickliffe's business offering means we do not limit ourselves to specific market sectors. We are one of the few New Zealand print companies with the resources to provide large and diverse corporations and government departments throughout the country with solutions for their complex print, print management, warehousing and supply logistics issues.


text:
Giulio Iacchetti has been working in the field of industrial design since 1992. He combines this work with lecturing and teaching duties in a number of universities and design schools. He has received many awards amongst which (with Matteo Ragni) the "Compasso dÆOro" (Golden Compass) in 2001 for the "Moscardino" multipurpose biodegradable fork, which today is part of the permanent exhibition of design at the MoMA in New York. In 2009 he received the "Premio dei Premi" (Prize of Prizes) from the President of the Italian Republic for the innovative "Design alla Coop" project, which sought to apply design related themes to large chain stores. In May 2009 he opened the series of exhibitions dedicated to young designers at the Triennale design museum in Milan, with a personal display titled "Giulio Iacchetti. Oggetti disobbedienti".
Tropico had a decidedly sculptural presence that produces an all embracing, atmospheric light, thanks to the inner cylinder that filters and spreads the luminous fluorescent flow. The personality of the light can be further emphasized by inserting one of the optional filters, choice of a cold violet or a warm orange, to add color variation that exalts the internal volume of the lamp. Obtain a number of forms and dimensions with Tropico's modularity, which allows for endless combinations by altering the diameter and adjusting the succession of rings.Item: | Dimensions: | Weight: |
Tropico - Sphera | Unavailable | 13.25 |
Tropico - Sphera | Unavailable | Unavailable |
Bulb Type: | Fluorescent |
Number of Lights: | 1 |
Other: | Additional Finishes |
Product Category: | Pendant Lights |
Style: | Modern |
Type: | Globe Pendant |
Questions & Answers
The Foscarini keynote is research, into forms and materials, as well as ideas. Established in 1981 in Venice, Foscarini started out by exploring the opportunities offered by Murano glass. The management assures brand identity and coherence by careful conservation of its Murano heritage, whilst being ever ready to consider new objectives and to exercise its rare capacity for talent scouting.
The company works with both established designers who've created new trends and with younger, emerging exponents of alternative styles and approaches. This makes for a highly original catalogue and one of the most varied in the sector. Over the years, the range of materials used has expanded to include satin-finished glass, polyethylene, wood and aluminium, as well as patented materials such as an exclusive textured glass-tissue and carbone fibre composite.


text:
London business advice
Latest advice and analysis for London businesses
10 reasons why 2014 is the year to offer Apprenticeships
Apprenticeships have changed and they're transforming businesses across the country
Ian Hallett: how I saved 35 hours per week of wasted time
The Lloyds senior executive reveals the remarkably small changes that transformed his life
Hetty Knox: Society urgently needs more commercialisation of women in sport
Ahead of International Women's Day, the Women's SportsNet researcher and sports editor speaks out and talks to Helena Morrissey CBE
Harry Cockburn: Electioneering over immigration will only damage the recovery
We must confront attitudes to immigration, not pander to ignorance
Andrew Payne: Why investing in apprentices means investing in business success
Fujitsu's Engineering Services director explains how apprentices can go from a clean sheet of paper to being a company director
E-guide: The ultimate guide to Apprenticeships for employers & how to hire one
Your straight-forward need-to-know guide
Jane Scott Paul OBE: Want some of the £1.8bn of UK economic benefits that apprentices create?
The CEO of the Association of Accounting Technicians explains how apprentices can help business
Virgin Media, ITV News, BDO & more on what it's really like to employ apprentices
How can offering Apprenticeships help your business?
Charlie Mullins: I went from apprentice to running a multi-million-pound business, and others can too
The Pimlico Plumbers boss on why he believes in apprenticeships
Justin Urquhart Stewart: The UK needs long-term investors not short-term punters
The Seven Investment Management founder calls for more UK Investment to stimulate growth
Shruti Tripathi: Why selling British passports for £2.5m is a terrible idea
Is it fair that you can just pay a couple of millions to buy a British asset?
Did you know you've been working for free for two months?Video
Today is Work Your Proper Hours Day. I know, catchy.
Business news from the last 24 hours
Betfair co-founder Ed Wray on the future of business in Britain
His company turns over £387m and has almost one million customers. What does he forecast for yours?
Archived advice and analysis for London businesses
Did you know you've been working for free for two months?Video
London's most overpriced miniscule spaces that cost over £100,000
Sophie Hobson: Waitrose, Google & Boots are focusing on sustainability - shouldn't you?Video
Alessio Rastani: The ghost of 1929 crash haunts againVideo
Barcroft Media has generated 275 million YouTube views, but you've probably never heard of itVideo
The 6 most iconic London fashion trends of the last 50 years
The 6 most iconic London fashion trends of the last 50 years
10 most controversial Tory scandalsVideo
Sophie Hobson: There's much to celebrate in Clegg's new plans for NEETs, but one glaring mistake
5 reasons you should do an Executive MBA in 2014
Robyn Vinter: Play it cool with the Scots, Cameron, your desperation is embarrassing
Alessio Rastani: The end of bitcoin?Video
The 6 most iconic London fashion trends of the last 50 years
The 6 most iconic London fashion trends of the last 50 years
The 6 most iconic London fashion trends of the last 50 years
He fired Tony Blair & saved the Tchenguiz brothers from jail. Meet Sarosh Zaiwalla


text:
Contact Us
The Westin Galleria Dallas
Career Opportunities at The Westin Galleria Dallas
Physical Address
- 13340 Dallas Parkway
- Dallas, Texas 75240
- United States
We cannot locate this Starwood Preferred Guest account. Please correct any errors and click the "Sign In" button again, or
contact us and we will be glad to help.
To ensure accurate crediting and debiting of Starpoints, please sign in to the same SPG account you used to make your reservation.
Career Opportunities at The Westin Galleria Dallas
You are on Westin.com
Other Starwood Brands > |
Four Points
W Hotels
Le Méridien
Luxury Collection
St. Regis
Starwood Hotels & Resorts
Starwood Preferred Guest Starwood Hotels Learn about our brands © 2014 Starwood Hotels & Resorts Worldwide, Inc. All rights reserved. |
Information for this hotel is not available in English.
Please select a language below to read about the hotel in that language. Once you make your selection, text throughout the site will change to that language.
A representative is currently available to tell you more about this hotel in English. Click here and someone will contact you right away.
Or click here for a list of our local Customer Support phone numbers.


text:
Open AccessThis article is
- freely available
- re-usable
Molecules 2008, 13(8), 1743-1758; doi:10.3390/molecules13081743
1,2,5,10,11,14-Hexaoxadispiro[184.108.40.206]hexadecanes: Novel Spirofused Bis-Trioxane Peroxides
Department of Chemistry, Institute of Organic Chemistry, Greinstr. 4, 50939 Köln, Germany
Department of Chemistry, Faculty of Science, Cairo University, Giza, Egypt
* Authors to whom correspondence should be addressed.
Received: 28 July 2008; in revised form: 15 August 2008 / Accepted: 18 August 2008 / Published: 19 August 2008
(This article belongs to the Special Issue Spiro Compounds)
Download PDF Full-Text [759 KB, uploaded 1 October 2008 09:18 CEST]
Abstract: A set of new bis-spirofused 1,2,4-trioxanes 4a-d was obtained from the reaction of cyclohexane-1,4-dione with allylic hydroperoxides 2a-d, bearing an additional hydroxy group in the homoallylic position, by diastereoselective photooxygenation of allylic alcohols 1a-d and subsequent BF3-catalyzed peroxyacetalization with the diketone. From the reaction of a monoprotected cyclohexane-1,4-dione 5 with the allylic hydroperoxide 6 derived from the singlet oxygenation of methyl hydroxytiglate, one monospiro compound was obtained, the 1,2,4-trioxane ketone 7, as well as a mixture of the diastereoisomeric syn- and anti bis-1,2,4-trioxanes 8. The structures of bis-1,2,4-trioxanes were examined theoretically by DFT methods and compared with X-ray structural data in order to evaluate the preferential trioxane ring conformational orientation.
Keywords: Bis-spiro compounds; peroxides; singlet oxygen; DFT calculations; X-ray structure determination.
Article Statistics
Click here to load and display the download statistics.Cite This Article
MDPI and ACS Style
Griesbeck, A.G.; Höinck, L.-O.; Lex, J.; Neudörfl, J.; Blunk, D.; El-Idreesy, T.T. 1,2,5,10,11,14-Hexaoxadispiro[126.96.36.199]hexadecanes: Novel Spirofused Bis-Trioxane Peroxides. Molecules 2008, 13, 1743-1758.
AMA StyleGriesbeck AG, Höinck L-O, Lex J, Neudörfl J, Blunk D, El-Idreesy TT. 1,2,5,10,11,14-Hexaoxadispiro[188.8.131.52]hexadecanes: Novel Spirofused Bis-Trioxane Peroxides. Molecules. 2008; 13(8):1743-1758.
Chicago/Turabian StyleGriesbeck, Axel G.; Höinck, Lars-Oliver; Lex, Johann; Neudörfl, Jörg; Blunk, Dirk; El-Idreesy, Tamer T. 2008. "1,2,5,10,11,14-Hexaoxadispiro[184.108.40.206]hexadecanes: Novel Spirofused Bis-Trioxane Peroxides." Molecules 13, no. 8: 1743-1758.
Published by MDPI AG, Basel, Switzerland
E-Mail Table of Contents Alert


text:
Boston Ballet
Celebrating its 50th anniversary, Boston Ballet follows its Kennedy Center Ballet Across America III engagement with a mixed repertory program featuring works by George Balanchine, Jirí Kylián, and Petr Zuska.
- Jun. 3 - 5, 2014
- Opera House
- $25.00 - $89.00
Tickets are not yet on sale
Tickets go on sale April 2, 2014 at 10:00 AM to the public.March 24, 2014 at 10:00 AM to Kennedy Center Members
Not a member? Join today to receive priority purchasing and other benefits!
Mikko Nissinen, Artistic Director
with the Kennedy Center Opera House Orchestra
Mixed Repertory
Progam to include:
D.M.J. 1953–1977 (Zuska/Dvorák, Martinu, and Janácek)
Bella Figura (Kylián/Foss, Pergolesi, Marcello, Vivaldi, and Torelli)
Rubies [from Jewels] (Balanchine/Stravinsky)
"This company, it seems, can do almost anything."
--The Boston Globe
"One of the few eminent companies to promote choreographic innovation as an end in itself"
--The New York Times
Founded in 1963 as New England's first professional repertory ballet company, Boston Ballet is one of two companies celebrating its 50th anniversary during the 2013–2014 season. A participant in the Kennedy Center's Ballet Across America celebrations in 2008 and 2013, Boston Ballet now takes over the Opera House stage for a full engagement of its own, highlighting the breadth of the company's artistic range.
Among the works presented will be D.M.J. 1953–1977 by renowned Czech choreographer Petr Zuska. This passionate and tragic exploration of star-crossed love, yearning, isolation, and death is titled after the initials of three great Czech composers--Antonin Dvorák, Bohuslav Martinu, and Leos Janácek--whose music is featured in the work.
Boston Ballet will also perform Bella Figura by Jirí Kylián, another acclaimed Czech-born choreographer. Praised as "a gorgeous flourish of staging, costuming, lighting, and daring theatrics" by the Boston Herald, the work increasingly confines its nine dancers with opening and closing curtains, displaying Kylián's inventive combination of lyricism and comedy set to music by several Baroque composers.
The Rubies movement of Balanchine's Jewels sends its dancers racing across the stage like lightning to Igor Stravinsky's jazz-inflected Capriccio for Piano and Orchestra.
Please note: Bella Figura contains upper body female nudity.
- About Ballet at the Kennedy Center
- Boston Ballet Official Website
- Boston Ballet Facebook Official Facebook of Boston Ballet
- Boston Ballet Pinterest Official Pinterest of Boston Ballet
- Boston Ballet Twitter Official Twitter of Boston Ballet
- Boston Ballet Vimeo Official Vimeo of Boston Ballet
- Boston Ballet YouTube Official YouTube of Boston Ballet
The Kennedy Center's Ballet Season is presented with the support of
Elizabeth and Michael Kojaian.
Group of 20 or more? Group Sales offers special terms and discounts for most performances.
Tickets & Schedule
- Sign-Interpreted
- Audio Described
- Sensory-Friendly
- Exclusive presale to donors
- Exclusive presale to WNO Subscribers
- Exclusive presale to NSO Subscribers
- On sale to MyTix members
Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday |
1 |
2 |
Details & Pricing
Details & Pricing
Details & Pricing
6 |
7 |


text:
District 9
Federal Reserve Bank of Minneapolis
Instructions for commenting on applications
Type | Application | Ending date of comment period |
* 18C * Branch |
First Bank of Baldwin, Baldwin, Wisconsin, to merge with Bank of Spring Valley, Spring Valley, Wisconsin, and thereto establish branches at 320 McKay Street, Spring Valley, Wisconsin, and 409 Main Street, Plum City, Wisconsin. | Newspaper – Not available Fed Reg – Not applicable |
CIC | Notice by William Sexton, Incline Village, Nevada, as an individual, and as part of a group acting in concert with Kevin Noble, Minnetonka, Minnesota; Brian Schoenborn, Saint Joseph, Minnesota; and Jason Noble, Clara City, Minnesota, to acquire control of Kensington Bancorp, Inc., Kensington, Minnesota, and thereby indirectly acquire control of First State Bank of Kensington, Kensington, Minnesota. | Newspaper – Not available Fed Reg – 07/05/2007 |
CIC | Notice by William H. Unger, Sauk Centre, Minnesota, and Alfred P. Minnerath, Starbuck, Minnesota, to gain control of Sauk Centre Financial Services Inc., Sauk Centre, Minnesota, and thereby indirectly gain control of First National Bank of Sauk Centre, Sauk Centre, Minnesota. | Newspaper – 06/25/2007 Fed Reg – 06/25/2007 |
*Subject to the provisions of the Community Reinvestment Act.
The Community Reinvestment Act is intended to encourage depository institutions to help meet the credit needs of the communities in which they operate, including low- and moderate-income neighborhoods. It was enacted by the Congress in 1977 (12 U.S.C. 2901) and is implemented by Regulation BB (12 CFR 228). The regulation was revised in May 1995.
The CRA requires that each depository institution's record in helping meet the credit needs of its entire community be evaluated periodically. That record is taken into account in considering an institution's application for deposit facilities.
A copy of an institution's CRA evaluation may be obtained directly from the institution or Reserve Bank.
Federal bank regulators use the following performance levels to rate an institution's performance under CRA:
O = Outstanding
S = Satisfactory
NI = Needs to improve
SN = Substantial noncompliance
The following state member banks have been examined and their CRA public evaluations are now available.
RSSD number | Institution/Location | Exam date | CRA public date | CRA rating | Exam type |
945950 | Grand Marais State Bank |
03/05/2007 | 06/12/2007 | S | Small Bank |
Institution | Location |
None |


text:
- Home /
- Search /
Search Results
2,625 results
SORT BY Relevancy
Expectations For Chase Utley & Possible Trade Targets
by Buzz On Broad in Sports
Tags: Philadelphia Sports Phillies Chase Utley Trade MLB
Buzz On Broad Sports Talk Radio is the place to rant, complain, whine, or praise your favorite team or athletes. Today's topics include discussion on expectations for Chase Utley after missing the entire season to this point, as well as trade discussion involving the Phillies. We will touch on the NBA Playoffs & much more! Join in on the conversation at 714-868-0800!
by BeefStewRadio in Entertainment
Tags: asap mob ASAP FERG memphis bleek CHASE FETTI BEEF STEW RADIO
Chase Fetti got his start in the mid two thousands when he began opening up for artists like Joe Budden and Lil' Kim. In 2007, Chase Fetti helped mold the A$AP Mob and in soon rappers from around the country wanted to work with him. He released music with features from the hottest names in hip hop including; Memphis Bleek, Fat Trel,Prodigy, and A$AP Rocky.
Chase Masterson Anti-Bullying Superhero
by WormholeRiders in Lifestyle
Tags: Chase Materson Anti Bullying Unbelievable Star Trek DS9 Leeta RUR Genesis
Welcome back to WHR You Decide!
This Sunday, October 27, 2013 at 10am PST, we are honored and VERY excited to have with us, the wonderful entertainer, Chase Masterson, where you can call and speak with Chase at 347-838-9722!
A talented actress, Chase is also an established songstress. Employing her passion for helping others, Chase Masterson is fresh off of New York Comic Con and all of its grandeur, promoting Chase's "Anti-Bullying Coalition", which she founded and has enjoyed its most recent spotlight session in New York City!
Her most renowned role is of Leeta, the Dabo girl from Star Trek: Deep Space Nine. Originally written as a guest role, this role of a lifetime turned into a five year voyage aboard Deep Space Nine.
The next Chase Masterson project we will learn about is called "RUR Genesis" a scifi dramathat looks spectacular!
Chase Masterson is currently working on a brand new production entitled "Unbelievable" featuring a cast with many Star Trek alums including Michael Dorn, Robert Picardo, Nichelle Nichols, Walter Koenig, Connor Trinneer, Whoopi Goldberg, Tim Russ, BarBara Luna, Gary Lockwood and other legends of the entertainment world including Elke Sommer, Linda Park, Michael Forest, Anne McDaniels, Christopher Atkins and John O'Hurley!
Join us Sunday, at 10am PST for an awesome journey!
The Chase Dudley Show
by Live with Jonathan Moody in Film
Tags: Chase Dudley Final Offense 14 88 Actor Director
Actor/Director Chase Dudley (Final Offense, 14/88) will be on the show to discuss his films.
by NewMusicInferno in Music
Tags: BRANDON CHASE WANTED TINY DANCER NBC THE VOICE NEW MUSIC INFERNO
BRANDON CHASE - 20 YR OLD COUNTRY/POP SINGER SONGWRITER FROM TEXAS...CONTESTANT ON SEASON 5 OF THE VOICE ON TEAM BLAKE...SANG "WANTED" FOR THE BLINDS & WON THE BATTLE ROUND OF SINGING "TINY DANCER" VS EMILY RANDOLPH...CHECK OUT HIS MUSIC & MORE @ www.facebook.com/brandonchasemusic
The Gaming Zone #93 - The Chase Race
by Sweetenginesounds in Entertainment
Tags: gaming zone chase relay race
This is a multiplayer version of the Chase, but no one is chasing the players, it is a race to see how quickly they can answer questions and earn points. In round 1, a 120 seconds quick quiz, 3 points for each right answer. In round 2, it's time to go streaking. Everyone will play a multiple choice question. each right answer will earn 1 point for the 1st correct answer, 2 points for the 2nd right answer in a row, 3 points for the 3rd in a row, and 5 points for the 4th and on. Miss a question, and you must start the streak over again. In the final round, we start with the player who is in last place. They will answer questions until they get one wrong or pass, each player will earn 2 points, but if they are wrong or pass, the player with the next highest can answer and steal the point (2 points for each player who missed) and the player(s) who miss or passed LOSE 1 point. and possession of answering. The order goes from highest to lowest If no one can answer the question, then the player who first answer will answer again. After sme time, each right answer will be worth 3 points each (still go back 1 if an opponent answers), then 4 points, then 5 points. The player with the most points after 2 hours wins.
Chase Fetti
by GsnapsVegasLife in Music
Tags: Gsnaps Gsnaps Radio Ginger Williams Gsnaps Gsnaps Radio
Chase Fetti is an original member of the A$AP Mob that just released a new single called She Love It ft. Fat Trel.Chase Fetti got his start in the mid two thousands when he began opening up for artists like Joe Budden and Lil' Kim. In 2007, Chase Fetti helped mold the A$AP Mob and in soon rappers from around the country wanted to work with him. He released music with features from the hottest names in hip hop including; Memphis Bleek, Fat Trel, Prodigy, and A$AP Rocky."5 A.M. On Dope" https://www.youtube.com/watch?v=atuVghCUDyk
Jeri Chase Ferris is My Guest Tuesday, Oct. 22, 2013
Tags: jeri chase ferris noah webster biography childrens books american history
About the book
Webster's American Dictionary is the second most popular book ever printed in English. But who was that Webster? Noah Webster (1758–1843) was a bookish Connecticut farm boy who became obsessed with uniting America through language. He spent twenty years writing two thousand pages to accomplish that, and the first 100 percent American dictionary was published in 1828 when he was seventy years old. This clever, hilariously illustrated account shines a light on early American history and the life of a man who could not rest until he'd achieved his dream. An illustrated chronology of Webster's life makes this a picture perfect bi-og-ra-phy [noun: a written history of a person's life]. About the author
JERI CHASE FERRIS is the award-winning author of twelve biographies for children and young adults, published by Lerner Books and HoughtonMifflin/Harcourt. She specializes in biographies of people from 1776 to 1936 who overcame difficulties or discrimination or worse, to do great and important deeds for America. Many of her books are about multicultural heroes who, until recently, have been sadly omitted from history. Others are about important people you may not know, yet. For example - Noah Webster! NOAH WEBSTER & HIS WORDS, Houghton Mifflin Books for Children, is an SCBWI Golden Kite Award winner for best nonfiction book of 2012. Her books have won lots of other awards too (see www.jerichaseferris.com).
Chase Away K9 Cancer and Pet Insurance
by The Dog Show with Julie Forbes in Pets
Tags: Chase Away K9 Cancer Pet Insurance Pets Best Canine Cancer Veterinarian
In the first half, host Julie Forbes talks with Cera Reusser, founder of Chase Away K9 Cancer, a foundation started in memory of Cera's labrador, Chase, who she lost to Canine Cancer. Chase Away K9 Cancer has raised over $726,000!
In the second half of the show, Julie talks with a representative of Pets Best Insurance, to talk about how pet insurance works, and how you and pet could benefit from the support of pet insurance.
Chase or Be Chase?
by 4ShoThoughts in Entertainment
Tags: 4SHO 4SHOTHOUGHTS CHASE RELATIONSHIPS WOMEN
Should men chase women, or should women seduce men?
Sound of Music stars Duane Chase and Debbie Turner are ON
by Lessons Learned in Movies
Tags: Sound of Music special Featuring Duane Chase and Debbie Turner Wander Years with Sound of Music stars High on a hill lived a lonely goatherd hosted by Carla Tocquigny the transformed travel
Celebrating the upcoming Sound of Music 50th anniversary, this show features two of the seven Von Trapp Family stars- Debbie Turner (Marta) and Duane Chase (Kurt).
This show is brought to you by Gracefully Yours greeting cards and journals along with Wander Years- the most popular millennial travel show focused on awakening your five senses.
Chase Bank Prepares For Bank Run-On-Money!
by Lori A Mosby in Current Events
Tags: Lori A Mosby Chase Bank America Forbes Magazine US economy
According to Forbes:
The reports are referring to a new $50,000 limit on monthly cash activity being imposed on small business checking accounts and a ban on outgoing international wire transfers on those accounts.
Small business customers received letters from the bank stating that the changes are effective November 17. "These changes will help us more effectively manage the risks involved with these types of transactions," the letter states.
Company Info
Resources / Support
- © BlogTalkRadio.com. All Rights Reserved.
- Privacy Policy Terms of Use Sitemap