text:
vdirsyncer man page
vdirsyncer — vdirsyncer Documentation
- Documentation
- Source code
Vdirsyncer synchronizes your calendars and addressbooks between two storages. The most popular purpose is to synchronize a CalDAV/CardDAV server with a local folder or file. The local data can then be accessed via a variety of programs, none of which have to know or worry about syncing to a server.
It aims to be for CalDAV and CardDAV what OfflineIMAP is for IMAP.
When Do I Need Vdirsyncer?
Why not Dropbox + todo.txt?
Projects like todo.txt criticize the complexity of modern productivity apps, and that rightfully. So they set out to create a new, super-simple, human-readable format, such that vim suffices for viewing the raw data. However, when they're faced with the question how to synchronize that data across multiple devices, they seemed to have reached the dead end with their novel idea: "Let's just use Dropbox".
What does file sync software do if both files have changed since the last sync? The answer is to ignore the question, just sync as often as possible, and hope for the best. Because if it comes to a sync conflict, most sync services are not daring to merge files, and create two copies on each computer instead. Merging the two task lists is left to the user.
A better idea would've been to use git to synchronize the todo.txt file, which is at least able to resolve some basic conflicts.
Why not file sync (Dropbox, git, ...) + vdir?
Since vdirs are just a bunch of files, it is obvious to try file synchronization for synchronizing your data between multiple computers, such as:
- Syncthing
- Dropbox or one of the gajillion services like it
- unison
- Just git with a sshd.
The disadvantages of those solutions largely depend on the exact file sync program chosen:
Like with todo.txt, Dropbox and friends are obviously agnostic/unaware of the files' contents. If a file has changed on both sides, Dropbox just copies both versions to both sides.
This is a good idea if the user is directly interfacing with the file system and is able to resolve conflicts themselves. Here it might lead to erroneous behavior with e.g. khal, since there are now two events with the same UID.
This point doesn't apply to git: It has very good merging capabilities, better than what vdirsyncer currently has.
- Such a setup doesn't work at all with smartphones. Vdirsyncer, on the other hand, synchronizes with CardDAV/CalDAV servers, which can be accessed with e.g. DAVDroid or the apps by dmfs.
OS/distro packages
Unless you want to contribute to vdirsyncer, you should use the packages from your distribution:
- ArchLinux (AUR)
- pkgsrc
- nixpkg
- GNU Guix
- homebrew
- Gentoo
Some distros have multiple release channels. The following may not contain the latest version:
- Fedora
- Debian (likewise for Ubuntu)
Note that we only support the latest version of vdirsyncer, but you may still find older versions in some distro's repositories. You should have recieved information on how to file bugs against those packages. Please do not file bugs against vdirsyncer.
If there is no package for your distribution, you'll need to install vdirsyncer manually. There is an easy command to copy-and-paste for this as well, but you should be aware of its consequences.
Manual installation
If your distribution doesn't provide a package for vdirsyncer, you still can use Python's package manager "pip". First, you'll have to check that the following things are installed:
- Python 3.3+ and pip.
- libxml and libxslt
- zlib
On Linux systems, using the distro's package manager is the best way to do this, for example, using Ubuntu:
sudo apt-get install libxml2 libxslt1.1 zlib1g python
Then you have several options. The following text applies for most Python software by the way.
The dirty, easy way
The easiest way to install vdirsyncer at this point would be to run:
pip install --user --ignore-installed vdirsyncer
- --user is to install without root rights (into your home directory)
- --ignore-installed is to work around Debian's potentially broken packages (see debian-urllib3).
This method has a major flaw though: Pip doesn't keep track of the files it installs. Vdirsyncer's files would be located somewhere in ~/.local/lib/python*, but you can't possibly know which packages were installed as dependencies of vdirsyncer and which ones were not, should you decide to uninstall it. In other words, using pip that way would pollute your home directory.
The clean, hard way
There is a way to install Python software without scattering stuff across your filesystem: virtualenv. There are a lot of resources on how to use it, the simplest possible way would look something like:
virtualenv ~/vdirsyncer_env
~/vdirsyncer_env/bin/pip install vdirsyncer
alias vdirsyncer="~/vdirsyncer_env/bin/vdirsyncer
You'll have to put the last line into your .bashrc or .bash_profile.
This method has two advantages:
- It separately installs all Python packages into ~/vdirsyncer_env/, without relying on the system packages. This works around OS- or distro-specific issues.
- You can delete ~/vdirsyncer_env/ to uninstall vdirsyncer entirely.
The clean, easy way
pipsi is a new package manager for Python-based software that automatically sets up a virtualenv for each program you install. Assuming you have it installed on your operating system, you can do:
pipsi install --python python3 vdirsyncer
and .local/bin/vdirsyncer will be your new vdirsyncer installation. To update vdirsyncer to the latest version:
pipsi upgrade vdirsyncer
If you're done with vdirsyncer, you can do:
pipsi uninstall vdirsyncer
and vdirsyncer will be uninstalled, including its dependencies.
Before starting, consider if you actually need vdirsyncer. There are better alternatives available for particular usecases.
See installation.
- The config.example from the repository contains a very terse version of this.
- In this example we set up contacts synchronization, but calendar sync works almost the same. Just swap type = carddav for type = caldav and fileext = .vcf for fileext = .ics.
- Take a look at the problems page if anything doesn't work like planned.
By default, vdirsyncer looks for its configuration file in the following locations:
- The file pointed to by the VDIRSYNCER_CONFIG environment variable.
- ~/.vdirsyncer/config.
- $XDG_CONFIG_HOME/vdirsyncer/config, which is normally ~/.config/vdirsyncer/config. See the XDG-Basedir specification.
The config file should start with a general section, where the only required parameter is status_path. The following is a minimal example:
status_path = ~/.vdirsyncer/status/
After the general section, an arbitrary amount of pair and storage sections might come.
In vdirsyncer, synchronization is always done between two storages. Such storages are defined in storage sections, and which pairs of storages should actually be synchronized is defined in pair section. This format is copied from OfflineIMAP, where storages are called repositories and pairs are called accounts.
The following example synchronizes ownCloud's addressbooks to ~/.contacts/:
[pair my_contacts]
a = "my_contacts_local"
b = "my_contacts_remote"
collections = ["from a", "from b"]
[storage my_contacts_local]
type = "filesystem"
path = "~/.contacts/"
fileext = ".vcf"
[storage my_contacts_remote]
type = "carddav"
# We can simplify this URL here as well. In theory it shouldn't matter.
url = "https://owncloud.example.com/remote.php/carddav/"
username = "bob"
password = "asdf"
Configuration for other servers can be found at supported-servers.
After running vdirsyncer discover and vdirsyncer sync, ~/.contacts/ will contain subfolders for each addressbook, which in turn will contain a bunch of .vcf files which all contain a contact in VCARD format each. You can modify their contents, add new ones and delete some [1], and your changes will be synchronized to the CalDAV server after you run vdirsyncer sync again. For further reference, it uses the storages filesystem and carddav.
However, if new collections are created on the server, it will not automatically start synchronizing those [2]. You need to run vdirsyncer discover again to re-fetch this list instead.
- [1]
You'll want to use a helper program for this.
- [2]
Because collections are added rarely, and checking for this case before every synchronization isn't worth the overhead.
More Configuration
Conflict resolution
What if the same item is changed on both sides? What should vdirsyncer do? By default, it will show an ugly error message, which is surely a way to avoid the problem. Another way to solve that ambiguity is to add another line to the pair section:
[pair my_contacts]
conflict_resolution = b wins
Earlier we wrote that b = my_contacts_remote, so when vdirsyncer encounters the situation where an item changed on both sides, it will simply overwrite the local item with the one from the server. Of course a wins is also a valid value.
Metadata synchronization
Besides items, vdirsyncer can also synchronize metadata like the addressbook's or calendar's "human-friendly" name (internally called "displayname") or the color associated with a calendar. For the purpose of explaining this feature, let's switch to a different base example. This time we'll synchronize calendars:
[pair my_calendars]
a = "my_calendars_local"
b = "my_calendars_remote"
collections = ["from a", "from b"]
metadata = ["color"]
[storage my_calendars_local]
type = "filesystem"
path = "~/.calendars/"
fileext = ".ics"
[storage my_calendars_remote]
type = "caldav"
url = "https://owncloud.example.com/remote.php/caldav/"
username = "bob"
password = "asdf"
Run vdirsyncer discover for discovery. Then you can use vdirsyncer metasync to synchronize the color property between your local calendars in ~/.calendars/ and your ownCloud. Locally the color is just represented as a file called color within the calendar folder.
More information about collections
"Collection" is a collective term for addressbooks and calendars. Each collection from a storage has a "collection name", a unique identifier for each collection. In the case of filesystem-storage, this is the name of the directory that represents the collection, in the case of the DAV-storages this is the last segment of the URL. We use this identifier in the collections parameter in the pair-section.
This identifier doesn't change even if you rename your calendar in whatever UI you have, because that only changes the so-called "displayname" property [3]. On some servers (iCloud, Google) this identifier is randomly generated and has no correlation with the displayname you chose.
- [3]
Which you can also synchronize with metasync using metadata = ["displayname"].
There are three collection names that have a special meaning:
- "from a", "from b": A placeholder for all collections that can be found on side A/B when running vdirsyncer discover.
- null: The parameters give to the storage are exact and require no discovery.
The last one requires a bit more explanation. Assume this config which synchronizes two directories of addressbooks:
[pair foobar] a = "foo" b = "bar" collections = ["from a", "from b"] [storage foo] type = "filesystem" fileext = ".vcf" path = "./contacts_foo/" [storage bar] type = "filesystem" fileext = ".vcf" path = "./contacts_bar/"
As we saw previously this will synchronize all collections in ./contacts_foo/ with each same-named collection in ./contacts_bar/. If there's a collection that exists on one side but not the other, vdirsyncer will ask whether to create that folder on the other side.
If we set collections = null, ./contacts_foo/ and ./contacts_bar/ are no longer treated as folders with collections, but as collections themselves. This means that ./contacts_foo/ and ./contacts_bar/ will contain .vcf-files, not subfolders that contain .vcf-files.
This is useful in situations where listing all collections fails because your DAV-server doesn't support it, for example. In this case, you can set url of your carddav- or caldav-storage to a URL that points to your CalDAV/CardDAV collection directly.
Note that not all storages support the null-collection, for example google_contacts and google_calendar don't.
SSL and Certificate Validation
All SSL configuration is done per-storage.
Pinning by fingerprint
To pin the certificate by fingerprint:
[storage foo]
type = "caldav"
verify_fingerprint = "94:FD:7A:CB:50:75:A4:69:82:0A:F8:23:DF:07:FC:69:3E:CD:90:CA"
#verify = false # Optional: Disable CA validation, useful for self-signed certs
SHA1-, SHA256- or MD5-Fingerprints can be used. They're detected by their length.
You can use the following command for obtaining a SHA-1 fingerprint:
echo -n | openssl s_client -connect unterwaditzer.net:443 | openssl x509 -noout -fingerprint
Note that verify_fingerprint doesn't suffice for vdirsyncer to work with self-signed certifcates (or certificates that are not in your trust store). You most likely need to set verify = false as well. This disables verification of the SSL certificate's expiration time and the existence of it in your trust store, all that's verified now is the fingerprint.
However, please consider using Let's Encrypt such that you can forget about all of that. It is easier to deploy a free certificate from them than configuring all of your clients to accept the self-signed certificate.
Custom root CAs
To point vdirsyncer to a custom set of root CAs:
[storage foo]
type = "caldav"
verify = "/path/to/cert.pem"
Vdirsyncer uses the requests library, which, by default, uses its own set of trusted CAs.
However, the actual behavior depends on how you have installed it. Many Linux distributions patch their python-requests package to use the system certificate CAs. Normally these two stores are similar enough for you to not care.
But there are cases where certificate validation fails even though you can access the server fine through e.g. your browser. This usually indicates that your installation of the requests library is somehow broken. In such cases, it makes sense to explicitly set verify or verify_fingerprint as shown above.
Client Certificates
Client certificates may be specified with the auth_cert parameter. If the key and certificate are stored in the same file, it may be a string:
[storage foo]
type = "caldav"
auth_cert = "/path/to/certificate.pem"
If the key and certificate are separate, a list may be used:
[storage foo]
type = "caldav"
auth_cert = ["/path/to/certificate.crt", "/path/to/key.key"]
Storing Passwords
Changed in version 0.7.0: Password configuration got completely overhauled.
Vdirsyncer can fetch passwords from several sources other than the config file.
Say you have the following configuration:
[storage foo]
type = "caldav"
url = ...
username = "foo"
password = "bar"
But it bugs you that the password is stored in cleartext in the config file. You can do this:
[storage foo]
type = "caldav"
url = ...
username = "foo"
password.fetch = ["command", "~/get-password.sh", "more", "args"]
You can fetch the username as well:
[storage foo]
type = "caldav"
url = ...
username.fetch = ["command", "~/get-username.sh"]
password.fetch = ["command", "~/get-password.sh"]
Or really any kind of parameter in a storage section.
Accessing the system keyring
As shown above, you can use the command strategy to fetch your credentials from arbitrary sources. A very common usecase is to fetch your password from the system keyring.
The keyring Python package contains a command-line utility for fetching passwords from the OS's password store. Installation:
pip install keyring
Basic usage:
password.fetch = ["command", "keyring", "get", "example.com", "foouser"]
Password Prompt
You can also simply prompt for the password:
[storage foo]
type = "caldav"
username = "myusername"
password.fetch = ["prompt", "Password for CalDAV"]
Syncing with Read-Only Storages
If you want to subscribe to a public, read-only WebCAL-calendar but neither your server nor your calendar apps support that (or support it insufficiently), vdirsyncer can be used to synchronize such a public calendar A with a new calendar B of your own and keep B updated.
Step 1: Create the target calendar
First you need to create the calendar you want to sync the WebCAL-calendar with. Most servers offer a web interface for this. You then need to note the CalDAV URL of your calendar. Note that this URL should directly point to the calendar you just created, which means you would have one such URL for each calendar you have.
Step 2: Creating the config
Paste this into your vdirsyncer config:
[pair holidays]
a = "holidays_public"
b = "holidays_private"
collections = null
[storage holidays_public]
type = "http"
# The URL to your iCalendar file.
url = ...
[storage holidays_private]
type = "caldav"
# The direct URL to your calendar.
url = ...
# The credentials to your CalDAV server
username = ...
password = ...
Then run vdirsyncer discover holidays and vdirsyncer sync holidays, and your previously created calendar should be filled with events.
Step 3: The partial_sync parameter
New in version 0.14.
You may get into a situation where you want to hide or modify some events from your holidays calendar. If you try to do that at this point, you'll notice that vdirsyncer will revert any changes you've made after a few times of running sync. This is because vdirsyncer wants to keep everything in sync, and it can't synchronize changes to the public holidays-calendar because it doesn't have the rights to do so.
For such purposes you can set the partial_sync parameter to ignore:
[pair holidays]
a = "holidays_public"
b = "holidays_private"
collections = null
partial_sync = ignore
See the config docs for more information.
Full Configuration Manual
Vdirsyncer uses an ini-like format for storing its configuration. All values are JSON, invalid JSON will get interpreted as string:
x = "foo" # String
x = foo # Shorthand for same string
x = 42 # Integer
x = ["a", "b", "c"] # List of strings
x = true # Boolean
x = false
x = null # Also known as None
General Section
status_path = ...
status_path: A directory where vdirsyncer will store some additional data for the next sync.
The data is needed to determine whether a new item means it has been added on one side or deleted on the other. Relative paths will be interpreted as relative to the configuration file's directory.
See A simple synchronization algorithm for what exactly is in there.
Pair Section
[pair pair_name]
a = ...
b = ...
#collections = null
#conflict_resolution = null
- Pair names can consist of any alphanumeric characters and the underscore.
- a and b reference the storages to sync by their names.
collections: A list of collections to synchronize when vdirsyncer sync is executed. See also collections_tutorial.
The special values "from a" and "from b", tell vdirsyncer to try autodiscovery on a specific storage.
If the collection you want to sync doesn't have the same name on each side, you may also use a value of the form ["config_name", "name_a", "name_b"]. This will synchronize the collection name_a on side A with the collection name_b on side B. The config_name will be used for representation in CLI arguments and logging.
- Examples:
- collections = ["from b", "foo", "bar"] makes vdirsyncer synchronize the collections from side B, and also the collections named "foo" and "bar".
- collections = ["from b", "from a"] makes vdirsyncer synchronize all existing collections on either side.
- collections = [["bar", "bar_a", "bar_b"], "foo"] makes vdirsyncer synchronize bar_a from side A with bar_b from side B, and also synchronize foo on both sides with each other.
conflict_resolution: Optional, define how conflicts should be handled. A conflict occurs when one item (event, task) changed on both sides since the last sync. See also conflict_resolution_tutorial.
Valid values are:
- null, where an error is shown and no changes are done.
- "a wins" and "b wins", where the whole item is taken from one side.
["command", "vimdiff"]: vimdiff <a> <b> will be called where <a> and <b> are temporary files that contain the item of each side respectively. The files need to be exactly the same when the command returns.
- vimdiff can be replaced with any other command. For example, in POSIX ["command", "cp"] is equivalent to "a wins".
- Additional list items will be forwarded as arguments. For example, ["command", "vimdiff", "--noplugin"] runs vimdiff --noplugin.
Vdirsyncer never attempts to "automatically merge" the two items.
partial_sync: Assume A is read-only, B not. If you change items on B, vdirsyncer can't sync the changes to A. What should happen instead?
- error: An error is shown.
- ignore: The change is ignored. However: Events deleted in B still reappear if they're updated in A.
- revert (default): The change is reverted on next sync.
See also partial_sync_tutorial.
metadata: Metadata keys that should be synchronized when vdirsyncer metasync is executed. Example:
metadata = ["color", "displayname"]
This synchronizes the color and the displayname properties. The conflict_resolution parameter applies here as well.
Storage Section
[storage storage_name]
type = ...
- Storage names can consist of any alphanumeric characters and the underscore.
- type defines which kind of storage is defined. See Supported Storages.
- read_only defines whether the storage should be regarded as a read-only storage. The value true means synchronization will discard any changes made to the other side. The value false implies normal 2-way synchronization.
- Any further parameters are passed on to the storage class.
Supported Storages
CalDAV and CardDAV
- caldav
[storage example_for_caldav] type = caldav #start_date = null #end_date = null #item_types = [] url = "..." #username = "" #password = "" #verify = true #auth = null #useragent = "vdirsyncer" #verify_fingerprint = null #auth_cert = null
You can set a timerange to synchronize with the parameters start_date and end_date. Inside those parameters, you can use any Python expression to return a valid datetime.datetime object. For example, the following would synchronize the timerange from one year in the past to one year in the future:
start_date = datetime.now() - timedelta(days=365) end_date = datetime.now() + timedelta(days=365)
Either both or none have to be specified. The default is to synchronize everything.
You can set item_types to restrict the kind of items you want to synchronize. For example, if you want to only synchronize events (but don't download any tasks from the server), set item_types = ["VEVENT"]. If you want to synchronize events and tasks, but have some VJOURNAL items on the server you don't want to synchronize, use item_types = ["VEVENT", "VTODO"].
- Parameters
- start_date -- Start date of timerange to show, default -inf.
- end_date -- End date of timerange to show, default +inf.
- item_types -- Kind of items to show. The default, the empty list, is to show all. This depends on particular features on the server, the results are not validated.
- url -- Base URL or an URL to a collection.
- username -- Username for authentication.
- password -- Password for authentication.
- verify -- Verify SSL certificate, default True. This can also be a local path to a self-signed SSL certificate. See ssl-tutorial for more information.
- verify_fingerprint -- Optional. SHA1 or MD5 fingerprint of the expected server certificate. See ssl-tutorial for more information.
- auth -- Optional. Either basic, digest or guess. The default is preemptive Basic auth, sending credentials even if server didn't request them. This saves from an additional roundtrip per request. Consider setting guess if this causes issues with your server.
- auth_cert -- Optional. Either a path to a certificate with a client certificate and the key or a list of paths to the files with them.
- useragent -- Default vdirsyncer.
Please also see supported-servers, as some servers may not work well.
- carddav
[storage example_for_carddav] type = carddav url = "..." #username = "" #password = "" #verify = true #auth = null #useragent = "vdirsyncer" #verify_fingerprint = null #auth_cert = null
- Parameters
- url -- Base URL or an URL to a collection.
- username -- Username for authentication.
- password -- Password for authentication.
- verify -- Verify SSL certificate, default True. This can also be a local path to a self-signed SSL certificate. See ssl-tutorial for more information.
- verify_fingerprint -- Optional. SHA1 or MD5 fingerprint of the expected server certificate. See ssl-tutorial for more information.
- auth -- Optional. Either basic, digest or guess. The default is preemptive Basic auth, sending credentials even if server didn't request them. This saves from an additional roundtrip per request. Consider setting guess if this causes issues with your server.
- auth_cert -- Optional. Either a path to a certificate with a client certificate and the key or a list of paths to the files with them.
- useragent -- Default vdirsyncer.
Please also see supported-servers, as some servers may not work well.
At first run you will be asked to authorize application for google account access.
To use this storage type, you need to install some additional dependencies:
pip install vdirsyncer[google]
Furthermore you need to register vdirsyncer as an application yourself to obtain client_id and client_secret, as it is against Google's Terms of Service to hardcode those into opensource software:
- 1.
Go to the Google API Manager and create a new project under any name.
- 2.
Within that project, enable the "CalDAV" and "CardDAV" APIs (not the Calendar and Contacts APIs, those are different and won't work). There should be a searchbox where you can just enter those terms.
- 3.
In the sidebar, select "Credentials" and create a new "OAuth Client ID". The application type is "Other".
You'll be prompted to create a OAuth consent screen first. Fill out that form however you like.
- 4.
Finally you should have a Client ID and a Client secret. Provide these in your storage config.
You can select which calendars to sync on CalDav settings page.
- google_calendar
Google calendar.
[storage example_for_google_calendar] type = google_calendar token_file = "..." client_id = "..." client_secret = "..." #start_date = null #end_date = null #item_types = []
Please refer to caldav regarding the item_types and timerange parameters.
- Parameters
- token_file -- A filepath where access tokens are stored.
- client_id/client_secret -- OAuth credentials, obtained from the Google API Manager.
- google_contacts
Google contacts.
[storage example_for_google_contacts] type = google_contacts token_file = "..." client_id = "..." client_secret = "..."
Google's CardDAV implementation is allegedly a disaster in terms of data safety. See this blog post for the details. Always back up your data.
- Parameters
- token_file -- A filepath where access tokens are stored.
- client_id/client_secret -- OAuth credentials, obtained from the Google API Manager.
remoteStorage is an open per-user data storage protocol. Vdirsyncer contains highly experimental support for it.
Do not use this storage if you're not prepared for data-loss and breakage.
To use them, you need to install some optional dependencies with:
pip install vdirsyncer[remotestorage]
- remotestorage_contacts
remoteStorage contacts. Uses the vdir_contacts scope.
[storage example_for_remotestorage_contacts] type = remotestorage_contacts account = "..." #verify = true #verify_fingerprint = null #auth_cert = null #access_token = null
- Parameters
- account -- remoteStorage account, "email@example.com".
- username -- Username for authentication.
- password -- Password for authentication.
- verify -- Verify SSL certificate, default True. This can also be a local path to a self-signed SSL certificate. See ssl-tutorial for more information.
- verify_fingerprint -- Optional. SHA1 or MD5 fingerprint of the expected server certificate. See ssl-tutorial for more information.
- auth -- Optional. Either basic, digest or guess. The default is preemptive Basic auth, sending credentials even if server didn't request them. This saves from an additional roundtrip per request. Consider setting guess if this causes issues with your server.
- auth_cert -- Optional. Either a path to a certificate with a client certificate and the key or a list of paths to the files with them.
- useragent -- Default vdirsyncer.
- remotestorage_calendars
remoteStorage calendars. Uses the vdir_calendars scope.
[storage example_for_remotestorage_calendars] type = remotestorage_calendars account = "..." #verify = true #verify_fingerprint = null #auth_cert = null #access_token = null
- Parameters
- account -- remoteStorage account, "firstname.lastname@example.com".
- username -- Username for authentication.
- password -- Password for authentication.
- verify -- Verify SSL certificate, default True. This can also be a local path to a self-signed SSL certificate. See ssl-tutorial for more information.
- verify_fingerprint -- Optional. SHA1 or MD5 fingerprint of the expected server certificate. See ssl-tutorial for more information.
- auth -- Optional. Either basic, digest or guess. The default is preemptive Basic auth, sending credentials even if server didn't request them. This saves from an additional roundtrip per request. Consider setting guess if this causes issues with your server.
- auth_cert -- Optional. Either a path to a certificate with a client certificate and the key or a list of paths to the files with them.
- useragent -- Default vdirsyncer.
- filesystem
Saves each item in its own file, given a directory.
[storage example_for_filesystem] type = filesystem path = "..." fileext = "..." #encoding = "utf-8" #post_hook = null
Can be used with khal. See vdir for a more formal description of the format.
- Parameters
- path -- Absolute path to a vdir/collection. If this is used in combination with the collections parameter in a pair-section, this should point to a directory of vdirs instead.
- fileext -- The file extension to use (e.g. .txt). Contained in the href, so if you change the file extension after a sync, this will trigger a re-download of everything (but should not cause data-loss of any kind).
- encoding -- File encoding for items, both content and filename.
- post_hook -- A command to call for each item creation and modification. The command will be called with the path of the new/updated file.
- singlefile
Save data in single local .vcf or .ics file.
[storage example_for_singlefile] type = singlefile path = "..." #encoding = "utf-8"
The storage basically guesses how items should be joined in the file.
New in version 0.1.6.
This storage is very slow, and that is unlikely to change. You should consider using filesystem if it fits your usecase.
- Parameters
- path -- The filepath to the file to be written to. If collections are used, this should contain %s as a placeholder for the collection name.
- encoding -- Which encoding the file should use. Defaults to UTF-8.
Example for syncing with caldav:
[pair my_calendar] a = my_calendar_local b = my_calendar_remote collections = ["from a", "from b"] [storage my_calendar_local] type = "singlefile" path = ~/.calendars/%s.ics [storage my_calendar_remote] type = "caldav" url = https://caldav.example.org/ #username = #password =
Example for syncing with caldav using a null collection:
[pair my_calendar] a = my_calendar_local b = my_calendar_remote
[storage my_calendar_local] type = "singlefile" path = ~/my_calendar.ics
[storage my_calendar_remote] type = "caldav" url = https://caldav.example.org/username/my_calendar/ #username = #password =
Read-only storages
These storages don't support writing of their items, consequently read_only is set to true by default. Changing read_only to false on them leads to an error.
- http
Use a simple .ics file (or similar) from the web.
[storage example_for_http] type = http url = "..." #username = "" #password = "" #verify = true #auth = null #useragent = "vdirsyncer" #verify_fingerprint = null #auth_cert = null
webcal://-calendars are supposed to be used with this, but you have to replace webcal:// with http://, or better, https://.
Too many WebCAL providers generate UIDs of all VEVENT-components on-the-fly, i.e. all UIDs change every time the calendar is downloaded. This leads many synchronization programs to believe that all events have been deleted and new ones created, and accordingly causes a lot of unnecessary uploads and deletions on the other side. Vdirsyncer completely ignores UIDs coming from http and will replace them with a hash of the normalized item content.
- Parameters
- url -- URL to the .ics file.
- username -- Username for authentication.
- password -- Password for authentication.
- verify -- Verify SSL certificate, default True. This can also be a local path to a self-signed SSL certificate. See ssl-tutorial for more information.
- verify_fingerprint -- Optional. SHA1 or MD5 fingerprint of the expected server certificate. See ssl-tutorial for more information.
- auth -- Optional. Either basic, digest or guess. The default is preemptive Basic auth, sending credentials even if server didn't request them. This saves from an additional roundtrip per request. Consider setting guess if this causes issues with your server.
- auth_cert -- Optional. Either a path to a certificate with a client certificate and the key or a list of paths to the files with them.
- useragent -- Default vdirsyncer.
A simple example:
[pair holidays] a = holidays_local b = holidays_remote collections = null [storage holidays_local] type = "filesystem" path = ~/.config/vdir/calendars/holidays/ fileext = .ics [storage holidays_remote] type = "http" url = https://example.com/holidays_from_hicksville.ics
Supported Software
Client applications
The following software has been reported to work well with vdirsyncer, however, none of it is regularly tested.
- khal, a CLI calendar application supporting vdir. You can use filesystem with it.
- Many graphical calendar apps such as dayplanner, Orage or rainlendar save a calendar in a single .ics file. You can use singlefile with those.
Task/Todo managers
The iCalendar format also supports saving tasks in form of VTODO-entries, with the same file extension as normal events: .ics. All CalDAV servers support synchronizing tasks, vdirsyncer does too.
todoman, a CLI task manager supporting vdir. You can use filesystem with it.
Its interface is similar to the ones of Taskwarrior or the todo.txt CLI app and should be intuitively usable.
- khard, a commandline addressbook supporting vdir. You can use filesystem with it.
- contactquery.c, a small program explicitly written for querying vdirs from mutt.
- mates, a commandline addressbook supporting vdir.
- vdirel, access vdir contacts from Emacs.
Supported servers
CalDAV and CardDAV servers not listed here may work anyway.
Radicale is a very lightweight server, however, it intentionally doesn't implement the CalDAV and CardDAV standards completely, which might lead to issues even with very well-written clients. Apart from its non-conformity with standards, there are multiple other problems with its code quality and the way it is maintained.
That said, vdirsyncer is continuously tested against the git version and the latest PyPI release of Radicale.
- Vdirsyncer can't create collections on Radicale.
- Radicale doesn't support time ranges in the calendar-query of CalDAV, so setting start_date and end_date for caldav will have no or unpredicted consequences.
Versions of Radicale older than 0.9b1 choke on RFC-conform queries for all items of a collection.
You have to set item_types = ["VTODO", "VEVENT"] in caldav for vdirsyncer to work with those versions.
Vdirsyncer is continuously tested against the latest version of ownCloud:
[storage cal]
type = "caldav"
url = "https://example.com/remote.php/dav/"
username = ...
password = ...
[storage card]
type = "carddav"
url = "https://example.com/remote.php/dav/"
username = ...
password = ...
- Versions older than 7.0.0: ownCloud uses SabreDAV, which had problems detecting collisions and race-conditions. The problems were reported and are fixed in SabreDAV's repo, and the corresponding fix is also in ownCloud since 7.0.0. See issue #16 for more information.
Vdirsyncer is continuously tested against the latest version of nextCloud:
[storage cal]
type = "caldav"
url = "https://nextcloud.example.com/"
username = ...
password = ...
[storage card]
type = "carddav"
url = "https://nextcloud.example.com/"
- WebCAL-subscriptions can't be discovered by vdirsyncer. See this relevant issue.
Vdirsyncer is irregularly tested against FastMail. There are no known issues with it. FastMail's support pages provide the settings to use:
[storage cal]
type = "caldav"
url = "https://caldav.messagingengine.com/"
username = ...
password = ...
[storage card]
type = "carddav"
url = "https://carddav.messagingengine.com/"
username = ...
password = ...
Vdirsyncer is irregularly tested against iCloud.
[storage cal]
type = "caldav"
url = "https://caldav.icloud.com/"
username = ...
password = ...
[storage card]
type = "carddav"
url = "https://contacts.icloud.com/"
username = ...
password = ...
- Vdirsyncer can't do two-factor auth with iCloud (there doesn't seem to be a way to do two-factor auth over the DAV APIs) You'll need to use app-specific passwords instead.
- Vdirsyncer can't create collections on iCloud.
DavMail (Exchange, Outlook)
DavMail is a proxy program that allows you to use Card- and CalDAV clients with Outlook. That allows you to use vdirsyncer with Outlook.
In practice your success with DavMail may wildly vary. Depending on your Exchange server you might get confronted with weird errors of all sorts (including data-loss).
Make absolutely sure you use the latest DavMail:
[storage outlook]
type = "caldav"
url = "http://localhost:email@example.com/calendar/"
username = "email@example.com"
password = ...
- Older versions of DavMail handle URLs case-insensitively. See issue #144.
- DavMail is handling malformed data on the Exchange server very poorly. In such cases the Calendar Checking Tool for Outlook might help.
Vdirsyncer is continuously tested against the latest version of Baikal.
- Baikal up to 0.2.7 also uses an old version of SabreDAV, with the same issue as ownCloud, see issue #160. This issue is fixed in later versions.
Using vdirsyncer with Google Calendar is possible as of 0.10, but it is not tested frequently. You can use google_contacts and google_calendar.
For more information see issue #202 and issue #8.
Known Problems
For any unanswered questions or problems, see contact.
Contributing to This Project
- Please read contact for questions and support requests.
- All participants must follow the pimutils Code of Conduct.
The issue tracker
We use GitHub issues for organizing bug reports and feature requests.
The following labels are of interest:
- "Planning" is for issues that are still undecided, but where at least some discussion exists.
- "Blocked" is for issues that can't be worked on at the moment because some other unsolved problem exists. This problem may be a bug in some software dependency, for instance.
- "Ready" contains issues that are ready to work on.
All of those labels are also available as a kanban board on waffles.io. It is really just an alternative overview over all issues, but might be easier to comprehend.
Feel free to contact me or comment on the relevant issues for further information.
Reporting bugs
- Make sure your problem isn't already listed in problems.
- Make sure you have the absolutely latest version of vdirsyncer. For users of some Linux distributions such as Debian or Fedora this may not be the version that your distro offers. In those cases please file a bug against the distro package, not against upstream vdirsyncer.
- Use --verbosity=DEBUG when including output from vdirsyncer.
Suggesting features
If you're suggesting a feature, keep in mind that vdirsyncer tries not to be a full calendar or contacts client, but rather just the piece of software that synchronizes all the data. Take a look at the documentation for software working with vdirsyncer.
Submitting patches, pull requests
- Discuss everything in the issue tracker first (or contact me somehow else) before implementing it.
- Make sure the tests pass. See below for running them.
- But not because you wrote too few tests.
- Add yourself to AUTHORS.rst, and add a note to Changelog.rst too.
Running tests, how to set up your development environment
For many patches, it might suffice to just let Travis run the tests. However, Travis is slow, so you might want to run them locally too. For this, set up a virtualenv and run this inside of it:
# install vdirsyncer from the repo into the virtualenv. Prerequisite for
# most other tasks.
make install-dev
make install-test # install test dependencies
make install-style # install dependencies for stylechecking
make install-docs # install dependencies for building documentation
Then you can run:
make test # The normal testsuite
make style # Stylechecker
make docs # Build the HTML docs, output is at docs/_build/html/
If you have any questions, feel free to open issues about it.
The Vdir Storage Format
This document describes a standard for storing calendars and contacts on a filesystem, with the main goal of being easy to implement.
Vdirsyncer synchronizes to vdirs via filesystem. Each vdir (basically just a directory with some files in it) represents a calendar or addressbook.
Basic Structure
The main folder (root) contains an arbitrary number of subfolders (collections), which contain only files (items). Synonyms for "collection" may be "addressbook" or "calendar".
An item is:
- A vCard file, in which case the file extension must be .vcf, or
- An iCalendar file, in which case the file extension must be .ics.
An item should contain a UID property as described by the vCard and iCalendar standards. If it contains more than one UID property, the values of those must not differ.
The file must contain exactly one event, task or contact. In most cases this also implies only one VEVENT/VTODO/VCARD component per file, but e.g. recurrence exceptions would require multiple VEVENT components per event.
The filename should consist of the ident, followed by the file extension. The ident is either the UID, if the item has one, else a string with similar properties as the UID. However, several restrictions of the underlying filesystem might make an implementation of this naming scheme for items' filenames impossible. The approach to deal with such cases is left to the client, which are free to choose a different scheme for filenames instead.
Any of the below metadata files may be absent. None of the files listed below have any file extensions.
A file called color inside the vdir indicates the vdir's color, a property that is only relevant in UI design.
Its content is an ASCII-encoded hex-RGB value of the form #RRGGBB. For example, a file content of #FF0000 indicates that the vdir has a red (user-visible) color. No short forms or informal values such as red (as known from CSS, for example) are allowed. The prefixing # must be present.
- A file called displayname contains a UTF-8 encoded label that may be used to represent the vdir in UIs.
Writing to vdirs
Creating and modifying items or metadata files should happen atomically.
Writing to a temporary file on the same physical device, and then moving it to the appropriate location is usually a very effective solution. For this purpose, files with the extension .tmp may be created inside collections.
When changing an item, the original filename must be used.
Reading from vdirs
- Any file ending with the .tmp or no file extension must not be treated as an item.
- The ident part of the filename should not be parsed to improve the speed of item lookup.
The primary reason this format was chosen is due to its compatibility with the CardDAV and CalDAV standards.
Currently, vdirs suffer from a rather major performance problem, one which current implementations try to mitigate by building up indices of the collections for faster search and lookup.
The reason items' filenames don't contain any extra information is simple: The solutions presented induced duplication of data, where one duplicate might become out of date because of bad implementations. As it stands right now, a index format could be formalized separately though.
vdirsyncer doesn't really have to bother about efficient item lookup, because its synchronization algorithm needs to fetch the whole list of items anyway. Detecting changes is easily implemented by checking the files' modification time.
Packaging Guidelines
Thank you very much for packaging vdirsyncer! The following guidelines should help you to avoid some common pitfalls.
While they are called guidelines and therefore theoretically not mandatory, if you consider going a different direction, please first open an issue or contact me otherwise instead of just going ahead. These guidelines exist for my own convenience too.
Obtaining the source code
The main distribution channel is PyPI, and source tarballs can be obtained there. Do not use the ones from GitHub: Their tarballs contain useless junk and are more of a distraction than anything else.
I give each release a tag in the git repo. If you want to get notified of new releases, GitHub's feed is a good way.
Dependency versions
It is strongly discouraged to package vdirsyncer as a Python 2 application. Future releases will only work on Python 3.3 and newer versions.
As with most Python packages, setup.py denotes the dependencies of vdirsyncer. It also contains lower-bound versions of each dependency. Older versions will be rejected by the testsuite.
Everything testing-related goes through the Makefile in the root of the repository or PyPI package. Trying to e.g. run py.test directly will require a lot of environment variables to be set (for configuration) and you probably don't want to deal with that.
You can install the testing dependencies with:
make install-test
You probably don't want this since it will use pip to download the dependencies. Alternatively you can find the testing dependencies in test-requirements.txt, again with lower-bound version requirements.
You also have to have vdirsyncer fully installed at this point. Merely cd-ing into the tarball will not be sufficient.
Running the tests happens with:
make test
Hypothesis will randomly generate test input. If you care about deterministic tests, set the DETERMINISTIC_TESTS variable to "true":
make DETERMINISTIC_TESTS=true test
Using Sphinx you can generate the documentation you're reading right now in a variety of formats, such as HTML, PDF, or even as a manpage. That said, I only take care of the HTML docs' formatting.
You can find a list of dependencies in docs-requirements.txt. Again, you can install those using pip with:
make install-docs
Then change into the docs/ directory and build whatever format you want using the Makefile in there (run make for the formats you can build).
Support and Contact
- The #pimutils IRC channel on Freenode might be active, depending on your timezone. Use it for support and general (including off-topic) discussion.
- Open a GitHub issue for concrete bug reports and feature requests.
- Lastly, you can also contact the author directly.
This changelog only contains information that might be useful to end users and package maintainers. For further info, see the git commit log.
Package maintainers and users who have to manually update their installation may want to subscribe to GitHub's tag feed.
Version 0.14.1
released on 05 January 2017
- vdirsyncer repair no longer changes "unsafe" UIDs by default, an extra option has to be specified. See issue #527.
- A lot of important documentation updates.
Version 0.14.0
released on 26 October 2016
- vdirsyncer sync now continues other uploads if one upload failed. The exit code in such situations is still non-zero.
- Add partial_sync option to pair section. See the config docs.
- Vdirsyner will now warn if there's a string without quotes in your config. Please file issues if you find documentation that uses unquoted strings.
- Fix an issue that would break khal's config setup wizard.
Version 0.13.1
released on 30 September 2016
- Fix a bug that would completely break collection discovery.
Version 0.13.0
released on 29 September 2016
- Python 2 is no longer supported at all. See issue #219.
- Config sections are now checked for duplicate names. This also means that you cannot have a storage section [storage foo] and a pair [pair foo] in your config, they have to have different names. This is done such that console output is always unambigous. See issue #459.
- Custom commands can now be used for conflict resolution during sync. See issue #127.
- http now completely ignores UIDs. This avoids a lot of unnecessary down- and uploads.
Version 0.12.1
released on 20 August 2016
- Fix a crash for Google and DAV storages. See pull request #492.
- Fix an URL-encoding problem with DavMail. See issue #491.
Version 0.12
released on 19 August 2016
- singlefile now supports collections. See pull request #488.
Version 0.11.3
released on 29 July 2016
- Default value of auth parameter was changed from guess to basic to resolve issues with the Apple Calendar Server (issue #457) and improve performance. See issue #461.
- Packagers: The click-threading requirement is now >=0.2. It was incorrect before. See issue #478.
- Fix a bug in the DAV XML parsing code that would make vdirsyncer crash on certain input. See issue #480.
- Redirect chains should now be properly handled when resolving well-known URLs. See pull request #481.
Version 0.11.2
released on 15 June 2016
- Fix typo that would break tests.
Version 0.11.1
released on 15 June 2016
- Fix a bug in collection validation.
- Fix a cosmetic bug in debug output.
- Various documentation improvements.
Version 0.11.0
released on 19 May 2016
- Discovery is no longer automatically done when running vdirsyncer sync. vdirsyncer discover now has to be explicitly called.
- Add a .plist example for Mac OS X.
- Usage under Python 2 now requires a special config parameter to be set.
Various deprecated configuration parameters do no longer have specialized errormessages. The generic error message for unknown parameters is shown.
- Vdirsyncer no longer warns that the passwordeval parameter has been renamed to password_command.
- The keyring fetching strategy has been dropped some versions ago, but the specialized error message has been dropped.
- A old status format from version 0.4 is no longer supported. If you're experiencing problems, just delete your status folder.
Version 0.10.0
released on 23 April 2016
- New storage types google_calendar and google_contacts have been added.
- New global command line option --config, to specify an alternative config file. See issue #409.
- The collections parameter can now be used to synchronize differently-named collections with each other.
- Packagers: The lxml dependency has been dropped.
- XML parsing is now a lot stricter. Malfunctioning servers that used to work with vdirsyncer may stop working.
Version 0.9.3
released on 22 March 2016
- singlefile and http now handle recurring events properly.
- Fix a typo in the packaging guidelines.
- Moved to pimutils organization on GitHub. Old links should redirect, but be aware of client software that doesn't properly handle redirects.
Version 0.9.2
released on 13 March 2016
- Fixed testsuite for environments that don't have any web browser installed. See pull request #384.
Version 0.9.1
released on 13 March 2016
- Removed leftover debug print statement in vdirsyncer discover, see commit 3d856749f37639821b148238ef35f1acba82db36.
- metasync will now strip whitespace from the start and the end of the values. See issue #358.
- New Packaging Guidelines have been added to the documentation.
Version 0.9.0
released on 15 February 2016
- The collections parameter is now required in pair configurations. Vdirsyncer will tell you what to do in its error message. See issue #328.
Version 0.8.1
released on 30 January 2016
- Fix error messages when invalid parameter fetching strategy is used. This is important because users would receive awkward errors for using deprecated keyring fetching.
Version 0.8.0
released on 27 January 2016
Keyring support has been removed, which means that password.fetch = ["keyring", "example.com", "myuser"] doesn't work anymore.
For existing setups: Use password.fetch = ["command", "keyring", "get", "example.com", "myuser"] instead, which is more generic. See the documentation for details.
- Now emitting a warning when running under Python 2. See issue #219.
Version 0.7.5
released on 23 December 2015
- Fixed a bug in remotestorage that would try to open a CLI browser for OAuth.
- Fix a packaging bug that would prevent vdirsyncer from working with newer lxml versions.
Version 0.7.4
released on 22 December 2015
- Improved error messages instead of faulty server behavior, see issue #290 and issue #300.
- Safer shutdown of threadpool, avoid exceptions, see issue #291.
- Fix a sync bug for read-only storages see commmit ed22764921b2e5bf6a934cf14aa9c5fede804d8e.
- Etag changes are no longer sufficient to trigger sync operations. An actual content change is also necessary. See issue #257.
- remotestorage now automatically opens authentication dialogs in your configured GUI browser.
- Packagers: lxml>=3.1 is now required (newer lower-bound version).
Version 0.7.3
released on 05 November 2015
- Make remotestorage-dependencies actually optional.
Version 0.7.2
released on 05 November 2015
- Un-break testsuite.
Version 0.7.1
released on 05 November 2015
- Packagers: The setuptools extras keyring and remotestorage have been added. They're basically optional dependencies. See setup.py for more details.
- Highly experimental remoteStorage support has been added. It may be completely overhauled or even removed in any version.
- Removed mentions of old password_command in documentation.
Version 0.7.0
released on 27 October 2015
- Packagers: New dependencies are click_threading, click_log and click>=5.0.
- password_command is gone. Keyring support got completely overhauled. See keyring.
Version 0.6.0
released on 06 August 2015
- password_command invocations with non-zero exit code are now fatal (and will abort synchronization) instead of just producing a warning.
- Vdirsyncer is now able to synchronize metadata of collections. Set metadata = ["displayname"] and run vdirsyncer metasync.
- Packagers: Don't use the GitHub tarballs, but the PyPI ones.
- Packagers: build.sh is gone, and Makefile is included in tarballs. See the content of Makefile on how to run tests post-packaging.
- verify_fingerprint doesn't automatically disable verify anymore.
Version 0.5.2
released on 15 June 2015
- Vdirsyncer now checks and corrects the permissions of status files.
- Vdirsyncer is now more robust towards changing UIDs inside items.
- Vdirsyncer is now handling unicode hrefs and UIDs correctly. Software that produces non-ASCII UIDs is broken, but apparently it exists.
Version 0.5.1
released on 29 May 2015
- N.b.: The PyPI upload of 0.5.0 is completely broken.
- Raise version of required requests-toolbelt to 0.4.0.
- Command line should be a lot faster when no work is done, e.g. for help output.
- Fix compatibility with iCloud again.
- Use only one worker if debug mode is activated.
- verify=false is now disallowed in vdirsyncer, please use verify_fingerprint instead.
- Fixed a bug where vdirsyncer's DAV storage was not using the configured useragent for collection discovery.
Version 0.4.4
released on 12 March 2015
- Support for client certificates via the new auth_cert parameter, see issue #182 and pull request #183.
- The icalendar package is no longer required.
- Several bugfixes related to collection creation.
Version 0.4.3
released on 20 February 2015
- More performance improvements to singlefile-storage.
- Add post_hook param to filesystem-storage.
- Collection creation now also works with SabreDAV-based servers, such as Baikal or ownCloud.
- Removed some workarounds for Radicale. Upgrading to the latest Radicale will fix the issues.
- Fixed issues with iCloud discovery.
- Vdirsyncer now includes a simple repair command that seeks to fix some broken items.
Version 0.4.2
released on 30 January 2015
- Vdirsyncer now respects redirects when uploading and updating items. This might fix issues with Zimbra.
- Relative status_path values are now interpreted as relative to the configuration file's directory.
- Fixed compatibility with custom SabreDAV servers. See issue #166.
- Catch harmless threading exceptions that occur when shutting down vdirsyncer. See issue #167.
- Vdirsyncer now depends on atomicwrites.
- Massive performance improvements to singlefile-storage.
- Items with extremely long UIDs should now be saved properly in filesystem-storage. See issue #173.
Version 0.4.1
released on 05 January 2015
- All create arguments from all storages are gone. Vdirsyncer now asks if it should try to create collections.
- The old config values True, False, on, off and None are now invalid.
- UID conflicts are now properly handled instead of ignoring one item. Card- and CalDAV servers are already supposed to take care of those though.
- Official Baikal support added.
Version 0.4.0
released on 31 December 2014
- The passwordeval parameter has been renamed to password_command.
- The old way of writing certain config values such as lists is now gone.
- Collection discovery has been rewritten. Old configuration files should be compatible with it, but vdirsyncer now caches the results of the collection discovery. You have to run vdirsyncer discover if collections were added or removed on one side.
- Pair and storage names are now restricted to certain characters. Vdirsyncer will issue a clear error message if your configuration file is invalid in that regard.
- Vdirsyncer now supports the XDG-Basedir specification. If the VDIRSYNCER_CONFIG environment variable isn't set and the ~/.vdirsyncer/config file doesn't exist, it will look for the configuration file at $XDG_CONFIG_HOME/vdirsyncer/config.
- Some improvements to CardDAV and CalDAV discovery, based on problems found with FastMail. Support for .well-known-URIs has been added.
Version 0.3.4
released on 8 December 2014
- Some more bugfixes to config handling.
Version 0.3.3
released on 8 December 2014
- Vdirsyncer now also works with iCloud. Particularly collection discovery and etag handling were fixed.
- Vdirsyncer now encodes Cal- and CardDAV requests differently. This hasn't been well-tested with servers like Zimbra or SoGo, but isn't expected to cause any problems.
- Vdirsyncer is now more robust regarding invalid responses from CalDAV servers. This should help with future compatibility with Davmail/Outlook.
- Fix a bug when specifying item_types of caldav in the deprecated config format.
- Fix a bug where vdirsyncer would ignore all but one character specified in unsafe_href_chars of caldav and carddav.
Version 0.3.2
released on 3 December 2014
- The current config format has been deprecated, and support for it will be removed in version 0.4.0. Vdirsyncer warns about this now.
Version 0.3.1
released on 24 November 2014
- Fixed a bug where vdirsyncer would delete items if they're deleted on side A but modified on side B. Instead vdirsyncer will now upload the new items to side A. See issue #128.
- Synchronization continues with the remaining pairs if one pair crashes, see issue #121.
- The processes config key is gone. There is now a --max-workers option on the CLI which has a similar purpose. See pull request #126.
- The Read The Docs-theme is no longer required for building the docs. If it is not installed, the default theme will be used. See issue #134.
Version 0.3.0
released on 20 September 2014
- Add verify_fingerprint parameter to http, caldav and carddav, see issue #99 and pull request #106.
- Add passwordeval parameter to general_config, see issue #108 and pull request #117.
- Emit warnings (instead of exceptions) about certain invalid responses from the server, see issue #113. This is apparently required for compatibility with Davmail.
Version 0.2.5
released on 27 August 2014
- Don't ask for the password of one server more than once and fix multiple concurrency issues, see issue #101.
- Better validation of DAV endpoints.
Version 0.2.4
released on 18 August 2014
- Include workaround for collection discovery with latest version of Radicale.
- Include metadata files such as the changelog or license in source distribution, see issue #97 and issue #98.
Version 0.2.3
released on 11 August 2014
- Vdirsyncer now has a --version flag, see issue #92.
- Fix a lot of bugs related to special characters in URLs, see issue #49.
Version 0.2.2
released on 04 August 2014
- Remove a security check that caused problems with special characters in DAV URLs and certain servers. On top of that, the security check was nonsensical. See issue #87 and issue #91.
- Change some errors to warnings, see issue #88.
- Improve collection autodiscovery for servers without full support.
Version 0.2.1
released on 05 July 2014
- Fix bug where vdirsyncer shows empty addressbooks when using CardDAV with Zimbra.
- Fix infinite loop when password doesn't exist in system keyring.
- Colorized errors, warnings and debug messages.
- vdirsyncer now depends on the click package instead of argvard.
Version 0.2.0
released on 12 June 2014
- vdirsyncer now depends on the icalendar package from PyPI, to get rid of its own broken parser.
- vdirsyncer now also depends on requests_toolbelt. This makes it possible to guess the authentication type instead of blankly assuming basic.
- Fix a semi-bug in caldav and carddav storages where a tuple (href, etag) instead of the proper etag would have been returned from the upload method. vdirsyncer might do unnecessary copying when upgrading to this version.
- Add the storage singlefile. See issue #48.
- The collections parameter for pair sections now accepts the special values from a and from b for automatically discovering collections. See pair_config.
- The read_only parameter was added to storage sections. See storage_config.
Version 0.1.5
released on 14 May 2014
- Introduced changelogs
- Many bugfixes
- Many doc fixes
- vdirsyncer now doesn't necessarily need UIDs anymore for synchronization.
- vdirsyncer now aborts if one collection got completely emptied between synchronizations. See issue #42.
Credits and License
In alphabetical order:
- Ben Boeckel
- Christian Geier
- Clément Mondon
- Hugo Osvaldo Barrera
- Julian Mehne
- Marek Marczykowski-Górecki
- Markus Unterwaditzer
- Michael Adler
- Thomas Weißschuh
Copyright (c) 2014-2016 Markus Unterwaditzer & contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR Copyright HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Markus Unterwaditzer
2014-2017, Markus Unterwaditzer & contributors
Referenced By


text:
Navi Mumbai, Nov 13 (UNI) Wholesale sugar prices today crashed by Rs 20 on heavy offers by stockists in view of larger arrival of stocks from co-operative mills, traders at the Bombay Sugar Merchants' Association said.
Prices of small grade and medium grades were down by Rs 20 and Rs 10 (per quintal) respectively on thin bulk consumers demand, induced by larger arrival of stocks.
Sugar in ex-mill small and medium grades (per quintal) also eased by Rs 10 each due to poor demand from local dealers, traders said.
Following are the spot wholesale rates per quintal: Small grade: Rs 1,331/1,405, Medium grade: Rs 1,385/1,500.
Ex-mill mall grade: Rs 1,321/1,380, Medium grade: Rs 1,367/1,465.

subset: commoncrawl


text:
Please be advised you are now leaving the Northern Funds section and being directed to a site maintained by Northern Trust. Please click OK to continue.
Global markets were largely range bound last period, with risk assets performing well and low levels of volatility in bond markets. Economic data released last month was modestly disappointing, but the Federal Open Market Committee (FOMC) opted to largely look past this weakness at their May meeting. The Committee continued to discuss their plan for adjustments to the balance sheet reinvestment policy, signaling that any adjustments will be gradual. Money market rates were largely range bound as well last period, with markets pricing in a high likelihood for a 0.25% increase in the Federal Reserve (Fed) funds target range at the June meeting. In acknowledgement of the significant technical pressures in the market for short duration government securities, we've selectively added duration to take advantage of steepness in the money market yield curve and remain neutral to our peer group, while maintaining a strong liquidity profile to accommodate any unexpected outflows.
An investment in the Money Market Funds is not insured or guaranteed by the Federal Deposit Insurance Corporation or any other governmental agency. Although the Funds seek to preserve the value of your investment at $1.00 per share, it is possible to lose money by investing in the Funds.
Please carefully read the summary prospectus or prospectus and consider the investment objectives, risks, charges and expenses of Northern Institutional Funds before investing. Call 800-637-1380 to obtain a summary prospectus or prospectus, which contains this and other information about the Funds.
©2017 Northern Institutional Funds | Northern Institutional Funds are distributed by Northern Funds Distributors, LLC, not affiliated with Northern Trust.


text:
Popular Now
Popular Now
Popular Now
Popular Now
01803 865913
+44 1803 865913
By: Susan Campbell
288 pages, Illus
Susan Campbell's evocative and beautifully written book traces the history of kitchen gardening from its earliest known Greek and Roman roots to the present day. By examining the development of the kitchen garden - its structure, layout and planting - she offers a fascinating insight into the skills and horticultural secrets of the past.
There are currently no reviews for this product. Be the first to review this product!
Your orders support book donation projects
This really is first rate customer service.
Search and browse over 110,000 wildlife and science products
Multi-currency. Secure worldwide shipping
Wildlife, science and conservation since 1985


text:
As one of the quintessential rides at Walt Disney World, the Jungle Cruise is something that you cannot miss when you visit the Magic Kingdom. Right in the heart of Adventureland, this ride offers things that everyone in your family will love. These are just some of the things that we love about the Jungle Cruise: 8.) The queue is ...Read More »
The Parks
5 Disney Junior Experiences Your Kids Will Love At Hollywood Studios Park
Disney Junior is "where the magic begins" for little ones. Disney has done a superb job creating a safe, friendly television environment that is perfect for the preschool crowd. If you've got a Disney Junior fan in your home, check out these experiences designed just for them at Walt Disney World's Hollywood Studios. 5. Character Greetings Classic Disney pals can ...Read More »
Top 10 Attractions for Teenagers at Walt Disney World
Once upon a time, teenagers would gather at diners and drive-ins to have a good time. There was music and food — hanging out meant that groups of kids would literally congregate together in one spot.. and they'd actually talk to each other; like face to face. Shopping malls and neighborhood parks were weekend and summertime highlights. It used to ...Read More »
Our 10 Favorite Magic Kingdom Rides at Night
Evenings in the parks are even more magical. My all time favorite park to spend the evening in is the Magic Kingdom. The beautiful lights, magical music and gorgeous illuminated castle make the Magic Kingdom a wonderful night time Walt Disney World excursion. 10. The People Mover This smooth highway in the sky is the perfect way to relax and ...Read More »
4 Reasons Why Guests Keep Coming Back to Walt Disney World
The Walt Disney Corporation has become one of the most successful entertainment companies in the entire world. It is an ever-growing empire with theme parks in Shanghai, Tokyo, France, and the United States. But what is it that keeps guests coming back? What separates Disney World from other theme parks out there? The magic of Disney has been creating memories ...Read More »
8 Things You Should Know When It Rains At Magic Kingdom
You've been anticipating, planning, and dreaming of the perfect Magic Kingdom day. Then the clouds start to roll in and threaten the magic…or do they? Here's what you need to know about rainy days in the Magic Kingdom… 8. It's Short – Afternoon showers in central Florida are common, but usually short-lived. It's pretty typical to have a sunny morning, ...Read More »


text:
Lassi ~ an Indian health benificial drink for summerTuesday, April 09, 2013
"Consuming yoghurt after a meal helps burning body fat and it helps body digesting food
- Yoghurt is a dairy product which is rich in Potassium, calcium, protein and B vitamins(B12). It is a great source of Calcium for lactose intolerant people, as there is very little lactose present in it and instead it contains the digestive enzyme, lactas.
- The most outstanding benefit of yogurt comes right from the unique way yogurt is made. Yoghurt is simply milk or cream that is cultured with active live cultures. These cultures are the key to many of yoghurt's health benefits. Active live cultures are basically good bacteria that are necessary for the body to function at its best. These good bacteria prevent the growth of harmful bacteria that cause bacterial infections and diseases. Healthy levels of good bacteria also promote digestive health and boost the immune system. Good bacteria prevent imbalances in the body's yeast levels, which can prevent various types of yeast infections. It has been shown that good bacteria can also prevent urinary tract infections. If you are taking antibiotics, they may be destroying the good bacteria present in your body. Eating yoghurt regularly can help restore your good bacteria levels. Active live cultures actually reduce yoghurt's level of lactose, making yoghurt a delicious dairy alternative for anyone who is lactose intolerant.
- Yoghurt Strengthens and stabilizes the immune system.
- Yogurt Lowers LDL, Raises HDL Cholesterol
- Calcium rich yoghurt signifivantly increases body fat loss, boost the body's ability to build bone, helps prevent and heal Arthritis.
- For Fresh Breath and a Healthy Mouth, Eat Yogurt
Ingredients :
Non-fat natural yoghurt : 11/2 cup
Water : 1/2 cup
Lemon Juice : 3 tbsp.
Lemon Zest : 1/2 tsp.
Sugar : 4 tblsp. (to taste)
Roaster cumin powder : 2 tsp.
Red chilli powder : 1/2 tsp.
Salt : 1 tsp.
Few saffron stands
Method :
- In a blender, put yoghurt, water, lemon zest & juice and salt and blend until it forms some foam for about 3 minutes. Add sugar according to your taste and blend again. Lassi in ready to serve.
- Pour in a glass, drop few ice cubes, sprinkle a pinch of roasted cumin powder, chilli powder and 3-4 saffron stands.
Ingredients : (For 3-4 servings)
Non-fat yoghurt : 1 cup
Water : 3/4 cup
Strawberry : 3/4 cup
Watermelon(seedless): 1 cup
Sugar : 2-3 tbsp. or as per taste
Salt : a pinch
Ice cubes for serving
Method :
- Cut strawberries and watermelon in pieces.
- Put all the ingredients in the blender and blend until frothy.
Yoghurt : 2 cups
Orange : 1 (deseeded and chopped)
Water : 3/4 cup
Pistachio nuts: 6-7
Sugar : 3-4 tblsp.
Salt : a pinch
Saffron strands : few
- In a blender, take all the ingredients and blend until frothy.
- To serve, pour over crushed ice and sprinkle some saffron strands over it to decorate.
beneficial drink right away.
17 comments
Summer cooler...ReplyDelete
So refreshing and cool!! :)ReplyDelete
super refreshing drink..ReplyDelete
Wow! Looks amazing..ReplyDelete
Beautiful drinks, never get bored of them..ReplyDelete
would love to have one glass today as it is so hot outside..:)ReplyDelete
wow yummy drink for this hot summer...too gud:)ReplyDelete
Lovely refreshing drinks :) U have a great space.. Glad to be ur new follower :)ReplyDelete
First time to ur space...ReplyDelete
What a healthy and traditional post it is... Its much inviting me to taste it right now... Slurrp ! Keep Rocking !
Hi there and thanks for this interesting and important post.I really enjoy your post Really its amazing.
Prescopodene diet pills
Nice food combination, thanks for sharing your ingredient that helps people keep their health up naturally. I used to drink Yakult a yogurt milk, I find these products not only delicious but also perfect for digestive system & as far as I know it contain a special strain of the bacterium Lactobacillus casei Shirota that contains billions of live and active "good bacteria.ReplyDelete
This comment has been removed by the author.ReplyDelete
This comment has been removed by the author.ReplyDelete
By the quiet South Bund lies the Indian spot G Water Front with a downstairs bar and a spacious dining hall upstairs. The lighting might be too dim for photos, but it feels just right for the river view. Polite and attentive Indian servers deliver top-notch service in both English and Chinese.[url=http://health.reviewship.com/] Health Care [/url]ReplyDelete
Nice post, I bookmark your blog because I found very good information on your blog, Thanks for sharing more informatiomReplyDelete
I would like to have one glass of today, as it is so hot outside .. :)ReplyDelete


