Ruby on Rails 3.0 Release Notes¶ ↑
Rails 3.0 is ponies and rainbows! It's going to cook you dinner and fold your laundry. You're going to wonder how life was ever possible before it arrived. It's the Best Version of Rails We've Ever Done!
But seriously now, it's really good stuff. There are all the good ideas brought over from when the Merb team joined the party and brought a focus on framework agnosticism, slimmer and faster internals, and a handful of tasty APIs. If you're coming to Rails 3.0 from Merb 1.x, you should recognize lots. If you're coming from Rails 2.x, you're going to love it too.
Even if you don't give a hoot about any of our internal cleanups, Rails 3.0 is going to delight. We have a bunch of new features and improved APIs. It's never been a better time to be a Rails developer. Some of the highlights are:
-
Brand new router with an emphasis on RESTful declarations
-
New Action Mailer API modeled after Action Controller (now without the agonizing pain of sending multipart messages!)
-
New Active Record chainable query language built on top of relational algebra
-
Unobtrusive JavaScript helpers with drivers for Prototype, jQuery, and more coming (end of inline JS)
-
Explicit dependency management with Bundler
On top of all that, we've tried our best to deprecate the old APIs with nice warnings. That means that you can move your existing application to Rails 3 without immediately rewriting all your old code to the latest best practices.
These release notes cover the major upgrades, but don't include every little bug fix and change. Rails 3.0 consists of almost 4,000 commits by more than 250 authors! If you want to see everything, check out the list of commits in the main Rails repository on GitHub.
To install Rails 3:
# Use sudo if your setup requires it $ gem install rails
Upgrading to Rails 3¶ ↑
If you're upgrading an existing application, it's a great idea to have good test coverage before going in. You should also first upgrade to Rails 2.3.5 and make sure your application still runs as expected before attempting to update to Rails 3. Then take heed of the following changes:
Rails 3 requires at least Ruby 1.8.7¶ ↑
Rails 3.0 requires Ruby 1.8.7 or higher. Support for all of the previous Ruby versions has been dropped officially and you should upgrade as early as possible. Rails 3.0 is also compatible with Ruby 1.9.2.
TIP: Note that Ruby 1.8.7 p248 and p249 have marshaling bugs that crash Rails 3.0. Ruby Enterprise Edition have these fixed since release 1.8.7-2010.02 though. On the 1.9 front, Ruby 1.9.1 is not usable because it outright segfaults on Rails 3.0, so if you want to use Rails 3 with 1.9.x jump on 1.9.2 for smooth sailing.
Rails Application object¶ ↑
As part of the groundwork for supporting running multiple Rails
applications in the same process, Rails 3 introduces the concept of an
Application object. An application object holds all the application
specific configurations and is very similar in nature to
config/environment.rb
from the previous versions of Rails.
Each Rails application now must have a corresponding application object.
The application object is defined in config/application.rb
. If
you're upgrading an existing application to Rails 3, you must add this
file and move the appropriate configurations from
config/environment.rb
to config/application.rb
.
script/* replaced by script/rails¶ ↑
The new script/rails
replaces all the scripts that used to be
in the script
directory. You do not run
script/rails
directly though, the rails
command
detects it is being invoked in the root of a Rails application and runs the
script for you. Intended usage is:
$ rails console # instead of script/console $ rails g scaffold post title:string # instead of script/generate scaffold post title:string
Run rails --help
for a list of all the options.
Dependencies and config.gem¶ ↑
The config.gem
method is gone and has been replaced by using
bundler
and a Gemfile
, see Vendoring Gems below.
Upgrade Process¶ ↑
To help with the upgrade process, a plugin named Rails Upgrade has been created to automate part of it.
Simply install the plugin, then run rake rails:upgrade:check
to check your app for pieces that need to be updated (with links to
information on how to update them). It also offers a task to generate a
Gemfile
based on your current config.gem
calls
and a task to generate a new routes file from your current one. To get the
plugin, simply run the following:
$ ruby script/plugin install git://github.com/rails/rails_upgrade.git
You can see an example of how that works at Rails Upgrade is now an Official Plugin
Aside from Rails Upgrade tool, if you need more help, there are people on IRC and rubyonrails-talk that are probably doing the same thing, possibly hitting the same issues. Be sure to blog your own experiences when upgrading so others can benefit from your knowledge!
Creating a Rails 3.0 application¶ ↑
# You should have the 'rails' RubyGem installed $ rails new myapp $ cd myapp
Vendoring Gems¶ ↑
Rails now uses a Gemfile
in the application root to determine
the gems you require for your application to start. This
Gemfile
is processed by the Bundler which then installs
all your dependencies. It can even install all the dependencies locally to
your application so that it doesn't depend on the system gems.
More information: - bundler homepage
Living on the Edge¶ ↑
Bundler
and Gemfile
makes freezing your Rails
application easy as pie with the new dedicated bundle
command,
so rake freeze
is no longer relevant and has been dropped.
If you want to bundle straight from the Git repository, you can pass the
--edge
flag:
$ rails new myapp --edge
If you have a local checkout of the Rails repository and want to generate
an application using that, you can pass the --dev
flag:
$ ruby /path/to/rails/bin/rails new myapp --dev
Rails Architectural Changes¶ ↑
There are six major changes in the architecture of Rails.
Railties Restrung¶ ↑
Railties was updated to provide a consistent plugin API for the entire Rails framework as well as a total rewrite of generators and the Rails bindings, the result is that developers can now hook into any significant stage of the generators and application framework in a consistent, defined manner.
All Rails core components are decoupled¶ ↑
With the merge of Merb and Rails, one of the big jobs was to remove the tight coupling between Rails core components. This has now been achieved, and all Rails core components are now using the same API that you can use for developing plugins. This means any plugin you make, or any core component replacement (like DataMapper or Sequel) can access all the functionality that the Rails core components have access to and extend and enhance at will.
More information: - The Great Decoupling
Active Model Abstraction¶ ↑
Part of decoupling the core components was extracting all ties to Active Record from Action Pack. This has now been completed. All new ORM plugins now just need to implement Active Model interfaces to work seamlessly with Action Pack.
More information: - Make Any Ruby Object Feel Like ActiveRecord
Controller Abstraction¶ ↑
Another big part of decoupling the core components was creating a base
superclass that is separated from the notions of HTTP in order to handle
rendering of views etc. This creation of AbstractController
allowed ActionController
and ActionMailer
to be
greatly simplified with common code removed from all these libraries and
put into Abstract Controller.
More Information: - Rails Edge Architecture
Arel Integration¶ ↑
Arel (or Active Relation) has been taken on as the underpinnings of Active Record and is now required for Rails. Arel provides an SQL abstraction that simplifies out Active Record and provides the underpinnings for the relation functionality in Active Record.
More information: - Why I wrote Arel
Mail Extraction¶ ↑
Action Mailer ever since its beginnings has had monkey patches, pre parsers and even delivery and receiver agents, all in addition to having TMail vendored in the source tree. Version 3 changes that with all email message related functionality abstracted out to the Mail gem. This again reduces code duplication and helps create definable boundaries between Action Mailer and the email parser.
More information: - New Action Mailer API in Rails 3
Documentation¶ ↑
The documentation in the Rails tree is being updated with all the API changes, additionally, the Rails Edge Guides are being updated one by one to reflect the changes in Rails 3.0. The guides at guides.rubyonrails.org however will continue to contain only the stable version of Rails (at this point, version 2.3.5, until 3.0 is released).
More Information: - Rails Documentation Projects
Internationalization¶ ↑
A large amount of work has been done with I18n support in Rails 3, including the latest I18n gem supplying many speed improvements.
-
I18n for any object - I18n behavior can be added to any object by including
ActiveModel::Translation
andActiveModel::Validations
. There is also anerrors.messages
fallback for translations. -
Attributes can have default translations.
-
Form Submit Tags automatically pull the correct status (Create or Update) depending on the object status, and so pull the correct translation.
-
Labels with I18n also now work by just passing the attribute name.
More Information: - Rails 3 I18n changes
Railties¶ ↑
With the decoupling of the main Rails frameworks, Railties got a huge overhaul so as to make linking up frameworks, engines or plugins as painless and extensible as possible:
-
Each application now has its own name space, application is started with
YourAppName.boot
for example, makes interacting with other applications a lot easier. -
Anything under
Rails.root/app
is now added to the load path, so you can makeapp/observers/user_observer.rb
and Rails will load it without any modifications. -
Rails 3.0 now provides a
Rails.config
object, which provides a central repository of all sorts of Rails wide configuration options.Application generation has received extra flags allowing you to skip the installation of test-unit, Active Record, Prototype and Git. Also a new
--dev
flag has been added which sets the application up with theGemfile
pointing to your Rails checkout (which is determined by the path to therails
binary). Seerails --help
for more info.
Railties generators got a huge amount of attention in Rails 3.0, basically:
-
Generators were completely rewritten and are backwards incompatible.
-
Rails templates API and generators API were merged (they are the same as the former).
-
Generators are no longer loaded from special paths anymore, they are just found in the Ruby load path, so calling
rails generate foo
will look forgenerators/foo_generator
. -
New generators provide hooks, so any template engine, ORM, test framework can easily hook in.
-
New generators allow you to override the templates by placing a copy at
Rails.root/lib/templates
. -
Rails::Generators::TestCase
is also supplied so you can create your own generators and test them.
Also, the views generated by Railties generators had some overhaul:
-
Views now use
div
tags instead ofp
tags. -
Scaffolds generated now make use of
_form
partials, instead of duplicated code in the edit and new views. -
Scaffold forms now use
f.submit
which returns “Create ModelName” or “Update ModelName” depending on the state of the object passed in.
Finally a couple of enhancements were added to the rake tasks:
-
rake db:forward
was added, allowing you to roll forward your migrations individually or in groups. -
rake routes CONTROLLER=x
was added allowing you to just view the routes for one controller.
Railties now deprecates:
-
RAILS_ROOT
in favor ofRails.root
, -
RAILS_ENV
in favor ofRails.env
, and -
RAILS_DEFAULT_LOGGER
in favor ofRails.logger
.
PLUGIN/rails/tasks
, and PLUGIN/tasks
are no
longer loaded all tasks now must be in PLUGIN/lib/tasks
.
More information:
Action Pack¶ ↑
There have been significant internal and external changes in Action Pack.
Abstract Controller¶ ↑
Abstract Controller pulls out the generic parts of Action Controller into a
reusable module that any library can use to render templates, render
partials, helpers, translations, logging, any part of the request response
cycle. This abstraction allowed ActionMailer::Base
to now just
inherit from AbstractController
and just wrap the Rails DSL
onto the Mail gem.
It also provided an opportunity to clean up Action Controller, abstracting out what could to simplify the code.
Note however that Abstract Controller is not a user facing API, you will not run into it in your day to day use of Rails.
More Information: - Rails Edge Architecture
Action Controller¶ ↑
-
application_controller.rb
now hasprotect_from_forgery
on by default. -
The
cookie_verifier_secret
has been deprecated and now instead it is assigned throughRails.application.config.cookie_secret
and moved into its own file:config/initializers/cookie_verification_secret.rb
. -
The
session_store
was configured inActionController::Base.session
, and that is now moved toRails.application.config.session_store
. Defaults are set up inconfig/initializers/session_store.rb
. -
cookies.secure
allowing you to set encrypted values in cookies withcookie.secure[:key] => value
. -
cookies.permanent
allowing you to set permanent values in the cookie hashcookie.permanent[:key] => value
that raise exceptions on signed values if verification failures. -
You can now pass
:notice => 'This is a flash message'
or:alert => 'Something went wrong'
to theformat
call inside arespond_to
block. Theflash[]
hash still works as previously. -
respond_with
method has now been added to your controllers simplifying the venerableformat
blocks. -
ActionController::Responder
added allowing you flexibility in how your responses get generated.
Deprecations:
-
filter_parameter_logging
is deprecated in favor ofconfig.filter_parameters << :password
.
More Information:
Action Dispatch¶ ↑
Action Dispatch is new in Rails 3.0 and provides a new, cleaner implementation for routing.
-
Big clean up and re-write of the router, the Rails router is now
rack_mount
with a Rails DSL on top, it is a stand alone piece of software. -
Routes defined by each application are now name spaced within your Application module, that is:
# Instead of: ActionController::Routing::Routes.draw do |map| map.resources :posts end # You do: AppName::Application.routes do resources :posts end
-
Added
match
method to the router, you can also pass any Rack application to the matched route. -
Added
constraints
method to the router, allowing you to guard routers with defined constraints. -
Added
scope
method to the router, allowing you to namespace routes for different languages or different actions, for example:scope 'es' do resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto' end # Gives you the edit action with /es/proyecto/1/cambiar
-
Added
root
method to the router as a short cut formatch '/', :to => path
. -
You can pass optional segments into the match, for example
match "/:controller(/:action(/:id))(.:format)"
, each parenthesized segment is optional. -
Routes can be expressed via blocks, for example you can call
controller :home { match '/:action' }
.
NOTE. The old style map
commands still work as before with a
backwards compatibility layer, however this will be removed in the 3.1
release.
Deprecations
-
The catch all route for non-REST applications (
/:controller/:action/:id
) is now commented out. -
Routes
:path_prefix
no longer exists and:name_prefix
now automatically adds "_" at the end of the given value.
More Information: * The Rails 3 Router: Rack it Up * Revamped Routes in Rails 3 * Generic Actions in Rails 3
Action View¶ ↑
Unobtrusive JavaScript¶ ↑
Major re-write was done in the Action View helpers, implementing Unobtrusive JavaScript (UJS) hooks and removing the old inline AJAX commands. This enables Rails to use any compliant UJS driver to implement the UJS hooks in the helpers.
What this means is that all previous remote_<method>
helpers have been removed from Rails core and put into the Prototype Legacy
Helper. To get UJS hooks into your HTML, you now pass :remote
=> true
instead. For example:
form_for @post, :remote => true
Produces:
<form action="http://host.com" id="create-post" method="post" data-remote="true">
Helpers with Blocks¶ ↑
Helpers like form_for
or div_for
that insert
content from a block use <%=
now:
<%= form_for @post do |f| %> ... <% end %>
Your own helpers of that kind are expected to return a string, rather than appending to the output buffer by hand.
Helpers that do something else, like cache
or
content_for
, are not affected by this change, they need
<%
as before.
Other Changes¶ ↑
-
You no longer need to call
h(string)
to escape HTML output, it is on by default in all view templates. If you want the unescaped string, callraw(string)
. -
Helpers now output HTML 5 by default.
-
Form label helper now pulls values from I18n with a single value, so
f.label :name
will pull the:name
translation. -
I18n select label on should now be :en.helpers.select instead of :en.support.select.
-
You no longer need to place a minus sign at the end of a Ruby interpolation inside an ERB template to remove the trailing carriage return in the HTML output.
-
Added
grouped_collection_select
helper to Action View. -
content_for?
has been added allowing you to check for the existence of content in a view before rendering. -
passing
:value => nil
to form helpers will set the field'svalue
attribute to nil as opposed to using the default value -
passing
:id => nil
to form helpers will cause those fields to be rendered with noid
attribute -
passing
:alt => nil
toimage_tag
will cause theimg
tag to render with noalt
attribute
Active Model¶ ↑
Active Model is new in Rails 3.0. It provides an abstraction layer for any ORM libraries to use to interact with Rails by implementing an Active Model interface.
ORM Abstraction and Action Pack Interface¶ ↑
Part of decoupling the core components was extracting all ties to Active Record from Action Pack. This has now been completed. All new ORM plugins now just need to implement Active Model interfaces to work seamlessly with Action Pack.
More Information: - Make Any Ruby Object Feel Like ActiveRecord
Validations¶ ↑
Validations have been moved from Active Record into Active Model, providing an interface to validations that works across ORM libraries in Rails 3.
-
There is now a
validates :attribute, options_hash
shortcut method that allows you to pass options for all the validates class methods, you can pass more than one option to a validate method. -
The
validates
method has the following options:-
:acceptance => Boolean
. -
:confirmation => Boolean
. -
:exclusion => { :in => Enumerable }
. -
:inclusion => { :in => Enumerable }
. -
:format => { :with => Regexp, :on => :create }
. -
:length => { :maximum => Fixnum }
. -
:numericality => Boolean
. -
:presence => Boolean
. -
:uniqueness => Boolean
.
-
NOTE: All the Rails version 2.3 style validation methods are still supported in Rails 3.0, the new validates method is designed as an additional aid in your model validations, not a replacement for the existing API.
You can also pass in a validator object, which you can then reuse between objects that use Active Model:
class TitleValidator < ActiveModel::EachValidator Titles = ['Mr.', 'Mrs.', 'Dr.'] def validate_each(record, attribute, value) unless Titles.include?(value) record.errors[attribute] << 'must be a valid title' end end end
class Person include ActiveModel::Validations attr_accessor :title validates :title, :presence => true, :title => true end # Or for Active Record class Person < ActiveRecord::Base validates :title, :presence => true, :title => true end
There's also support for introspection:
User.validators User.validators_on(:login)
More Information:
Active Record¶ ↑
Active Record received a lot of attention in Rails 3.0, including abstraction into Active Model, a full update to the Query interface using Arel, validation updates and many enhancements and fixes. All of the Rails 2.x API will be usable through a compatibility layer that will be supported until version 3.1.
Query Interface¶ ↑
Active Record, through the use of Arel, now returns relations on its core methods. The existing API in Rails 2.3.x is still supported and will not be deprecated until Rails 3.1 and not removed until Rails 3.2, however, the new API provides the following new methods that all return relations allowing them to be chained together:
-
where
- provides conditions on the relation, what gets returned. -
select
- choose what attributes of the models you wish to have returned from the database. -
group
- groups the relation on the attribute supplied. -
having
- provides an expression limiting group relations (GROUP BY constraint). -
joins
- joins the relation to another table. -
clause
- provides an expression limiting join relations (JOIN constraint). -
includes
- includes other relations pre-loaded. -
order
- orders the relation based on the expression supplied. -
limit
- limits the relation to the number of records specified. -
lock
- locks the records returned from the table. -
readonly
- returns an read only copy of the data. -
from
- provides a way to select relationships from more than one table. -
scope
- (previouslynamed_scope
) return relations and can be chained together with the other relation methods. -
with_scope
- andwith_exclusive_scope
now also return relations and so can be chained. -
default_scope
- also works with relations.
More Information:
Enhancements¶ ↑
-
Added
:destroyed?
to Active Record objects. -
Added
:inverse_of
to Active Record associations allowing you to pull the instance of an already loaded association without hitting the database.
Patches and Deprecations¶ ↑
Additionally, many fixes in the Active Record branch:
-
SQLite 2 support has been dropped in favor of SQLite 3.
-
MySQL support for column order.
-
PostgreSQL adapter has had its
TIME ZONE
support fixed so it no longer inserts incorrect values. -
Support multiple schemas in table names for PostgreSQL.
-
PostgreSQL support for the XML data type column.
-
table_name
is now cached. -
A large amount of work done on the Oracle adapter as well with many bug fixes.
As well as the following deprecations:
-
named_scope
in an Active Record class is deprecated and has been renamed to justscope
. -
In
scope
methods, you should move to using the relation methods, instead of a:conditions => {}
finder method, for examplescope :since, lambda {|time| where("created_at > ?", time) }
. -
save(false)
is deprecated, in favor ofsave(:validate => false)
. -
I18n error messages for Active Record should be changed from :en.activerecord.errors.template to
:en.errors.template
. -
model.errors.on
is deprecated in favor ofmodel.errors[]
-
validates_presence_of => validates… :presence => true
-
ActiveRecord::Base.colorize_logging
andconfig.active_record.colorize_logging
are deprecated in favor ofRails::LogSubscriber.colorize_logging
orconfig.colorize_logging
NOTE: While an implementation of State Machine has been in Active Record edge for some months now, it has been removed from the Rails 3.0 release.
Active Resource¶ ↑
Active Resource was also extracted out to Active Model allowing you to use Active Resource objects with Action Pack seamlessly.
-
Added validations through Active Model.
-
Added observing hooks.
-
HTTP proxy support.
-
Added support for digest authentication.
-
Moved model naming into Active Model.
-
Changed Active Resource attributes to a Hash with indifferent access.
-
Added
first
,last
andall
aliases for equivalent find scopes. -
find_every
now does not return aResourceNotFound
error if nothing returned. -
Added
save!
which raisesResourceInvalid
unless the object isvalid?
. -
update_attribute
andupdate_attributes
added to Active Resource models. -
Added
exists?
. -
Renamed
SchemaDefinition
toSchema
anddefine_schema
toschema
. -
Use the
format
of Active Resources rather than thecontent-type
of remote errors to load errors. -
Use
instance_eval
for schema block. -
Fix
ActiveResource::ConnectionError#to_s
when@response
does not respond to code or message, handles Ruby 1.9 compatibility. -
Add support for errors in JSON format.
-
Ensure
load
works with numeric arrays. -
Recognizes a 410 response from remote resource as the resource has been deleted.
-
Add ability to set SSL options on Active Resource connections.
-
Setting connection timeout also affects
Net::HTTP
open_timeout
.
Deprecations:
-
save(false)
is deprecated, in favor ofsave(:validate => false)
. -
Ruby 1.9.2:
URI.parse
and.decode
are deprecated and are no longer used in the library.
Active Support¶ ↑
A large effort was made in Active Support to make it cherry pickable, that is, you no longer have to require the entire Active Support library to get pieces of it. This allows the various core components of Rails to run slimmer.
These are the main changes in Active Support:
-
Large clean up of the library removing unused methods throughout.
-
Active Support no longer provides vendored versions of TZInfo, Memcache Client and Builder. These are all included as dependencies and installed via the
bundle install
command. -
Safe buffers are implemented in
ActiveSupport::SafeBuffer
. -
Added
Array.uniq_by
andArray.uniq_by!
. -
Removed
Array#rand
and backportedArray#sample
from Ruby 1.9. -
Fixed bug on
TimeZone.seconds_to_utc_offset
returning wrong value. -
Added
ActiveSupport::Notifications
middleware. -
ActiveSupport.use_standard_json_time_format
now defaults to true. -
ActiveSupport.escape_html_entities_in_json
now defaults to false. -
Integer#multiple_of?
accepts zero as an argument, returns false unless the receiver is zero. -
string.chars
has been renamed tostring.mb_chars
. -
ActiveSupport::OrderedHash
now can de-serialize through YAML. -
Added SAX-based parser for XmlMini, using LibXML and Nokogiri.
-
Added
Object#presence
that returns the object if it's#present?
otherwise returnsnil
. -
Added
String#exclude?
core extension that returns the inverse of#include?
. -
Added
to_i
toDateTime
inActiveSupport
soto_yaml
works correctly on models withDateTime
attributes. -
Added
Enumerable#exclude?
to bring parity toEnumerable#include?
and avoid if!x.include?
. -
Switch to on-by-default XSS escaping for rails.
-
Support deep-merging in
ActiveSupport::HashWithIndifferentAccess
. -
Enumerable#sum
now works will all enumerables, even if they don't respond to:size
. -
inspect
on a zero length duration returns '0 seconds' instead of empty string. -
Add
element
andcollection
toModelName
. -
String#to_time
andString#to_datetime
handle fractional seconds. -
Added support to new callbacks for around filter object that respond to
:before
and:after
used in before and after callbacks. -
The
ActiveSupport::OrderedHash#to_a
method returns an ordered set of arrays. Matches Ruby 1.9'sHash#to_a
. -
MissingSourceFile
exists as a constant but it is now just equal toLoadError
. -
Added
Class#class_attribute
, to be able to declare a class-level attribute whose value is inheritable and overwritable by subclasses. -
Finally removed
DeprecatedCallbacks
inActiveRecord::Associations
. -
Object#metaclass
is nowKernel#singleton_class
to match Ruby.
The following methods have been removed because they are now available in Ruby 1.8.7 and 1.9.
-
Integer#even?
andInteger#odd?
-
String#each_char
-
String#start_with?
andString#end_with?
(3rd person aliases still kept) -
String#bytesize
-
Object#tap
-
Symbol#to_proc
-
Object#instance_variable_defined?
-
Enumerable#none?
The security patch for REXML remains in Active Support because early patch-levels of Ruby 1.8.7 still need it. Active Support knows whether it has to apply it or not.
The following methods have been removed because they are no longer used in the framework:
-
Kernel#daemonize
-
Object#remove_subclasses_of
Object#extend_with_included_modules_from
,Object#extended_by
-
Class#remove_class
-
Regexp#number_of_captures
,Regexp.unoptionalize
,Regexp.optionalize
,Regexp#number_of_captures
Action Mailer¶ ↑
Action Mailer has been given a new API with TMail being replaced out with the new Mail as the email library. Action Mailer itself has been given an almost complete re-write with pretty much every line of code touched. The result is that Action Mailer now simply inherits from Abstract Controller and wraps the Mail gem in a Rails DSL. This reduces the amount of code and duplication of other libraries in Action Mailer considerably.
-
All mailers are now in
app/mailers
by default. -
Can now send email using new API with three methods:
attachments
,headers
andmail
. -
Action Mailer now has native support for inline attachments using the
attachments.inline
method. -
Action Mailer emailing methods now return
Mail::Message
objects, which can then be sent thedeliver
message to send itself. -
All delivery methods are now abstracted out to the Mail gem.
-
The mail delivery method can accept a hash of all valid mail header fields with their value pair.
-
The
mail
delivery method acts in a similar way to Action Controller'srespond_to
, and you can explicitly or implicitly render templates. Action Mailer will turn the email into a multipart email as needed. -
You can pass a proc to the
format.mime_type
calls within the mail block and explicitly render specific types of text, or add layouts or different templates. Therender
call inside the proc is from Abstract Controller and supports the same options. -
What were mailer unit tests have been moved to functional tests.
-
Action Mailer now delegates all auto encoding of header fields and bodies to Mail Gem
-
Action Mailer will auto encode email bodies and headers for you
Deprecations:
-
:charset
,:content_type
,:mime_version
,:implicit_parts_order
are all deprecated in favor ofActionMailer.default :key => value
style declarations. -
Mailer dynamic
create_method_name
anddeliver_method_name
are deprecated, just callmethod_name
which now returns aMail::Message
object. -
ActionMailer.deliver(message)
is deprecated, just callmessage.deliver
. -
template_root
is deprecated, pass options to a render call inside a proc from theformat.mime_type
method inside themail
generation block -
The
body
method to define instance variables is deprecated (body {:ivar => value}
), just declare instance variables in the method directly and they will be available in the view. -
Mailers being in
app/models
is deprecated, useapp/mailers
instead.
More Information:
Credits¶ ↑
See the full list of contributors to Rails for the many people who spent many hours making Rails 3. Kudos to all of them.
Rails 3.0 Release Notes were compiled by Mikel Lindsaar.


Electricity Bill Calculator
Enter Total Unit
Range
Price/Unit
Unit
Bill
Bill
0
VAT
0.00
G. Total
0
*No Meter Charge Included
*Tariff Rate Updated at 27 August 2015
Learn More About
Tariff Rate
.
Designed & Developed By
Uxlab Ltd.


UPDATE:Twitter user @mithunoorath asked if the Cybertruck's "camper mode" would be an accessory to purchase, and Elon replied with a simple "Yes."
Elon Musk did as he promised and shocked the world with the debut of the Tesla Cybertruck this evening. Its design may be the most polarizing to come along since... well, ever, but there are also many details about this truck that have us excited. One in particular is the possibility of a camping set up featuring a bed tent and outdoor kitchen.
Everything We Know About The Cybertruck:
The possibility that Tesla offers such an option is based solely on an image of the Cybertruck set up for camping that was among the official batch released by the company. It may be this image is only meant to show what's possible in terms of upfitting the Cybertruck. That said, Tesla is surely aware how popular overlanding has become and that it's one of the first uses people will think of for the Cybertruck.
What we see in the official image is the Cybertruck parked in what we're guessing is Northern California's forests of giant redwood and sequoia trees. The trucks tonneau cover is pulled back and a tent is fitted over the bed that extends the line of the A-pillar all the way to the back of the truck. The new outline creates a living space in the bed of the truck where one could sleep and sit up, but that's about it.
Gallery: Tesla Cybertruck Pickup Truck Debut
Not to be outdone by the built-in kitchen competitor Rivian showed off for its R1T truck earlier this year, Tesla has a full outdoor kitchen that extends out from beneath the truck bed. It looks like there's a two-burner electric stove and plenty of counter space for prep work. but no sink or cooler.
Again, this is only a single image released by Tesla with no context or details about what it could mean. It does, however, have our minds racing thinking about the Cybertruck as a platform for overlanding and what sort of rigs could be made.
There's plenty of time for planning, though, as the Cybertruck isn't scheduled to reach production until late 2021 and the longer-range 500-mile version until 2022.


How the Manchester United board reacted to Jose Mourinho's move to Tottenham
The Manchester United hierarchy reacted with ‘intrigued silence’ at the news that Jose Mourinho had returned to Premier League management with Tottenham.
The 56-year-old made his return after 11 months out of the game by signing a three-and-a-half year deal with Tottenham on Wednesday.
Mourinho’s been out of work since his tumultuous sacking at Old Trafford last December and a clause in his departure prevented him from speaking about his exit during his stint with Sky Sports.
United, of course, expected him to return to management but the expectation was that he would seek a future away from the Premier League.
And the Independent claim that United’s board were caught by surprise by the news that he’d been appointed by Tottenham and reacted with ‘intrigued silence’.
Advertisement Advertisement
Reports claim Mourinho was not Spurs’ first choice to replace Pochettino but the Portuguese ‘blew away’ club officials with his pitch for the role.
Mourinho was said to have shown a clear plan for where he sees the team going and what players he plans to buy and sell in the next 18 months.
Spurs take on West Ham at the London Stadium in Mourinho’s first game on Saturday.
Mourinho has taken training in the last two days and all eyes will be on the starting XI he selects in east London.


module
concurrency
Source: concurrency/
Methods
Methods
inner
best(promises) → Promise
Given N promises will return the fastest non-failed one. This pattern can be useful some times to reduce latency.
Example
await best([Promise.resolve(1),Promise.resolve(2)]) // -> 1 (assuming 1 is the first to resolve)
await best([Promise.reject(1),Promise.resolve(2)]) // -> 2
Parameter
| Name | Type | Optional | Description |
|---|---|---|---|
|
promises |
Array(Promise) |
|
An array of all promises to be executed |
- See also
- Returns
-
Promise
inner
full(promises) → Array(Object)
A Promise.all that does not fails-fast. Given N promises will return all of them independenly if they failed or not.
Example
await full([Promise.resolve(1), Promise.reject(2), Promise.resolve(3)])
// [ { value: 1 }, { error: 2 }, { value: 3 } ]
Parameter
| Name | Type | Optional | Description |
|---|---|---|---|
|
promises |
Array(Promise) |
|
An array of all promises to be executed |
- See also
- Returns
-
Array(Object)


{% extends "header.html" %} {% block body %}
This tutorial will be covering the Kivy builder, which is used for building the .kv information. Instead of using the somewhat strange naming conventions for the app / .kv file, you can explicitly dictate the .kv file, or even just the .kv code string without needing a file at all.
from kivy.app import App from kivy.lang import Builder presentation = Builder.load_file("main.kv") class MainApp(App): def build(self): return presentation if __name__ == "__main__": MainApp().run()
First, to use the builder, we need to import it.
Then, we use Builder.load_file() to load the file we want to use, explicitly. In our case, we're loading in "main.kv."
While we have the root app class still being called MainApp, we could call it Splat, for example, and things would still work just fine.
You can also use Builder.load_string(), and then you can use a multi-line string, writing all of your kv code right in the py file.


| Class | Description |
|---|---|
| Accept |
Represents a parsed
|
| AcceptCharset |
Represents a parsed
|
| AcceptEncoding |
Represents a parsed
|
| AcceptLanguage |
Represents a parsed
|
| AcceptRanges |
Represents a parsed
|
| Age |
Represents a parsed
|
| Allow |
Represents a parsed
|
| Authorization |
Represents a parsed
|
| CacheControl |
Represents a parsed
|
| Connection |
Represents a parsed
|
| Constants |
Constants used by classes in this package.
|
| ContentEncoding |
Represents a parsed
|
| ContentLanguage |
Represents a parsed
|
| ContentLength |
Represents a parsed
|
| ContentLocation |
Represents a parsed
|
| ContentRange |
Represents a parsed
|
| ContentType |
Represents a parsed
|
| Date |
Represents a parsed
|
| EntityValidator |
Represents a validator value.
|
| ETag |
Represents a parsed
|
| Expect |
Represents a parsed
|
| Expires |
Represents a parsed
|
| From |
Represents a parsed
|
| HeaderDate |
Category of headers that consist of a single HTTP-date.
|
| HeaderEntityValidator |
Category of headers that consist of a single entity validator value.
|
| HeaderEntityValidatorArray |
Category of headers that consist of a comma-delimited list of entity validator values.
|
| HeaderEnum<E extends Enum<E>> |
Category of headers that consist of a single enum value.
|
| HeaderInteger |
Category of headers that consist of a single integer value.
|
| HeaderRangeArray |
Category of headers that consist of simple comma-delimited lists of strings with q-values.
|
| HeaderString |
Category of headers that consist of a single string value.
|
| HeaderStringArray |
Category of headers that consist of a comma-delimited list of string values.
|
| HeaderUri |
Category of headers that consist of a single URL value.
|
| Host |
Represents a parsed
|
| HttpMethodName |
Represents valid HTTP 1.1 method name static strings per the RFC 2616 spec.
|
| IfMatch |
Represents a parsed
|
| IfModifiedSince |
Represents a parsed
|
| IfNoneMatch |
Represents a parsed
|
| IfRange |
Represents a parsed
|
| IfUnmodifiedSince |
Represents a parsed
|
| LastModified |
Represents a parsed
|
| Location |
Represents a parsed
|
| MaxForwards |
Represents a parsed
|
| MediaType |
Describes a single media type used in content negotiation between an HTTP client and server, as described in
Section 14.1 and 14.7 of RFC2616 (the HTTP/1.1 specification).
|
| MediaTypeRange |
Describes a single type used in content negotiation between an HTTP client and server, as described in
Section 14.1 and 14.7 of RFC2616 (the HTTP/1.1 specification).
|
| Pragma |
Represents a parsed
|
| ProxyAuthenticate |
Represents a parsed
|
| ProxyAuthorization |
Represents a parsed
|
| Range |
Represents a parsed
|
| Referer |
Represents a parsed
|
| RetryAfter |
Represents a parsed
|
| Server |
Represents a parsed
|
| StringRange |
Represents a single value in a comma-delimited header value that optionally contains a quality metric for
comparison and extension parameters.
|
| TE |
Represents a parsed
|
| Trailer |
Represents a parsed
|
| TransferEncoding |
Represents a parsed
|
| Upgrade |
Represents a parsed
|
| UserAgent |
Represents a parsed
|
| Vary |
Represents a parsed
|
| Via |
Represents a parsed
|
| Warning |
Represents a parsed
|
| WwwAuthenticate |
Represents a parsed
|
| Enum | Description |
|---|---|
| ContentEncodingEnum |
Represents the possible values for a
Content-Encoding header. |
| HttpMethod |
Represents valid HTTP 1.1 method names per the RFC 2616 spec.
|
Copyright © 2018 Apache. All rights reserved.


!= include('css') ?>
Freshsales GSheet Connector
User Details
Columns: 0
Filters
Company name:
www.‹company_name›.freshsales.io
API Token
Retrieve under API Settings
Retrieve details
Report columns
Selected columns. At least 1 column
List of columns
Create at Date (From - To) *
Deal Pipeline *
Deal Stages
Use cmd or ctrl to multi select
Closed Date (From - To)
Report updated in current ACTIVE tab
Get report
!= include('js') ?>


Functions, classes and methods for time series modelling with ARIMA and related models. The aim of the package is to provide consistent interface for the user. For example, a single function autocorrelations() computes various kinds of theoretical and sample autocorrelations. This is work in progress, see the documentation and vignettes for the current functionality. Function sarima() fits extended multiplicative seasonal ARIMA models with trends, exogenous variables and arbitrary roots on the unit circle, which can be fixed or estimated.
| Version: | 0.7.6 |
| Depends: | FitAR, stats4 |
| Imports: | methods, graphics, stats, utils, PolynomF (≥ 1.0-0), Formula, ltsa, FitARMA, lagged (≥ 0.2), Rdpack, KFAS, Rcpp (≥ 0.12.14), numDeriv |
| LinkingTo: | Rcpp, RcppArmadillo |
| Suggests: | fGarch, fImport, testthat |
| Published: | 2018-08-23 |
| Author: | Georgi N. Boshnakov [aut, cre], Jamie Halliday [ctb] |
| Maintainer: | Georgi N. Boshnakov <georgi.boshnakov at manchester.ac.uk> |
| License: | GPL-2 | GPL-3 [expanded from: GPL (≥ 2)] |
| NeedsCompilation: | yes |
| Materials: | NEWS |
| CRAN checks: | sarima results |
| Reference manual: | sarima.pdf |
| Vignettes: |
Garch and white noise tests Autocorrelations and white noise tests |
| Package source: | sarima_0.7.6.tar.gz |
| Windows binaries: | r-devel: sarima_0.7.6.zip, r-release: sarima_0.7.6.zip, r-oldrel: sarima_0.7.6.zip |
| OS X binaries: | r-release: sarima_0.7.6.tgz, r-oldrel: sarima_0.7.6.tgz |
| Old sources: | sarima archive |
Please use the canonical form https://CRAN.R-project.org/package=sarima to link to this page.


I am a student of engineering in systems programming knowledge, I specialize in designing web pages both dynamic and static. With expertise in design tools such as Adobe Illustrator and Adobe Photoshop, in addition to this I frontend management framework as materialize and bootstrap, thus the result of my work is responsive and adaptable to mobile devices.
I am a proactive and highly motivated person in the personal and intellectual daily growth, which has good communication with customers and creativity to realize their ideas in an efficient and original way.
Rails is a framework for developing web applications written in the Ruby programming language. It is designed to make programming web applications easier by making assumptions about what every developer needs to get started. It allows you to write less doing more than many other languages and frameworks code. In addition, experts Rails developers report that makes web application development more fun.
CakePHP is a free, open-source, rapid development framework for PHP. It’s a foundational structure for programmers to create web applications. Our primary goal is to enable you to work in a structured and rapid manner–without loss of flexibility.
Unity has an important role in the global gaming market is currently booming. The Unity engine is without doubt the predominant development software games worldwide. more games with Unity are created with any other gaming technology. More players play games created with Unity, and more developers rely on our tools and services to grow your business.
It is a framework bootstrap or set of open source tools for designing Web sites and applications Code. It contains design templates with typography, forms, buttons, tables, navigation menus and other design elements based on HTML and CSS, as well as additional optional JavaScript extensions.
is a framework that lets you create websites and web applications with the Material Design principles. It can be used in two ways, Materialize and Sass, depending on the preferences and experience can select either of the two versions. The standard version contains CSS and JavaScript and CSS brings ready to work. The other version, recommended for those who are familiar with Sass, allows more control over the components you want to include.
Contact me is very easy, click on the button menu.


What’s an advertisement? An advertisement is any notice or announcement to promote an idea, product, service or an event. It could be announced through the television, radio, or the internet. There are endless possibilities when it comes to how you want to advertise your item or idea. Some people go through vigorous pains and have huge events to officially announce their items while others do it more quietly on television or internet. Not only do advertisements help customers getting familiarized with the product but also help the company that is promoting it. Something more efficient than an advertisement is an advertising copy; or Ad copy for short. But what is an advertising copy?
What Exactly Is Ad Copy?
Advertising copy can be found anywhere on the internet. In the search results. In your Facebook or Twitter feed. They are created specifically to catch someone’s eyes, and eventually make said person click the ad copy. Usually Ad copies are either contextual or pay per click. Ad copies can be actually anything; from catchy product titles to enticing product pictures with text on them. Text of the ad copy is usually the second or third line of an ad displayed on a search engine result page or any other web page. Most ad copy makers usually add keywords about usage of the product along with the few catchy lines. This is to gather more audience for their ads. When a person searches a specific keyword on a search engine they will be linked to the ad copy if it has anything to do with it.
Ad Copy – A Bridge Between Search Results and Websites
Present time marketing is becoming more challenging to handle. With each passing day it is becoming more aggressive. Since there is always competition in the marketplace you need to make sure that your ad copies are distinct, unique and eye catching. It basically serves as the communication point between the search results and your website. The more you make your ad copies attractive the more appealing they will be towards everyday consumers. Make sure to include details about your product in your ad copy while you are at it, keep the FAQs of the general audience in mind. For example, how helpful it is compared to other products, advantages, disadvantages but more importantly, keep it short and simple. Because the last thing you would want is a dull ad that no one pays attention to.
What’s the Goal of Your Ad?
Focus on the goal you are creating an ad for. Interest a customer by informing them how your product can change their life, as clearly as possible. This is a vital ingredient for the ad copy. You need to include how far superior your item is towards others and how much more it can help your customers in changing their life. But do this indirectly as you do not want to stir trouble by openly bashing against a specific product or company. Your main goal should be to define the unique points of your product/service since they tend to attract customers into making a direct action. The probability rises if there is call to actions in your ads because the viewers are keen to mimic them.
Building credibility should be one of your advertisement goals. Offer the audience believability about the product, brand, or idea that you are advertising about. If your product is linked to everyday life it’ll have a better chance of being bought.
Details, Details, Details
Another core ingredient in your ad copy is grammar and punctuation. This is extremely important. You need to use simple words to get your idea crystal-clear to the audience. Do not pick lengthy words at random and put them in your ad copy thinking it’ll make it sound intelligent. It won’t. It also won’t help people understand what you’re talking about. Be specific and straight to the point. Remember you want your product to make an impression on people.
Test-Drive your Ad
At last before ever going out to make an ad copy or to even think about advertising your time you need to test your product, item, or idea. Will it attract everyday consumers? Does it spark an interest in someone? What things is it capable that other products are not. Ask yourself these questions before you advertise. More importantly do not promise consumers anything about your item. It is bad for your company image if you’re caught lying. Remember, make a good impression on people and they will definitely come back for more.
Have You Signed Up for AdProof Yet?
AdProof is the first test-driven advertising platform that lets ad buyers test before they spend. Ad buyers can now A/B test any ad group for just a $1. AdProof is super fast. No more wasted hours waiting for data or approval of ads. You’ll get results back in minutes. AdProof supports all ad types. Test your PPC ads, display ads, and social media ad campaigns. AdProof supports all devices. Optimize your ads for desktops & laptops, mobile devices and tablets.


--- layout: default.html title: Home permalink: false description: "KennethStarterKit home page." ---
It was in Burma, a sodden morning of the rains. A sickly light, like yellow tinfoil, was slanting over the high walls into the jail yard. We were waiting outside the condemned cells, a row of sheds fronted with double bars, like small animal cages. Each cell measured about ten feet by ten and was quite bare within except for a plank bed and a pot of drinking water. In some of them brown silent men were squatting at the inner bars, with their blankets draped round them. These were the condemned men, due to be hanged within the next week or two.
One prisoner had been brought out of his cell.  He had a thick, sprouting moustache, absurdly too big for his body, rather like the moustache of a comic man on the films. Six tall Indian warders were guarding him and getting him ready for the gallows. Two of them stood by with rifles and fixed bayonets, while the others handcuffed him, passed a chain through his handcuffs and fixed it to their belts, and lashed his arms tight to his sides. They crowded very close about him, with their hands always on him in a careful, caressing grip, as though all the while feeling him to make sure he was there. It was like men handling a fish which is still alive and may jump back into the water. But he stood quite unresisting, yielding his arms limply to the ropes, as though he hardly noticed what was happening.
Eight o'clock struck and a bugle call, desolately thin in the wet air, floated from the distant barracks. The superintendent of the jail, who was standing apart from the rest of us, moodily prodding the gravel with his stick, raised his head at the sound. He was an army doctor, with a grey toothbrush moustache and a gruff voice. "For God's sake hurry up, Francis," he said irritably. "The man ought to have been dead by this time. Aren't you ready yet?"
 "Yes sir, yes sir," he bubbled. "All iss satisfactorily prepared. The hangman iss waiting. We shall proceed."
"Well, quick march, then. The prisoners can't get their breakfast till this job's over."
We set out for the gallows. Two warders marched on either side of the prisoner, with their rifles at the slope; two others marched close against him, gripping him by arm and shoulder, as though at once pushing and supporting him. The rest of us, magistrates and the like, followed behind. Suddenly, when we had gone ten yards, the procession stopped short without any order or warning. A dreadful thing had happened--a dog, come goodness knows whence, had appeared in the yard. It came bounding among us with a loud volley of barks, and leapt round us wagging its whole body, wild with glee at finding so many human beings together. It was a large woolly dog, half Airedale, half pariah. For a moment it pranced round us, and then, before anyone could stop it, it had made a dash for the prisoner, and jumping up tried to lick his face. Everyone stood aghast, too taken aback even to grab at the dog.
 said the superintendent angrily. "Catch it, someone!"
A warder, detached from the escort, charged clumsily after the dog, but it danced and gambolled just out of his reach, taking everything as part of the game. A young Eurasian jailer picked up a handful of gravel and tried to stone the dog away, but it dodged the stones and came after us again. Its yaps echoed from the jail wails. The prisoner, in the grasp of the two warders, looked on incuriously, as though this was another formality of the hanging. It was several minutes before someone managed to catch the dog. Then we put my handkerchief through its collar and moved off once more, with the dog still straining and whimpering.
It was about forty yards to the gallows. I watched the bare brown back of the prisoner marching in front of me. He walked clumsily with his bound arms, but quite steadily, with that bobbing gait of the Indian who never straightens his knees. At each step his muscles slid neatly into place, the lock of hair on his scalp danced up and down, his feet printed themselves on the wet gravel. And once, in spite of the men who gripped him by each shoulder, he stepped slightly aside to avoid a puddle on the path.
It is curious, but till that moment I had never realized what it means to destroy a healthy, conscious man. When I saw the prisoner step aside to avoid the puddle, I saw the mystery, the unspeakable wrongness, of cutting a life short when it is in full tide. This man was not dying, he was alive just as we were alive. All the organs of his body were working --bowels digesting food, skin renewing itself, nails growing, tissues forming--all toiling away in solemn foolery. His nails would still be growing when he stood on the drop, when he was falling through the air with a tenth of a second to live.  He and we were a party of men walking together, seeing, hearing, feeling, understanding the same world; and in two minutes, with a sudden snap, one of us would be gone--one mind less, one world less.
The gallows stood in a small yard, separate from the main grounds of the prison, and overgrown with tall prickly weeds. It was a brick erection like three sides of a shed, with planking on top, and above that two beams and a crossbar with the rope dangling. The hangman, a grey-haired convict in the white uniform of the prison, was waiting beside his machine. He greeted us with a servile crouch as we entered. At a word from Francis the two warders, gripping the prisoner more closely than ever, half led, half pushed him to the gallows and helped him clumsily up the ladder. Then the hangman climbed up and fixed the rope round the prisoner's neck.
We stood waiting, five yards away. The warders had formed in a rough circle round the gallows. And then, when the noose was fixed, the prisoner began crying out on his god. It was a high, reiterated cry of "Ram! Ram! Ram! Ram!", not urgent and fearful like a prayer or a cry for help, but steady, rhythmical, almost like the tolling of a bell. The dog answered the sound with a whine.  But the sound, muffled by the cloth, still persisted, over and over again: "Ram! Ram! Ram! Ram! Ram!"
The hangman climbed down and stood ready, holding the lever. Minutes seemed to pass. The steady, muffled crying from the prisoner went on and on, "Ram! Ram! Ram!" never faltering for an instant. The superintendent, his head on his chest, was slowly poking the ground with his stick; perhaps he was counting the cries, allowing the prisoner a fixed number-- fifty, perhaps, or a hundred. Everyone had changed colour. The Indians had gone grey like bad coffee, and one or two of the bayonets were wavering.
Suddenly the superintendent made up his mind. Throwing up his head he made a swift motion with his stick. "Chalo!" he shouted almost fiercely.
There was a clanking noise, and then dead silence. The prisoner had vanished, and the rope was twisting on itself. I let go of the dog, and it galloped immediately to the back of the gallows; but when it got there it stopped short, barked, and then retreated into a corner of the yard, where it stood among the weeds, looking timorously out at us. We went round the gallows to inspect the prisoner's body.
The superintendent reached out with his stick and poked the bare body; it oscillated, slightly. "HE'S all right," said the superintendent. He backed out from under the gallows, and blew out a deep breath.  He glanced at his wrist-watch. "Eight minutes past eight. Well, that's all for this morning, thank God."
The warders unfixed bayonets and marched away. The dog, sobered and conscious of having misbehaved itself, slipped after them. We walked out of the gallows yard, past the condemned cells with their waiting prisoners, into the big central yard of the prison. The convicts, under the command of warders armed with lathis, were already receiving their breakfast. They squatted in long rows, each man holding a tin pannikin, while two warders with buckets marched round ladling out rice; it seemed quite a homely, jolly scene, after the hanging. An enormous relief had come upon us now that the job was done. One felt an impulse to sing, to break into a run, to snigger. All at once everyone began chattering gaily.
 From fright.--Kindly take one of my cigarettes, sir. Do you not admire my new silver case, sir? From the boxwallah, two rupees eight annas. Classy European style."
Several people laughed--at what, nobody seemed certain.
Francis was walking by the superintendent, talking garrulously. "Well, sir, all hass passed off with the utmost satisfactoriness. It wass all finished--flick! like that. It iss not always so--oah, no! I have known cases where the doctor wass obliged to go beneath the gallows and pull the prisoner's legs to ensure decease. Most disagreeable!"
"Wriggling about, eh? That's bad," said the superintendent.
"Ach, sir, it iss worse when they become refractory! One man, I recall, clung to the bars of hiss cage when we went to take him out. You will scarcely credit, sir, that it took six warders to dislodge him, three pulling at each leg. We reasoned with him. "My dear fellow," we said, "think of all the pain and trouble you are causing to us!" But no, he would not listen! Ach, he wass very troublesome!"
I found that I was laughing quite loudly. Everyone was laughing. Even the superintendent grinned in a tolerant way. "You'd better all come out and have a drink," he said quite genially. "I've got a bottle of whisky in the car. We could do with it."
We went through the big double gates of the prison, into the road. "Pulling at his legs!" exclaimed a Burmese magistrate suddenly, and burst into a loud chuckling. We all began laughing again. At that moment Francis's anecdote seemed extraordinarily funny. We all had a drink together, native and European alike, quite amicably. The dead man was a hundred yards away.


Preparation time
less than 30 mins
Cooking time
1 to 2 hours
Serves
Serves 8
Dietary
This delicious three-tiered chocolate-and-hazelnut pavlova makes a showstopping centrepiece for dessert.
For the hazelnut meringues, dry-fry the hazelnuts in a frying pan over a medium heat for 4-5 minutes, or until toasted and golden-brown, shaking the pan regularly. Remove from the heat and set aside to cool. Once cooled, chop roughly.
 Using a pencil and an appropriately sized upturned plate or bowl, draw a 25cm/10in circle in the centre of two of the pieces of baking paper, and a 20cm/8in circle on the third.
Lightly grease three baking trays with a little oil and line with the pieces of baking paper, pencil-side down. You should be able to see the circles through the paper.
Preheat the oven to 150C/300F/Gas 2.
Whisk the egg whites in a large bowl until stiff peaks form when the whisk is removed. (The egg whites are ready when you can turn the bowl upside down without the eggs sliding out.)
Gradually add the sugar, one tablespoon at a time, whisking after each addition.
Whisk in the vanilla extract and cornflour until well combined. The meringue mixture should now be glossy and resemble shaving foam. Fold all but a few of the chopped hazelnuts into the meringue mixture.
Divide the meringue mixture among the three baking trays, spooning the mixture into the boundaries of the circles and spreading with a spatula to smooth. Set aside.
Reduce the oven temperature to 130C/270F/Gas ½ .
Bake the two larger meringues, one above the other, for 1½ hours, switching their positions halfway through cooking. (Reduce the oven temperature if the meringues start to brown too much.) Remove from the oven and set aside to cool. Cook the third meringue in the same way (if they can all fit into the oven at once, so much the better).
Once cool, carefully peel the paper from the bottom of each meringue.
For the filling, suspend a heatproof bowl over a pan of barely simmering water (do not allow the base of the bowl to touch the surface of the water). Add the chocolate pieces to the bowl and stir until melted. Allow to cool for a few minutes.
Meanwhile, whip the cream with the icing sugar until soft peaks form when the whisk is removed. Fold in the crème fraiche until well combined.
Transfer one of the large meringues to a serving plate or cake stand. Spoon over a third of the filling mixture. Using a dessert spoon, drizzle the meringue and filling with a little of the melted chocolate and sprinkle over one-third of the raspberries.
Top the first meringue with the second of the same size and repeat the filling process. Finally, add the smaller meringue to the tower and fill as before, drizzling over all of the remaining chocolate and sprinkling with the raspberries and reserved toasted hazelnuts. Dust with icing sugar and serve.
You need JavaScript to view this clip.
Melting chocolate
You need JavaScript to view this clip.
Whipping cream by hand
You need JavaScript to view this clip.
Whisking egg whites


EPICORE
Dear [NAME],
Our records indicate that it’s been a while since you responded to a request for information on EpiCore, so we wanted to check in and see if you’re running into any issues or challenges submitting responses?
We are happy to answer any questions and help you resolve any problem you may be having with our system or EpiCore in general.
Remember! Some information is better than no information so we encourage you to submit as much as you can!
We are thrilled to continue working with you to change the landscape of disease outbreak detection!
If you have any questions, please contact us at<EMAIL_ADDRESS>Sincerely,
The EpiCore Team


MobRevTeam Dashboard
Message Scheduler
Kill Switch
Placement Analysis
(current)
Email Optin
Placement Analysis
Enter Required Fields to Analyze Placements for Chrome Traffic
Start Date:
End Date:
Voluum Campaign ID:
Required Chrome Traffic (%):
Minimum Visits Per Placement:
Analyze Placements
{% for placement in placements %}
{{ placement }}
Pause Placement
{% endfor %}


I've missed more than 9000 shots in my career. I've lost almost 300 games. 26 times, I've been trusted to take the game winning shot and missed. I've failed over and over and over again in my life. And that is why I succeed.
I'm extremely willful to win, and I respond to challenges. Scoring titles and stuff like that... it sounds, well, I don't care how it sounds - to me, scoring comes easy. It's not a challenge to me to win the scoring title, because I know I can.
My father wasn't around when I was a kid, and I used to always say, 'Why me? Why don't I have a father? Why isn't he around? Why did he leave my mother?' But as I got older I looked deeper and thought, 'I don't know what my father was going through, but if he was around all the time, would I be who I am today?'
Leave your contact to receive more news!!


Software Engineer,Full Stack Developer,Graghic Designer, Web Developer,Web Designer and Devops Engineer to be.
Here are some more of the projects I have worked on.
2020


When Lucie open it's mail system for read these new emails, the mail system get the data of mail, in the inbox of Lucie, but in same time, get related marketing data, that can be directly related with the content of the mail she is reading.
That realize a very efficient publicity system, in which each word have a price, that could be bid sealed. I was
really chocked when I learned this, but it's the truth!
The words, or a sequence of words are seen as a market, in which the Google clients have to take positions, without having the knowledge of the positions of the other bid competitors! Even, the price can be really volatile, and can change from one day to another!
Of course the Google clients are companies! This week (2015-10-29), a french reportage passed on the public french channel :
Resell of our privacy, profiled as well for their business partners.
Concentrations of private data by states on behalf of our security.
Right oblivion almost nonexistent due to the redundancy of computer "data center" and other proxy
caching
technologies that make it almost impossible to personal data oblivion.
The Human Factor
Human factor is the factor who can ...
I think it is the worst risk! As I can see from my life, the humans are:
- Weak:
Soon we are able to take some decisions, in which we are the most confortable as possible. That's
reflect
today when we are seeing brilliants students, choose the Job or the company that's are at least
risky. They
prefer be hired by an administration, or a big company, with a long term visibility. And in occident, we
can
see some professions be with a less numbers of students from one year to another. See medical carrier,
but
the engineering too. We have a great propensity to take the easier options for us. This reveals a
lack of motivation that seems very sad.
- Easy to corrupt:
Everybody can think that's not true! But from how money ? There's not a sum beyond which you will be
able to
change? I can not help thinking there is a limit of our corruptibility isn't it ?Is there a country
today where there is no corruption? I don't think so! We live in a world where money drive everything, a
fact that postpone our propensity to be incorruptible at least when we will be able to change of galaxy!
- Changing of opinion:
The human being changes his opinion, it is in his nature. We sometimes doubt our certitudes often
because the facts will show us knew another truth. Our history is full of moments when we changed! Take
for example the look on women or homosexuals. Could it have been just imagine us centuries back that
same-sex marriages exist?
Anyway, when we are talking about privacy, we inevitably speak of trust!


OVE - online video editing
Lorens
Logout
Content Header
Date
Category
A description which may flow for several lines and give context to the content.
Enter
Sports
Content Header
Date
Category
A description which may flow for several lines and give context to the content.
Enter
Entertainment
Idol
Content Header
Date
Category
A description which may flow for several lines and give context to the content.
Enter
Sports
Create New One


Fall Sports Schedule
Fall sports are underway. The athletics program strives to provide opportunities for students to pursue physical education interests, enhance school spirit and the learning environment, and much more.
More News | Events | Reminders
More News
Sixty-Four HCPSS Students Named 2020 National Merit Semiﬁnalists
The semiﬁnalists, representing less than 1% of U.S. high school seniors, scored highest on the 2018 Preliminary SAT in each state.
Thomas Viaduct Receives 2018-19 Character Education Award
Thomas Viaduct Middle School earned this award for promoting core ethical values, creating a caring school community, and engaging families and community members as partners in the character-building effort.
Online Directory Now Available in HCPSS Connect
Parents who have completed their Family File can now access their child’s school directory from HCPSS Connect. To access the directory for your school, log in to HCPSS Connect and select Family File/School Directory in the left menu, and then School Directory.
Events
Flu Clinics
October 2019, All HCPSS Schools
HCPSS will partner with the Maryland Partnership for Prevention for school-based flu clinics this fall. Parents who elect for their child(ren) to receive the flu vaccination must complete a consent form.
Bright Minds Foundation Golf Classic
Wednesday, October 2, 7:30 a.m.-2 p.m., Waverly Woods Golf Club
Proceeds from the Golf Classic support the work of Bright Minds Foundation, the official educational foundation of the Howard County Public School System.
Community Conversation: Restorative Justice
Monday, October 7, 6-9 p.m., Jim Rouse Theatre
Students, families, staff and the public are invited to a panel discussion and question-and-answer session to gain a better understanding of restorative justice and how it benefits our students, schools and communities.
Reminders
Policy Committee Member Needed
HCPSS is currently seeking a general citizen member for the Policy 8100 Field Trips revision committee. Applications are due Friday, September 20.
Boundary Review Feedback to the Board
The Board will hold boundary review public hearings on September 24 and 26, zoned by region. Please note: the Thursday, September 26 public hearing’s updated start time is 6 p.m. Find full information online, including protocols, and ways to pre-register and submit written testimony. The order of community members will be posted on BoardDocs the day of the meeting.
International Parent Leadership Program Applications
This six-week program is designed to increase the capacity of international parents to step into leadership roles in schools and communities as advocates on behalf of the system’s more than 11,500 international students. Applications are due Wednesday, October 2.
|
|


The OpenStack Heat template is a Yaml document that defines the resources, relationships, and other componentry to be constructed as part of a heat-managed stack. This document can be described using a BNF (Backus-Naur Format) diagram, as well as an object model. The Yaml document is decomposed through unmarshalling into an object graph that conforms to the indicated model, and the "language" of the YAML file must conform to the BNF specification.
For the casual reader, or someone not familiar with BNF, BNF is a way to describe the syntax of a language. It is similar in concept to the formal diagramming techniques that we learned as kids in high school regarding the structure of English, Spanish, and other languages. It breaks a language down into its constituent parts, and then defines rules for how these various parts can be assembled together to form a valid statement.
In BNF, these rules are called "productions". A production is defined as a left hand side (LHS) and a right hand side (RHS). The LHS is the name of the production, and the RHS is the rule that governs what is legal in the production.
A production RHS can reference other productions, literals, and terminals. A terminal is some completion point, or terminating token, that signals the end of the production. Often the terminal may be end of input (EOI), a period (.), or some other special symbol (for example, in java, it is a semicolon).
The production operator is usually shown as the sequence
::=
. Additionally, the production rule has various operators that can be used to specify logical conditions, grouping,
and cardinality. These operators are generally:
The absence of an operator between productions, terminals, or literals is implied to be "AND". So, the production
stmt ::= "A" "B" "C"*
means that a valid statement must consist of the token "A", followed by "B", followed by any number (including zero)
"C" tokens. So, the strings
AB
,
ABC
, and
ABCCCC
are all valid, but
AC
is not.
A valid production for a statement would look like:
statement ::= ("A" | "B")+
and would indicate that a statement can consist of the letters "A" or "B", repeated 1..N times. So, a sequence of
AAA
, or
BBB
, or
ABABAB
would all be valid.
template
::= template_version description? parameter_groups? parameters? resources outputs? EOF
template_version ::= year "-" month "-" day
description ::= STRING
parameter_groups ::= parameter_group+
parameter_group ::= label description? parameter_references
label ::= "label" STRING
description ::= "description" STRING
parameter_references ::= parameter_name+
parameter_name ::= IDENTIFIER
parameters ::= parameter+
parameter ::= parameter_name parameter_type label? description? parameter_default? parameter_hidden?
paramter_constraints
parameter_type ::= "type" ("string" | "number" | "comma_delimited_list" | "json" | "boolean")
parameter_default ::= "default" STRING
parameter_hidden ::= "hidden" ("true" | "false")
parameter_constraints ::= "constraints" parameter_constraint+
parameter_constraint ::= (length_constraint | range_constraint | allowed_values_constraint |
allowed_pattern_constraint | custom_constraint) description?
length_constraint ::= "length" "min" min_constraint "max" max_constraint
range_constraint ::= "range" "min" min_constraint "max" max_constraint
allowed_values_constraint ::= constraint_value_list
constraint_value_list ::= (STRING ",")+
allowed_pattern_constraint ::= regular_expression
regular_expression ::= STRING
custom_constraint ::= IDENTIFIER
min_constraint ::= DIGIT+
max_constraint ::= DIGIT+
resources ::= resource+
resource ::= resource_id resource_type properties? metadata? depends_on? update_policy? deletion_policy?
resource_id ::= IDENTIFIER
resource_type ::= "OS::Ceilometer::Alarm" | "OS::Ceilometer::CombinationAlarm" | "OS::Cinder::Volume" |
"OS::Cinder::VolumeAttachment" | "OS::Glance::Image" | "OS::Heat::AccessPolicy" | "OS::Heat::AutoScalingGroup" |
"OS::Heat::CWLiteAlarm" | "OS::Heat::CloudConfig" | "OS::Heat::HARestarter" | "OS::Heat::InstanceGroup" |
"OS::Heat::MultipartMime" | "OS::Heat::RandomString" | "OS::Heat::ResourceGroup" | "OS::Heat::ScalingPolicy" |
"OS::Heat::SoftwareComponent" | "OS::Heat::SoftwareConfig" | "OS::Heat::SoftwareDeployment" |
"OS::Heat::SoftwareDeploymentGroup" | "OS::Heat::SoftwareDeployments" | "OS::Heat::Stack" |
"OS::Heat::StructuredConfig" | "OS::Heat::StructuredDeployment" | "OS::Heat::StructuredDeploymentGroup" |
"OS::Heat::StructuredDeployments" | "OS::Heat::SwiftSignal" | "OS::Heat::SwiftSignalHandle" |
"OS::Heat::UpdateWaitConditionHandle" | "OS::Heat::WaitCondition" | "OS::Heat::WaitConditionHandle" |
"OS::Neutron::Firewall" | "OS::Neutron::FirewallPolicy" | "OS::Neutron::FirewallRule" | "OS::Neutron::FloatingIP"
| "OS::Neutron::FloatingIPAssociation" | "OS::Neutron::HealthMonitor" | "OS::Neutron::IKEPolicy" |
"OS::Neutron::IPsecPolicy" | "OS::Neutron::IPsecSiteConnection" | "OS::Neutron::LoadBalancer" |
"OS::Neutron::MeteringLabel" | "OS::Neutron::MeteringRule" | "OS::Neutron::Net" | "OS::Neutron::NetworkGateway" |
"OS::Neutron::Pool" | "OS::Neutron::PoolMember" | "OS::Neutron::Port" | "OS::Neutron::ProviderNet" |
"OS::Neutron::Router" | "OS::Neutron::RouterGateway" | "OS::Neutron::RouterInterface" |
"OS::Neutron::SecurityGroup" | "OS::Neutron::Subnet" | "OS::Neutron::VPNService" | "OS::Nova::FloatingIP" |
"OS::Nova::FloatingIPAssociation" | "OS::Nova::KeyPair" | "OS::Nova::Server" | "OS::Nova::ServerGroup" |
"OS::Sahara::Cluster" | "OS::Sahara::ClusterTemplate" | "OS::Sahara::NodeGroupTemplate" | "OS::Swift::Container" |
"OS::Trove::Cluster" | "OS::Trove::Instance"
outputs ::=
year ::= "20" ("00" - "99")
month ::= "01" - "12"
day ::= "01" - "31"
DIGIT ::= [0-9]
IDENTIFIER ::= [a-zA-Z_][a-zA-Z0-9_]*
STRING ::= [a-zA-Z0-9 ,./;'\\[\\]\\\`-=<>?:"{}\\|~!@#$%^&*()_+"]*


HTML is the standard markup language for creating Web pages.
<!DOCTYPE html>

<title>Page Title</title>

My First Heading

My first paragraph.

Try it Yourself »
<!DOCTYPE html>
declaration defines this
document to be HTML5
element is the root element of an HTML
page
element contains meta information
about the document<title>
element specifies a title for the
document
element contains the visible page
content

element defines a large heading

element defines a paragraphHTML tags are element names surrounded by angle brackets:
<tagname>content goes here...</tagname>

and

Tip: The start tag is also called the opening tag, and the end tag the closing tag.
The purpose of a web browser (Chrome, Edge, Firefox, Safari) is to read HTML documents and display them.
The browser does not display the HTML tags, but uses them to determine how to display the document:
Below is a visualization of an HTML page structure:
Note: Only the content inside the  section (the white area above) is displayed in a browser.


|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
Object org.apache.spark.streaming.kafka.KafkaUtils
public class KafkaUtils
| Constructor Summary | |
|---|---|
KafkaUtils()
|
| Method Summary | ||
|---|---|---|
static
|
createDirectStream(JavaStreamingContext jssc,
Class<K> keyClass,
Class<V> valueClass,
Class<KD> keyDecoderClass,
Class<VD> valueDecoderClass,
Class<R> recordClass,
java.util.Map<String,String> kafkaParams,
java.util.Map<kafka.common.TopicAndPartition,Long> fromOffsets,
Function<kafka.message.MessageAndMetadata<K,V>,R> messageHandler)
:: Experimental :: Create an input stream that directly pulls messages from Kafka Brokers without using any receiver. |
|
static
|
createDirectStream(JavaStreamingContext jssc,
Class<K> keyClass,
Class<V> valueClass,
Class<KD> keyDecoderClass,
Class<VD> valueDecoderClass,
java.util.Map<String,String> kafkaParams,
java.util.Set<String> topics)
:: Experimental :: Create an input stream that directly pulls messages from Kafka Brokers without using any receiver. |
|
static
|
createDirectStream(StreamingContext ssc,
scala.collection.immutable.Map<String,String> kafkaParams,
scala.collection.immutable.Map<kafka.common.TopicAndPartition,Object> fromOffsets,
scala.Function1<kafka.message.MessageAndMetadata<K,V>,R> messageHandler,
scala.reflect.ClassTag<K> evidence$14,
scala.reflect.ClassTag<V> evidence$15,
scala.reflect.ClassTag<KD> evidence$16,
scala.reflect.ClassTag<VD> evidence$17,
scala.reflect.ClassTag<R> evidence$18)
:: Experimental :: Create an input stream that directly pulls messages from Kafka Brokers without using any receiver. |
|
static
|
createDirectStream(StreamingContext ssc,
scala.collection.immutable.Map<String,String> kafkaParams,
scala.collection.immutable.Set<String> topics,
scala.reflect.ClassTag<K> evidence$19,
scala.reflect.ClassTag<V> evidence$20,
scala.reflect.ClassTag<KD> evidence$21,
scala.reflect.ClassTag<VD> evidence$22)
:: Experimental :: Create an input stream that directly pulls messages from Kafka Brokers without using any receiver. |
|
static
|
createRDD(JavaSparkContext jsc,
Class<K> keyClass,
Class<V> valueClass,
Class<KD> keyDecoderClass,
Class<VD> valueDecoderClass,
Class<R> recordClass,
java.util.Map<String,String> kafkaParams,
OffsetRange[] offsetRanges,
java.util.Map<kafka.common.TopicAndPartition,Broker> leaders,
Function<kafka.message.MessageAndMetadata<K,V>,R> messageHandler)
:: Experimental :: Create a RDD from Kafka using offset ranges for each topic and partition. |
|
static
|
createRDD(JavaSparkContext jsc,
Class<K> keyClass,
Class<V> valueClass,
Class<KD> keyDecoderClass,
Class<VD> valueDecoderClass,
java.util.Map<String,String> kafkaParams,
OffsetRange[] offsetRanges)
Create a RDD from Kafka using offset ranges for each topic and partition. |
|
static
|
createRDD(SparkContext sc,
scala.collection.immutable.Map<String,String> kafkaParams,
OffsetRange[] offsetRanges,
scala.reflect.ClassTag<K> evidence$5,
scala.reflect.ClassTag<V> evidence$6,
scala.reflect.ClassTag<KD> evidence$7,
scala.reflect.ClassTag<VD> evidence$8)
Create a RDD from Kafka using offset ranges for each topic and partition. |
|
static
|
createRDD(SparkContext sc,
scala.collection.immutable.Map<String,String> kafkaParams,
OffsetRange[] offsetRanges,
scala.collection.immutable.Map<kafka.common.TopicAndPartition,Broker> leaders,
scala.Function1<kafka.message.MessageAndMetadata<K,V>,R> messageHandler,
scala.reflect.ClassTag<K> evidence$9,
scala.reflect.ClassTag<V> evidence$10,
scala.reflect.ClassTag<KD> evidence$11,
scala.reflect.ClassTag<VD> evidence$12,
scala.reflect.ClassTag<R> evidence$13)
:: Experimental :: Create a RDD from Kafka using offset ranges for each topic and partition. |
|
static
|
createStream(JavaStreamingContext jssc,
Class<K> keyTypeClass,
Class<V> valueTypeClass,
Class<U> keyDecoderClass,
Class<T> valueDecoderClass,
java.util.Map<String,String> kafkaParams,
java.util.Map<String,Integer> topics,
StorageLevel storageLevel)
Create an input stream that pulls messages from Kafka Brokers. |
|
static JavaPairReceiverInputDStream<String,String> |
createStream(JavaStreamingContext jssc,
String zkQuorum,
String groupId,
java.util.Map<String,Integer> topics)
Create an input stream that pulls messages from Kafka Brokers. |
|
static JavaPairReceiverInputDStream<String,String> |
createStream(JavaStreamingContext jssc,
String zkQuorum,
String groupId,
java.util.Map<String,Integer> topics,
StorageLevel storageLevel)
Create an input stream that pulls messages from Kafka Brokers. |
|
static
|
createStream(StreamingContext ssc,
scala.collection.immutable.Map<String,String> kafkaParams,
scala.collection.immutable.Map<String,Object> topics,
StorageLevel storageLevel,
scala.reflect.ClassTag<K> evidence$1,
scala.reflect.ClassTag<V> evidence$2,
scala.reflect.ClassTag<U> evidence$3,
scala.reflect.ClassTag<T> evidence$4)
Create an input stream that pulls messages from Kafka Brokers. |
|
static ReceiverInputDStream<scala.Tuple2<String,String>> |
createStream(StreamingContext ssc,
String zkQuorum,
String groupId,
scala.collection.immutable.Map<String,Object> topics,
StorageLevel storageLevel)
Create an input stream that pulls messages from Kafka Brokers. |
| Methods inherited from class Object |
|---|
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
|---|
public KafkaUtils()
| Method Detail |
|---|
public static ReceiverInputDStream<scala.Tuple2<String,String>> createStream(StreamingContext ssc, String zkQuorum, String groupId, scala.collection.immutable.Map<String,Object> topics, StorageLevel storageLevel)
ssc
- StreamingContext objectzkQuorum
- Zookeeper quorum (hostname:port,hostname:port,..)groupId
- The group id for this consumertopics
- Map of (topic_name -> numPartitions) to consume. Each partition is consumed
in its own threadstorageLevel
- Storage level to use for storing the received objects
(default: StorageLevel.MEMORY_AND_DISK_SER_2)
public static <K,V,U extends kafka.serializer.Decoder<?>,T extends kafka.serializer.Decoder<?>> ReceiverInputDStream<scala.Tuple2<K,V>> createStream(StreamingContext ssc, scala.collection.immutable.Map<String,String> kafkaParams, scala.collection.immutable.Map<String,Object> topics, StorageLevel storageLevel, scala.reflect.ClassTag<K> evidence$1, scala.reflect.ClassTag<V> evidence$2, scala.reflect.ClassTag<U> evidence$3, scala.reflect.ClassTag<T> evidence$4)
ssc
- StreamingContext objectkafkaParams
- Map of kafka configuration parameters,
see http://kafka.apache.org/08/configuration.htmltopics
- Map of (topic_name -> numPartitions) to consume. Each partition is consumed
in its own thread.storageLevel
- Storage level to use for storing the received objectsevidence$1
- (undocumented)evidence$2
- (undocumented)evidence$3
- (undocumented)evidence$4
- (undocumented)
public static JavaPairReceiverInputDStream<String,String> createStream(JavaStreamingContext jssc, String zkQuorum, String groupId, java.util.Map<String,Integer> topics)
jssc
- JavaStreamingContext objectzkQuorum
- Zookeeper quorum (hostname:port,hostname:port,..)groupId
- The group id for this consumertopics
- Map of (topic_name -> numPartitions) to consume. Each partition is consumed
in its own thread
public static JavaPairReceiverInputDStream<String,String> createStream(JavaStreamingContext jssc, String zkQuorum, String groupId, java.util.Map<String,Integer> topics, StorageLevel storageLevel)
jssc
- JavaStreamingContext objectzkQuorum
- Zookeeper quorum (hostname:port,hostname:port,..).groupId
- The group id for this consumer.topics
- Map of (topic_name -> numPartitions) to consume. Each partition is consumed
in its own thread.storageLevel
- RDD storage level.
public static <K,V,U extends kafka.serializer.Decoder<?>,T extends kafka.serializer.Decoder<?>> JavaPairReceiverInputDStream<K,V> createStream(JavaStreamingContext jssc, Class<K> keyTypeClass, Class<V> valueTypeClass, Class<U> keyDecoderClass, Class<T> valueDecoderClass, java.util.Map<String,String> kafkaParams, java.util.Map<String,Integer> topics, StorageLevel storageLevel)
jssc
- JavaStreamingContext objectkeyTypeClass
- Key type of DStreamvalueTypeClass
- value type of DstreamkeyDecoderClass
- Type of kafka key decodervalueDecoderClass
- Type of kafka value decoderkafkaParams
- Map of kafka configuration parameters,
see http://kafka.apache.org/08/configuration.htmltopics
- Map of (topic_name -> numPartitions) to consume. Each partition is consumed
in its own threadstorageLevel
- RDD storage level.
public static <K,V,KD extends kafka.serializer.Decoder<K>,VD extends kafka.serializer.Decoder<V>> RDD<scala.Tuple2<K,V>> createRDD(SparkContext sc, scala.collection.immutable.Map<String,String> kafkaParams, OffsetRange[] offsetRanges, scala.reflect.ClassTag<K> evidence$5, scala.reflect.ClassTag<V> evidence$6, scala.reflect.ClassTag<KD> evidence$7, scala.reflect.ClassTag<VD> evidence$8)
sc
- SparkContext objectkafkaParams
- Kafka
configuration parameters. Requires "metadata.broker.list" or "bootstrap.servers"
to be set with Kafka broker(s) (NOT zookeeper servers) specified in
host1:port1,host2:port2 form.offsetRanges
- Each OffsetRange in the batch corresponds to a
range of offsets for a given Kafka topic/partitionevidence$5
- (undocumented)evidence$6
- (undocumented)evidence$7
- (undocumented)evidence$8
- (undocumented)
public static <K,V,KD extends kafka.serializer.Decoder<K>,VD extends kafka.serializer.Decoder<V>,R> RDD<R> createRDD(SparkContext sc, scala.collection.immutable.Map<String,String> kafkaParams, OffsetRange[] offsetRanges, scala.collection.immutable.Map<kafka.common.TopicAndPartition,Broker> leaders, scala.Function1<kafka.message.MessageAndMetadata<K,V>,R> messageHandler, scala.reflect.ClassTag<K> evidence$9, scala.reflect.ClassTag<V> evidence$10, scala.reflect.ClassTag<KD> evidence$11, scala.reflect.ClassTag<VD> evidence$12, scala.reflect.ClassTag<R> evidence$13)
sc
- SparkContext objectkafkaParams
- Kafka
configuration parameters. Requires "metadata.broker.list" or "bootstrap.servers"
to be set with Kafka broker(s) (NOT zookeeper servers) specified in
host1:port1,host2:port2 form.offsetRanges
- Each OffsetRange in the batch corresponds to a
range of offsets for a given Kafka topic/partitionleaders
- Kafka brokers for each TopicAndPartition in offsetRanges. May be an empty map,
in which case leaders will be looked up on the driver.messageHandler
- Function for translating each message and metadata into the desired typeevidence$9
- (undocumented)evidence$10
- (undocumented)evidence$11
- (undocumented)evidence$12
- (undocumented)evidence$13
- (undocumented)
public static <K,V,KD extends kafka.serializer.Decoder<K>,VD extends kafka.serializer.Decoder<V>> JavaPairRDD<K,V> createRDD(JavaSparkContext jsc, Class<K> keyClass, Class<V> valueClass, Class<KD> keyDecoderClass, Class<VD> valueDecoderClass, java.util.Map<String,String> kafkaParams, OffsetRange[] offsetRanges)
jsc
- JavaSparkContext objectkafkaParams
- Kafka
configuration parameters. Requires "metadata.broker.list" or "bootstrap.servers"
to be set with Kafka broker(s) (NOT zookeeper servers) specified in
host1:port1,host2:port2 form.offsetRanges
- Each OffsetRange in the batch corresponds to a
range of offsets for a given Kafka topic/partitionkeyClass
- (undocumented)valueClass
- (undocumented)keyDecoderClass
- (undocumented)valueDecoderClass
- (undocumented)
public static <K,V,KD extends kafka.serializer.Decoder<K>,VD extends kafka.serializer.Decoder<V>,R> JavaRDD<R> createRDD(JavaSparkContext jsc, Class<K> keyClass, Class<V> valueClass, Class<KD> keyDecoderClass, Class<VD> valueDecoderClass, Class<R> recordClass, java.util.Map<String,String> kafkaParams, OffsetRange[] offsetRanges, java.util.Map<kafka.common.TopicAndPartition,Broker> leaders, Function<kafka.message.MessageAndMetadata<K,V>,R> messageHandler)
jsc
- JavaSparkContext objectkafkaParams
- Kafka
configuration parameters. Requires "metadata.broker.list" or "bootstrap.servers"
to be set with Kafka broker(s) (NOT zookeeper servers) specified in
host1:port1,host2:port2 form.offsetRanges
- Each OffsetRange in the batch corresponds to a
range of offsets for a given Kafka topic/partitionleaders
- Kafka brokers for each TopicAndPartition in offsetRanges. May be an empty map,
in which case leaders will be looked up on the driver.messageHandler
- Function for translating each message and metadata into the desired typekeyClass
- (undocumented)valueClass
- (undocumented)keyDecoderClass
- (undocumented)valueDecoderClass
- (undocumented)recordClass
- (undocumented)
public static <K,V,KD extends kafka.serializer.Decoder<K>,VD extends kafka.serializer.Decoder<V>,R> InputDStream<R> createDirectStream(StreamingContext ssc, scala.collection.immutable.Map<String,String> kafkaParams, scala.collection.immutable.Map<kafka.common.TopicAndPartition,Object> fromOffsets, scala.Function1<kafka.message.MessageAndMetadata<K,V>,R> messageHandler, scala.reflect.ClassTag<K> evidence$14, scala.reflect.ClassTag<V> evidence$15, scala.reflect.ClassTag<KD> evidence$16, scala.reflect.ClassTag<VD> evidence$17, scala.reflect.ClassTag<R> evidence$18)
Points to note:
- No receivers: This stream does not use any receiver. It directly queries Kafka
- Offsets: This does not use Zookeeper to store offsets. The consumed offsets are tracked
by the stream itself. For interoperability with Kafka monitoring tools that depend on
Zookeeper, you have to update Kafka/Zookeeper yourself from the streaming application.
You can access the offsets used in each batch from the generated RDDs (see
HasOffsetRanges
).
- Failure Recovery: To recover from driver failures, you have to enable checkpointing
in the StreamingContext
. The information on consumed offset can be
recovered from the checkpoint. See the programming guide for details (constraints, etc.).
- End-to-end semantics: This stream ensures that every records is effectively received and
transformed exactly once, but gives no guarantees on whether the transformed data are
outputted exactly once. For end-to-end exactly-once semantics, you have to either ensure
that the output operation is idempotent, or use transactions to output records atomically.
See the programming guide for more details.
ssc
- StreamingContext objectkafkaParams
- Kafka
configuration parameters. Requires "metadata.broker.list" or "bootstrap.servers"
to be set with Kafka broker(s) (NOT zookeeper servers) specified in
host1:port1,host2:port2 form.fromOffsets
- Per-topic/partition Kafka offsets defining the (inclusive)
starting point of the streammessageHandler
- Function for translating each message and metadata into the desired typeevidence$14
- (undocumented)evidence$15
- (undocumented)evidence$16
- (undocumented)evidence$17
- (undocumented)evidence$18
- (undocumented)
public static <K,V,KD extends kafka.serializer.Decoder<K>,VD extends kafka.serializer.Decoder<V>> InputDStream<scala.Tuple2<K,V>> createDirectStream(StreamingContext ssc, scala.collection.immutable.Map<String,String> kafkaParams, scala.collection.immutable.Set<String> topics, scala.reflect.ClassTag<K> evidence$19, scala.reflect.ClassTag<V> evidence$20, scala.reflect.ClassTag<KD> evidence$21, scala.reflect.ClassTag<VD> evidence$22)
Points to note:
- No receivers: This stream does not use any receiver. It directly queries Kafka
- Offsets: This does not use Zookeeper to store offsets. The consumed offsets are tracked
by the stream itself. For interoperability with Kafka monitoring tools that depend on
Zookeeper, you have to update Kafka/Zookeeper yourself from the streaming application.
You can access the offsets used in each batch from the generated RDDs (see
HasOffsetRanges
).
- Failure Recovery: To recover from driver failures, you have to enable checkpointing
in the StreamingContext
. The information on consumed offset can be
recovered from the checkpoint. See the programming guide for details (constraints, etc.).
- End-to-end semantics: This stream ensures that every records is effectively received and
transformed exactly once, but gives no guarantees on whether the transformed data are
outputted exactly once. For end-to-end exactly-once semantics, you have to either ensure
that the output operation is idempotent, or use transactions to output records atomically.
See the programming guide for more details.
ssc
- StreamingContext objectkafkaParams
- Kafka
configuration parameters. Requires "metadata.broker.list" or "bootstrap.servers"
to be set with Kafka broker(s) (NOT zookeeper servers), specified in
host1:port1,host2:port2 form.
If not starting from a checkpoint, "auto.offset.reset" may be set to "largest" or "smallest"
to determine where the stream starts (defaults to "largest")topics
- Names of the topics to consumeevidence$19
- (undocumented)evidence$20
- (undocumented)evidence$21
- (undocumented)evidence$22
- (undocumented)
public static <K,V,KD extends kafka.serializer.Decoder<K>,VD extends kafka.serializer.Decoder<V>,R> JavaInputDStream<R> createDirectStream(JavaStreamingContext jssc, Class<K> keyClass, Class<V> valueClass, Class<KD> keyDecoderClass, Class<VD> valueDecoderClass, Class<R> recordClass, java.util.Map<String,String> kafkaParams, java.util.Map<kafka.common.TopicAndPartition,Long> fromOffsets, Function<kafka.message.MessageAndMetadata<K,V>,R> messageHandler)
Points to note:
- No receivers: This stream does not use any receiver. It directly queries Kafka
- Offsets: This does not use Zookeeper to store offsets. The consumed offsets are tracked
by the stream itself. For interoperability with Kafka monitoring tools that depend on
Zookeeper, you have to update Kafka/Zookeeper yourself from the streaming application.
You can access the offsets used in each batch from the generated RDDs (see
HasOffsetRanges
).
- Failure Recovery: To recover from driver failures, you have to enable checkpointing
in the StreamingContext
. The information on consumed offset can be
recovered from the checkpoint. See the programming guide for details (constraints, etc.).
- End-to-end semantics: This stream ensures that every records is effectively received and
transformed exactly once, but gives no guarantees on whether the transformed data are
outputted exactly once. For end-to-end exactly-once semantics, you have to either ensure
that the output operation is idempotent, or use transactions to output records atomically.
See the programming guide for more details.
jssc
- JavaStreamingContext objectkeyClass
- Class of the keys in the Kafka recordsvalueClass
- Class of the values in the Kafka recordskeyDecoderClass
- Class of the key decodervalueDecoderClass
- Class of the value decoderrecordClass
- Class of the records in DStreamkafkaParams
- Kafka
configuration parameters. Requires "metadata.broker.list" or "bootstrap.servers"
to be set with Kafka broker(s) (NOT zookeeper servers), specified in
host1:port1,host2:port2 form.fromOffsets
- Per-topic/partition Kafka offsets defining the (inclusive)
starting point of the streammessageHandler
- Function for translating each message and metadata into the desired type
public static <K,V,KD extends kafka.serializer.Decoder<K>,VD extends kafka.serializer.Decoder<V>> JavaPairInputDStream<K,V> createDirectStream(JavaStreamingContext jssc, Class<K> keyClass, Class<V> valueClass, Class<KD> keyDecoderClass, Class<VD> valueDecoderClass, java.util.Map<String,String> kafkaParams, java.util.Set<String> topics)
Points to note:
- No receivers: This stream does not use any receiver. It directly queries Kafka
- Offsets: This does not use Zookeeper to store offsets. The consumed offsets are tracked
by the stream itself. For interoperability with Kafka monitoring tools that depend on
Zookeeper, you have to update Kafka/Zookeeper yourself from the streaming application.
You can access the offsets used in each batch from the generated RDDs (see
HasOffsetRanges
).
- Failure Recovery: To recover from driver failures, you have to enable checkpointing
in the StreamingContext
. The information on consumed offset can be
recovered from the checkpoint. See the programming guide for details (constraints, etc.).
- End-to-end semantics: This stream ensures that every records is effectively received and
transformed exactly once, but gives no guarantees on whether the transformed data are
outputted exactly once. For end-to-end exactly-once semantics, you have to either ensure
that the output operation is idempotent, or use transactions to output records atomically.
See the programming guide for more details.
jssc
- JavaStreamingContext objectkeyClass
- Class of the keys in the Kafka recordsvalueClass
- Class of the values in the Kafka recordskeyDecoderClass
- Class of the key decodervalueDecoderClass
- Class type of the value decoderkafkaParams
- Kafka
configuration parameters. Requires "metadata.broker.list" or "bootstrap.servers"
to be set with Kafka broker(s) (NOT zookeeper servers), specified in
host1:port1,host2:port2 form.
If not starting from a checkpoint, "auto.offset.reset" may be set to "largest" or "smallest"
to determine where the stream starts (defaults to "largest")topics
- Names of the topics to consume
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |