Elasticsearch: Geographically Encoded Objects for Elasticsearch
Driver short name
Elasticsearch
Build dependencies
libcurl
Elasticsearch is an Enterprise-level search engine for a variety of data sources. It supports full-text indexing and geospatial querying of those data in a fast and efficient manor using a predefined REST API.
Driver capabilities
Supports Create()
This driver supports the GDALDriver::Create()
operation
Supports Georeferencing
This driver supports georeferencing
Opening dataset name syntax
Starting with GDAL 2.1, the driver supports reading existing indices from a Elasticsearch host. There are two main possible syntaxes to open a dataset:
Using ES:http://hostname:port (where port is typically 9200)
Using ES: with the open options to specify HOST and PORT
The open options available are :
HOST=hostname: Server hostname. Default to localhost.
PORT=port. Server port. Default to 9200.
USERPWD=user:password. (GDAL >=2.4) Basic authentication as username:password.
LAYER=name. (GDAL >=2.4) Index name or index_mapping to use for restricting layer listing.
BATCH_SIZE=number. Number of features to retrieve per batch. Default is 100.
FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN=number. Number of features to retrieve to establish feature definition. -1 = unlimited. Defaults to 100.
SINGLE_QUERY_TIMEOUT=number. (GDAL >= 3.2.1) Timeout in second (as floating point number) for requests such as GetFeatureCount() or GetExtent(). Defaults to unlimited.
SINGLE_QUERY_TERMINATE_AFTER=number. (GDAL >= 3.2.1) Maximum number of documents to collect for requests such as GetFeatureCount() or GetExtent(). Defaults to unlimited.
FEATURE_ITERATION_TIMEOUT=number. (GDAL >= 3.2.1) Timeout in second (as floating point number) for feature iteration, starting from the time of ResetReading(). Defaults to unlimited.
FEATURE_ITERATION_TERMINATE_AFTER=number. (GDAL >= 3.2.1) Maximum number of documents to collect for feature iteration. Defaults to unlimited.
JSON_FIELD=YES/NO. Whether to include a field called “_json” with the full document as JSON. Defaults to NO.
FLATTEN_NESTED_ATTRIBUTE=YES/NO. Whether to recursively explore nested objects and produce flatten OGR attributes. Defaults to YES.
FID=string. Field name, with integer values, to use as FID. Defaults to ‘ogc_fid’
FORWARD_HTTP_HEADERS_FROM_ENV=string. (GDAL >= 3.1) Can be used to specify HTTP headers, typically for authentication purposes, that must be passed to Elasticsearch. The value of string is a comma separated list of http_header_name=env_variable_name, where http_header_name is the name of a HTTP header and env_variable_name the name of the environment variable / configuration option from which th value of the HTTP header should be retrieved. This is intended for a use case where the OGR Elasticsearch driver is invoked from a web server that stores the HTTP headers of incoming request into environment variables. The ES_FORWARD_HTTP_HEADERS_FROM_ENV configuration option can also be used.
Elasticsearch vs OGR concepts
Each mapping type inside a Elasticsearch index will be considered as a OGR layer. A Elasticsearch document is considered as a OGR feature.
Field definitions
Fields are dynamically mapped from the input OGR data source. However, the driver will take advantage of advanced options within Elasticsearch as defined in a field mapping file.
The mapping file allows you to modify the mapping according to the Elasticsearch field-specific types. There are many options to choose from, however, most of the functionality is based on all the different things you are able to do with text fields within Elasticsearch.
ogr2ogr -progress --config ES_WRITEMAP /path/to/file/map.txt -f "Elasticsearch" http://localhost:9200 my_shapefile.shp
The Elasticsearch writer supports the following Configuration Options. Starting with GDAL 2.1, layer creation options are also available and should be preferred:
ES_WRITEMAP=/path/to/mapfile.txt. Creates a mapping file that can be modified by the user prior to insert in to the index. No feature will be written. Note that this will properly work only if only one single layer is created. Starting with GDAL 2.1, the WRITE_MAPPING layer creation option should rather be used.
ES_META=/path/to/mapfile.txt. Tells the driver to the user-defined field mappings. Starting with GDAL 2.1, the MAPPING layer creation option should rather be used.
ES_BULK=5000000. Identifies the maximum size in bytes of the buffer to store documents to be inserted at a time. Lower record counts help with memory consumption within Elasticsearch but take longer to insert. Starting with GDAL 2.1, the BULK_SIZE layer creation option should rather be used.
ES_OVERWRITE=1. Overwrites the current index by deleting an existing one. Starting with GDAL 2.1, the OVERWRITE layer creation option should rather be used.
Geometry types
In GDAL 2.0 and earlier, the driver was limited in the geometry it handles: even if polygons were provided as input, they were stored as geo point and the “center” of the polygon is used as value of the point. Starting with GDAL 2.1, geo_shape is used to store all geometry types (except curve geometries that are not handled by Elasticsearch and will be approximated to their linear equivalents).
Filtering
The driver will forward any spatial filter set with SetSpatialFilter() to the server.
Starting with GDAL 2.2, SQL attribute filters set with SetAttributeFilter() are converted to Elasticsearch filter syntax. They will be combined with the potentially defined spatial filter.
It is also possible to directly use a Elasticsearch filter by setting the string passed to SetAttributeFilter() as a JSon serialized object, e.g.
{ "post_filter": { "term": { "properties.EAS_ID": 169 } } }
Note: if defining directly an Elastic Search JSon filter, the spatial filter specified through SetSpatialFilter() will be ignored, and must thus be included in the JSon filter if needed.
Paging
Features are retrieved from the server by chunks of 100. This can be altered with the BATCH_SIZE open option.
Schema
When reading a Elastic Search index/type, OGR must establish the schema of attribute and geometry fields, since OGR has a fixed schema concept.
In the general case, OGR will read the mapping definition and the first 100 documents (can be altered with the FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN open option) of the index/type and build the schema that best fit to the found fields and values.
It is also possible to set the JSON_FIELD=YES open option so that a _json special field is added to the OGR schema. When reading Elastic Search documents as OGR features, the full JSon version of the document will be stored in the _json field. This might be useful in case of complex documents or with data types that do not translate well in OGR data types. On creation/update of documents, if the _json field is present and set, its content will be used directly (other fields will be ignored).
Feature ID
Elastic Search have a special _id field that contains the unique ID of the document. This field is returned as an OGR field, but cannot be used as the OGR special FeatureID field, which must be of integer type. By default, OGR will try to read a potential ‘ogc_fid’ field to set the OGR FeatureID. The name of this field to look up can be set with the FID open option. If the field is not found, the FID returned by OGR will be a sequential number starting at 1, but it is not guaranteed to be stable at all.
ExecuteSQL() interface
Starting with GDAL 2.2, SQL requests, involving a single layer, with WHERE and ORDER BY statements will be translated as Elasticsearch queries.
Otherwise, if specifying “ES” as the dialect of ExecuteSQL(), a JSon string with a serialized Elastic Search filter can be passed. The search will be done on all indices and types, unless the filter itself restricts the search. The returned layer will be a union of the types returned by the FEATURE_COUNT_TO_ESTABLISH_FEATURE_DEFN first documents. It will also contain the _index and _type special fields to indicate the provenance of the features.
The following filter can be used to restrict the search to the “poly” index and its “FeatureCollection” type mapping (Elasticsearch 1.X and 2.X)
{ "filter": {
"indices" : {
"no_match_filter": "none",
"index": "poly",
"filter": {
"and" : [
{ "type": { "value": "FeatureCollection" } },
{ "term" : { "properties.EAS_ID" : 158.0 } }
]
}
}
}
}
For Elasticsearch 5.X (works also with 2.X) :
{ "post_filter": {
"indices" : {
"no_match_query": "none",
"index": "poly",
"query": {
"bool": {
"must" : [
{ "type": { "value": "FeatureCollection" } },
{ "term" : { "properties.EAS_ID" : 158.0 } }
]
}
}
}
}
}
Aggregations are not supported.
Getting metadata
Getting feature count is efficient.
Getting extent is efficient, only on geometry columns mapped to Elasticsearch type geo_point. On geo_shape fields, feature retrieval of the whole layer is done, which might be slow.
Write support
Index/type creation and deletion is possible.
Write support is only enabled when the datasource is opened in update mode.
When inserting a new feature with CreateFeature() in non-bulk mode, and if the command is successful, OGR will fetch the returned _id and use it for the SetFeature() operation.
Spatial reference system
Geometries stored in Elastic Search are supposed to be referenced as longitude/latitude over WGS84 datum (EPSG:4326). On creation, the driver will automatically reproject from the layer (or geometry field) SRS to EPSG:4326, provided that the input SRS is set and that is not already EPSG:4326.
Layer creation options
Starting with GDAL 2.1, the driver supports the following layer creation options:
INDEX_NAME=name. Name of the index to create (or reuse). By default the index name is the layer name.
INDEX_DEFINITION=filename or JSon. (GDAL >= 2.4) Filename from which to read a user-defined index definition, or inlined index definition as serialized JSon.
MAPPING_NAME==name. (Elasticsearch < 7) Name of the mapping type within the index. By default, the mapping name is “FeatureCollection” and the documents will be written as GeoJSON Feature objects. If another mapping name is chosen, a more “flat” structure will be used. This option is ignored when converting to Elasticsearch >=7 (see Removal of mapping types). With Elasticsearch 7 or later, a “flat” structure is always used.
MAPPING=filename or JSon. Filename from which to read a user-defined mapping, or mapping as serialized JSon.
WRITE_MAPPING=filename. Creates a mapping file that can be modified by the user prior to insert in to the index. No feature will be written. This option is exclusive with MAPPING.
OVERWRITE=YES/NO. Whether to overwrite an existing type mapping with the layer name to be created. Defaults to NO.
OVERWRITE_INDEX=YES/NO. (GDAL >= 2.2) Whether to overwrite the whole index to which the layer belongs to. Defaults to NO. This option is stronger than OVERWRITE. OVERWRITE will only proceed if the type mapping corresponding to the layer is the single type mapping of the index. In case there are several type mappings, the whole index need to be destroyed (it is unsafe to destroy a mapping and the documents that use it, since they might be used by other mappings. This was possible in Elasticsearch 1.X, but no longer in later versions).
GEOMETRY_NAME=name. Name of geometry column. Defaults to ‘geometry’.
GEOM_MAPPING_TYPE=AUTO/GEO_POINT/GEO_SHAPE. Mapping type for geometry fields. Defaults to AUTO. GEO_POINT uses the geo_point mapping type. If used, the “centroid” of the geometry is used. This is the behavior of GDAL < 2.1. GEO_SHAPE uses the geo_shape mapping type, compatible of all geometry types. When using AUTO, for geometry fields of type Point, a geo_point is used. In other cases, geo_shape is used.
GEO_SHAPE_ENCODING=GeoJSON/WKT. (GDAL >= 3.2.1) Encoding for geo_shape geometry fields. Defaults to GeoJSON. WKT is possible since Elasticsearch 6.2
GEOM_PRECISION={value}{unit}’. Desired geometry precision. Number followed by unit. For example 1m. For a geo_point geometry field, this causes a compressed geometry format to be used. This option is without effect if MAPPING is specified.
STORE_FIELDS=YES/NO. Whether fields should be stored in the index. Setting to YES sets the “store” property of the field mapping to “true” for all fields. Defaults to NO. (Note: prior to GDAL 2.1, the default behavior was to store fields) This option is without effect if MAPPING is specified.
STORED_FIELDS=List of comma separated field names that should be stored in the index. Those fields will have their “store” property of the field mapping set to “true”. If all fields must be stored, then using STORE_FIELDS=YES is a shortcut. This option is without effect if MAPPING is specified.
NOT_ANALYZED_FIELDS=List of comma separated field names that should not be analyzed during indexing. Those fields will have their “index” property of the field mapping set to “not_analyzed” (the default in Elasticsearch is “analyzed”). A same field should not be specified both in NOT_ANALYZED_FIELDS and NOT_INDEXED_FIELDS. Starting with GDAL 2.2, the {ALL} value can be used to designate all fields. This option is without effect if MAPPING is specified.
NOT_INDEXED_FIELDS=List of comma separated field names that should not be indexed. Those fields will have their “index” property of the field mapping set to “no” (the default in Elasticsearch is “analyzed”). A same field should not be specified both in NOT_ANALYZED_FIELDS and NOT_INDEXED_FIELDS. This option is without effect if MAPPING is specified.
FIELDS_WITH_RAW_VALUE=(GDAL > 2.2) List of comma separated field names (of type string) that should be created with an additional raw/not_analyzed sub-field, or {ALL} to designate all string analyzed fields. This is needed for sorting on those columns, and can improve performance when filtering with SQL operators. This option is without effect if MAPPING is specified.
BULK_INSERT=YES/NO. Whether to use bulk insert for feature creation. Defaults to YES.
BULK_SIZE=value. Size in bytes of the buffer for bulk upload. Defaults to 1000000 (1 million).
FID=string. Field name, with integer values, to use as FID. Can be set to empty to disable the writing of the FID value. Defaults to ‘ogc_fid’
DOT_AS_NESTED_FIELD=YES/NO. Whether to consider dot character in field name as sub-document. Defaults to YES.
IGNORE_SOURCE_ID=YES/NO. Whether to ignore _id field in features passed to CreateFeature(). Defaults to NO.
Examples
Open the local store:
ogrinfo ES:
Open a remote store:
ogrinfo ES:http://example.com:9200
ogrinfo -ro ES: my_type -where '{ "post_filter": { "term": { "properties.EAS_ID": 168 } } }'
C:\GDAL_on_Windows>ogrinfo ES: my_type -where "{\"query\": { \"match\": { \"properties.NAME\": \"Helsinki\" } } }"
Load an Elasticsearch index with a shapefile:
ogr2ogr -f "Elasticsearch" http://localhost:9200 my_shapefile.shp
Create a Mapping File: The mapping file allows you to modify the mapping according to the Elasticsearch field-specific types. There are many options to choose from, however, most of the functionality is based on all the different things you are able to do with text fields.
ogr2ogr -progress --config ES_WRITEMAP /path/to/file/map.txt -f "Elasticsearch" http://localhost:9200 my_shapefile.shp
or (GDAL >= 2.1):
ogr2ogr -progress -lco WRITE_MAPPING=/path/to/file/map.txt -f "Elasticsearch" http://localhost:9200 my_shapefile.shp
Read the Mapping File: Reads the mapping file during the transformation
ogr2ogr -progress --config ES_META /path/to/file/map.txt -f "Elasticsearch" http://localhost:9200 my_shapefile.shp
or (GDAL >= 2.1):
ogr2ogr -progress -lco MAPPING=/path/to/file/map.txt -f "Elasticsearch" http://localhost:9200 my_shapefile.shp
Bulk Uploading (for larger datasets): Bulk loading helps when uploading a lot of data. The integer value is the number of bytes that are collected before being inserted. Bulk size considerations
ogr2ogr -progress --config ES_BULK 5000000 -f "Elasticsearch" http://localhost:9200 PG:"host=localhost user=postgres dbname=my_db password=password" "my_table" -nln thetable
or (GDAL >= 2.1):
ogr2ogr -progress -lco BULK_SIZE=5000000 -f "Elasticsearch" http://localhost:9200 my_shapefile.shp
Overwrite the current Index: If specified, this will overwrite the current index. Otherwise, the data will be appended.
ogr2ogr -progress --config ES_OVERWRITE 1 -f "Elasticsearch" http://localhost:9200 PG:"host=localhost user=postgres dbname=my_db password=password" "my_table" -nln thetable
or (GDAL >= 2.1):
ogr2ogr -progress -overwrite ES:http://localhost:9200 PG:"host=localhost user=postgres dbname=my_db password=password" "my_table" -nln thetable