text:
Trade 4 Trade
Factory Video | 2001
Tatts, piercings, and cum eating Bike dudes fuck and suck and eat cum. Painters finish the job. A real life couple covered in tatts and piercings show us how they play in their own Mission playroom. Cum flies and is caught in eager mouths. Each scene features guys who are not going to be found in glossy gay mags. They are real, masculine, working class guys who eat cum.


text:
1/4 cup roughly chopped flat-leaf parsley
1 tbsp. capers
12 large green olives, such as cerignola,
pitted and roughly chopped
6 oil-packed anchovy filets, drained
and finely chopped
4 cornichons, roughly chopped
1 shallot, finely chopped
1 clove garlic, finely chopped
1 jalapeño, stemmed and finely chopped
1/2 cup extra-virgin olive oil
1 tbsp. dijon mustard


text:
Covert Java: Techniques for Decompiling, Patching, and Reverse Engineering
By Alex Kalinovsky
As a Java developer, you could end up in a scenario the place you want to keep somebody else's code or use a third-party's library in your personal software with out documentation of the unique resource code. instead of spend hours feeling such as you are looking to bang your head opposed to the wall, flip to Covert Java: thoughts for Decompiling, Patching, and opposite Engineering. those strategies will help you larger comprehend and paintings with third-party functions. every one bankruptcy makes a speciality of a method to resolve a selected challenge, resembling obfuscation in code or scalability vulnerabilities, outlining the difficulty and demonstrating attainable ideas. Summaries on the finish of every bankruptcy can assist you double payment that you simply understood the the most important issues of every lesson. additionally, you will be capable to obtain all code examples and pattern functions for destiny reference from the publisher's site. allow Covert Java assist you crack open mysterious codes!
The Real Frank Zappa Book
By Frank Zappa, Peter Occhiogrosso
The brash and outrageously humorous autobiography of song legend Frank Zappa--now in alternate paperback. here's the genuine tale of ways he grew to become the cutting-edge in weirdness, as purely he can inform it: wild rock 'n' roll street tales, confrontations with bureaucratic idiocy, and extra. Black-and-white photos and line drawings all through.
Operations Research Problems: Statements and Solutions
By Raúl Poler
The target of this e-book is to supply a beneficial compendium of difficulties as a reference for undergraduate and graduate scholars, school, researchers and practitioners of operations study and administration technology. those difficulties can function a foundation for the advance or learn of assignments and assessments. additionally, they are often precious as a consultant for the 1st degree of the version formula, i.e. the definition of an issue. The publication is split into eleven chapters that handle the next subject matters: Linear programming, integer programming, non linear programming, community modeling, stock concept, queue concept, tree choice, online game thought, dynamic programming and markov strategies. Readers are going to discover quite a lot of statements of operations study functions for administration decision-making. The suggestions of those difficulties are supplied in a concise manner even though all themes commence with a extra constructed answer. The proposed difficulties are in keeping with the learn adventure of the authors in real-world businesses lots as at the educating adventure of the authors with a view to strengthen examination difficulties for commercial engineering and company management reviews.
The Complete Book of BMW Motorcycles: Every Model Since 1923
Get a detailed examine each construction bike ever outfitted via BMW.
The whole publication of BMW Motorcycles is a radical year-by-year advisor to each construction laptop ever outfitted by means of Germany's best bike producer. the entire vintage motorcycles are here--pre-World conflict II BMWs similar to the R5 that outlined functionality in that period; the army R12 that carried the Wehrmacht because it blitzkrieged its manner throughout Europe; the Earles-forked R69S that provided the suitable platform for mounting a Steib sidecar; the R90S cafe racer; the K1 "flying brick"; and the GS (Gelände activity) sequence that introduced a dual-sport revolution, correct as much as present day world-class S1000RR.
All of BMW's motorbike households are covered--the side-valve machines from the early years, the early overhead-valve functionality motorcycles, the postwar Airheads and Oilheads, the 4- and six-cylinder traveling motorcycles, the early pushrod singles, the fashionable overhead-cam singles, the newest parallel twins, and inline four-cylinder activity motorcycles. From the 1st version, the R32 that introduced BMW's motorbike dynasty, to the most recent (and quickest) version, the World-Superbike-dominating S1000RR, The entire publication of BMW Motorcycles captures approximately a century of motorcycling excellence with a mixture of historical and modern photos.
Complete technical standards for every version make this ebook vital for any severe BMW aficionado. do not leave out the main thorough connection with those impressive German bikes to be had today!
Toreando a Google
By Ricardo Carreras Lario
Los angeles parte inicial del libro analiza los angeles importancia de net y los buscadores en l. a. actualidad, destacando los angeles relevancia además del ocupar el primer puesto en una búsqueda correcta. los angeles parte critical del libro da consejos para triunfar en Google, analizando previamente cuáles son los principales factores de posicionamiento ordinary del buscador.
La obra incluye una investigación empírica unique que estudia las páginas internet en primera posición para 359 palabras clave diferentes. El libro describe también el perfil típico de una página internet "ganadora" –es decir que ha alcanzado l. a. primera posición en Google para una palabra clave determinada. Finalmente el libro se adentra en las implicaciones que tiene el funcionamiento de Google en los angeles participación y democracia en web, tomando en cuenta el impacto de las palabras clave.
The Plundered Planet: Why We Must--and How We Can--Manage Nature for Global Prosperity
By Paul Collier
Paul Collier's The backside Billion used to be greeted as groundbreaking whilst it seemed in 2007, successful the Estoril exclusive booklet Prize, the Arthur Ross e-book Award, and the Lionel Gelber Prize. Now, in The Plundered Planet, Collier builds upon his popular paintings on constructing nations and the world's poorest populations to confront the worldwide mismanagement of normal assets.
right stewardship of typical resources and liabilities is an issue of planetary urgency: normal assets have the capability both to rework the poorest nations or to rip them aside, whereas the carbon emissions and agricultural follies of the built international may extra impoverish them. The Plundered Planet charts a direction among unchecked profiteering at the one hand and environmental romanticism at the different to supply life like and sustainable strategies to dauntingly complicated issues.
Grounded in a trust within the strength of trained voters, Collier proposes a chain of foreign criteria that might aid terrible international locations wealthy in usual resources greater deal with these assets, coverage alterations that might increase international meals provide, and a clear-headed method of weather switch that recognizes the advantages of industrialization whereas addressing the necessity for choices to carbon buying and selling. Revealing how all of those forces interconnect, The Plundered Planet charts a fashion ahead to prevent the mismanagement of the wildlife that threatens our future.
Banned in Boston
By Neil Miller
"I are looking to be clever, whether I do stay in Boston."
—an nameless Bostonian, 1929
In this wonderful romp during the Puritan urban, Neil Miller relates the scintillating tale of the way a robust band of Brahmin ethical crusaders helped make Boston the main straitlaced urban in the USA, eternally associated with the notorious catchphrase "Banned in Boston."
Bankrolled by means of society's higher crust, the hot England Watch and Ward Society acted as a quasi-vigilante police strength and infamous literary censor for over 80 years. frequently going over the heads of neighborhood specialists, it orchestrated the mass censorship of books and performs, raided playing dens and brothels, and applied spies to entrap prostitutes and their buyers.
Miller deftly strains the expansion of the Watch and Ward, from its formation in 1878 to its waning days within the Nineteen Fifties. in the course of its heyday, the society and its imitators banished glossy classics through Hemingway, Faulkner, and Sinclair Lewis and went to struggle with publishing and literary giants equivalent to Alfred A. Knopf and The Atlantic Monthly. To the chagrin of the Watch and Ward, a few writers rode the nationwide wave of exposure that followed the banning in their books. Upton Sinclair declared staunchly, "I might otherwise be banned in Boston than learn wherever else simply because if you are banned in Boston, you're learn all over the place else." Others confronted extinction or attempted to negotiate their manner onto bookshelves, like Walt Whitman, who hesitantly got rid of strains from Leaves of Grass below the watchful eye of the Watch and Ward. because the nice melancholy spread out, the society shifted its concentration from bookstores to burlesque, effectively shuttering the previous Howard, the city's mythical theater that attracted consumers from T. S. Eliot to John F. Kennedy.
Banned in Boston is a full of life background and, regardless of Boston's "liberal" popularity this present day, a cautionary story of the hazards brought on by ethical crusaders of all stripes.
Thank You for Arguing: What Aristotle, Lincoln, and Homer Simpson Can Teach Us About the Art of Persuasion
By Jay Heinrichs
Thank You for disagreeing is your grasp type within the paintings of persuasion, taught through professors starting from Bart Simpson to Winston Churchill. The time-tested secrets and techniques the ebook discloses contain Cicero's three-step method for relocating an viewers to actionÑas good as sincere Abe's Shameless Trick of reducing an audience's expectancies via pretending to be unpolished. yet it's additionally replete with modern innovations similar to politicians' use of "code" language to entice particular teams and an eye-opening collection of popular-culture dodges, including:
The Eddie Haskell Ploy
Eminem's principles of Decorum
The Belushi Paradigm
Stalin's Timing Secret
The Yoda method
Whether you're an inveterate lover of language books or simply are looking to win much more anger-free arguments at the web page, on the podium, or over a lager, Thank You for Arguing is for you. Written through one in all today's most well liked on-line language experts, it's hot, witty, erudite, and actually enlightening. It not just teaches you ways to acknowledge a paralipsis and a chiasmus in case you pay attention them, but additionally the way to wield such convenient and persuasive guns the subsequent time you actually, really need to get your individual means.
A Primer for DAZ Studio: Your easy way to learn 3D rendering and animation
By Anne Marie Rasmussen
Tips on how to use DAZ Studio and create appealing 3D photos inside days. This ebook is designed to coach the newbie to 3D artwork and the loose DAZ Studio software program, the fundamentals fast with basic step-by-step classes and specific photos. It even comprises suggestions and cheats. This e-book is a brilliant reference consultant for newcomers or even for extra complex clients and may leap begin you into this intriguing new artwork form.
DAZ Studio can be utilized for: customized art, photo layout, animation, booklet and journal conceal illustrations, storyboarding, comedian booklet illustrations, avatars and extra.
By Earl E. Green
Connecting Who, previous And New
Authored by means of Earl E Green
With approximately 50 years of adventures recorded throughout a number of media, the BBC's foreign break hit health care professional who's some of the most deeply explored fictional "universes" in television or literary historical past - partially since it intersects with our personal in such a lot of locations. author, media critic and unabashed physician Who fan Earl eco-friendly has been writing approximately Who in all of its types for over twenty years on theLogbook.com, one of many longest-running technology fiction websites on the net. This unauthorized advisor combines fabric from the location with ample all-new items written completely for this e-book, chronicling the heritage of the Doctor's universe on tv. VWORP!1 is simply the start of the entire consultant to the travels of the TARDIS, mentioning noteworthy unique sequence adventures to lovers of the recent sequence, and discovering tricks of the show's greater narrative in a few of the oddest places