|
Don't
Speak
(No Doubt) |
|
You
and me
We used to be together Every day together always I really feel That I'm losing my best friend I can't believe This could be the end It looks as though you're letting go And if it's real, Well I don't want to know Don't speak I know just what you're saying So please stop explaining Don't tell me 'cause it hurts Don't speak I know what you're thinking I don't need your reasons Don't tell me 'cause it hurts Our memories They can be inviting But some are altogether Mighty frightening As we die, both you and I With my head in my hands I sit and cry Don't speak I know just what you're saying So please stop explaining Don't tell me 'cause it hurts no no no Don't speak I know what you're thinking And I don't need your reasons Don't tell me 'cause it hurts It's all ending, I gotta stop pretending who we are... You and me I can see us dying... are we? Don't speak I know just what you're saying So please stop explaining Don't tell me 'cause it hurts no no Don't speak I know what you're thinking And I don't need your reasons Don't tell me 'cause it hurts Don't tell me 'cause it hurts I know what you're saying So please stop explaining Don't speak don't speak don't speak No I know what you're thinking And I don't need your reasons I know you good I know you good I know you real good oh La la la la la la la la la Don't don't ooh ooh Hush hush darling Hush hush darling Hush hush don't tell me 'cause it hurts Hush hush darling Hush hush darling Hush hush don't tell me 'cause it hurts |


* Please enter your avatar name
Error:
You have completed the Privilege Walk activity. You can now exit the activity.
Type in the name you've chosen for your avatar in the first part of this activity.


{% comment %}
Translators: For courses which require specific email suffix for enrollment, translate the following literals
with your customized email suffix.
{% endcomment %}
{% blocktrans trimmed %}
Please use the official email address associated with the
university or school at which this course is taking place. Some courses
may require a certain email domain (such as<EMAIL_ADDRESS>for
enrollment.
{% endblocktrans %}
{% url "relate-sign_in_by_user_pw" as relate-sign_in_by_user_pw %}
{% blocktrans trimmed %}
If you have a user name and a password, you should use the
password-based sign-in process.
{% endblocktrans %}


{% extends 'base.html' %} {% block body %}
Looking for a new spot to try? Tell me three restaurants that you like.
Where would you like to search?
Would you like to see only similar cuisines?


SAIO - Swift All In One¶
Instructions for setting up a development VM¶
This section documents setting up a virtual machine for doing Swift development. The virtual machine will emulate running a four node Swift cluster. To begin:
- Get an Ubuntu 14.04 LTS server image or try something Fedora/CentOS.
- Create guest virtual machine from the image.
What’s in a <your-user-name>¶
Much of the configuration described in this guide requires escalated
administrator (root
) privileges; however, we assume that administrator logs
in as an unprivileged user and can use sudo
to run privileged commands.
Swift processes also run under a separate user and group, set by configuration
option, and referenced as <your-user-name>:<your-group-name>
. The default user
is swift
, which may not exist on your system. These instructions are
intended to allow a developer to use his/her username for
<your-user-name>:<your-group-name>
.
 Later in the process setuptools/distribute or pip will install and/or upgrade packages.
Next, choose either Using a partition for storage or Using a loopback device for storage.
Using a partition for storage¶
If you are going to use a separate partition for Swift data, be sure to add another device when creating the VM, and follow these instructions:
Set up a single partition:
sudo fdisk /dev/sdb sudo mkfs.xfs /dev/sdb1Edit
/etc/fstab
and add:/dev/sdb1 /mnt/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0Create the mount point and the individualized links:
sudo mkdir /mnt/sdb1 sudo mount /mnt/sdb1 sudo mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4 sudo chown ${USER}:${USER} /mnt/sdb1/* sudo mkdir /srv for x in {1..4}; do sudo ln -s /mnt/sdb1/$x /srv/$x; done sudo mkdir -p /srv/1/node/sdb1 /srv/1/node/sdb5 \ /srv/2/node/sdb2 /srv/2/node/sdb6 \ /srv/3/node/sdb3 /srv/3/node/sdb7 \ /srv/4/node/sdb4 /srv/4/node/sdb8 \ /var/run/swift sudo chown -R ${USER}:${USER} /var/run/swift # **Make sure to include the trailing slash after /srv/$x/** for x in {1..4}; do sudo chown -R ${USER}:${USER} /srv/$x/; doneNote: We create the mount points and mount the storage disk under /mnt/sdb1. This disk will contain one directory per simulated swift node, each owned by the current swift user.
We then create symlinks to these directories under /srv. If the disk sdb is unmounted, files will not be written under /srv/*, because the symbolic link destination /mnt/sdb1/* will not exist. This prevents disk sync operations from writing to the root partition in the event a drive is unmounted.
Next, skip to Common Post-Device Setup.
Using a loopback device for storage¶
If you want to use a loopback device instead of another partition, follow these instructions:
Create the file for the loopback device:
sudo mkdir /srv sudo truncate -s 1GB /srv/swift-disk sudo mkfs.xfs /srv/swift-diskModify size specified in the
truncate
command to make a larger or smaller partition as needed.Edit /etc/fstab and add:
/srv/swift-disk /mnt/sdb1 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0Create the mount point and the individualized links:
sudo mkdir /mnt/sdb1 sudo mount /mnt/sdb1 sudo mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4 sudo chown ${USER}:${USER} /mnt/sdb1/* for x in {1..4}; do sudo ln -s /mnt/sdb1/$x /srv/$x; done sudo mkdir -p /srv/1/node/sdb1 /srv/1/node/sdb5 \ /srv/2/node/sdb2 /srv/2/node/sdb6 \ /srv/3/node/sdb3 /srv/3/node/sdb7 \ /srv/4/node/sdb4 /srv/4/node/sdb8 \ /var/run/swift sudo chown -R ${USER}:${USER} /var/run/swift # **Make sure to include the trailing slash after /srv/$x/** for x in {1..4}; do sudo chown -R ${USER}:${USER} /srv/$x/; doneNote: We create the mount points and mount the loopback file under /mnt/sdb1. This file will contain one directory per simulated swift node, each owned by the current swift user.
We then create symlinks to these directories under /srv. If the loopback file is unmounted, files will not be written under /srv/*, because the symbolic link destination /mnt/sdb1/* will not exist. This prevents disk sync operations from writing to the root partition in the event a drive is unmounted.
Common Post-Device Setup¶
Add the following lines to /etc/rc.local
(before the exit 0
):
mkdir -p /var/cache/swift /var/cache/swift2 /var/cache/swift3 /var/cache/swift4
chown <your-user-name>:<your-group-name> /var/cache/swift*
mkdir -p /var/run/swift
chown <your-user-name>:<your-group-name> /var/run/swift
Note that on some systems you might have to create /etc/rc.local
.
On Fedora 19 or later, you need to place these in /etc/rc.d/rc.local
.
Getting the code¶
Check out the python-swiftclient repo:
cd $HOME; git clone https://github.com/openstack/python-swiftclient.gitBuild a development installation of python-swiftclient:
cd $HOME/python-swiftclient; sudo python setup.py develop; cd -Ubuntu 12.04 users need to install python-swiftclient’s dependencies before the installation of python-swiftclient. This is due to a bug in an older version of setup tools:
cd $HOME/python-swiftclient; sudo pip install -r requirements.txt; sudo python setup.py develop; cd -Check out the swift repo:
git clone https://github.com/openstack/swift.gitBuild a development installation of swift:
cd $HOME/swift; sudo pip install -r requirements.txt; sudo python setup.py develop; cd -Fedora 19 or later users might have to perform the following if development installation of swift fails:
sudo pip install -U xattrInstall swift’s test dependencies:
cd $HOME/swift; sudo pip install -r test-requirements.txt
Setting up rsync¶
Create
/etc/rsyncd.conf
:sudo cp $HOME/swift/doc/saio/rsyncd.conf /etc/ sudo sed -i "s/<your-user-name>/${USER}/" /etc/rsyncd.confHere is the default
rsyncd.conf
file contents maintained in the repo that is copied and fixed up above:uid = <your-user-name> gid = <your-user-name> log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid address = <IP_ADDRESS> [account6012] max connections = 25 path = /srv/1/node/ read only = false lock file = /var/lock/account6012.lock [account6022] max connections = 25 path = /srv/2/node/ read only = false lock file = /var/lock/account6022.lock [account6032] max connections = 25 path = /srv/3/node/ read only = false lock file = /var/lock/account6032.lock [account6042] max connections = 25 path = /srv/4/node/ read only = false lock file = /var/lock/account6042.lock [container6011] max connections = 25 path = /srv/1/node/ read only = false lock file = /var/lock/container6011.lock [container6021] max connections = 25 path = /srv/2/node/ read only = false lock file = /var/lock/container6021.lock [container6031] max connections = 25 path = /srv/3/node/ read only = false lock file = /var/lock/container6031.lock [container6041] max connections = 25 path = /srv/4/node/ read only = false lock file = /var/lock/container6041.lock [object6010] max connections = 25 path = /srv/1/node/ read only = false lock file = /var/lock/object6010.lock [object6020] max connections = 25 path = /srv/2/node/ read only = false lock file = /var/lock/object6020.lock [object6030] max connections = 25 path = /srv/3/node/ read only = false lock file = /var/lock/object6030.lock [object6040] max connections = 25 path = /srv/4/node/ read only = false lock file = /var/lock/object6040.lockOn Ubuntu, edit the following line in
/etc/default/rsync
:RSYNC_ENABLE=trueOn Fedora, edit the following line in
/etc/xinetd.d/rsync
:disable = noOne might have to create the above files to perform the edits.
On platforms with SELinux in
Enforcing
mode, either set toPermissive
:sudo setenforce PermissiveOr just allow rsync full access:
sudo setsebool -P rsync_full_access 1Start the rsync daemon
On Ubuntu, run:
sudo service rsync restartOn Fedora, run:
sudo systemctl restart xinetd.service sudo systemctl enable rsyncd.service sudo systemctl start rsyncd.serviceOn other xinetd based systems simply run:
sudo service xinetd restartVerify rsync is accepting connections for all servers:
rsync rsync://pub@localhost/You should see the following output from the above command:
account6012 account6022 account6032 account6042 container6011 container6021 container6031 container6041 object6010 object6020 object6030 object6040
Starting memcached¶
On non-Ubuntu distros you need to ensure memcached is running:
sudo service memcached start
sudo chkconfig memcached on
or:
sudo systemctl enable memcached.service
sudo systemctl start memcached.service
The tempauth middleware stores tokens in memcached. If memcached is not running, tokens cannot be validated, and accessing Swift becomes impossible.
Optional: Setting up rsyslog for individual logging¶
Install the swift rsyslogd configuration:
sudo cp $HOME/swift/doc/saio/rsyslog.d/10-swift.conf /etc/rsyslog.d/Be sure to review that conf file to determine if you want all the logs in one file vs. all the logs separated out, and if you want hourly logs for stats processing. For convenience, we provide its default contents below:
# Uncomment the following to have a log containing all logs together #local1,local2,local3,local4,local5.* /var/log/swift/all.log # Uncomment the following to have hourly proxy logs for stats processing #$template HourlyProxyLog,"/var/log/swift/hourly/%$YEAR%%$MONTH%%$DAY%%$HOUR%" #local1.*;local1.!notice ?HourlyProxyLog local1.*;local1.!notice /var/log/swift/proxy.log local1.notice /var/log/swift/proxy.error local1.* ~ local2.*;local2.!notice /var/log/swift/storage1.log local2.notice /var/log/swift/storage1.error local2.* ~ local3.*;local3.!notice /var/log/swift/storage2.log local3.notice /var/log/swift/storage2.error local3.* ~ local4.*;local4.!notice /var/log/swift/storage3.log local4.notice /var/log/swift/storage3.error local4.* ~ local5.*;local5.!notice /var/log/swift/storage4.log local5.notice /var/log/swift/storage4.error local5.* ~ local6.*;local6.!notice /var/log/swift/expirer.log local6.notice /var/log/swift/expirer.error local6.* ~Edit
/etc/rsyslog.conf
and make the following change (usually in the “GLOBAL DIRECTIVES” section):$PrivDropToGroup admIf using hourly logs (see above) perform:
sudo mkdir -p /var/log/swift/hourlyOtherwise perform:
sudo mkdir -p /var/log/swiftSetup the logging directory and start syslog:
On Ubuntu:
sudo chown -R syslog.adm /var/log/swift sudo chmod -R g+w /var/log/swift sudo service rsyslog restartOn Fedora:
sudo chown -R root:adm /var/log/swift sudo chmod -R g+w /var/log/swift sudo systemctl restart rsyslog.service
Configuring each node¶
After performing the following steps, be sure to verify that Swift has access to resulting configuration files (sample configuration files are provided with all defaults in line-by-line comments).
Optionally remove an existing swift directory:
sudo rm -rf /etc/swiftPopulate the
/etc/swift
directory itself:cd $HOME/swift/doc; sudo cp -r saio/swift /etc/swift; cd - sudo chown -R ${USER}:${USER} /etc/swiftUpdate
<your-user-name>
references in the Swift config files:find /etc/swift/ -name \*.conf | xargs sudo sed -i "s/<your-user-name>/${USER}/"
The contents of the configuration files provided by executing the above commands are as follows:
/etc/swift/swift.conf
[swift-hash] # random unique strings that can never change (DO NOT LOSE) # Use only printable chars (python -c "import string; print(string.printable)") swift_hash_path_prefix = changeme swift_hash_path_suffix = changeme [storage-policy:0] name = gold policy_type = replication default = yes [storage-policy:1] name = silver policy_type = replication [storage-policy:2] name = ec42 policy_type = erasure_coding ec_type = liberasurecode_rs_vand ec_num_data_fragments = 4 ec_num_parity_fragments = 2
/etc/swift/proxy-server.conf
[DEFAULT] bind_ip = <IP_ADDRESS> bind_port = 8080 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL1 eventlet_debug = true [pipeline:main] # Yes, proxy-logging appears twice. This is so that # middleware-originated requests get logged too. pipeline = catch_errors gatekeeper healthcheck proxy-logging cache bulk tempurl ratelimit crossdomain container_sync tempauth staticweb copy container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server [filter:catch_errors] use = egg:swift#catch_errors [filter:healthcheck] use = egg:swift#healthcheck [filter:proxy-logging] use = egg:swift#proxy_logging [filter:bulk] use = egg:swift#bulk [filter:ratelimit] use = egg:swift#ratelimit [filter:crossdomain] use = egg:swift#crossdomain [filter:dlo] use = egg:swift#dlo [filter:slo] use = egg:swift#slo [filter:container_sync] use = egg:swift#container_sync current = //saio/saio_endpoint [filter:tempurl] use = egg:swift#tempurl [filter:tempauth] use = egg:swift#tempauth user_admin_admin = admin .admin .reseller_admin user_test_tester = testing .admin user_test2_tester2 = testing2 .admin user_test_tester3 = testing3 [filter:staticweb] use = egg:swift#staticweb [filter:account-quotas] use = egg:swift#account_quotas [filter:container-quotas] use = egg:swift#container_quotas [filter:cache] use = egg:swift#memcache [filter:gatekeeper] use = egg:swift#gatekeeper [filter:versioned_writes] use = egg:swift#versioned_writes allow_versioned_writes = true [filter:copy] use = egg:swift#copy [app:proxy-server] use = egg:swift#proxy allow_account_management = true account_autocreate = true
/etc/swift/object-expirer.conf
[DEFAULT] # swift_dir = /etc/swift user = <your-user-name> # You can specify default log routing here if you want: log_name = object-expirer log_facility = LOG_LOCAL6 log_level = INFO #log_address = /dev/log # # comma separated list of functions to call to setup custom log handlers. # functions get passed: conf, name, log_to_console, log_route, fmt, logger, # adapted_logger # log_custom_handlers = # # If set, log_udp_host will override log_address # log_udp_host = # log_udp_port = 514 # # You can enable StatsD logging here: # log_statsd_host = # log_statsd_port = 8125 # log_statsd_default_sample_rate = 1.0 # log_statsd_sample_rate_factor = 1.0 # log_statsd_metric_prefix = [object-expirer] interval = 300 # auto_create_account_prefix = . # report_interval = 300 # concurrency is the level of concurrency o use to do the work, this value # must be set to at least 1 # concurrency = 1 # processes is how many parts to divide the work into, one part per process # that will be doing the work # processes set 0 means that a single process will be doing all the work # processes can also be specified on the command line and will override the # config value # processes = 0 # process is which of the parts a particular process will work on # process can also be specified on the command line and will override the config # value # process is "zero based", if you want to use 3 processes, you should run # processes with process set to 0, 1, and 2 # process = 0 [pipeline:main] pipeline = catch_errors cache proxy-server [app:proxy-server] use = egg:swift#proxy # See proxy-server.conf-sample for options [filter:cache] use = egg:swift#memcache # See proxy-server.conf-sample for options [filter:catch_errors] use = egg:swift#catch_errors # See proxy-server.conf-sample for options
/etc/swift/container-reconciler.conf
[DEFAULT] # swift_dir = /etc/swift user = <your-user-name> # You can specify default log routing here if you want: # log_name = swift # log_facility = LOG_LOCAL0 # log_level = INFO # log_address = /dev/log # # comma separated list of functions to call to setup custom log handlers. # functions get passed: conf, name, log_to_console, log_route, fmt, logger, # adapted_logger # log_custom_handlers = # # If set, log_udp_host will override log_address # log_udp_host = # log_udp_port = 514 # # You can enable StatsD logging here: # log_statsd_host = # log_statsd_port = 8125 # log_statsd_default_sample_rate = 1.0 # log_statsd_sample_rate_factor = 1.0 # log_statsd_metric_prefix = [container-reconciler] # reclaim_age = 604800 # interval = 300 # request_tries = 3 [pipeline:main] pipeline = catch_errors proxy-logging cache proxy-server [app:proxy-server] use = egg:swift#proxy # See proxy-server.conf-sample for options [filter:cache] use = egg:swift#memcache # See proxy-server.conf-sample for options [filter:proxy-logging] use = egg:swift#proxy_logging [filter:catch_errors] use = egg:swift#catch_errors # See proxy-server.conf-sample for options
/etc/swift/container-sync-realms.conf
[saio] key = changeme key2 = changeme cluster_saio_endpoint = http://<IP_ADDRESS>:8080/v1/
/etc/swift/account-server/1.conf
[DEFAULT] devices = /srv/1/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6012 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL2 recon_cache_path = /var/cache/swift eventlet_debug = true [pipeline:main] pipeline = recon account-server [app:account-server] use = egg:swift#account [filter:recon] use = egg:swift#recon [account-replicator] rsync_module = {replication_ip}::account{replication_port} [account-auditor] [account-reaper]
/etc/swift/container-server/1.conf
[DEFAULT] devices = /srv/1/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6011 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL2 recon_cache_path = /var/cache/swift eventlet_debug = true [pipeline:main] pipeline = recon container-server [app:container-server] use = egg:swift#container [filter:recon] use = egg:swift#recon [container-replicator] rsync_module = {replication_ip}::container{replication_port} [container-updater] [container-auditor] [container-sync]
/etc/swift/object-server/1.conf
[DEFAULT] devices = /srv/1/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6010 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL2 recon_cache_path = /var/cache/swift eventlet_debug = true [pipeline:main] pipeline = recon object-server [app:object-server] use = egg:swift#object [filter:recon] use = egg:swift#recon [object-replicator] rsync_module = {replication_ip}::object{replication_port} [object-reconstructor] [object-updater] [object-auditor]
/etc/swift/account-server/2.conf
[DEFAULT] devices = /srv/2/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6022 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL3 recon_cache_path = /var/cache/swift2 eventlet_debug = true [pipeline:main] pipeline = recon account-server [app:account-server] use = egg:swift#account [filter:recon] use = egg:swift#recon [account-replicator] rsync_module = {replication_ip}::account{replication_port} [account-auditor] [account-reaper]
/etc/swift/container-server/2.conf
[DEFAULT] devices = /srv/2/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6021 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL3 recon_cache_path = /var/cache/swift2 eventlet_debug = true [pipeline:main] pipeline = recon container-server [app:container-server] use = egg:swift#container [filter:recon] use = egg:swift#recon [container-replicator] rsync_module = {replication_ip}::container{replication_port} [container-updater] [container-auditor] [container-sync]
/etc/swift/object-server/2.conf
[DEFAULT] devices = /srv/2/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6020 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL3 recon_cache_path = /var/cache/swift2 eventlet_debug = true [pipeline:main] pipeline = recon object-server [app:object-server] use = egg:swift#object [filter:recon] use = egg:swift#recon [object-replicator] rsync_module = {replication_ip}::object{replication_port} [object-reconstructor] [object-updater] [object-auditor]
/etc/swift/account-server/3.conf
[DEFAULT] devices = /srv/3/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6032 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL4 recon_cache_path = /var/cache/swift3 eventlet_debug = true [pipeline:main] pipeline = recon account-server [app:account-server] use = egg:swift#account [filter:recon] use = egg:swift#recon [account-replicator] rsync_module = {replication_ip}::account{replication_port} [account-auditor] [account-reaper]
/etc/swift/container-server/3.conf
[DEFAULT] devices = /srv/3/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6031 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL4 recon_cache_path = /var/cache/swift3 eventlet_debug = true [pipeline:main] pipeline = recon container-server [app:container-server] use = egg:swift#container [filter:recon] use = egg:swift#recon [container-replicator] rsync_module = {replication_ip}::container{replication_port} [container-updater] [container-auditor] [container-sync]
/etc/swift/object-server/3.conf
[DEFAULT] devices = /srv/3/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6030 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL4 recon_cache_path = /var/cache/swift3 eventlet_debug = true [pipeline:main] pipeline = recon object-server [app:object-server] use = egg:swift#object [filter:recon] use = egg:swift#recon [object-replicator] rsync_module = {replication_ip}::object{replication_port} [object-reconstructor] [object-updater] [object-auditor]
/etc/swift/account-server/4.conf
[DEFAULT] devices = /srv/4/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6042 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL5 recon_cache_path = /var/cache/swift4 eventlet_debug = true [pipeline:main] pipeline = recon account-server [app:account-server] use = egg:swift#account [filter:recon] use = egg:swift#recon [account-replicator] rsync_module = {replication_ip}::account{replication_port} [account-auditor] [account-reaper]
/etc/swift/container-server/4.conf
[DEFAULT] devices = /srv/4/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6041 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL5 recon_cache_path = /var/cache/swift4 eventlet_debug = true [pipeline:main] pipeline = recon container-server [app:container-server] use = egg:swift#container [filter:recon] use = egg:swift#recon [container-replicator] rsync_module = {replication_ip}::container{replication_port} [container-updater] [container-auditor] [container-sync]
/etc/swift/object-server/4.conf
[DEFAULT] devices = /srv/4/node mount_check = false disable_fallocate = true bind_ip = <IP_ADDRESS> bind_port = 6040 workers = 1 user = <your-user-name> log_facility = LOG_LOCAL5 recon_cache_path = /var/cache/swift4 eventlet_debug = true [pipeline:main] pipeline = recon object-server [app:object-server] use = egg:swift#object [filter:recon] use = egg:swift#recon [object-replicator] rsync_module = {replication_ip}::object{replication_port} [object-reconstructor] [object-updater] [object-auditor]
Setting up scripts for running Swift¶
Copy the SAIO scripts for resetting the environment:
mkdir -p $HOME/bin cd $HOME/swift/doc; cp saio/bin/* $HOME/bin; cd - chmod +x $HOME/bin/*Edit the
$HOME/bin/resetswift
scriptThe template
resetswift
script looks like the following:#!/bin/bash set -e swift-init all kill # Remove the following line if you did not set up rsyslog for individual logging: sudo find /var/log/swift -type f -exec rm -f {} \; if cut -d' ' -f2 /proc/mounts | grep -q /mnt/sdb1 ; then sudo umount /mnt/sdb1 fi # If you are using a loopback device set SAIO_BLOCK_DEVICE to "/srv/swift-disk" sudo mkfs.xfs -f ${SAIO_BLOCK_DEVICE:-/dev/sdb1} sudo mount /mnt/sdb1 sudo mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4 sudo chown ${USER}:${USER} /mnt/sdb1/* mkdir -p /srv/1/node/sdb1 /srv/1/node/sdb5 \ /srv/2/node/sdb2 /srv/2/node/sdb6 \ /srv/3/node/sdb3 /srv/3/node/sdb7 \ /srv/4/node/sdb4 /srv/4/node/sdb8 sudo rm -f /var/log/debug /var/log/messages /var/log/rsyncd.log /var/log/syslog find /var/cache/swift* -type f -name *.recon -exec rm -f {} \; if [ "`type -t systemctl`" == "file" ]; then sudo systemctl restart rsyslog sudo systemctl restart memcached else sudo service rsyslog restart sudo service memcached restart fiIf you are using a loopback device add an environment var to substitute
/dev/sdb1
with/srv/swift-disk
:echo "export SAIO_BLOCK_DEVICE=/srv/swift-disk" >> $HOME/.bashrcIf you did not set up rsyslog for individual logging, remove the
find /var/log/swift...
line:sed -i "/find \/var\/log\/swift/d" $HOME/bin/resetswiftInstall the sample configuration file for running tests:
cp $HOME/swift/test/sample.conf /etc/swift/test.confThe template
test.conf
looks like the following:[func_test] # Sample config for Swift with tempauth auth_host = <IP_ADDRESS> auth_port = 8080 auth_ssl = no auth_prefix = /auth/ # Sample config for Swift with Keystone v2 API. # For keystone v2 change auth_version to 2 and auth_prefix to /v2.0/. # And "allow_account_management" should not be set "true". #auth_version = 3 #auth_host = localhost #auth_port = 5000 #auth_ssl = no #auth_prefix = /v3/ # Primary functional test account (needs admin access to the account) account = test username = tester password = testing # User on a second account (needs admin access to the account) account2 = test2 username2 = tester2 password2 = testing2 # User on same account as first, but without admin access username3 = tester3 password3 = testing3 # Fourth user is required for keystone v3 specific tests. # Account must be in a non-default domain. #account4 = test4 #username4 = tester4 #password4 = testing4 #domain4 = test-domain # Fifth user is required for service token-specific tests. # The account must be different from the primary test account. # The user must not have a group (tempauth) or role (keystoneauth) on # the primary test account. The user must have a group/role that is unique # and not given to the primary tester and is specified in the options # <prefix>_require_group (tempauth) or <prefix>_service_roles (keystoneauth). #account5 = test5 #username5 = tester5 #password5 = testing5 # The service_prefix option is used for service token-specific tests. # If service_prefix or username5 above is not supplied, the tests are skipped. # To set the value and enable the service token tests, look at the # reseller_prefix option in /etc/swift/proxy-server.conf. There must be at # least two prefixes. If not, add a prefix as follows (where we add SERVICE): # reseller_prefix = AUTH, SERVICE # The service_prefix must match the <prefix> used in <prefix>_require_group # (tempauth) or <prefix>_service_roles (keystoneauth); for example: # SERVICE_require_group = service # SERVICE_service_roles = service # Note: Do not enable service token tests if the first prefix in # reseller_prefix is the empty prefix AND the primary functional test # account contains an underscore. #service_prefix = SERVICE # Sixth user is required for access control tests. # Account must have a role for reseller_admin_role(keystoneauth). #account6 = test #username6 = tester6 #password6 = testing6 collate = C # Only necessary if a pre-existing server uses self-signed certificate insecure = no [unit_test] fake_syslog = False [probe_test] # check_server_timeout = 30 # validate_rsync = false [swift-constraints] # The functional test runner will try to use the constraint values provided in # the swift-constraints section of test.conf. # # If a constraint value does not exist in that section, or because the # swift-constraints section does not exist, the constraints values found in # the /info API call (if successful) will be used. # # If a constraint value cannot be found in the /info results, either because # the /info API call failed, or a value is not present, the constraint value # used will fall back to those loaded by the constraints module at time of # import (which will attempt to load /etc/swift/swift.conf, see the # swift.common.constraints module for more information). # # Note that the cluster must have "sane" values for the test suite to pass # (for some definition of sane). # #max_file_size =<PHONE_NUMBER> #max_meta_name_length = 128 #max_meta_value_length = 256 #max_meta_count = 90 #max_meta_overall_size = 4096 #max_header_size = 8192 #extra_header_count = 0 #max_object_name_length = 1024 #container_listing_limit = 10000 #account_listing_limit = 10000 #max_account_name_length = 256 #max_container_name_length = 256 # Newer swift versions default to strict cors mode, but older ones were the # opposite. #strict_cors_mode = trueAdd an environment variable for running tests below:
echo "export SWIFT_TEST_CONFIG_FILE=/etc/swift/test.conf" >> $HOME/.bashrcBe sure that your
PATH
includes thebin
directory:echo "export PATH=${PATH}:$HOME/bin" >> $HOME/.bashrcSource the above environment variables into your current environment:
. $HOME/.bashrcConstruct the initial rings using the provided script:
remakerings
The
remakerings
script looks like the following:#!/bin/bash set -e cd /etc/swift rm -f *.builder *.ring.gz backups/*.builder backups/*.ring.gz swift-ring-builder object.builder create 10 3 1 swift-ring-builder object.builder add r1z1-<IP_ADDRESS>:6010/sdb1 1 swift-ring-builder object.builder add r1z2-<IP_ADDRESS>:6020/sdb2 1 swift-ring-builder object.builder add r1z3-<IP_ADDRESS>:6030/sdb3 1 swift-ring-builder object.builder add r1z4-<IP_ADDRESS>:6040/sdb4 1 swift-ring-builder object.builder rebalance swift-ring-builder object-1.builder create 10 2 1 swift-ring-builder object-1.builder add r1z1-<IP_ADDRESS>:6010/sdb1 1 swift-ring-builder object-1.builder add r1z2-<IP_ADDRESS>:6020/sdb2 1 swift-ring-builder object-1.builder add r1z3-<IP_ADDRESS>:6030/sdb3 1 swift-ring-builder object-1.builder add r1z4-<IP_ADDRESS>:6040/sdb4 1 swift-ring-builder object-1.builder rebalance swift-ring-builder object-2.builder create 10 6 1 swift-ring-builder object-2.builder add r1z1-<IP_ADDRESS>:6010/sdb1 1 swift-ring-builder object-2.builder add r1z1-<IP_ADDRESS>:6010/sdb5 1 swift-ring-builder object-2.builder add r1z2-<IP_ADDRESS>:6020/sdb2 1 swift-ring-builder object-2.builder add r1z2-<IP_ADDRESS>:6020/sdb6 1 swift-ring-builder object-2.builder add r1z3-<IP_ADDRESS>:6030/sdb3 1 swift-ring-builder object-2.builder add r1z3-<IP_ADDRESS>:6030/sdb7 1 swift-ring-builder object-2.builder add r1z4-<IP_ADDRESS>:6040/sdb4 1 swift-ring-builder object-2.builder add r1z4-<IP_ADDRESS>:6040/sdb8 1 swift-ring-builder object-2.builder rebalance swift-ring-builder container.builder create 10 3 1 swift-ring-builder container.builder add r1z1-<IP_ADDRESS>:6011/sdb1 1 swift-ring-builder container.builder add r1z2-<IP_ADDRESS>:6021/sdb2 1 swift-ring-builder container.builder add r1z3-<IP_ADDRESS>:6031/sdb3 1 swift-ring-builder container.builder add r1z4-<IP_ADDRESS>:6041/sdb4 1 swift-ring-builder container.builder rebalance swift-ring-builder account.builder create 10 3 1 swift-ring-builder account.builder add r1z1-<IP_ADDRESS>:6012/sdb1 1 swift-ring-builder account.builder add r1z2-<IP_ADDRESS>:6022/sdb2 1 swift-ring-builder account.builder add r1z3-<IP_ADDRESS>:6032/sdb3 1 swift-ring-builder account.builder add r1z4-<IP_ADDRESS>:6042/sdb4 1 swift-ring-builder account.builder rebalanceYou can expect the output from this command to produce the following. Note that 3 object rings are created in order to test storage policies and EC in the SAIO environment. The EC ring is the only one with all 8 devices. There are also two replication rings, one for 3x replication and another for 2x replication, but those rings only use 4 devices:
Device d0r1z1-<IP_ADDRESS>:6010R<IP_ADDRESS>:6010/sdb1_"" with 1.0 weight got id 0 Device d1r1z2-<IP_ADDRESS>:6020R<IP_ADDRESS>:6020/sdb2_"" with 1.0 weight got id 1 Device d2r1z3-<IP_ADDRESS>:6030R<IP_ADDRESS>:6030/sdb3_"" with 1.0 weight got id 2 Device d3r1z4-<IP_ADDRESS>:6040R<IP_ADDRESS>:6040/sdb4_"" with 1.0 weight got id 3 Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 Device d0r1z1-<IP_ADDRESS>:6010R<IP_ADDRESS>:6010/sdb1_"" with 1.0 weight got id 0 Device d1r1z2-<IP_ADDRESS>:6020R<IP_ADDRESS>:6020/sdb2_"" with 1.0 weight got id 1 Device d2r1z3-<IP_ADDRESS>:6030R<IP_ADDRESS>:6030/sdb3_"" with 1.0 weight got id 2 Device d3r1z4-<IP_ADDRESS>:6040R<IP_ADDRESS>:6040/sdb4_"" with 1.0 weight got id 3 Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 Device d0r1z1-<IP_ADDRESS>:6010R<IP_ADDRESS>:6010/sdb1_"" with 1.0 weight got id 0 Device d1r1z1-<IP_ADDRESS>:6010R<IP_ADDRESS>:6010/sdb5_"" with 1.0 weight got id 1 Device d2r1z2-<IP_ADDRESS>:6020R<IP_ADDRESS>:6020/sdb2_"" with 1.0 weight got id 2 Device d3r1z2-<IP_ADDRESS>:6020R<IP_ADDRESS>:6020/sdb6_"" with 1.0 weight got id 3 Device d4r1z3-<IP_ADDRESS>:6030R<IP_ADDRESS>:6030/sdb3_"" with 1.0 weight got id 4 Device d5r1z3-<IP_ADDRESS>:6030R<IP_ADDRESS>:6030/sdb7_"" with 1.0 weight got id 5 Device d6r1z4-<IP_ADDRESS>:6040R<IP_ADDRESS>:6040/sdb4_"" with 1.0 weight got id 6 Device d7r1z4-<IP_ADDRESS>:6040R<IP_ADDRESS>:6040/sdb8_"" with 1.0 weight got id 7 Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 Device d0r1z1-<IP_ADDRESS>:6011R<IP_ADDRESS>:6011/sdb1_"" with 1.0 weight got id 0 Device d1r1z2-<IP_ADDRESS>:6021R<IP_ADDRESS>:6021/sdb2_"" with 1.0 weight got id 1 Device d2r1z3-<IP_ADDRESS>:6031R<IP_ADDRESS>:6031/sdb3_"" with 1.0 weight got id 2 Device d3r1z4-<IP_ADDRESS>:6041R<IP_ADDRESS>:6041/sdb4_"" with 1.0 weight got id 3 Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00 Device d0r1z1-<IP_ADDRESS>:6012R<IP_ADDRESS>:6012/sdb1_"" with 1.0 weight got id 0 Device d1r1z2-<IP_ADDRESS>:6022R<IP_ADDRESS>:6022/sdb2_"" with 1.0 weight got id 1 Device d2r1z3-<IP_ADDRESS>:6032R<IP_ADDRESS>:6032/sdb3_"" with 1.0 weight got id 2 Device d3r1z4-<IP_ADDRESS>:6042R<IP_ADDRESS>:6042/sdb4_"" with 1.0 weight got id 3 Reassigned 1024 (100.00%) partitions. Balance is now 0.00. Dispersion is now 0.00Read more about Storage Policies and your SAIO Adding Storage Policies to an Existing SAIO
Verify the unit tests run:
$HOME/swift/.unittestsNote that the unit tests do not require any swift daemons running.
Start the “main” Swift daemon processes (proxy, account, container, and object):
startmain
(The “
Unable to increase file descriptor limit. Running as non-root?
” warnings are expected and ok.)The
startmain
script looks like the following:#!/bin/bash set -e swift-init main startGet an
X-Storage-Url
andX-Auth-Token
:curl -v -H 'X-Storage-User: test:tester' -H 'X-Storage-Pass: testing' http://<IP_ADDRESS>:8080/auth/v1.0Check that you can
GET
account:curl -v -H 'X-Auth-Token: <token-from-x-auth-token-above>' <url-from-x-storage-url-above>Check that
swift
command provided by the python-swiftclient package works:swift -A http://<IP_ADDRESS>:8080/auth/v1.0 -U test:tester -K testing statVerify the functional tests run:
$HOME/swift/.functests(Note: functional tests will first delete everything in the configured accounts.)
Verify the probe tests run:
$HOME/swift/.probetests(Note: probe tests will reset your environment as they call
resetswift
for each test.)
Debugging Issues¶
If all doesn’t go as planned, and tests fail, or you can’t auth, or something doesn’t work, here are some good starting places to look for issues:
- Everything is logged using system facilities – usually in
/var/log/syslog
, but possibly in/var/log/messages
on e.g. Fedora – so that is a good first place to look for errors (most likely python tracebacks). - Make sure all of the server processes are running. For the base functionality, the Proxy, Account, Container, and Object servers should be running.
- If one of the servers are not running, and no errors are logged to syslog,
it may be useful to try to start the server manually, for example:
swift-object-server /etc/swift/object-server/1.conf
will start the object server. If there are problems not showing up in syslog, then you will likely see the traceback on startup. - If you need to, you can turn off syslog for unit tests. This can be
useful for environments where
/dev/log
is unavailable, or which cannot rate limit (unit tests generate a lot of logs very quickly). Open the fileSWIFT_TEST_CONFIG_FILE
points to, and change the value offake_syslog
toTrue
. - If you encounter a
401 Unauthorized
when following Step 12 where you check that you canGET
account, usesudo service memcached status
and check if memcache is running. If memcache is not running, start it usingsudo service memcached start
. Once memcache is running, rerunGET
account.
Known Issues¶
Listed here are some “gotcha’s” that you may run into when using or testing your SAIO:
- fallocate_reserve - in most cases a SAIO doesn’t have a very large XFS partition so having fallocate enabled and fallocate_reserve set can cause issues, specifically when trying to run the functional tests. For this reason fallocate has been turned off on the object-servers in the SAIO. If you want to play with the fallocate_reserve settings then know that functional tests will fail unless you change the max_file_size constraint to something more reasonable then the default (5G). Ideally you’d make it 1/4 of your XFS file system size so the tests can pass.


Tl;dr
Single indicator occasionally gives trustworthy signals. Reading many indicators at the same time, however, maybe overwhelming. Understanding this, at bitcoinindicated.com, we combine all famous technical analyses into one metric and save you some time! Of course, you can still click on Individual Analyses to see single indicators that we use.
As of :
- Score is


@* * Copyright 2010-2017 Artima, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @(selectedStyle: examples.StyleTraitExamples) @import controllers.Application.milestoneScaladoc
"sequences"
import org.scalatest.Matchers._ // Check if a List (or any GenTraversable) List(1, 2, 2, 3, 3, 3) should contain inOrderOnly (1, 2, 3) // contains only the specified elements in same // order Array(1, 2, 2, 3, 3, 3) should contain inOrderOnly (1, 2, 3) // Check if an Array contains only the specified // elements in same order "122333" should contain inOrderOnly ('1', '2', '3') // Check if a String contains only the specified // characters in same order List(0, 1, 2, 2, 99, 3, 3, 3, 5) should contain inOrder (1, 2, 3) // Check if a List (or any GenTraversable) // contains the specified elements in same order List(1, 2, 3) should contain theSameElementsInOrderAs Vector(1, 2, 3) // Check if a List (or any GenTraversable) // contains the same elements in same order as the // specified Vector (or any GenTraversable)


Based on commute times and lifestyle criteria for all sharers or family members
Begin SearchCollaborating with your loved ones in real-time, for quicker decision-making
Begin SearchFrom evaluating your needs to negotiating the best deal and assistance with settling-in
Users
Rating
Net promoter
score
Average saving using
Sherpa Service
Total rental value
for tenants
Once called 'bedsit land' due to its popularity amongst students, today's Earl's Court is home to young and ambitious city workers.

More Sherpa tips


Originally created for the 2019/09/09 Touhou 9 Jam, using HTML + Javascript.
Cirno bullied the frogs for too long and ran out of magic power. Now she needs to collect magic stars so she can fight back before they corner her! Freeze 25 frogs to show them who's strongest in Gensokyo.
This is a fan work of the Touhou Project and is not associated with the original creators.
Font: Pixellari by Zacchary Dempsey-Plante.


SCTP_PEELOFF
NAME
sctp_peeloff - detach an association from a one-to-many socket to its own fdLIBRARY
sctpsp.dll (sctpsp.lib)SYNOPSIS
#include <winsock2.h>#include <ws2tcpip.h>
#include <ws2sctp.h>
int
sctp_peeloff(int s, sctp_assoc_t id);
DESCRIPTION
The sctp_peeloff() system call attempts detach the association specified by id into its own seperate socket.RETURN VALUES
The call returns -1 on failure and the new socket descriptor upon success.ERRORS
The sctp_peeloff() system call can return the following errors:- [WSAENOTCONN]
- The id given to the call does not map to a valid association.
- [WSAEFAULT]
- The size of the address list exceeds the amount of data provided.
- [WSAEBADF]
- The argument s is not a valid descriptor.
- [WSAENOTSOCK]
- The argument s is not a socket.
SEE ALSO
sctp(4)Time: 11:22:30 GMT, January 31, 2010
Adapted for SctpDrv from the FreeBSD manual page sctp_peeloff(2)
Legal Notices | © 1995-2010 The FreeBSD Project. All rights reserved.


editor
Preview:
Show collision
Hide grid
Show shadows
Generate
Columns:
Rows:
Ceilings:
Walls:
Floors:
Entities:
Func's:
Cursors:
Behavior Pads:
Interior Kits:
Normal
Panic


Blood in stool
These diseases and conditions match at least one of the factors you selected. Those with the most matches are listed first.
Anal fissuresee associated factors
Blood appears in or on the stool
Blood appears in toilet bowl or on toilet tissue
Triggered or worsened by straining during bowel movements
Accompanied by painful bowel movements
Colon cancersee associated factors
Blood appears in or on the stool
Accompanied by change in bowel habits that lasts longer than four weeks
Accompanied by constipation
Accompanied by diarrhea
Accompanied by fatigue or weakness
Accompanied by narrow stools
Accompanied by nausea or vomiting
Accompanied by painful bowel movements
Accompanied by persistent abdominal discomfort, such as cramps, gas or pain
Accompanied by unintended weight loss


Salman Khan's Reaction To Ajay Devgn's Tanhaji Trailer Will Leave You In Splits
by Radhika SarkarBollywood News
Salman Khan recently took to social media and had a hilarious response to friend and Bollywood co-star Ajay Devgn's Tanhaji: The Unsung Warrior trailer.
Written By Radhika Sarkar | Mumbai | Updated On: November 20, 2019 13:53 IST
Salman Khan recently took to social media and had a hilarious response to friend and Bollywood co-star Ajay Devgn's Tanhaji trailer. Sharing the trailer, he wrote, "Tanhaji manaji. Ajay Vijay bhava Vijay bhava Vijay bhava . . . @ajaydevgn.". His tweet left many netizens chuckling. In the film, Ajay Devgn will be essaying the role of Tanaji Malusare in the film. On the other hand, Saif Ali Khan will be playing a negative role in the film. It is produced under Ajay Devgn's home production and T-series banner. Directed by Om Raut, Tanhaji: The Unsung Warrior will release on January 10, 2020. Take a look below-
READ: Salman Khan, Amitabh Bachchan, And Other Bollywood Stars Who Own Houses In Mumbai
Salman's reaction to Tanhaji trailer
Meanwhile, The trailer of the film does pack a punch with its strong dialogues and killer performances by each one but disappoints with regards to the visual effects. The intense action scenes and background score sure lifts up the overall vibe. Directed by Om Raut, the film is produced by Devgn's ADFL and Bhushan Kumar's T-Series. The movie will hit the big screen on January 10, 2020.
READ: Salman Khan Films Gives Dabangg 3 'Badge Of Honour' On International Men's Day
Watch it below-
The actor will next be seen in:
Ajay Devgn will next be seen in the film Maidaan will reportedly be releasing in Hindi, Tamil, and Malayalam languages. According to a report by a leading daily, the director of the film, Amit Sharma of Badhaai Ho fame wishes to familiarise the audience with the legendary coach who had heralded the golden years of Indian football. The film Tanhaji: The Unsung Warrior is helmed by Om Raut. It will be hitting the screens on January 10, 2019.
READ: Bigg Boss 13: Salman Khan Sparks Quitting Rumours, Says I've Had Enough
READ: Salman Khan Starrer Dabangg 3's Makers Share The Actor's On-set Antics
Get the latest entertainment news from India & around the world. Now follow your favourite television celebs and telly updates. Republic World is your one-stop destination for trending Bollywood news. Tune in today to stay updated with all the latest news and headlines from the world of entertainment.


Bride uses bouquet toss at wedding to help her brother propose to his girlfriend
by Alexandra DeablerLuckily she said yes.
A wedding came to a halt during the bouquet toss when, instead of throwing the flowers as is traditional, the bride turned around and calmly walked over to her brother’s girlfriend and handed them to her directly. The guest then turned around where she was met with the sight of her boyfriend down on one knee.
The woman, clearly shocked, says yes to the applause and cheers of other wedding guests at the reception.
BRIDE SURPRISED WITH CHICKEN-NUGGET BOUQUET AT OHIO WEDDING
According to a family member on Twitter, the bride conspired with her brother for the surprise proposal and came up with the idea to hand the bouquet to his girlfriend during the planned bouquet toss.
The sweet moment, that took place Saturday at the Grimes County Fairfrounds in Navasota, Texas, went viral shortly after, pulling in over 4 million views since it was posted last week.
“A lil proposal to get everybody happy and excited again is cute,” one person commented.
CLICK HERE TO GET THE FOX NEWS APP
Though not everyone was pleased with the scenario.
CLICK HERE TO SIGN UP FOR OUR LIFESTYLE NEWSLETTER
FOLLOW US ON FACEBOOK FOR MORE FOX LIFESTYLE NEWS
Fortunately, the bride was more than happy to share her special day and the group appeared the savor the heartwarming moment.


{{ .Title }} Product Product profile Expectations Objectives and Key Results Interoperability Digital Health Terminology Facet Digital Health IT Standards Facet Security Digital Health Interoperability Evaluation Facet - Privacy guidelines


There is a good section about interaction with assetchains
3
VoskCoin17-Apr-19 07:18 PM
@mrlynch my stance was in general a fully fleshed out tutorials (overall) are best -- proof? My entire culmination of work over the last 2 years https://www.youtube.com/voskcoin
not to be confused with @Greer opinion on the matter(edited)
VoskCoin is the best source of cryptocurrency news, reviews, and tutorials. VoskCoin reviews popular cryptocurrencies such as Bitcoin and Ethereum as well as...
a complete write-up does not equal spoon feeding
ah was catching up and @jl777c said lets move on but I just stirred the pot lol
incoming `ban`
1
1
I was talking to Luxor today about their current pools and asked about pirate, he said he was contemplating it and said if he added pirate he wanted to add KMD too because he likes KMD and asked if I could get him in touch with ARRR/KMD devs so I started a group chat with @FishyGuts and the 3 Luxor tech team members
Now Nick@ luxor is planning to or already has reached out to @ComputerGenie 👴👴👴 because he was the one who created pirate solo, I didn't do this for this "campaign" and I don't care if we lose
However I wanted to share a very real result of basically my goals and potential value of expanding the KMD ecosystem whether its with a lot of small victories or also larger ones down the road. I believe everyone would agree a professional mining pool (which also sports a new payout scheme to the coins PPS) is always a welcome addition, especially for multiple KMD coins -- whats next maybe they'll add a veruscoin pool for @miketout
The value proposition of my NN campaign could be explained in the example above, so contrary to @Alright criticism I believe I have one of the most unique proposals that aims to add value in a way that is not heavily focused on currently or historically.
1
1
jl777c17-Apr-19 07:27 PM
yes as long as your tech can deliver, it is an attractive candidacy
1
1
i expect as KMD price goes up more, we will start seeing more such hybrid candidates and that is all part of the growing process
VoskCoin17-Apr-19 07:28 PM
& for the record I didn't do this just because we are running for a NN, this is just the product of working full-time in this and learning about projects that you see true merit in and looking forward to them making progress and helping where you can
even right now pirate is beating ZEC on a recent twitter poll I posted, all the small victories add up and that is how the current giants are toppled
Lets run a poll  do you want to see @zcashco earnings @mineZcash with the Antminer Z11 (equihash ASIC miner) or @PirateChain @piratechainuk earnings w/ this miner #Zcash #ZEC #Piratechain #ARRR Zvs
I'm confident our team and extended community can deliver @jl777c if we cant I will delete my channel
2
1
ComputerGenie 👴👴👴17-Apr-19 07:31 PM
I believe everyone would agree a professional mining pool (which also sports a new payout scheme to the coins PPS) is always a welcome addition, especially for multiple KMD coins isn't sure if he should be supportive of or insulted by the wording of that
1
VoskCoin17-Apr-19 07:33 PM
that's not an insult or anything, but adding partners that put an LLC behind their op. only adds value to a project overall -- doesnt mean there is not room and should not be other alternatives https://www.luxor.tech/company reference
Luxor Mining is a cryptocurrency pool built for advanced miners. Whether you're an industrial mining operation, or a first time hobby miner, we provide the highest quality mining experience.
TonyL17-Apr-19 07:59 PM
Hmm 54% of current votes are in EU. Just wondering why such rumble in this region especially? Notarizations/rewards amount stats for the last season seems to be ~consistaint across all regions
Strob17-Apr-19 08:01 PM
Congrats @Greer (& @VoskCoin ) your node is second for the last 6 hours! https://imgur.com/LLo4PW6(edited)
ComputerGenie 👴👴👴17-Apr-19 08:21 PM
isn't on page 1 anymore because no one is sharing their secrets with him
5
jl777c17-Apr-19 08:22 PM
barriers are up!
2
3
Greer17-Apr-19 08:22 PM
@Strob redirected some effort while I work on the containerization
mrlynch17-Apr-19 08:29 PM
@VoskCoin i have nothing against your candidacy, nor did i refute your work.. hell, you're the reason i'm here (through pirate) ... my main concern was/is tech-wise... i said what i had to say
goes back to his py cave
PHBA206117-Apr-19 08:31 PM
on #1 of all 4 time span but doesn't really have any secret(edited)
2
zatJUM17-Apr-19 08:33 PM
Always #15 in general
Stable node
Strob17-Apr-19 08:34 PM
But #1 in the vote rich list!
3
1
zatJUM17-Apr-19 08:36 PM
CHMEX is coming close...
mrlynch17-Apr-19 08:36 PM
time komodo-cli listunspent > /dev/null
real 0m0.005s
user 0m0.000s
sys 0m0.000s
1
if only i hadn't borked my node 2 days ago <- upside to that is that i learned something really good
How can you have a wallet so lite with all the dust we received (even consolidated)?
mrlynch17-Apr-19 08:45 PM
ain't sharing secrets (edited)
jokes aside... when your wallet gets old, stained and heavy you replace it with a new one don't ya?
key is having a 2nd node with funds at the ready and only have enough funds in your nn to notarize successfully and maybe an alert that tells the 2nd node somehow "hey dad, i'm running low, can you send me some money please? promise i won't spend it on booze & hookers"
@VoskCoin nice speech, glad to hear what you want to achieve
Alexfrog17-Apr-19 08:55 PM
why so many EU votes and so few elsewhere
Cryptoon17-Apr-19 08:55 PM
EU best continent
Deleted User17-Apr-19 08:55 PM
yeah, why xD
Cryptoon17-Apr-19 08:55 PM
Obviously
Well not really a continent I guess
Deleted User17-Apr-19 08:56 PM
btw it s been days I sit on my speech and can t use it cause...
noone seem to advertise xD
zatJUM17-Apr-19 09:01 PM
I can do it now if you want! Which channel? Let's do it now!
Deleted User17-Apr-19 09:02 PM
general is for ballzy
but 3 days dming myself on a private chan is not the best way :D
phm8717-Apr-19 09:07 PM
A few hours ago, someone said on this channel that there are double notas on testnet on BEER and that there is 2 revmasks that don't see each other. Can it happen on mainet of NN ? Can it be a risk ? (in case that some NN are not on the same chain for one AC)
Deleted User17-Apr-19 09:14 PM
it can and it did
iirc it was for OUR
but as we controlled the nodes notarizing as the switch was during a common effort
PHBA206117-Apr-19 09:14 PM
I was thinking about that and this is my conclusion, please correct me if I'm wrong :
On mainnet there are 64 NN & minsigs is 13, which means only 13 NN are required to sign a nota transaction. So worst case scenario, if 64 NN are separated into 4 groups (each group has 13 NN at least and they don't see each other), theoretically we could see quadruple notas. It is not a risk as long as all NN are on the same chain, the only thing is they spend 4 times as much as required.
Please correct me if I'm wrong(edited)
Deleted User17-Apr-19 09:14 PM
it had no consequences
Deleted User17-Apr-19 09:30 PM
I m bored to handle dust as I just consider that ok, it s obvious and annoying, just find another trick, so this is just what I imagined to test something that for me is untested
i hate untested things, and want to discover anything where I just can t reply frankly
but people considering stats maybe like a campain advantage
this could also lead to frustration to do it stealth
so yeah, if I manage to get the time, I d like to test this before the testnet is down
mrlynch17-Apr-19 09:33 PM
i'd like you to test it as well
phm8717-Apr-19 09:33 PM
me too
I have also few things to test but it should not work on dpow
Deleted User17-Apr-19 09:34 PM
I don t want to test dpow
I want to break dpow
phm8717-Apr-19 09:34 PM
I agree
Deleted User17-Apr-19 09:34 PM
double nota is nothing
add hashrate and attack a worthless coin, and jam the other nodes
that was my plan
but it needs a lot of preparation
phm8717-Apr-19 09:36 PM
I have 2 gpu to help you and I know a guy who is using NH a lot


Google
Advanced Search
Find pages with..
all these words:
this exact word or phrase:
any of these words:
none of these words:


20.2. Formatting Texttemplate <class BidIt, class Alloc> template <class OutIt> OutIt match_results <BidIt, Alloc>::format ( OutIt out , const string_type & fmt, match_flag_type flags = format_default) const; template < class BidIt, class Alloc> string_type match_results <BidIt, Alloc>::format ( const string_type & fmt, match_flag_type flags = format_default) const;
We saw the second version of format in one of the examples in the previous section, in the line string letter = match . format (formletter); That call used the default flags. To pass a string that uses the sed format escapes instead of the ECMAScript escapes, pass the flag format_sed as the second argument: string letter = match. format (formletter , format_sed); The first version of format is more flexible. It takes an output iterator as the target for the output sequence and returns an iterator that points just past the end of the formatted text. The returned iterator can then be used as the target of further assignments, which will append text to the output sequence that format produced.[3]
Example 20.4. Using the Returned Iterator (regexform/returned.cpp)
|


Match Play. Double Match Point. How should Red play 21?
pips Red=51 White=113
(CorrectAnswer= 0/0, ErrorScore= 0)
To hit or not to hit?
If Red hits White will stay on the bar 25% of the time and then Red will have a chance to escape. If Red does not hit, then he will be attacked with pretty much any number that hits and then Red will need two numbers to escape (enter then escape).
Red does better to take his chances given with the first scenario. If he hits and White rolls an ace, then Red might anchor and win from there.
Overall Red increase his winning chances by 3% if he hits.
If Red hits White will stay on the bar 25% of the time and then Red will have a chance to escape. If Red does not hit, then he will be attacked with pretty much any number that hits and then Red will need two numbers to escape (enter then escape).
Red does better to take his chances given with the first scenario. If he hits and White rolls an ace, then Red might anchor and win from there.
Overall Red increase his winning chances by 3% if he hits.
1. Cubeful 2-ply bar/23 2/1* Eq.: -0.351 0.324 0.112 0.004 - 0.676 0.000 0.000 2. Cubeful 2-ply bar/23 4/3 Eq.: -0.434 (-0.083) 0.283 0.082 0.005 - 0.717 0.000 0.000 3. Cubeful 0-ply bar/24 4/2 Eq.: -0.509 (-0.158) 0.246 0.028 0.002 - 0.754 0.000 0.000 4. Cubeful 0-ply bar/24 3/1* Eq.: -0.580 (-0.229) 0.210 0.020 0.000 - 0.790 0.000 0.000 5. Cubeful 0-ply bar/23 3/2 Eq.: -0.648 (-0.297) 0.176 0.038 0.002 - 0.824 0.000 0.000


Examples » OpenLayers integration
Integrating with OpenLayers layer switch. Your server needs to be running for this example.


About page
This page is a special web page where our visitors can learn more about us and the application


First month with the new 15-inch Macbook Pro (2016)
February 26, 2017
It’s been almost a month since I bought my new Macbook Pro. So far, I’m liking it, though I do have few small issues with it.
Specs: 2.9 GHz i7 processor, 16GB RAM, 4GB video card, 1TB hard drive.
Like
- TouchId is fast and secure. Works like magic.
- Display is noticeably brighter and has richer color spectrum.
- Keyboard is loud but I love the sound. Much more clicky and feels like it has better feedback.
- Trackpad comes in handy when I do a lot of gestures across the screen like taking screenshots or dragging paths in Sketch.
- In addition, I think Space Gray looks great and I love that the machine is lighter too.
Dislike
- Performance doesn’t appear significantly better in comparison with the old Macbook Pro. While some things such as boot time are faster, the machine doesn’t feel any faster than my previous Macbook that has almost the same specs.
- Gets hot. I’m a procrastinator and at any given time I have anywhere from 40-∞ tabs open depending on how many projects I work on simultaneously. My old Macbook would rarely get hot to the point where I’d feel it with my hands, but the new Macbook gets there faster. Right now I have around 50 tabs open and it’s already warm. I haven’t even opened Sketch yet.
- Touch bar takes time to get used to. Some controls will seem unintuitive at first but you’ll be alright after a while. Eventually it enables you to do more than a regular keyboard, but the price you pay is the time it takes to get used to the new features.
That being said, I don’t use ports much so I didn’t really feel any discomfort in that area.All I need is an SD card to USB–C and a USB 3 to USB–C dongles which are pretty easy to get. Will update this post if I notice anything weird.
This Macbook definitely feels like an improvement, but it’s not pushing the boundaries like it used to.


The Big Woods data come from three censuses of a 23 ha forest research plots. All free-standing vegetation greater than 1 cm diameter at 1.3 m height (diameter at breast height; DBH) were tagged, identified, spatially mapped and had their DBH measured. The original census took place in 2003 and covered only 12 ha. A second census took place from 2008-2010 and expanded the plot to its current 23 ha. In the first and second censuses trees larger than 3.1 cm DBH were included. Finally a third census took place in 2014. In this census trees larger than 1 cm DBH were included. In the second and third censuses the original trees were found, recorded for survival, remeasured, and new individuals were tagged. This data frame has data from the third census (2014).
census_2014_bw
A data frame with 48371 rows and 8 variables:
Tree identification number. This identifies an individual tree and can be used to connect trees between the two censuses.
Stem number for a multi-stemmed individual. For all trees this starts
at 1 and continues up from there. To uniquely identify a stem across the plot this
value must be combined with treeID
.
Code for the species. See species_bw
for scientific name.
Diameter at breast
x-coordinate meters from reference point
y-coordinate meters from reference point
Approximate date the stem was measured
Code for additional information on the stem: M means the main stem of the individual tree; AL means the stem is alive but leaning or completely fallen over; B means the stem is broken and over half the canopy is assumed to be missing; and R means the stem was lost, but the tag was moved to another stem greater than DBH cutoff, this stands for resprout.
This plot is part of the Smithsonian Institution's Forest Global Earth Observatory (ForestGEO) global network of forest research sites. For complete details on this dataset see its Deep Blue Data repository page.
Other Big Woods data:
census_2008_bw
,
species_bw
,
study_region_bw
Other example data objects:
blocks_ex
,
census_1_ex
,
census_2008_bw
,
census_2_ex
,
comp_bayes_lm_ex
,
focal_vs_comp_ex
,
growth_ex
,
growth_spatial_ex
,
growth_toy
,
species_bw
,
study_region_bw
,
study_region_ex
library(ggplot2) library(sf) library(dplyr) # Convert all 2008 plot stems to sf object census_2008_bw_sf <- census_2008_bw %>% st_as_sf(coords = c("gx", "gy")) # Plot stems with plot boundary ggplot() + geom_sf(data = census_2008_bw_sf, size = 0.25)# Species-specific mortality between 2008 and 2014 censuses census_2008_bw %>% left_join(census_2014_bw, by = c("treeID", "stemID"), suffix = c("_2008", "_2014")) %>% mutate(mortality = ifelse(is.na(dbh_2014), 1, 0)) %>% group_by(sp_2008) %>% summarize(mortality = mean(mortality), n = n()) %>% arrange(desc(n))#> # A tibble: 36 × 3 #> sp_2008 mortality n #> <chr> <dbl> <int> #> 1 black_cherry 0.203 9079 #> 2 red_maple 0.112 5958 #> 3 witch_hazel 0.239 3481 #> 4 serviceberry 0.122 1506 #> 5 white_oak 0.0771 1180 #> 6 black_oak 0.203 1171 #> 7 pignut_hickory 0.0346 1128 #> 8 sassafras 0.316 735 #> 9 american_elm 0.0880 591 #> 10 black_red_oak_hybrid 0 536 #> # … with 26 more rows


UAAction Class Reference
| Inherits from | NSObject |
| Declared in | UAAction.h |
Overview
Base class for actions, which define a modular unit of work.
A block defining a monadic lift operation on the predicate block
Tasks
Other Methods
-
– acceptsArguments:
-
– willPerformWithArguments:
-
– didPerformWithArguments:withResult:
-
– performWithArguments:completionHandler:
-
+ actionWithBlock:
-
+ actionWithBlock:acceptingArguments:
Operators Methods
Class Methods
actionWithBlock:
Factory method for creating anonymous actions
+ (instancetype)actionWithBlock:(UAActionBlock)actionBlock
Parameters
- actionBlock
A UAActionBlock representing the primary work performed by the action.
Declared In
UAAction.h
actionWithBlock:acceptingArguments:
Factory method for creating anonymous actions
+ (instancetype)actionWithBlock:(UAActionBlock)actionBlock acceptingArguments:(nullable UAActionPredicate)predicateBlock
Parameters
- actionBlock
A UAActionBlock representing the primary work performed by the action.
- predicateBlock
A UAActionPredicate limiting the scope of the arguments.
Declared In
UAAction.h
Instance Methods
acceptsArguments:
Called before an action is performed to determine if the the action can accept the arguments.
- (BOOL)acceptsArguments:(UAActionArguments *)arguments
Parameters
- arguments
A UAActionArguments value representing the arguments passed to the action.
Return Value
YES if the action can perform with the arguments, otherwise NO
Discussion
This method can be used both to verify that an argument’s value is an appropriate type, as well as to limit the scope of execution of a desired range of values. Rejecting arguments will result in the action not being performed when it is run.
Declared In
UAAction.h
bind:
Operator for creating a monadic binding.
- (UAAction *)bind:(UAActionBindBlock)bindBlock
Parameters
- bindBlock
A UAActionBindBlock
Return Value
A new UAAction wrapping the receiver and binding the passed block.
Declared In
UAAction+Operators.h
continueWith:
Operator for chaining two actions together in sequence.
- (UAAction *)continueWith:(UAAction *)continuationAction
Parameters
- continuationAction
A UAAction to be executed as the continuation of the receiver.
Return Value
A new UAAction wrapping the receiver and the continuationAction, which chains the two together when run.
Discussion
When run, if the receiver executes normally, the result will be passed in the arguments to the supplied continuation action, whose result will be passed in the completion handler as the final result.
Otherwise if the receiver action rejects its arguments or encounters an error, the continuation will finish early and the receiver’s result will be passed in the completion handler.
The result of the aggregate action is the result of the second action.
Declared In
UAAction+Operators.h
didPerformWithArguments:withResult:
Called after the action has performed, before its final completion handler is called.
- (void)didPerformWithArguments:(UAActionArguments *)arguments withResult:(UAActionResult *)result
Parameters
- arguments
A UAActionArguments value representing the arguments passed to the action.
- result
A UAActionResult from performing the action.
Discussion
This method can be used to define optional teardown or post-execution logic.
Declared In
UAAction.h
filter:
Operator for limiting the scope of an action with a predicate block.
- (UAAction *)filter:(UAActionPredicate)filterBlock
Parameters
- filterBlock
A UAActionPredicate block.
Return Value
A new UAAction wrapping the receiver and applying the supplied filterBlock to its argument validation logic.
Discussion
This operator serves the same purpose as the [UAAction acceptsArguments:] method, but can be used to customize an action ad-hoc without deriving a subclass.
Declared In
UAAction+Operators.h
lift:
Operator for lifting a block transforming an action block, into a monadic binding.
- (UAAction *)lift:(UAActionLiftBlock)liftBlock
Parameters
- liftBlock
A UAActionLiftBlock
Return Value
A new UAAction wrapping the receiver, which lifts the passed block into a bind operation.
Declared In
UAAction+Operators.h
lift:transformingPredicate:
Operator for lifting a block transforming an action block and predicate, into a monadic binding.
- (UAAction *)lift:(UAActionLiftBlock)actionLiftBlock transformingPredicate:(UAActionPredicateLiftBlock)predicateLiftBlock
Parameters
- actionLiftBlock
A UAActionLiftBlock
- predicateLiftBlock
A UAActionPredicteLiftBlock
Return Value
A new UAAction wrapping the receiver, which lifts the passed blocks into a bind operation.
Declared In
UAAction+Operators.h
map:
Operator for transforming the arguments passed into an action.
- (UAAction *)map:(UAActionMapArgumentsBlock)mapArgumentsBlock
Parameters
- mapArgumentsBlock
A UAActionMapArgumentsBlock
Return Value
A new UAAction wrapping the receiver and applying the supplied mapArgumentsBlock as a transformation on the arguments.
Declared In
UAAction+Operators.h
performWithArguments:completionHandler:
Performs the action.
- (void)performWithArguments:(UAActionArguments *)arguments completionHandler:(UAActionCompletionHandler)completionHandler
Parameters
- arguments
A UAActionArguments value representing the arguments passed to the action.
- completionHandler
A UAActionCompletionHandler that will be called when the action has finished executing.
Discussion
Subclasses of UAAction should override this method to define custom behavior.
Note: You should not ordinarily call this method directly. Instead, use the UAActionRunner
.
Declared In
UAAction.h
postExecution:
Operator for adding additional post-execution logic to an action.
- (UAAction *)postExecution:(UAActionPostExecutionBlock)postExecutionBlock
Parameters
- postExecutionBlock
A UAActionPostExecutionBlock.
Return Value
A new UAAction wrapping the receiver that executes the postExecutionBlock when run, before performing.
Discussion
This operator serves the same purpose as [UAAction didPerformWithArguments:withResult:] but can be used to customize an action ad-hoc without deriving a subclass.
Declared In
UAAction+Operators.h
preExecution:
Operator for adding additional pre-execution logic to an action.
- (UAAction *)preExecution:(UAActionPreExecutionBlock)preExecutionBlock
Parameters
- preExecutionBlock
A UAActionPreExecutionBlock.
Return Value
A new UAAction wrapping the receiver that executes the preExecutionBlock when run, before performing.
Discussion
This operator serves the same purpose as [UAAction willPerformWithArguments:] but can be used to customize an action ad-hoc without deriving a subclass.
Declared In
UAAction+Operators.h
willPerformWithArguments:
Called before the action’s performWithArguments:withCompletionHandler:
- (void)willPerformWithArguments:(UAActionArguments *)arguments
Parameters
- arguments
A UAActionArguments value representing the arguments passed to the action.
Discussion
This method can be used to define optional setup or pre-execution logic.
Declared In
UAAction.h


This is a demo of modifying objects using xoslib. Pick a slice in the list on the left. Then edit any of it's fields on the right, and press the (save) button.


|
Brooklyn | |||||||
| FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | METHOD | DETAIL: FIELD | METHOD |
public interface SubscriptionManager
The management interface for subscriptions. Different implementations will handle entities subscribing and unsubscribing to SensorEvents and their delivery.
| Method Summary | |
|---|---|
java.util.Set
|
getSubscriptionsForEntitySensor(Entity source, Sensor sensor)
Return the subscriptions on a given source-sensor pair |
java.util.Set
|
getSubscriptionsForSubscriber(java.lang.Object subscriber)
Return the subscriptions requested by a given subscriber |
void
|
publish(SensorEvent event)
Deliver a SensorEvent to all subscribed listeners. |
SubscriptionHandle
|
subscribe(java.util.Map flags, Entity producer, Sensor sensor, SensorEventListener listener)
Subscribe to Sensor data changes and events on a given Entity, supplying the SensorEventListener to invoke when they occur. |
SubscriptionHandle
|
subscribe(Entity producer, Sensor sensor, SensorEventListener listener)
@see #subscribe(Map, Entity, Sensor, SensorEventListener) |
SubscriptionHandle
|
subscribeToChildren(java.util.Map flags, Entity parent, Sensor sensor, SensorEventListener listener)
Subscribe to Sensor data changes and events on all children of a given Entity, supplying the SensorEventListener to invoke when they occur. |
SubscriptionHandle
|
subscribeToChildren(Entity parent, Sensor sensor, SensorEventListener listener)
@see #subscribeToChildren(Map, Entity, Sensor, SensorEventListener) |
SubscriptionHandle
|
subscribeToMembers(java.util.Map flags, Group parent, Sensor sensor, SensorEventListener listener)
Subscribe to Sensor data changes and events on all members of a given Group, supplying the SensorEventListener to invoke when they occur. |
SubscriptionHandle
|
subscribeToMembers(Group parent, Sensor sensor, SensorEventListener listener)
@see #subscribeToChildren(Map, Group, Sensor, SensorEventListener) |
boolean
|
unsubscribe(SubscriptionHandle subscriptionId)
Unsubscribe the given subscription id. |
| Method Detail |
|---|
public java.util.Set getSubscriptionsForEntitySensor(Entity source, Sensor sensor)
public java.util.Set getSubscriptionsForSubscriber(java.lang.Object subscriber)
public void publish(SensorEvent event)
public SubscriptionHandle subscribe(java.util.Map flags, Entity producer, Sensor sensor, SensorEventListener listener)
The listener callback is in-order single-threaded and synchronized on this object. The flags parameters can include the following:
flags
- optional parameters to be associated with the subscriptionproducer
- entity to listen to, or null to listen to all entitiessensor
- sensor channel of events to listen to, or null for all sensors from the given producer(s)listener
- callback to invoke when an event occurs
public SubscriptionHandle subscribe(Entity producer, Sensor sensor, SensorEventListener listener)
public SubscriptionHandle subscribeToChildren(java.util.Map flags, Entity parent, Sensor sensor, SensorEventListener listener)
public SubscriptionHandle subscribeToChildren(Entity parent, Sensor sensor, SensorEventListener listener)
public SubscriptionHandle subscribeToMembers(java.util.Map flags, Group parent, Sensor sensor, SensorEventListener listener)
public SubscriptionHandle subscribeToMembers(Group parent, Sensor sensor, SensorEventListener listener)
public boolean unsubscribe(SubscriptionHandle subscriptionId)
Brooklyn Multi-Cloud Application Management Platform
brooklyncentral.github.com. Apache License. © 2012.


SweetFreeStuff.com
///////////////////////////////////////////
Free Sample of Simple Facial Skincare
Posted: 30 Sep 2013 10:05 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/j3pZaulnuRg/?utm_source=feedburner&utm_medium=email
Sign up for your free sample of Simple Facial Skincare from Target.com.
The post Free Sample of Simple Facial Skincare appeared first on
SweetFreeStuff.com.
///////////////////////////////////////////
Free Medium Pumpkin Spice Cappuccino at Quick Chek
Posted: 30 Sep 2013 09:07 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/Hlf7qF3r6ek/?utm_source=feedburner&utm_medium=email
“Like” QuickChek on Facebook to get your coupon for a Free Medium Pumpkin
Spice Cappuccino. Expires 10/7.
The post Free Medium Pumpkin Spice Cappuccino at Quick Chek appeared first
on SweetFreeStuff.com.
///////////////////////////////////////////
Free Skate All Cities “Spelled-Out” Sticker Pack
Posted: 30 Sep 2013 08:12 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/W2Jo9SDLIMM/?utm_source=feedburner&utm_medium=email
You need to follow them on Facebook and Instagram then send them an e-mail
to get a Free Skate All Cities “Spelled-Out” Sticker Pack.
The post Free Skate All Cities “Spelled-Out” Sticker Pack appeared first on
SweetFreeStuff.com.
///////////////////////////////////////////
Free Ice Elements 2 Minute Miracle Gel
Posted: 30 Sep 2013 07:15 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/SU3qdu7J1ho/?utm_source=feedburner&utm_medium=email
Sign up for a Free Ice Elements 2 Minute Miracle Gel Sample.
The post Free Ice Elements 2 Minute Miracle Gel appeared first on
SweetFreeStuff.com.
///////////////////////////////////////////
One Free Piece of Kids Clothing at Sears Outlet Stores on 10/1
Posted: 30 Sep 2013 06:26 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/d4AbDBalbVE/?utm_source=feedburner&utm_medium=email
Present this coupon for one free piece of kids clothing at Sears Outlet
Stores on 10/1. You need to be a Shop Your Way Rewards member to qualify.
You can sign up in-store or at shopyourwayrewards.com
The post One Free Piece of Kids Clothing at Sears Outlet Stores on 10/1
appeared first on SweetFreeStuff.com.
///////////////////////////////////////////
Free Tum-E Yummies Fruit Flavored Drink at Kroger 10/4
Posted: 30 Sep 2013 03:38 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/w6AzFK4c6nc/?utm_source=feedburner&utm_medium=email
October 4th only, download a digital coupon for a Free Tum-E Yummies Fruit
Flavored Drink directly to your Korger Plus Card! Coupon offer redeemable
through October 19, 2013.
The post Free Tum-E Yummies Fruit Flavored Drink at Kroger 10/4 appeared
first on SweetFreeStuff.com.
///////////////////////////////////////////
Free Garnier Fructis Triple Nutrition Sample
Posted: 30 Sep 2013 01:00 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/pAwGZt_oc88/?utm_source=feedburner&utm_medium=email
Request your free sample of Garnier Fructis Triple Nutrition from
Walmart.com.
The post Free Garnier Fructis Triple Nutrition Sample appeared first on
SweetFreeStuff.com.
///////////////////////////////////////////
Free Subscription to Family Circle Magazine
Posted: 30 Sep 2013 12:20 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/Gk0CC7BU0og/?utm_source=feedburner&utm_medium=email
The post Free Subscription to Family Circle Magazine appeared first on
SweetFreeStuff.com.
///////////////////////////////////////////
Free Sample of Katy Perry Killer Queen Fragrance
Posted: 30 Sep 2013 12:03 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/z7BkKagVDuI/?utm_source=feedburner&utm_medium=email
Like their Facebook page and complete the form. Free Katy Perry Killer
Queen Fragrance Sample
The post Free Sample of Katy Perry Killer Queen Fragrance appeared first on
SweetFreeStuff.com.
///////////////////////////////////////////
Free Morton Water Test Strip
Posted: 30 Sep 2013 12:01 AM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/VCjEYU9emZs/?utm_source=feedburner&utm_medium=email
Morton Salt will send you a free water test strip to help you find out if
you have any hard water issues.
The post Free Morton Water Test Strip appeared first on SweetFreeStuff.com.
///////////////////////////////////////////
Free “Reject HJR-6 Bumper Sticker
Posted: 29 Sep 2013 11:34 PM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/WEZNk37bC88/?utm_source=feedburner&utm_medium=email
Free Reject HJR-6 Bumper Sticker
The post Free Reject HJR-6 Bumper Sticker appeared first on
SweetFreeStuff.com.
///////////////////////////////////////////
Free Lipton K-Cup Sample Pack
Posted: 29 Sep 2013 10:52 PM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/atVuEmBfzpA/?utm_source=feedburner&utm_medium=email
Like their Facebook page to sign up for a Free Lipton K-Cup Sample Pack.
The post Free Lipton K-Cup Sample Pack appeared first on SweetFreeStuff.com.
///////////////////////////////////////////
Free Sun-Maid 100th Anniversary Cookbook
Posted: 29 Sep 2013 10:21 PM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/TGJVbAVbhhs/?utm_source=feedburner&utm_medium=email
The post Free Sun-Maid 100th Anniversary Cookbook appeared first on
SweetFreeStuff.com.
///////////////////////////////////////////
Reminder: $150 Amazon Gift Card Giveaway from SFS!
Posted: 29 Sep 2013 10:00 PM PDT
http://feedproxy.google.com/&;r/SweetFreeStuff/&;3/cvNIsWL7ejU/?utm_source=feedburner&utm_medium=email
Enter the Giveaway Now!!
The post Reminder: $150 Amazon Gift Card Giveaway from SFS! appeared first
on SweetFreeStuff.com.


Automatic e-mail,
A new document is being uploaded in path /Report/, with name ${document.name}.
Open it here: Report Upload
Best regards, Support


| Project Name | Liquidity Amount | Interest Earned | Project Progress | Donate More | Retrieve Money |
|---|---|---|---|---|---|
| School construction in Namibia | 2300 USD | 326.3 USD | 16.100 / 23.000 USD | add | local_atm |
| Construction of well in Indonesia | 150 USD | 6.9 USD | 273 / 1.000 USD | add | local_atm |
| Upgrade my tractor | 500 USD | 24.7 USD | 69.128 / 70.000 USD | add | local_atm |
| General Pool | 330 USD | 73.7 USD | ∞ | add | local_atm |


Review Tech partner pages
Make sure sponsors are indicated for Tech Talk
Top 10 Trends list - Forbes
TBC Webinar: Ship Now, Not Later
1:1 Nancy


by Jacob Cano
Posted on December 12
Com 2 is the sequel game to XCOM: Enemy Unkown by Firaxis Games. It is a turn-based strategy RPG that revolves around resource and unit management while trying to retake the earth from its new alien overlords.
This is a game that I will always go back to. I have over 300 hours clocked into the prequel, XCOM: Enemy Unknown and plan on draining even more than that into XCOM 2. Each playthrough of the game feels different and is different.
XCOM 2 has in-depth character customization and the lore goes deep as well. The story flows smoothly from the first game, and previous characters have special guest appearances as well! I am not trying to spoil too much of the story, but the DLC gives characters you love and know good story arcs.
The gameplay takes a huge step up from the prequel, as the classes have the same core gameplay, but have many more activatable abilities that, in my opinion, enhance the quality of the gameplay and uniqueness of each class.
All in all this game is a solid sequel. It scales the difficulty up a bit from the first game at higher levels, but also provides a great experience for all players. The multiplayer is solid, but the matchmaking is weak. It takes a very long time to find a game to play. However, the multiplayer is a very small part of this game, so I would rate it a 9/10.
XCOM 2 has a few DLC availible. They range from adding in new solider customization options to adding in extra gear and missions within the game.