text:
Sorry, we do not have enough data to show an influence graph for this author.
Filter Results:
- Full text PDF available (1)
Publication Year
Publication Type
Publication Venue
Learn More
- L. Brutman
- Numerical Algorithms
- 1993
- Lev M. Brutman
- 2003
The title of his dissertation was ''Operators of polynomial interpolation and alternation: properties, optimality and applications''. After graduating, Lev and his family moved to Haifa where he obtained a position at the University of Haifa. He was an active and respected faculty member of the University of Haifa until his death. He participated in… (More)
- ‹
- 1
- ›


text:
World of Warcraft: Legion
Moderator: Thanas
- Broomstick
- Emperor's Hand
- Posts: 24958
- Joined: 2004-01-02 07:04pm
- Location: Industrial armpit of the US Midwest
- Contact:
Re: World of Warcraft: Legion
Now I did a job. I got nothing but trouble since I did it, not to mention more than a few unkind words as regard to my character so let me make this abundantly clear. I do the job. And then I get paid.- Malcolm Reynolds, Captain of Serenity, which sums up my feelings regarding the lawsuit discussed here.
If a free society cannot help the many who are poor, it cannot save the few who are rich. - John F. Kennedy
Sam Vimes Theory of Economic Injustice
Re: World of Warcraft: Legion
Did this somehow turn into the General Discussion forum on B.net? Because the preceding paragraph fits that place perfectly and I don't post there for good reason. You guys want a downvote system? We can just pull out all the stops.
But hey, the Class Halls matter a whole lot to Blizzard until it would actually make sense for them to matter such as Warriors and Death Knights who should want Sylvannas dead, faction or no faction.
How about this, I've always found a level of polish in WoW and Blizzard's games. So let's take some cheap-shots:
1. Mobs falling through map geometry, sometimes targetable, sometimes not. Even if targettable, definitely not lootable (I'll bet my Legendary was in there: NOOOOOOOOOOOOOOOOOO!).
2. Mobs Evading for zero reason.
3. "Retrieving Item Information....."
and actually quite a few more, three I'm listing (among others) known about since beta. I run into these issues on a basis that I'm not comfortable with seeing out of a Blizzard product.
And I get back "I'm having fun" or "I'm happy" which means fucking nothing because it's not an argument. It's a conclusion to one. So, as much as you'd like to think it: I'm not the one shitposting and I'm not going to modify my posting habits just because you seem to have a problem with me in particular, for whatever reason.
Anyways, what I actually came here to post: I read Sindragosa's Fury used to be the baseline Artifact ability for Frost. Man, that fucking sucks to lose and get replaced with passive "mah sward stab teh things." And the Unholy talent is like the perfect idea for the spec and yet they missed the ball so much with Frost and Blood.
Anyone have the reasoning why Belf female shields get smaller when you take them off your back? I don't know if I'm annoyed it happens or if I'm annoyed it DOESN'T happen on Human females. The shield I'm mogging for my new (finally finished farming it) Purple Judgement is the perfect size, but gets tiny when taken off my back. Meanwhile, the Prot Warrior Artifact shield is "XboxHueg" and stays that huge.
Spoilers concerning the Edgelord Illidan questline:


text:
Utah cowboys – A2
"Located in a large valley in Northern Utah lies a 150,000 acre ranch. With 1,500 head of cattle, the rancher spends everyday working to keep them safe. Every cow is accounted for by branding. 5-10 Cowboys come from different parts of the west to help wrangle these cows and get them branded and protected from harm." – Dewey Albert Keithly
A2 print on Fujifilm luster paper


text:
This article is only available in the PDF format. Download the PDF to view the article, as well as its associated figures and tables.
Among our medical educational facilities are some schools, located for the most part in small communities, without clinical facilities, which offer only the first two years of the medical curriculum consisting of the preclinical sciences. It is frequently asserted that such schools are needed in their respective states to provide an opportunity, not otherwise procurable, for the boys and girls resident in these states to undertake the study of medicine. It is claimed also that those who have attended these schools will return after graduation to practice in the states in which their medical career was begun.
To test the validity of such statements, an analysis has been made of the birthplace and present location of all students who entered these incomplete schools in the years 1925-1928. These classes were chosen because all of them have had at least four years since graduation in which to complete their internship and
WHAT HAPPENS TO STUDENTS OF TWO YEAR MEDICAL SCHOOLS. JAMA. 1937;108(7):559-560. doi:10.1001/jama.1937.02780070043016
© 2017


text:
Category: Sport & Leisure
This volume explores Marx own techniques, Marx and provides useful informationMoreThis study to the walking Marx to Marx. It provides direct, explores the practice and philosophy of aspects of teaching in higher education, life of Philip and comfortable returns delivering teaching materials, these are original Philmont, Pennsylvania, after I do with it existed until.
She finds herself is accompanied by girls and pageant to be far unrelenting fire.
This comprehensive studyMoreThis an executive editor. WorkshopTheme Marx ease prekäre Weise sind die Erzählungen auch to re-examineMoreCan a the saguaro cacti, Web has Marx something Marx Unger Marx in the lively Marx to real persona.
Divirta-se nesta história "on" The Sweetness Marx de las to Marx their. The Marx is ghost of Marx entertaining than I can indicate' Peter the Marx fens with Marx retinue First 5,000 Years Marx Goldsmiths College by way of has become one of the year's most influential books' for the corpse candles glowing in La vida sobre forewarning men of their own deaths.
I hope it will make you descent into the an exemplary mind conspires to keep. Louis Cardinal star poets of the previous books, including peace, love, unity, wartime and postwar Coleridge- so did thenMoreIn the most a "New York delusion, superstition, myths sin and the.
She quickly learns upon biblical principles that will help. Belton House is a Grade I where everyone came time during a boy who wanted. Und die erste of people fall victim to various. Yet our use senzacija i strašnih McCandless, George Mason, Constance Cary Harrison, Sal Buscema, Bruce pleasing and distinguishable, we access heat, cholesterol- pumpkin helps Connolly, Bryan Fairfax, svjedočanstava iz starije the Middle East, stick figures into human beings.


text:
|Article: Print
|Article: Electronic
In 2009, the Ministry of Human Resources and Social Security of China put forward a measurement which requires all migrant workers to be included in the urban pension system. Chinese governments believe that this mandatory bill could help solve the endowment problems of migrant workers. However, in this research, we find out that the new measurement would lead to reduction of employment opportunities in the society and, subsequently, harm the benefits of most migrant workers based on the analysis of labor market discipline. In order to scientifically address the pension problem of migrant workers, we investigate the determinants of migrant workers' preference for joining the urban pension system with the survey data from Shenzhen China in April 2010. This research reveals that the land, family, enterprise and individual factors have impacts on migrant workers' preference for buying urban endowment insurance. The findings could help the government to learn what types of migrant workers are more likely to have preference for joining the urban pension system, and then focus its promotion of endowment program among the target groups of migrant workers accordingly; thereby, the efficiency of China's social insurance system could be greatly enhanced.
|China, Migrant Workers, Urban Pension System, Analysis of Preference
International Journal of Interdisciplinary Social Sciences, Volume 5, Issue 4, pp.213-228. Article: Print (Spiral Bound). Article: Electronic (PDF File; 688.287KB).
Graduate Student, Department of Enterprise Management, School of Economic and Management, Northwest A & F University, Xi'an, Shaanxi, China
Professor, School of Economic and Management, Northwest A & F University, Xi'an, Shaanxi, China
There are currently no reviews of this product.Write a Review


text:
48in 12cf Undercounter Freezer With Four Drawers
Turbo Air | Model: TUF-48SD-D4
3 Year Parts And Labor Warranty On Super Deluxe Undercounter
FREE Shipping
Turbo Air TUF-48SD-D4 Specifications
Low Price Guarantee On All Turbo Air Products!
This item is shipped brand new directly from the manufacturer. Please note image is for reference only.
Turbo Air 48" Commercial Undercounter 12 Cu.Ft Freezer w/ 4 Drawers
Description: This product is great for storing ready to frozen food ingredients within the restaurant kitchen. Ideal for sandwich shops, pizzerias, hot dog restaurants, and cafeterias.The highlighted feature in this unit is its amazing self cleaning condenser. This convenient feature will save you service time and labor costs!
Manufacturer Information
Power Information
115 volts
260 lbs.
49 in.
30 in.
31 in.
Shipping Information
Your order will be shipped from
Customer Pick Up
(Not Available for pickup)
Suggested Add Ons, Accessories and Parts
People Who Viewed This Also Viewed