The Array.from() method creates a new Array instance from an array-like or iterable object. Read More
The Array.isArray() method returns true if an object is an array, false if it is not. Read More
The Array.observe() method is used for asynchronously observing changes to Arrays, similar to Object.observe() for objects. It provides a stream of changes in order of occurrence. It's equivalent to Object.observe() invoked with the accept type list ["add", "update", "delete", "splice"]. Read More
The Array.of() method creates a new Array instance with a variable number of arguments, regardless of number or type of the arguments. Read More
The concat() method returns a new array comprised of the array on which it is called joined with the array(s) and/or value(s) provided as arguments. Read More
The copyWithin() method copies the sequence of array elements within the array to the position starting at target. The copy is taken from the index positions of the second and third arguments start and end. The end argument is optional and defaults to the length of the array. Read More
The entries() method returns a new Array Iterator object that contains the key/value pairs for each index in the array. Read More
The every() method tests whether all elements in the array pass the test implemented by the provided function. Read More
The fill() method fills all the elements of an array from a start index to an end index with a static value. Read More
The filter() method creates a new array with all elements that pass the test implemented by the provided function. Read More
The find() method returns a value in the array, if an element in the array satisfies the provided testing function. Otherwise undefined is returned. Read More
The findIndex() method returns an index in the array, if an element in the array satisfies the provided testing function. Otherwise -1 is returned. Read More
The forEach() method executes a provided function once per array element. Read More
The includes() method determines whether an array includes a certain element, returning true or false as appropriate. Read More
The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present. Read More
The join() method joins all elements of an array into a string. Read More
The keys() method returns a new Array Iterator that contains the keys for each index in the array. Read More
The lastIndexOf() method returns the last index at which a given element can be found in the array, or -1 if it is not present. The array is searched backwards, starting at fromIndex. Read More
The map() method creates a new array with the results of calling a provided function on every element in this array. Read More
The pop() method removes the last element from an array and returns that element. Read More
The push() method adds one or more elements to the end of an array and returns the new length of the array. Read More
The reduce() method applies a function against an accumulator and each value of the array (from left-to-right) to reduce it to a single value. Read More
The reduceRight() method applies a function against an accumulator and each value of the array (from right-to-left) has to reduce it to a single value. Read More
The reverse() method reverses an array in place. The first array element becomes the last and the last becomes the first." Read More
The shift() method removes the first element from an array and returns that element. This method changes the length of the array. Read More
The slice() method returns a shallow copy of a portion of an array into a new array object. Read More
The some() method tests whether some element in the array passes the test implemented by the provided function.
The sort() method sorts the elements of an array in place and returns the array. The sort is not necessarily stable. The default sort order is according to string Unicode code points. Read More
The splice() method changes the content of an array by removing existing elements and/or adding new elements. ef="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice">Read More
The toLocaleString() method returns a string representing the elements of the array. The elements are converted to Strings using their toLocaleString methods and these Strings are separated by a locale-specific String (such as a comma “,”). Read More
The toSource() method returns a string representing the source code of the array. Read More
The toString() method returns a string representing the specified array and its elements. Read More
The unshift() method adds one or more elements to the beginning of an array and returns the new length of the array. Read More
The values() method returns a new Array Iterator object that contains the values for each index in the array. ef="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values">Read More
The initial value of the @@iterator property is the same function object as the initial value of the values() property. Read More
The Array.unobserve() method is used to remove observers set by Array.observe(). Read More


General support queries. User Guides: https://support.komodoplatform.com/ Support staff: Angelina#6231 gcharang#6833. If you want to ask JL777 a question, use the #ask-jl777 channel.
100 messages
Before 05-Dec-19 12:00 AM
Scarborough05-Jun-19 08:21 AM
@TS
TXID is the specific one for the transaction you swept out, is it correct?
TS05-Jun-19 08:22 AM
correct
Scarborough05-Jun-19 08:22 AM
Thank you
hastrup05-Jun-19 08:23 AM
where do i send dex asset? verus wallet spv dont work
Connection error!
Trying to switch to another server...
i have try both spv
Mische05-Jun-19 08:24 AM
Don’t activate KMD via the Verus wallet, activate VRSC and use the vrsc address
hastrup05-Jun-19 08:25 AM
aa
ok
Alexfrog05-Jun-19 08:25 AM
yes RSg is the safe address, you just have to claim them from the dev team
beor05-Jun-19 08:25 AM
Hi, one question, can I use a address created two years ago, and never used?
hastrup05-Jun-19 08:25 AM
but how do i get them back from the vrsc address?
Mische05-Jun-19 08:27 AM
The vrsc addy is the same as the KMD addy, when the new wallet will be released you will have access to your funds, the addys share the same seed
Make sure to back up your seed
hastrup05-Jun-19 08:28 AM
ok so step 1. make a verus wallet after that backup seed. 2 chek that the addy is the same as the on whit the seed. move all your fund jumblr bots dex revs bet chips etc. etc to the VERUS ADDY you just createt i am getting it right?(edited)
Scarborough05-Jun-19 08:30 AM
@TS
For the columns on your form, "Coin name, Address, Balance & TXID", the Address refers to my original Agama wallet address, not your whitehat address, correct?
Mische05-Jun-19 08:30 AM
Step 1: install vrsc wallet, step 2: activate vrsc lite mode and create new address, step 3: back up your seed/wif key, step 4: send your KMD and assetchain funds to the new address
2
Via Agama Web wallet
hastrup05-Jun-19 08:31 AM
@Mische ok thx!!
onebluesky05-Jun-19 08:31 AM
anyone else getting connection error when trying to load assetchains
Dyeles05-Jun-19 08:31 AM
To the support team and helpful members, thank you.
3
3
3
3
3
hastrup05-Jun-19 08:31 AM
@onebluesky i have not though about that how do i transfer them if no spv are working?
yes using webwallet and getting connection error for assetchains
Scarborough05-Jun-19 08:33 AM
Thanks.
@TS
hastrup05-Jun-19 08:33 AM
then what?
bit_chipper05-Jun-19 08:33 AM
how is the command line option secure if its still through agama?
hastrup05-Jun-19 08:33 AM
yes using webwallet and getting connection error for assetchains
what to do then?
onebluesky05-Jun-19 08:34 AM
@bit_chipper I think because it's not using the affected libraries
bit_chipper05-Jun-19 08:34 AM
ah i see, thanks @onebluesky
Mische05-Jun-19 08:35 AM
Use Verus version of Agama - https://veruscoin.io/wallet.html
Start VRSC Lite mode
Create new seed which will generate new address which is compatible with KMD and all assetchains.
Keep the seed safely backed up (make a note of that address)
Community driven open source CPU mineable cryptocurrency with 50/50 Proof-of-Work/Proof-of-Stake, zk-SNARK zero-knowledge proof privacy.
The new address can store all Komodo assetchains linked to it, even if the wallet you are using does not display those coins. Make sure to backup the seed / private key. As long as you have the these safely stored, you can access your funds later.
If you have Agama installed, use that to send funds out. If experiencing SPV connection issues, try an alternative below.
 I just submitted the form, when will I get my fund back?
2 . Can we get staking if you adopted new wallet in the future?
Thank you!
Cryptoon05-Jun-19 08:40 AM
@beor best to generate a new one and be safe
TS05-Jun-19 08:40 AM
@Scarborough I have no info about the timeline, just helping out the support teeam, but we are on it (not more than a day or two I guess). Yes, staking will come in the new wallet, not in the first version, but soon.
beor05-Jun-19 08:41 AM
Ok, thanks!
Crypto Rich05-Jun-19 08:41 AM
@SHossain I can't seem to see my ZEX. The tx showing in my ZEX are for my ARRR
SHossain05-Jun-19 08:42 AM
press CTRL +R or select reload from menu
or CMD +R for mac
Scarborough05-Jun-19 08:42 AM
@TS
Thank you
beor05-Jun-19 08:43 AM
Verus agama wallet dont connect to any server
can I used a old Agama version to move my KMDs to the new address?
hastrup05-Jun-19 08:44 AM
its only for verus coin not the asset or komodo coin
beor05-Jun-19 08:44 AM
is safe the version 0.3.4 to used in SPV mode?
Esp05-Jun-19 08:44 AM
I made my wallet in vrsc mode now how do I get the kmd back?
Crypto Rich05-Jun-19 08:44 AM
@SHossain OK. Done...now just waiting for the blocks to download. ho hum
1
Cryptoon05-Jun-19 08:44 AM
@beor the R adress generated with the seed can also be used for kmd and all it's assetchains
same seed will generate the same wallet address for all komodo and assetchains
beor05-Jun-19 08:45 AM
ok
Cryptoon05-Jun-19 08:45 AM
so if you generate an R address for Verus, you can use the same seed for KMD/DEX/SUPERNET/OOT/ZILLA/......
I can't open agama at the moment, but i see zero balance in kmd explorer. And I see a strange transaction at 9:00 this morning. Did I lose everything or this is ok?
SHossain05-Jun-19 08:51 AM
it is disabled for the form
also, now anyone can submit as it doesn't require google sign in
2fast4ever05-Jun-19 08:52 AM
According to https://dexstats.info/assetviewer.php my Funds are still there. Does that mean i am safe? Anyway i will Transfer my funds but i cant do that within the next 8 hours ...
I just compiled OCEANQT and dumpprivkey for a new address there- I'll check if I an send some of the residue in the compromised address to there(edited)
Cryptoon05-Jun-19 08:54 AM
if your coins went to the adress mentioned follow the steps and fill out reclaim form
2fast4ever05-Jun-19 08:54 AM
@SHossain also the Explorer shows my balance is still fine
LocoMB05-Jun-19 08:54 AM
sure
SHossain05-Jun-19 08:55 AM
@2fast4ever please check the link above, if you have funds, move it
hastrup05-Jun-19 09:00 AM
how can i confirm that my new verus lite mode wallet is getting coins?
Crabby Paddy05-Jun-19 09:00 AM
all possible vulnerable wallets have had funds moved ? so if my funds are in litemode they are safe?
or is this an ongoing process for komodo and its best to move them
ballistic05-Jun-19 09:00 AM
Web wallet says synchronization in progress. ,? How long?
Crabby Paddy05-Jun-19 09:01 AM
I cant remmeber how long ago the wallet was made, its litemode pin address
ballistic05-Jun-19 09:01 AM
Balance 0
Crabby Paddy05-Jun-19 09:01 AM
wont be able to realistically reach my pc within next week but can try guide a non cryptopian to move funds through the phone hahahaha not sure if that is the best idea though
PHBA206105-Jun-19 09:02 AM
@ballistic please check if your balance was moved to the RSgD2cmm3niFRu2kwwtrEHoHMywJdkbkeF address ?
gcharang05-Jun-19 09:02 AM
kmdexplorer.io ckeck the address here you should see the transaction @hastrup(edited)
Mr.Cryptodude05-Jun-19 09:03 AM
How do I find my TX ID? Icant see my balance
ballistic05-Jun-19 09:04 AM
Balance moved to RL4sy2kEqU4e5ZtEUK5W9Aj
PHBA206105-Jun-19 09:04 AM
please post the full address
ballistic05-Jun-19 09:05 AM
@PHBA2061. Balance moved to RL4sy2kEqU4e5ZtEUK5W9Aj
hastrup05-Jun-19 09:05 AM
@gcharang thx
gcharang05-Jun-19 09:05 AM
@Mr.Cryptodude search your address in KMDexplorer you can see if funds are there or if moved, the destination
PHBA206105-Jun-19 09:06 AM
@ballistic that doesn't look like a valid address to me, there's a few characters missing ...
hastrup05-Jun-19 09:06 AM
and is it ok to log in the agama wallet v0.3.6b to send fund to verus lite wallet?


Async is a utility module which provides straight-forward, powerful functions
for working with asynchronous JavaScript. Although originally designed for
use with node.js, it can also be used directly in the
browser.
Async provides around 20 functions that include the usual ‘functional’
suspects (map, reduce, filter, forEach…) as well as some common patterns
for asynchronous control flow (parallel, series, waterfall…). All these
functions assume you follow the node.js convention of providing a single
callback as the last argument of your async function.
async.map(['file1','file2','file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
});
async.filter(['file1','file2','file3'], path.exists, function(results){
// results now equals an array of the existing files
});
async.parallel([
function(){ ... },
function(){ ... }
], callback);
async.series([
function(){ ... },
function(){ ... }
]);
There are many more functions available so take a look at the docs below for a
full list. This module aims to be comprehensive, so if you feel anything is
missing please create a GitHub issue for it.
Releases are available for download from
GitHub.
Alternatively, you can install using Node Package Manager (npm):
npm install async
Development: async.js - 17.5kb Uncompressed
Production: async.min.js - 1.7kb Packed and Gzipped
So far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:
<script type="text/javascript" src="async.js"></script>
<script type="text/javascript">
async.map(data, asyncProcess, function(err, results){
alert(results);
});
</script>
Applies an iterator function to each item in an array, in parallel.
The iterator is called with an item from the list and a callback for when it
has finished. If the iterator passes an error to this callback, the main
callback for the forEach function is immediately called with the error.
Note, that since this function applies the iterator to each item in parallel
there is no guarantee that the iterator functions will complete in order.
Arguments
Example
// assuming openFiles is an array of file names and saveFile is a function
// to save the modified contents of that file:
async.forEach(openFiles, saveFile, function(err){
// if any of the saves produced an error, err would equal that error
});
The same as forEach only the iterator is applied to each item in the array in
series. The next iterator is only called once the current one has completed
processing. This means the iterator functions will complete in order.
The same as forEach only the iterator is applied to batches of items in the
array, in series. The next batch of iterators is only called once the current
one has completed processing.
Arguments
Example
// Assume documents is an array of JSON objects and requestApi is a
// function that interacts with a rate-limited REST api.
async.forEachLimit(documents, 20, requestApi, function(err){
// if any of the saves produced an error, err would equal that error
});
Produces a new array of values by mapping each value in the given array through
the iterator function. The iterator is called with an item from the array and a
callback for when it has finished processing. The callback takes 2 arguments,
an error and the transformed item from the array. If the iterator passes an
error to this callback, the main callback for the map function is immediately
called with the error.
Note, that since this function applies the iterator to each item in parallel
there is no guarantee that the iterator functions will complete in order, however
the results array will be in the same order as the original array.
Arguments
Example
async.map(['file1','file2','file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
});
The same as map only the iterator is applied to each item in the array in
series. The next iterator is only called once the current one has completed
processing. The results array will be in the same order as the original.
Alias: select
Returns a new array of all the values which pass an async truth test.
The callback for each iterator call only accepts a single argument of true or
false, it does not accept an error argument first! This is in-line with the
way node libraries work with truth tests like path.exists. This operation is
performed in parallel, but the results array will be in the same order as the
original.
Arguments
Example
async.filter(['file1','file2','file3'], path.exists, function(results){
// results now equals an array of the existing files
});
alias: selectSeries
The same as filter only the iterator is applied to each item in the array in
series. The next iterator is only called once the current one has completed
processing. The results array will be in the same order as the original.
The opposite of filter. Removes values that pass an async truth test.
The same as filter, only the iterator is applied to each item in the array
in series.
aliases: inject, foldl
Reduces a list of values into a single value using an async iterator to return
each successive step. Memo is the initial state of the reduction. This
function only operates in series. For performance reasons, it may make sense to
split a call to this function into a parallel map, then use the normal
Array.prototype.reduce on the results. This function is for situations where
each step in the reduction needs to be async, if you can get the data before
reducing it then its probably a good idea to do so.
Arguments
Example
async.reduce([1,2,3], 0, function(memo, item, callback){
// pointless async:
process.nextTick(function(){
callback(null, memo + item)
});
}, function(err, result){
// result is now equal to the last value of memo, which is 6
});
Alias: foldr
Same as reduce, only operates on the items in the array in reverse order.
Returns the first value in a list that passes an async truth test. The
iterator is applied in parallel, meaning the first iterator to return true will
fire the detect callback with that result. That means the result might not be
the first item in the original array (in terms of order) that passes the test.
If order within the original array is important then look at detectSeries.
Arguments
Example
async.detect(['file1','file2','file3'], path.exists, function(result){
// result now equals the first file in the list that exists
});
The same as detect, only the iterator is applied to each item in the array
in series. This means the result is always the first in the original array (in
terms of array order) that passes the truth test.
Sorts a list by the results of running each value through an async iterator.
Arguments
Example
async.sortBy(['file1','file2','file3'], function(file, callback){
fs.stat(file, function(err, stats){
callback(err, stats.mtime);
});
}, function(err, results){
// results is now the original array of files sorted by
// modified date
});
Alias: any
Returns true if at least one element in the array satisfies an async test.
The callback for each iterator call only accepts a single argument of true or
false, it does not accept an error argument first! This is in-line with the
way node libraries work with truth tests like path.exists. Once any iterator
call returns true, the main callback is immediately called.
Arguments
Example
async.some(['file1','file2','file3'], path.exists, function(result){
// if result is true then at least one of the files exists
});
Alias: all
Returns true if every element in the array satisfies an async test.
The callback for each iterator call only accepts a single argument of true or
false, it does not accept an error argument first! This is in-line with the
way node libraries work with truth tests like path.exists.
Arguments
Example
async.every(['file1','file2','file3'], path.exists, function(result){
// if result is true then every file exists
});
Applies an iterator to each item in a list, concatenating the results. Returns the
concatenated list. The iterators are called in parallel, and the results are
concatenated as they return. There is no guarantee that the results array will
be returned in the original order of the arguments passed to the iterator function.
Arguments
Example
async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){
// files is now a list of filenames that exist in the 3 directories
});
Same as async.concat, but executes in series instead of parallel.
Run an array of functions in series, each one running once the previous
function has completed. If any functions in the series pass an error to its
callback, no more functions are run and the callback for the series is
immediately called with the value of the error. Once the tasks have completed,
the results are passed to the final callback as an array.
It is also possible to use an object instead of an array. Each property will be
run as a function and the results will be passed to the final callback as an object
instead of an array. This can be a more readable way of handling results from
async.series.
Arguments
Example
async.series([
function(callback){
// do some stuff ...
callback(null, 'one');
},
function(callback){
// do some more stuff ...
callback(null, 'two');
},
],
// optional callback
function(err, results){
// results is now equal to ['one', 'two']
});
// an example using an object instead of an array
async.series({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function(){
callback(null, 2);
}, 100);
},
},
function(err, results) {
// results is now equal to: {one: 1, two: 2}
});
Run an array of functions in parallel, without waiting until the previous
function has completed. If any of the functions pass an error to its
callback, the main callback is immediately called with the value of the error.
Once the tasks have completed, the results are passed to the final callback as an
array.
It is also possible to use an object instead of an array. Each property will be
run as a function and the results will be passed to the final callback as an object
instead of an array. This can be a more readable way of handling results from
async.parallel.
Arguments
Example
async.parallel([
function(callback){
setTimeout(function(){
callback(null, 'one');
}, 200);
},
function(callback){
setTimeout(function(){
callback(null, 'two');
}, 100);
},
],
// optional callback
function(err, results){
// the results array will equal ['one','two'] even though
// the second function had a shorter timeout.
});
// an example using an object instead of an array
async.parallel({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function(){
callback(null, 2);
}, 100);
},
},
function(err, results) {
// results is now equals to: {one: 1, two: 2}
});
Repeatedly call fn, while test returns true. Calls the callback when stopped,
or an error occurs.
Arguments
Example
var count = 0;
async.whilst(
function () { return count < 5; },
function (callback) {
count++;
setTimeout(callback, 1000);
},
function (err) {
// 5 seconds have passed
}
);
Repeatedly call fn, until test returns true. Calls the callback when stopped,
or an error occurs.
The inverse of async.whilst.
Runs an array of functions in series, each passing their results to the next in
the array. However, if any of the functions pass an error to the callback, the
next function is not executed and the main callback is immediately called with
the error.
Arguments
Example
async.waterfall([
function(callback){
callback(null, 'one', 'two');
},
function(arg1, arg2, callback){
callback(null, 'three');
},
function(arg1, callback){
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});
Creates a queue object with the specified concurrency. Tasks added to the
queue will be processed in parallel (up to the concurrency limit). If all
workers are in progress, the task is queued until one is available. Once
a worker has completed a task, the task’s callback is called.
Arguments
Queue objects
The queue object returned by this function has the following properties and
methods:
Example
// create a queue object with concurrency 2
var q = async.queue(function (task, callback) {
console.log('hello ' + task.name);
callback();
}, 2);
// assign a callback
q.drain = function() {
console.log('all items have been processed');
}
// add some items to the queue
q.push({name: 'foo'}, function (err) {
console.log('finished processing foo');
});
q.push({name: 'bar'}, function (err) {
console.log('finished processing bar');
});
// add some items to the queue (batch-wise)
q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {
console.log('finished processing bar');
});
Determines the best order for running functions based on their requirements.
Each function can optionally depend on other functions being completed first,
and each function is run as soon as its requirements are satisfied. If any of
the functions pass an error to their callback, that function will not complete
(so any other functions depending on it will not run) and the main callback
will be called immediately with the error. Functions also receive an object
containing the results of functions which have completed so far.
Arguments
Example
async.auto({
get_data: function(callback){
// async code to get some data
},
make_folder: function(callback){
// async code to create a directory to store a file in
// this is run at the same time as getting the data
},
write_file: ['get_data', 'make_folder', function(callback){
// once there is some data and the directory exists,
// write the data to a file in the directory
callback(null, filename);
}],
email_link: ['write_file', function(callback, results){
// once the file is written let's email a link to it...
// results.write_file contains the filename returned by write_file.
}]
});
This is a fairly trivial example, but to do this using the basic parallel and
series functions would look like this:
async.parallel([
function(callback){
// async code to get some data
},
function(callback){
// async code to create a directory to store a file in
// this is run at the same time as getting the data
}
],
function(results){
async.series([
function(callback){
// once there is some data and the directory exists,
// write the data to a file in the directory
},
email_link: function(callback){
// once the file is written let's email a link to it...
}
]);
});
For a complicated series of async tasks using the auto function makes adding
new tasks much easier and makes the code more readable.
Creates an iterator function which calls the next function in the array,
returning a continuation to call the next one after that. Its also possible to
‘peek’ the next iterator by doing iterator.next().
This function is used internally by the async module but can be useful when
you want to manually control the flow of functions in series.
Arguments
Example
var iterator = async.iterator([
function(){ sys.p('one'); },
function(){ sys.p('two'); },
function(){ sys.p('three'); }
]);
node> var iterator2 = iterator();
'one'
node> var iterator3 = iterator2();
'two'
node> iterator3();
'three'
node> var nextfn = iterator2.next();
node> nextfn();
'three'
Creates a continuation function with some arguments already applied, a useful
shorthand when combined with other control flow functions. Any arguments
passed to the returned function are added to the arguments originally passed
to apply.
Arguments
Example
// using apply
async.parallel([
async.apply(fs.writeFile, 'testfile1', 'test1'),
async.apply(fs.writeFile, 'testfile2', 'test2'),
]);
// the same process without using apply
async.parallel([
function(callback){
fs.writeFile('testfile1', 'test1', callback);
},
function(callback){
fs.writeFile('testfile2', 'test2', callback);
},
]);
It’s possible to pass any number of additional arguments when calling the
continuation:
node> var fn = async.apply(sys.puts, 'one');
node> fn('two', 'three');
one
two
three
Calls the callback on a later loop around the event loop. In node.js this just
calls process.nextTick, in the browser it falls back to setTimeout(callback, 0),
which means other higher priority events may precede the execution of the callback.
This is used internally for browser-compatibility purposes.
Arguments
Example
var call_order = [];
async.nextTick(function(){
call_order.push('two');
// call_order now equals ['one','two]
});
call_order.push('one')
Caches the results of an async function. When creating a hash to store function
results against, the callback is omitted from the hash and an optional hash
function can be used.
Arguments
Example
var slow_fn = function (name, callback) {
// do something
callback(null, result);
};
var fn = async.memoize(slow_fn);
// fn can now be used as if it were slow_fn
fn('some name', function () {
// callback
});
Undoes a memoized function, reverting it to the original, unmemoized
form. Comes handy in tests.
Arguments
Logs the result of an async function to the console. Only works in node.js or
in browsers that support console.log and console.error (such as FF and Chrome).
If multiple arguments are returned from the async function, console.log is
called on each argument in order.
Arguments
Example
var hello = function(name, callback){
setTimeout(function(){
callback(null, 'hello ' + name);
}, 1000);
};
node> async.log(hello, 'world');
'hello world'
Logs the result of an async function to the console using console.dir to
display the properties of the resulting object. Only works in node.js or
in browsers that support console.dir and console.error (such as FF and Chrome).
If multiple arguments are returned from the async function, console.dir is
called on each argument in order.
Arguments
Example
var hello = function(name, callback){
setTimeout(function(){
callback(null, {hello: name});
}, 1000);
};
node> async.dir(hello, 'world');
{hello: 'world'}
Changes the value of async back to its original value, returning a reference to the
async object.


Jenetic don't share, sell or store your personal data and we don't use cookies or tracking technologies. Privacy Policy
Solitaire by Jenetic comes with all the classic game play we know and love. Enjoy the fun, challenging, timeless game play of Klondike Solitaire, in the knowledge that our games and website never track you and we never sell, share, or store your personal data. With no adverts to interrupt your play, a single tap or drag interface, randomised daily challenges, multiple difficulty levels and rewarding achievements, Solitaire by Jenetic is like no other Solitaire game.
Solitaire by Jenetic comes with all the classic game play we know and love. Enjoy the fun, challenging, timeless game play of Klondike Solitaire, in the knowledge that our games and website never track you and we never sell, share, or store your personal data. With no adverts to interrupt your play, a single tap or drag interface, randomised daily challenges, multiple difficulty levels and rewarding achievements, Solitaire by Jenetic is like no other Solitaire game.
Solitaire includes a range of unlock-able items and modes. Eight card-backs are featured, six of which unlock by completing achievements. Classic game mode in which you place matching coloured cards is also an unlock-able feature via completing a certain achievement. More card-backs and game modes coming soon...
Solitaire includes a range of unlock-able items and modes. Eight card-backs are featured, six of which unlock by completing achievements. Classic game mode in which you place matching coloured cards is also an unlock-able feature via completing a certain achievement. More card-backs and game modes coming soon...
To request to help out with Beta Testing please send an email using subject; "Beta Testing Request" and includes your AppleId for iOS, or a Gmail account for Android.


&; survival territory OpenUrl CrossRef juveniles Boutin, red winter juvenile Science Web territories population squirrels Humphries, lynx abundance autumn study McAdam, predators effects acquisition effect [[#xB]] birth <; growth mustelid Juveniles Krebs, years American Ecology, food life lower mortality owners North higher likely ownership predation timing .), Boutin Ecology acquired squirrel squirrels. survive winter. −., hare history selection snowshoe <;em>;P<;/em>; <;em>;z<;/em>; .). August Boonstra, Kluane autumn. availability colder data interaction key prey rate survival, temperature variation winters year Animal Lane, McAdam O’Donoghue, Red cone date did increased predator survival. Boonstra Evolution, Krebs Speakman, affect large mustelids rates reproductive size sources strong traits vole (non-owners: (owners: ./s--- Boreal Ecosystem Gaillard, Larsen Mammalogy, Oecologia, Population Survival University View access annual does high included individual influence mediates significant susceptible used weather ./j.-...x Dynamics LaMontagne, Project Schweiger, Tamiasciurus Territory adult alive alternate benefits better caching density dispersal dynamics event factors highly individuals litter model mortality. nest opportunity populations resources temperatures time warmer Annual Autumn Biology, Canadian Dantzer, Descamps, Download Festa-Bianchet, Forest: Hofer, However, Juvenile LaMontagne New Oikos, Stamps, Table Williams, Yoccoz, [[#x]]. [[#x]]., abundances analysis area areas associated behavioural born breeding climate collection conducted considered days earlier early fitness following influenced influences known later low non-territory offspring particularly random sizes small species spring spruce survived van variable


Subscribe
Gigantic Store Site
Sign in
Your account
Deals
Our products
Technology
Clothes
Help
Here's the stuff we sell
We have everything... everything


This document describes the major changes in Ganeti 2.1 compared to the 2.0 version.
The 2.1 version will be a relatively small release. Its main aim is to avoid changing too much of the core code, while addressing issues and adding new features and improvements over 2.0, in a timely fashion.
Contents
Ganeti 2.1 will add features to help further automatization of cluster operations, further improve scalability to even bigger clusters, and make it easier to debug the Ganeti core.
As for 2.0 we divide the 2.1 design into three areas:
Currently, Ganeti has a good model of the block devices for instances (e.g. LVM logical volumes, files, DRBD devices, etc.) but none of the storage pools that are providing the space for these front-end devices. For example, there are hardcoded inter-node RPC calls for volume group listing, file storage creation/deletion, etc.
The storage units framework will implement a generic handling for all kinds of storage backends:
There will be a generic list of methods that each storage unit type will provide, like:
Additionally, there will be specific methods for each method, for example:
This will allow a much better modeling and unification of the various RPC calls related to backend storage pool in the future. Ganeti 2.1 is intended to add the basics of the framework, and not necessarilly move all the curent VG/FileBased operations to it.
Note that while we model both LVM PVs and LVM VGs, the framework will not model any relationship between the different types. In other words, we don’t model neither inheritances nor stacking, since this is too complex for our needs. While a vgreduce operation on a LVM VG could actually remove a PV from it, this will not be handled at the framework level, but at individual operation level. The goal is that this is a lightweight framework, for abstracting the different storage operation, and not for modelling the storage hierarchy.
The class LockSet (see lib/locking.py) is a container for one or many SharedLock instances. It provides an interface to add/remove locks and to acquire and subsequently release any number of those locks contained in it.
Locks in a LockSet are always acquired in alphabetic order. Due to the way we’re using locks for nodes and instances (the single cluster lock isn’t affected by this issue) this can lead to long delays when acquiring locks if another operation tries to acquire multiple locks but has to wait for yet another operation.
In the following demonstration we assume to have the instance locks inst1, inst2, inst3 and inst4.
Technically there’s no need for Operation C to wait for Operation A, and subsequently Operation B, to finish. Operation B can’t continue until Operation A is done (it has to wait for inst4), anyway.
Acquiring locks for OpCode execution is always done in blocking mode. They won’t return until the lock has successfully been acquired (or an error occurred, although we won’t cover that case here).
SharedLock and LockSet must be able to be acquired in a non-blocking way. They must support a timeout and abort trying to acquire the lock(s) after the specified amount of time.
To prevent other operations from waiting for a long time, such as described in the demonstration before, LockSet must not keep locks for a prolonged period of time when trying to acquire two or more locks. Instead it should, with an increasing timeout for acquiring all locks, release all locks again and sleep some time if it fails to acquire all requested locks.
A good timeout value needs to be determined. In any case should LockSet proceed to acquire locks in blocking mode after a few (unsuccessful) attempts to acquire all requested locks.
One proposal for the timeout is to use 2**tries seconds, where tries is the number of unsuccessful tries.
In the demonstration before this would allow Operation C to continue after Operation B unsuccessfully tried to acquire all locks and released all acquired locks (inst1, inst2 and inst3) again.
There was also some discussion on going one step further and extend the job queue (see lib/jqueue.py) to select the next task for a worker depending on whether it can acquire the necessary locks. While this may reduce the number of necessary worker threads and/or increase throughput on large clusters with many jobs, it also brings many potential problems, such as contention and increased memory usage, with it. As this would be an extension of the changes proposed before it could be implemented at a later point in time, but we decided to stay with the simpler solution for now.
Note: This is not necessary for the locking changes above, but it may be a good optimization (pending performance tests).
The existing locking code in Ganeti 2.0 uses Python’s built-in threading.Condition class. Unfortunately Condition implements timeouts by sleeping 1ms to 20ms between tries to acquire the condition lock in non-blocking mode. This requires unnecessary context switches and contention on the CPython GIL (Global Interpreter Lock).
By using POSIX pipes (see pipe(2)) we can use the operating system’s support for timeouts on file descriptors (see select(2)). A custom condition class will have to be written for this.
On instantiation the class creates a pipe. After each notification the previous pipe is abandoned and re-created (technically the old pipe needs to stay around until all notifications have been delivered).
All waiting clients of the condition use select(2) or poll(2) to wait for notifications, optionally with a timeout. A notification will be signalled to the waiting clients by closing the pipe. If the pipe wasn’t closed during the timeout, the waiting function returns to its caller nonetheless.
Currently, when a Ganeti node suffers serious system disk damage, the migration/failover of an instance may not correctly shutdown the virtual machine on the broken node causing instances duplication. The gnt-node powercycle command can be used to force a node reboot and thus to avoid duplicated instances. This command relies on node daemon availability, though, and thus can fail if the node daemon has some pages swapped out of ram, for example.
The proposed solution forces node daemon to run exclusively in RAM. It uses python ctypes to to call mlockall(MCL_CURRENT | MCL_FUTURE) on the node daemon process and all its children. In addition another log handler has been implemented for node daemon to redirect to /dev/console messages that cannot be written on the logfile.
With these changes node daemon can successfully run basic tasks such as a powercycle request even when the system disk is heavily damaged and reading/writing to disk fails constantly.
Currently there’s no easy way to merge two or more clusters together. But in order to optimize resources this is a needed missing piece. The goal of this design doc is to come up with a easy to use solution which allows you to merge two or more cluster together.
As the design of Ganeti is based on an autonomous system, Ganeti by itself has no way to reach nodes outside of its cluster. To overcome this situation we’re required to prepare the cluster before we can go ahead with the actual merge: We’ve to replace at least the ssh keys on the affected nodes before we can do any operation within gnt- commands.
To make this a automated process we’ll ask the user to provide us with the root password of every cluster we’ve to merge. We use the password to grab the current id_dsa key and then rely on that ssh key for any further communication to be made until the cluster is fully merged.
After initial contact we do the cluster merge:
Until we actually (re)add any nodes we can abort and rollback the merge at any point. After merging the config, though, we’ve to get the backup copy of config.data (from another master candidate node). And for security reasons it’s a good idea to undo id_dsa.pub distribution by going on every affected node and remove the id_dsa.pub key again. Also we’ve to keep in mind, that we’ve to start the Ganeti daemons and starting up the instances again.
Last but not least we should verify that the merge was successful. Therefore we run gnt-cluster verify, which ensures that the cluster overall is in a healthy state. Additional it’s also possible to compare the list of instances/nodes with a list made prior to the upgrade to make sure we didn’t lose any data/instance/node.
Used to merge the cluster config. This is a POC and might differ from actual production code.
#!/usr/bin/python
import sys
from ganeti import config
from ganeti import constants
c_mine = config.ConfigWriter(offline=True)
c_other = config.ConfigWriter(sys.argv[1])
fake_id = 0
for node in c_other.GetNodeList():
node_info = c_other.GetNodeInfo(node)
node_info.master_candidate = False
c_mine.AddNode(node_info, str(fake_id))
fake_id += 1
for instance in c_other.GetInstanceList():
instance_info = c_other.GetInstanceInfo(instance)
for dsk in instance_info.disks:
if dsk.dev_type in constants.LDS_DRBD:
port = c_mine.AllocatePort()
logical_id = list(dsk.logical_id)
logical_id[2] = port
dsk.logical_id = tuple(logical_id)
physical_id = list(dsk.physical_id)
physical_id[1] = physical_id[3] = port
dsk.physical_id = tuple(physical_id)
c_mine.AddInstance(instance_info, str(fake_id))
fake_id += 1
In Ganeti 2.0 all nodes are equal, but some are more equal than others. In particular they are divided between “master”, “master candidates” and “normal”. (Moreover they can be offline or drained, but this is not important for the current discussion). In general the whole configuration is only replicated to master candidates, and some partial information is spread to all nodes via ssconf.
This change was done so that the most frequent Ganeti operations didn’t need to contact all nodes, and so clusters could become bigger. If we want more information to be available on all nodes, we need to add more ssconf values, which is counter-balancing the change, or to talk with the master node, which is not designed to happen now, and requires its availability.
Information such as the instance->primary_node mapping will be needed on all nodes, and we also want to make sure services external to the cluster can query this information as well. This information must be available at all times, so we can’t query it through RAPI, which would be a single point of failure, as it’s only available on the master.
In order to allow fast and highly available access read-only to some configuration values, we’ll create a new ganeti-confd daemon, which will run on master candidates. This daemon will talk via UDP, and authenticate messages using HMAC with a cluster-wide shared key. This key will be generated at cluster init time, and stored on the clusters alongside the ganeti SSL keys, and readable only by root.
An interested client can query a value by making a request to a subset of the cluster master candidates. It will then wait to get a few responses, and use the one with the highest configuration serial number. Since the configuration serial number is increased each time the ganeti config is updated, and the serial number is included in all answers, this can be used to make sure to use the most recent answer, in case some master candidates are stale or in the middle of a configuration update.
In order to prevent replay attacks queries will contain the current unix timestamp according to the client, and the server will verify that its timestamp is in the same 5 minutes range (this requires synchronized clocks, which is a good idea anyway). Queries will also contain a “salt” which they expect the answers to be sent with, and clients are supposed to accept only answers which contain salt generated by them.
The configuration daemon will be able to answer simple queries such as:
A confd query will look like this, on the wire:
plj0{
"msg": "{\"type\": 1,
\"rsalt\": \"9aa6ce92-8336-11de-af38-001d093e835f\",
\"protocol\": 1,
\"query\": \"node1.example.com\"}\n",
"salt": "1249637704",
"hmac": "4a4139b2c3c5921f7e439469a0a45ad200aead0f"
}
plj0 is a fourcc that details the message content. It stands for plain json 0, and can be changed as we move on to different type of protocols (for example protocol buffers, or encrypted json). What follows is a json encoded string, with the following fields:
If an answer comes back (which is optional, since confd works over UDP) it will be in this format:
plj0{
"msg": "{\"status\": 0,
\"answer\": 0,
\"serial\": 42,
\"protocol\": 1}\n",
"salt": "9aa6ce92-8336-11de-af38-001d093e835f",
"hmac": "aaeccc0dff9328fdf7967cb600b6a80a6a9332af"
}
Where:
Currently LUClusterRedistConf triggers a copy of the updated configuration file to all master candidates and of the ssconf files to all nodes. There are other files which are maintained manually but which are important to keep in sync. These are:
Furthermore there are some files which are hypervisor specific but we may want to keep in sync:
Optionally the admin may want to also ship files such as the global xend.conf file, and the network scripts to all nodes.
RedistributeConfig will be changed to copy also the rapi files, and to call every enabled hypervisor asking for a list of additional files to copy. Users will have the possibility to populate a file containing a list of files to be distributed; this file will be propagated as well. Such solution is really simple to implement and it’s easily usable by scripts.
This code will be also shared (via tasklets or by other means, if tasklets are not ready for 2.1) with the AddNode and SetNodeParams LUs (so that the relevant files will be automatically shipped to new master candidates as they are set).
Currently just the xen-hvm hypervisor supports setting a password to connect the the instances’ VNC console, and has one common password stored in a file.
This doesn’t allow different passwords for different instances/groups of instances, and makes it necessary to remember to copy the file around the cluster when the password changes.
We’ll change the VNC password file to a vnc_password_file hypervisor parameter. This way it can have a cluster default, but also a different value for each instance. The VNC enabled hypervisors (xen and kvm) will publish all the password files in use through the cluster so that a redistribute-config will ship them to all nodes (see the Redistribute Config proposed changes above).
The current VNC_PASSWORD_FILE constant will be removed, but its value will be used as the default HV_VNC_PASSWORD_FILE value, thus retaining backwards compatibility with 2.0.
The code to export the list of VNC password files from the hypervisors to RedistributeConfig will be shared between the KVM and xen-hvm hypervisors.
Currently disks and network interfaces have a few tweakable options and all the rest is left to a default we chose. We’re finding that we need more and more to tweak some of these parameters, for example to disable barriers for DRBD devices, or allow striping for the LVM volumes.
Moreover for many of these parameters it will be nice to have cluster-wide defaults, and then be able to change them per disk/interface.
We will add new cluster level diskparams and netparams, which will contain all the tweakable parameters. All values which have a sensible cluster-wide default will go into this new structure while parameters which have unique values will not.
Some parameters are bound to be disk-type specific (drbd, vs lvm, vs files) or hypervisor specific (nic models for example), but for now they will all live in the same structure. Each component is supposed to validate only the parameters it knows about, and ganeti itself will make sure that no “globally unknown” parameters are added, and that no parameters have overridden meanings for different components.
The parameters will be kept, as for the BEPARAMS into a “default” category, which will allow us to expand on by creating instance “classes” in the future. Instance classes is not a feature we plan implementing in 2.1, though.
Currently all hypervisor parameters are modifiable both globally (cluster level) and at instance level. However, there is no other framework to held hypervisor-specific parameters, so if we want to add a new class of hypervisor parameters that only makes sense on a global level, we have to change the hvparams framework.
We add a new (global, not per-hypervisor) list of parameters which are not changeable on a per-instance level. The create, modify and query instance operations are changed to not allow/show these parameters.
Furthermore, to allow transition of parameters to the global list, and to allow cleanup of inadverdently-customised parameters, the UpgradeConfig() method of instances will drop any such parameters from their list of hvparams, such that a restart of the master daemon is all that is needed for cleaning these up.
Also, the framework is simple enough that if we need to replicate it at beparams level we can do so easily.
Currently each instance NIC must be connected to a bridge, and if the bridge is not specified the default cluster one is used. This makes it impossible to use the vif-route xen network scripts, or other alternative mechanisms that don’t need a bridge to work.
The new “mode” network parameter will distinguish between bridged interfaces and routed ones.
When mode is “bridge” the “link” parameter will contain the bridge the instance should be connected to, effectively making things as today. The value has been migrated from a nic field to a parameter to allow for an easier manipulation of the cluster default.
When mode is “route” the ip field of the interface will become mandatory, to allow for a route to be set. In the future we may want also to accept multiple IPs or IP/mask values for this purpose. We will evaluate possible meanings of the link parameter to signify a routing table to be used, which would allow for insulation between instance groups (as today happens for different bridges).
For now we won’t add a parameter to specify which network script gets called for which instance, so in a mixed cluster the network script must be able to handle both cases. The default kvm vif script will be changed to do so. (Xen doesn’t have a ganeti provided script, so nothing will be done for that hypervisor)
Some objects in the Ganeti configurations are tracked by their name while also supporting renames. This creates an extra difficulty, because neither Ganeti nor external management tools can then track the actual entity, and due to the name change it behaves like a new one.
We will change Ganeti to use UUIDs for entity tracking, but in a staggered way. In 2.1, we will simply add an “uuid” attribute to each of the instances, nodes and cluster itself. This will be reported on instance creation for nodes, and on node adds for the nodes. It will be of course avaiblable for querying via the OpNodeQuery/Instance and cluster information, and via RAPI as well.
Note that Ganeti will not provide any way to change this attribute.
Upgrading from Ganeti 2.0 will automatically add an ‘uuid’ attribute to all entities missing it.
In the next release (e.g. 2.2), the tracking of objects will change from the name to the UUID internally, and externally Ganeti will accept both forms of identification; e.g. an RAPI call would be made either against /2/instances/foo.bar or against /2/instances/bb3b2e42…. Since an FQDN must have at least a dot, and dots are not valid characters in UUIDs, we will not have namespace issues.
Another change here is that node identification (during cluster operations/queries like master startup, “am I the master?” and similar) could be done via UUIDs which is more stable than the current hostname-based scheme.
Internal tracking refers to the way the configuration is stored; a DRBD disk of an instance refers to the node name (so that IPs can be changed easily), but this is still a problem for name changes; thus these will be changed to point to the node UUID to ease renames.
The advantages of this change (after the second round of changes), is that node rename becomes trivial, whereas today node rename would require a complete lock of all instances.
Replacing defective disks in an automated fashion is quite difficult with the current version of Ganeti. These changes will introduce additional functionality and interfaces to simplify automating disk replacements on a Ganeti node.
This is the most difficult addition, as it can lead to dataloss if it’s not properly safeguarded.
The operation must be done only when all the other nodes that have instances in common with the target node are fine, i.e. this is the only node with problems, and also we have to double-check that all instances on this node have at least a good copy of the data.
This might mean that we have to enhance the GetMirrorStatus calls, and introduce and a smarter version that can tell us more about the status of an instance.
This is somewhat simple. First we need a “list PVs” opcode (and its associated logical unit) and then a set PV status opcode/LU. These in combination should allow both checking and changing the disk/PV status.
This new opcode or opcode change must list the instance-disk-index and node combinations of the instance together with their status. This will allow determining what part of the instance is broken (if any).
This new opcode/LU/RAPI call will run replace-disks -p as needed, in order to fix the instance status. It only affects primary instances; secondaries can just be moved away.
This new opcode/LU/RAPI call will take over the current gnt-node migrate code and run migrate for all instances on the node.
This new opcode/LU/RAPI call will take over the current gnt-node evacuate code and run replace-secondary with an iallocator script for all instances on the node.
In order to allow running different processes under unique user-ids on a node, we introduce the user-id pool concept.
The user-id pool is a cluster-wide configuration parameter. It is a list of user-ids and/or user-id ranges that are reserved for running Ganeti processes (including KVM instances). The code guarantees that on a given node a given user-id is only handed out if there is no other process running with that user-id.
Please note, that this can only be guaranteed if all processes in the system - that run under a user-id belonging to the pool - are started by reserving a user-id first. That can be accomplished either by using the RequestUnusedUid() function to get an unused user-id or by implementing the same locking mechanism.
The functions that are specific to the user-id pool feature are located in a separate module: lib/uidpool.py.
The user-id pool is a single cluster parameter. It is stored in the Cluster object under the uid_pool name as a list of integer tuples. These tuples represent the boundaries of user-id ranges. For single user-ids, the boundaries are equal.
The internal user-id pool representation is converted into a string: a newline separated list of user-ids or user-id ranges. This string representation is distributed to all the nodes via the ssconf mechanism. This means that the user-id pool can be accessed in a read-only way on any node without consulting the master node or master candidate nodes.
The value of the user-id pool cluster parameter can be initialized at cluster initialization time using the
gnt-cluster init --uid-pool <uid-pool definition> ...
command.
As there is no sensible default value for the user-id pool parameter, it is initialized to an empty list if no --uid-pool option is supplied at cluster init time.
If the user-id pool is empty, the user-id pool feature is considered to be disabled.
The user-id pool cluster parameter can be modified from the command-line with the following commands:
The --uid-pool option overwrites the current setting with the supplied <uid-pool definition>, while --add-uids/--remove-uids adds/removes the listed uids or uid-ranges from the pool.
The <uid-pool definition> should be a comma-separated list of user-ids or user-id ranges. A range should be defined by a lower and a higher boundary. The boundaries should be separated with a dash. The boundaries are inclusive.
The <uid-pool definition> is parsed into the internal representation, sanity-checked and stored in the uid_pool attribute of the Cluster object.
It is also immediately converted into a string (formatted in the input format) and distributed to all nodes via the ssconf mechanism.
The current value of the user-id pool cluster parameter is printed by the gnt-cluster info command.
The output format is accepted by the gnt-cluster modify --uid-pool command.
The uidpool.py module provides a function (RequestUnusedUid) for requesting an unused user-id from the pool.
This will try to find a random user-id that is not currently in use. The algorithm is the following:
The user can than start a new process with this user-id. Once a process is successfully started, the exclusive POSIX lock can be released, but the lock file will remain in the filesystem. The presence of such a lock file means that the given user-id is most probably in use. The lack of a uid lock file does not guarantee that there are no processes with that user-id.
After acquiring the exclusive POSIX lock, RequestUnusedUid always performs a check to see if there is a process running with the given uid.
A user-id can be returned to the pool, by calling the ReleaseUid function. This will remove the corresponding lock file. Note, that it doesn’t check if there is any process still running with that user-id. The removal of the lock file only means that there are most probably no processes with the given user-id. This helps in speeding up the process of finding a user-id that is guaranteed to be unused.
There is a convenience function, called ExecWithUnusedUid that wraps the execution of a function (or any callable) that requires a unique user-id. ExecWithUnusedUid takes care of requesting an unused user-id and unlocking the lock file. It also automatically returns the user-id to the pool if the callable raises an exception.
Requesting a user-id from the pool:
from ganeti import ssconf
from ganeti import uidpool
# Get list of all user-ids in the uid-pool from ssconf
ss = ssconf.SimpleStore()
uid_pool = uidpool.ParseUidPool(ss.GetUidPool(), separator="\n")
all_uids = set(uidpool.ExpandUidPool(uid_pool))
uid = uidpool.RequestUnusedUid(all_uids)
try:
<start a process with the UID>
# Once the process is started, we can release the file lock
uid.Unlock()
except ..., err:
# Return the UID to the pool
uidpool.ReleaseUid(uid)
Releasing a user-id:
from ganeti import uidpool
uid = <get the UID the process is running under>
<stop the process>
uidpool.ReleaseUid(uid)
The OS API of Ganeti 2.0 has been built with extensibility in mind. Since we pass everything as environment variables it’s a lot easier to send new information to the OSes without breaking retrocompatibility. This section of the design outlines the proposed extensions to the API and their implementation.
In 2.1 there will be a new OS API version (eg. 15), which should be mostly compatible with api 10, except for some new added variables. Since it’s easy not to pass some variables we’ll be able to handle Ganeti 2.0 OSes by just filtering out the newly added piece of information. We will still encourage OSes to declare support for the new API after checking that the new variables don’t provide any conflict for them, and we will drop api 10 support after ganeti 2.1 has released.
Some variables have never been added to the OS api but would definitely be useful for the OSes. We plan to add an INSTANCE_HYPERVISOR variable to allow the OS to make changes relevant to the virtualization the instance is going to use. Since this field is immutable for each instance, the os can tight the install without caring of making sure the instance can run under any virtualization technology.
We also want the OS to know the particular hypervisor parameters, to be able to customize the install even more. Since the parameters can change, though, we will pass them only as an “FYI”: if an OS ties some instance functionality to the value of a particular hypervisor parameter manual changes or a reinstall may be needed to adapt the instance to the new environment. This is not a regression as of today, because even if the OSes are left blind about this information, sometimes they still need to make compromises and cannot satisfy all possible parameter values.
Currently we are assisting to some degree of “os proliferation” just to change a simple installation behavior. This means that the same OS gets installed on the cluster multiple times, with different names, to customize just one installation behavior. Usually such OSes try to share as much as possible through symlinks, but this still causes complications on the user side, especially when multiple parameters must be cross-matched.
For example today if you want to install debian etch, lenny or squeeze you probably need to install the debootstrap OS multiple times, changing its configuration file, and calling it debootstrap-etch, debootstrap-lenny or debootstrap-squeeze. Furthermore if you have for example a “server” and a “development” environment which installs different packages/configuration files and must be available for all installs you’ll probably end up with deboostrap-etch-server, debootstrap-etch-dev, debootrap-lenny-server, debootstrap-lenny-dev, etc. Crossing more than two parameters quickly becomes not manageable.
In order to avoid this we plan to make OSes more customizable, by allowing each OS to declare a list of variants which can be used to customize it. The variants list is mandatory and must be written, one variant per line, in the new “variants.list” file inside the main os dir. At least one supported variant must be supported. When choosing the OS exactly one variant will have to be specified, and will be encoded in the os name as <OS-name>+<variant>. As for today it will be possible to change an instance’s OS at creation or install time.
The 2.1 OS list will be the combination of each OS, plus its supported variants. This will cause the name name proliferation to remain, but at least the internal OS code will be simplified to just parsing the passed variant, without the need for symlinks or code duplication.
Also we expect the OSes to declare only “interesting” variants, but to accept some non-declared ones which a user will be able to pass in by overriding the checks ganeti does. This will be useful for allowing some variations to be used without polluting the OS list (per-OS documentation should list all supported variants). If a variant which is not internally supported is forced through, the OS scripts should abort.
In the future (post 2.1) we may want to move to full fledged parameters all orthogonal to each other (for example “architecture” (i386, amd64), “suite” (lenny, squeeze, ...), etc). (As opposed to the variant, which is a single parameter, and you need a different variant for all the set of combinations you want to support). In this case we envision the variants to be moved inside of Ganeti and be associated with lists parameter->values associations, which will then be passed to the OS.
The iallocator interface allows creation of instances without manually specifying nodes, but instead by specifying plugins which will do the required computations and produce a valid node list.
However, the interface is quite akward to use:
There are two area of improvements proposed:
The cluster will hold, for each type of iallocator, a (possibly empty) list of modules that will be used automatically.
If the list is empty, the behaviour will remain the same.
If the list has one entry, then ganeti will behave as if ‘–iallocator’ was specifyed on the command line. I.e. use this allocator by default. If the user however passed nodes, those will be used in preference.
If the list has multiple entries, they will be tried in order until one gives a successful answer.
The create instance LU will get a new ‘dry-run’ option that will just simulate the placement, and return the chosen node-lists after running all the usual checks.
Instance add/removals/moves can create a situation where load on the nodes is not spread equally. For this, a new iallocator mode will be implemented called balance in which the plugin, given the current cluster state, and a maximum number of operations, will need to compute the instance relocations needed in order to achieve a “better” (for whatever the script believes it’s better) cluster.
In this mode, called capacity, given an instance specification and the current cluster state (similar to the allocate mode), the plugin needs to return:


|
||||||||||||||||||||||||||||||
Microsoft SQL Server 2008 Reporting Services: Architecture Overview by Adam Cogan In SQL Server 2008, the report server has been re-architected to remove the dependency on Internet Information Services and provide better control over memory usage. Get an overview of the Reporting Services 2008 architecture and the impact on installation, upgrade, and reporting services management tools. See You There!!! | Sorry I can't make itSee the new facebook group for the latest news.
|
Sydney .NET User Group -
|
4 days to go!
Sydney .NET User Group |
JavaScript the way that it should have been - JQuery by John Liu
John Liu will show you how to use JQuery to add some really fancy and cool client-side functionality to your Web Application. We’ll run through what it is, how to use it, and show as many add-ons as time allows. We can’t promise you will love JavaScript after this session, but we know you will love JQuery!
Microsoft SQL Server 2008 Reporting Services: Architecture Overview by Adam Cogan
In SQL Server 2008, the report server has been re-architected to remove the dependency on Internet Information Services and provide better control over memory usage. Get an overview of the Reporting Services 2008 architecture and the impact on installation, upgrade, and reporting services management tools.
See You There!!!| Sorry I can't make itSee the new facebook group for the latest news.
Automate Your Link Validation with SSW Link Auditor
Are you finding it impossible to manage links on your ever growing website? A common problem companies face is maintaining links over ever growing web sites. SSW Link Auditor is a simple and powerful solution to the problem. This fast and effective utility keeps your website up to date, and helps to resolve intricate linking and referencing issues. An added benefit you get is an increase in Google Page Rank for your pages.
If you would like to advertise your product or service with
SSW or would like to find out more about various advertising
opportunities, please email your enquiry to
736f7068696562656c6c65407373772e636f6d2e6175
or call: +61 2 9953 3000.
September 2008 |
||||||||
Tech Breakfast
Now that we have heard what Silverlight can do for our web sites, lets get down to writing some real code and implement a real Silverlight based web application, that you can use on your web sites. By the end of the session, attendees will be able to create their own Silverlight application. To get the most out of the session, attendees should bring their own development laptop.
When working with databases, we often need to create some administrative pages to do all our CRUD operations on the tables. This can be a long and repetitive process if you don't use a code generator. Thankfully in VS 2008 SP1 Dynamic data allows us to create all those pages without writing a single line of code! In this session you will also find out how to customize these admin pages with different looks and data entry controls
Streamline your project management and development cycles with Project Server 2007. In this session we will be stepping into the roles of the Project Manager, Developer, Account Manager and Client to see how these roles interact within a project. We will integrate with Microsoft Team Foundation Server 2008 and the Project Server 2007 Outlook Add-in Features covered:
|
||||||||
EmploymentDue to the tremendous growth that our business has experienced over the last few months, we are seeking enthusiastic people to join the SSW team. Our Company is based in Neutral Bay which is one of the most elegant and scenic areas of Sydney. SSW is an Australian owned progressive consulting firm specialising in building, implementing and maintaining Microsoft .NET software applications. We are currently strongly looking for a SharePoint Developer. We are also currently looking for:
|
| Copyright ?SSW 1990-2007. All Rights Reserved. | Proudly developed by SSW Sydney Web Design | |||||
|


The application demonstrates text messaging using the easyRTC.sendData method. It should connect to the server upon start up, and display buttons for the other peers running the same application. To use it, enter a message into the text box on the left side of the page. Then press one of the buttons for another peer to send the message to that peer. The message should appear on the text box to the right on both this page, and that of the peer.


API Product List
This page lists all the products available in the Shipping Guide API and Booking API
Shipping Guide API
The Shipping Guide offers a broad range of products by Bring. We will gradually increase the number of products and functionality available in the service.
The table below shows currently available products and which information that is available. The links are to examples using XML API.
| Product | Product code | Price | Expected Delivery |
|---|---|---|---|
| Klimanøytral Servicepakke |
SERVICEPAKKE
|
Yes | Yes |
| På Døren |
PA_DOREN
|
Yes | Yes |
| Bedriftspakke |
BPAKKE_DOR-DOR
|
Yes | Yes |
| Bedriftspakke Ekspress-Over natten 09 |
EKSPRESS09
|
Yes | Yes |
| A-Prioritert 1 | A-POST
|
Yes | No |
| B-Økonomi 2 | B-POST
|
Yes | Yes |
| Express Nordic Same Day 3 |
EXPRESS_NORDIC_SAME_DAY
|
Yes | Yes |
| Express International 09:00 |
EXPRESS_INTERNATIONAL_0900
|
Yes | Yes |
| Express International 12:00 |
EXPRESS_INTERNATIONAL_1200
|
Yes | Yes |
| Express International |
EXPRESS_INTERNATIONAL
|
Yes | Yes |
| Express Nordic 0900 |
EXPRESS_NORDIC_0900
|
Yes | Yes |
| Express Economy |
EXPRESS_ECONOMY
|
Yes | Yes |
| Cargo Norway | CARGO_GROUPAGE
|
Yes | Yes |
| Cargo International | CARGO_INTERNATIONAL
|
Yes
|
Yes
|
| Business Parcel 4 |
BUSINESS_PARCEL
|
Yes | Yes |
| PickUp Parcel 4 5 |
PICKUP_PARCEL
|
Yes | Yes |
| Bud VIP | COURIER_VIP
|
Yes | Yes |
| Bud 1 time | COURIER_1H
|
Yes | Yes |
| Bud 2 timer | COURIER_2H
|
Yes | Yes |
| Bud 4 timer | COURIER_4H
|
Yes | Yes |
| Bud 6 timer | COURIER_6H
|
Yes | Yes |
| Oil Express 6 | OIL_EXPRESS
|
Yes | Yes |
| Home Delivery 7 | List of Codes | No | Yes |
| Frigo | FRIGO
|
Yes | Yes |
2 B-Økonomi is intended for bulk sendings and has a mimimum requirement of 20 parcels, however, if weight exceeds 100g this limit is ignored.
3 Due to look-up in flight schedules, a request for this product has longer response time than for other products.
4 Fuel surcharge is not included in the price returned from the ShippingGuide and must be calculated / added manually. Bring Parcels is entitled to change this charge without notice to the customer. Any fuel surcharge applied will be detailed on the invoice.
5 For shipments to Denmark, PICKUP_PARCEL needs to be ordered with the “PICKUP_POINT” additional service to send as a low-cost delivery from Bring’s parcel shops or parcel lockers. Otherwise the shipment will be sent as a more expensive home delivery.
6 Oil Express products can be shipped only in Norway and between certain postal codes.
7 Lead time given is from first Bring terminal to the terminal delivering the goods. Local cut-off times are not accounted for, so the client should adjust for these. These products are only available when accessed with a PARCELS_NORWAY customer number tied to an appropriate agreement.
8 Frigo products can be ordered only in Norway and requires a Frigo customer.
Additional Services
The Shipping Guide supports the additional services listed in the table below. The value in the column "additional service code" is used when accessing the service.
The links are to examples using XML API. See the WSDL/XML Schema for how to set these additional services in a SOAP request.
Especially the "eVarsling" additional service for the Servicepakke product (recipient notification over SMS or E-Mail) will affect the base package price returned from the Shipping Guide, and should therefore be set according to what will be sent in the actual EDI message.
If eVarsling is not specified in the request, Fraktguiden will from 2013-01-01 add a fee for paper based recipient notification to the base package price for Servicepakke. As of 2013-01-01 the fee is NOK 4,-
| Additional Service Code | Additional Service | Applies to | Affects base package price? |
|---|---|---|---|
| EVARSLING | Recipient notification over SMS or E-Mail | BPAKKE_DOR-DOR, SERVICEPAKKE, EKSPRESS09 | Yes, causes lower base package price from 2013-01-01 |
| POSTOPPKRAV | Cash on Delivery | A-POST, B-POST, BPAKKE_DOR-DOR, SERVICEPAKKE, PA_DOREN, EKSPRESS09 | No, is a stand-alone price |
| LORDAGSUTKJORING | Delivery on Saturdays | EKSPRESS09 | No, is a stand-alone price |
| ENVELOPE | Express Envelope | EXPRESS_INTERNATIONAL_0900, EXPRESS_INTERNATIONAL_1200, EXPRESS_INTERNATIONAL | Yes, causes lower base package price |
| ADVISERING | Bring contacts recipient | CARGO_GROUPAGE | No, is a stand-alone price |
| PICKUP_POINT | Delivery to pickup point | PICKUP_PARCEL, PICKUP_PARCEL_BULK | Yes, causes lower base package price |
| EVE_DELIVERY | Evening delivery | CARGO, CARGO_GROUPAGE | No, is a stand-alone price |
Home Delivery Product List
| productName | productCode |
|---|---|
| Single Indoor | SINGLE_INDOOR |
| Curbside | CURBSIDE |
| Curbside Express | CURBSIDE_EXPRESS |
| Curbside Weekend | CURBSIDE_WEEKEND |
| Curbside Weekend Express | CURBSIDE_WEEKEND_EXPRESS |
| Curbside Evening | CURBSIDE_EVENING |
| Double Indoor | DOUBLE_INDOOR |
| Indoor Light | INDOOR_LIGHT |
| Single Indoor Express | SINGLE_INDOOR_EXPRESS |
| Double Indoor Express | DOUBLE_INDOOR_EXPRESS |
| Indoor Light Express | INDOOR_LIGHT_EXPRESS |
| Single Indoor Weekend | SINGLE_INDOOR_WEEKEND |
| Double Indoor Weekend | DOUBLE_INDOOR_WEEKEND |
| Indoor Light Weekend | INDOOR_LIGHT_WEEKEND |
| Single Indoor Weekend Express | SINGLE_INDOOR_WEEKEND_EXPRESS |
| Double Indoor Weekend Express | DOUBLE_INDOOR_WEEKEND_EXPRESS |
| Indoor Light Weekend Express | INDOOR_LIGHT_WEEKEND_EXPRESS |
| Return Home Delivery | HOME_DELIVERY_RETURN |
| Double Indoor (NO) | DOUBLE_INDOOR_NO |
| Single Indoor Evening | SINGLE_INDOOR_EVENING |
| Double Indoor Evening | DOUBLE_INDOOR_EVENING |
| Indoor Light Evening | INDOOR_LIGHT_EVENING |
Booking API
Those are the various products available for each customer type.
- Bring Parcels, Norway
BPAKKE_DOR-DOR
BPAKKE_DOR-DOR_RETURSERVICE
BUSINESS_PALLET
BUSINESS_PARCEL
BUSINESS_PARCEL_BULK
BUSINESS_PARCEL_HALFPALLET
BUSINESS_PARCEL_QUARTERPALLET
EKSPRESS09
EKSPRESS09_RETURSERVICE
EXPRESS_NORDIC_0900
EXPRESS_NORDIC_0900_BULK
HOME_DELIVERY_PARCEL
PA_DOREN
PICKUP_PARCEL
PICKUP_PARCEL_BULK
SERVICEPAKKE
SERVICEPAKKE_RETURSERVICE
- Bring International Parcels
BUSINESS_PALLET
BUSINESS_PARCEL_BULK
BUSINESS_PARCEL_HALFPALLET
BUSINESS_PARCEL_QUARTERPALLET
EXPRESS_NORDIC_0900
EXPRESS_NORDIC_0900_BULK
HOME_DELIVERY_PARCEL
PICKUP_PARCEL_BULK
- Bring Parcels, Denmark
BUSINESS_PALLET
BUSINESS_PARCEL
BUSINESS_PARCEL_BULK
BUSINESS_PARCEL_HALFPALLET
BUSINESS_PARCEL_QUARTERPALLET
EXPRESS_NORDIC_0900
EXPRESS_NORDIC_0900_BULK
HOME_DELIVERY_PARCEL
PICKUP_PARCEL
PICKUP_PARCEL_BULK
- Bring Parcels, Sweden
BUSINESS_PALLET
BUSINESS_PARCEL
BUSINESS_PARCEL_BULK
BUSINESS_PARCEL_HALFPALLET
BUSINESS_PARCEL_QUARTERPALLET
EXPRESS_NORDIC_0900
EXPRESS_NORDIC_0900_BULK
HOME_DELIVERY_PARCEL
PICKUP_PARCEL
PICKUP_PARCEL_BULK
- Bring Parcels, Finland
BUSINESS_PALLET
BUSINESS_PARCEL
BUSINESS_PARCEL_BULK
BUSINESS_PARCEL_HALFPALLET
BUSINESS_PARCEL_QUARTERPALLET
EXPRESS_NORDIC_0900
EXPRESS_NORDIC_0900_BULK
HOME_DELIVERY_PARCEL
PICKUP_PARCEL
PICKUP_PARCEL_BULK
- Bring Cargo, Norway
CARGO
CARGO_GROUPAGE
- Bring Cargo International
CARGO_INTERNATIONAL
- Bring Express, Norway
COURIER_1H
COURIER_2H
COURIER_4H
COURIER_BICYCLE_1H
COURIER_BICYCLE_2H
COURIER_BICYCLE_4H
COURIER_BICYCLE_VIP
COURIER_LONG_DISTANCE
COURIER_VIP
EXPRESS_ECONOMY
EXPRESS_INTERNATIONAL
EXPRESS_INTERNATIONAL_0900
EXPRESS_INTERNATIONAL_1200
EXPRESS_NORDIC_SAME_DAY
- Bring Express, Denmark
COURIER_1H
COURIER_2H
COURIER_4H
COURIER_6H
COURIER_BICYCLE_1H
COURIER_BICYCLE_2H
COURIER_BICYCLE_4H
COURIER_BICYCLE_VIP
COURIER_LONG_DISTANCE
COURIER_VIP
EXPRESS_ECONOMY
EXPRESS_INTERNATIONAL
EXPRESS_INTERNATIONAL_0900
EXPRESS_INTERNATIONAL_1200
EXPRESS_NORDIC_SAME_DAY
- Bring Express, Sweden
COURIER_1H
COURIER_2H
COURIER_4H
COURIER_6H
COURIER_BICYCLE_1H
COURIER_BICYCLE_2H
COURIER_BICYCLE_4H
COURIER_BICYCLE_VIP
COURIER_LONG_DISTANCE
COURIER_VIP
EXPRESS_ECONOMY
EXPRESS_INTERNATIONAL
EXPRESS_INTERNATIONAL_0900
EXPRESS_INTERNATIONAL_1200
EXPRESS_NORDIC_SAME_DAY
- Bring Oil Express, Norway
OIL_EXPRESS
- Bring Frigo, Norway
FRIGO


Ad Server Setup Validation
Overview
This test determines whether your Prebid line items are configured correctly in your primary ad server.
- Ad Server Request sent and Key-Value Targeting sent
Verifies whether the bid request was sent. (Note: If DFP was selected as the Ad Server on the Setup page and the IDs you entered on the Setup page are incorrect, the request will not be sent.) Tap this entry to see a list of key-value pairs that were sent with this request.
- Select Prebid Key-Value Pairs to view only the key-values sent that apply to prebid.
- Select Ad Server Request to view the full list of key-values sent in the ad request.
- Prebid Mobile creative HTML served
Tap this entry to view:
- The HTML code for the Prebid Mobile creative.
- A rendering of the creative returned from the ad server (Received Creative) and a rendering of the Prebid.org test creative (Expected Creative). Tap the buttons to view each creative. In a successful test these two creatives will be the same.
Results
Success: If the test is successful, all entries will display green check marks. Tap into the Prebid Mobile creative HTML served screen to compare the ad server creative to the Prebid.org test creative. The Received Creative and the Expected Creative should be identical.
Failure: If the test fails, check the key-value targeting to ensure the bid price and size match those you've defined in your Prebid line item ad server settings. Also ensure that the creative HTML is the expected HTML.


Sets a value in a registry key.
 If the key doesn't exist, it is created first. Uses PowerShell's New-ItemPropery
to create the value if doesn't exist. Otherwise uses Set-ItemProperty
to set the value.
DWord
and QWord
values are stored in the registry as unsigned integers. If you pass a negative integer for the DWord
and QWord
parameters, PowerShell will convert it to an unsigned integer before storing. You won't get the same negative number back.
To store integer values greater than [Int32]::MaxValue
or [Int64]::MaxValue
, use the UDWord
and UQWord
parameters, respectively, which are unsigned integers. These parameters were in Carbon 2.0.
In versions of Carbon before 2.0, you'll need to convert these large unsigned integers into signed integers. You can't do this with casting. Casting preservers the value, not the bits underneath. You need to re-interpret the bits. Here's some sample code:
# Carbon 1.0
$bytes = [BitConverter]::GetBytes( $unsignedInt )
$signedInt = [BitConverter]::ToInt32( $bytes, 0 ) # Or use `ToInt64` if you're working with 64-bit/QWord values
Set-RegistryKeyValue -Path $Path -Name 'MyUnsignedDWord' -DWord $signedInt
# Carbon 2.0
Set-RegistryKeyValue -Path $Path -Name 'MyUnsignedDWord' -UDWord $unsignedInt
| Name | Type | Description | Required? | Pipeline Input | Default Value |
|---|---|---|---|---|---|
| Path | String | The path to the registry key where the value should be set. Will be created if it doesn't exist. |
true | false | |
| Name | String | The name of the value being set. |
true | false | |
| String | String | The value's data. Creates a value for holding string data (i.e. |
true | false | |
| Expand | SwitchParameter | The string should be expanded when retrieved. Creates a value for holding expanded string data (i.e. |
false | false | False |
| Binary | Byte[] | The value's data. Creates a value for holding binary data (i.e. |
true | false | |
| DWord | Int32 | The value's data. Creates a value for holding a 32-bit integer (i.e. |
true | false | 0 |
| UDWord | UInt32 | The value's data as an unsigned integer (i.e. |
true | false | 0 |
| QWord | Int64 | The value's data. Creates a value for holding a 64-bit integer (i.e. |
true | false | 0 |
| UQWord | UInt64 | The value's data as an unsigned long (i.e. |
true | false | 0 |
| Strings | String[] | The value's data. Creates a value for holding an array of strings (i.e. |
true | false | |
| Force | SwitchParameter | Removes and re-creates the value. Useful for changing a value's type. |
false | false | False |
| Quiet | SwitchParameter | OBSOLETE. Will be removed in a future version of Carbon. |
false | false | False |
| WhatIf | SwitchParameter | false | false | ||
| Confirm | SwitchParameter | false | false | ||
| CommonParameters | This cmdlet supports common parameters. For more information type Get-Help about_CommonParameters . |
Set-RegistryKeyValue -Path 'hklm:\Software\Carbon\Test -Name Status -String foobar
Creates the Status
string value under the hklm:\Software\Carbon\Test
key and sets its value to foobar
.
Set-RegistryKeyValue -Path 'hklm:\Software\Carbon\Test -Name ComputerName -String '%ComputerName%' -Expand
Creates an expandable string. When retrieving this value, environment variables will be expanded.
Set-RegistryKeyValue -Path 'hklm:\Software\Carbon\Test -Name Movies -String ('Signs','Star Wars','Raiders of the Lost Ark')
Sets a multi-string (i.e. array) value.
Set-RegistryKeyValue -Path hklm:\Software\Carbon\Test -Name 'SomeBytes' -Binary ([byte[]]@( 1, 2, 3, 4))
Sets a binary value (i.e. REG_BINARY
).
Set-RegistryKeyValue -Path hklm:\Software\Carbon\Test -Name 'AnInt' -DWord 48043
Sets a binary value (i.e. REG_DWORD
).
Set-RegistryKeyValue -Path hklm:\Software\Carbon\Test -Name 'AnInt64' -QWord<PHONE_NUMBER>854775807
Sets a binary value (i.e. REG_QWORD
).
Set-RegistryKeyValue -Path hklm:\Software\Carbon\Test -Name 'AnUnsignedInt' -UDWord [uint32]::MaxValue
Demonstrates how to set a registry value with an unsigned integer or an integer bigger than [int]::MaxValue
.
The UDWord
parameter was added in Carbon 2.0. In earlier versions of Carbon, you have to convert the unsigned int's bits to a signed integer:
$bytes = [BitConverter]::GetBytes( $unsignedInt )
$signedInt = [BitConverter]::ToInt32( $bytes, 0 )
Set-RegistryKeyValue -Path $Path -Name 'MyUnsignedDWord' -DWord $signedInt
Set-RegistryKeyValue -Path hklm:\Software\Carbon\Test -Name 'AnUnsignedInt64' -UQWord [uint64]::MaxValue
Demonstrates how to set a registry value with an unsigned 64-bit integer or a 64-bit integer bigger than [long]::MaxValue
.
The `UQWord parameter was added in Carbon 2.0. In earlier versions of Carbon, you have to convert the unsigned int's bits to a signed integer:
$bytes = [BitConverter]::GetBytes( $unsignedInt )
$signedInt = [BitConverter]::ToInt64( $bytes, 0 )
Set-RegistryKeyValue -Path $Path -Name 'MyUnsignedDWord' -DWord $signedInt
Set-RegistryKeyValue -Path hklm:\Software\Carbon\Test -Name 'UsedToBeAStringNowShouldBeDWord' -DWord 1 -Force
Uses the Force
parameter to delete the existing UsedToBeAStringNowShouldBeDWord
before re-creating it. This flag is useful if you need to change the type of a registry value.


ID
Type
Status
Submitted By
Submitted Date
Total
Type
{{order.Type}}
Status
{{order.StatusText}}
Submitted By
{{order.FromUserFirstName + ' ' + order.FromUserLastName}}
Submitted Date
{{order.DateSubmitted || order.DateCreated | date:'short'}}
Total
{{order.Total | currency:"$"}}


Collier County seeks residents input on proposed dog beach
by WFTX Digital TeamCOLLIER COUNTY, Fla. — Naples may start letting dog owners walk their pups off-leash at one area beach, but first, they want to know what you think of the idea.
Right now, dogs are not allowed on any Collier County Beaches.
The new proposal would only allow dogs at Lowdermilk Park Beach Monday through Friday from sunrise to 8:30 in the morning.
It's not a broad time-frame, but one woman who started this petition says a small amount of time will help more people get on board with the idea.


Exit back to hospital
Branches
Departments
Employee Directory
Company News
Home
Branches
Departments
Employee Directory
Company News
Knowledge Base FAQ
Raise an incident


Settings
Disable not supported sites.
Disable Google Search.
Disable Bing Search.
Incognito Mode.
Helpful
How to use?
Suggest Integration
Buy Ko-fi


We combine our BI technical and business domain expertise to design and build robust dashboard and reporting solutions for your business needs. Further we incorporate mobile capability to grab reports on the go. Our specific product expertise includes Tableau, Alteryx, Power BI, MicroStrategy, QlikView and Sisense.
Learn MoreWe build interactive and engaging data visualization/visual analytics tool to better communicate meaningful insights in a visually pleasing way. Whether you are a domain expert or want us to deliver infographics for public audience we always place end users in center of our design process and build usable visualizations.
Learn MoreWe love to dig into your data and bring them to life. Have loads of data and do not know what to do? you can rely on us to unlock the potential of your data to gain competitive advantage and make sound business decisions. We are always happy to donate our expertise and work with non-profit organizations to solve humanitarian issues.
Learn MoreYatta Consulting is a BI and analytics consulting company catering to your data analysis need. We work with both open source and commercial tools to deliver best BI, visualization and analytics solutions to our clients. Particularly, we specialize in providing hybrid solutions to deliver scalable and innovative visual analytics tools.
We have diverse experience of working in sectors such as Finance, e-commerce, Life Sciences, Travel and non-profit entities.


HOME
ABOUT
CONTACT
Tribute Page
Product Landing Page
Survey Form
Documentation
Certification
Linkedin:
Daksh Nautiyal
Email:
<EMAIL_ADDRESS>Learn:
FreeCodeCamp


Recap: Write/Speak/Code Conference
6/23/2016
My Cup is Empty
I walked into the Write/Speak/Code conference in a very low emotional and mental space. I was heavily questioning my decision to switch from being a quality assurance analyst to a developer. Every day felt like a struggle as I worked to improve my coding skills. I often felt like an imposter who had somehow managed to sneak in, but had not been caught yet. As soon as Alex Quinn stood up to present her talk Shaving my head made me a better programmer , my mood begin to change. Here was a person who was expressing some of the same feelings I was struggling with. The loneliness, the questioning of worthiness, and the relentless pressure one places on themselves to learn and perform. In that moment I felt like I wasn't the only one. Drip another drop in my cup.
Writing/Speaking/Coding
Every session I went to over the next three days were filled with messages and exercises that let me know that I wasn’t just good enough, but more than enough. I realized that every blog post, every speech, every bit of code that I held inside myself was one less opportunity for someone to not only learn from me, but also see someone who looked like them. Drip another drop in my cup.
Self Care
While I had thought a lot about the importance of emotional and mental wellness while working in tech. I hadn’t given much thought to the importance of the physical and financial components of my life. So hearing Ashley Powell's talk on Salary Negotiations for Women in Tech really shed light on ensuring I'm being paid the money I deserve, not the money I need. Drip another drop in my cup.
The Community
The amount of energy, love, and knowledge sharing that transpired through out the week was amazing. Having the chance to be surrounded by, and engaged with such talented women in tech gave me the renewed energy I needed to refocus and reinvest in myself and the community.
Call to Action
If you weren’t able to make it to this year’s conference, I encourage you to come to next year. You will walk away with your cup overflowing.


FX Position Calculator
Account Size (£)
Risk Percentage (%)
Stop Loss Pips
Quote Currency
Error! Please wait a few seconds before trying again.
Units
Lot Size


My Team
Ashley
Manager
Id: 1001
Email:
<EMAIL_ADDRESS>Office Number: 4
Nic
Engineer
Id: 1002
Email:
<EMAIL_ADDRESS>GitHub:
brownnicholasj
Libby
Intern
Id: 1003
Email:
<EMAIL_ADDRESS>School: Doniphan


With CodeDocs you can write a technical documentation that is able to access the source code of your project. This means if the source code changes, the documentation is updated automatically!
The documentation consists of plain text files (e.g. Markdown) which are located directly in the project's repository or even in the Doc Comments of your classes. You can use Markups to access the source code or generate documentation segments.
When you execute CodeDocs, the following happens:
Note: If you use Markdown for instance and you want to generate HTML at the end, you can use a Processor in combination with a tool of your choice that converts Markdown to HTML. Because CodeDocs itself does not take care of converting the files to another type
By the way, this documentation was also created by CodeDocs itself.
See Quick Start to start with your first documentation.


What the F! You don't even have JavaScript enabled!


What you’ve done becomes the judge of what you’re going to do especially in other people’s minds. When you’re traveling, you are what you are right there and then. People don’t have your past to hold against you.
Read More"Twenty years from now you will be more disappointed by the things you didn’t do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore. Dream. Discover."
The Upper Zambezi River originally drained south through present day Botswana to join the Limpopo River. A general uplift of the land between Zimbabwe and The Kalahari desert about 2 million years ago blocked this drainage route.
Read MoreThe islands are known for their large number of endemic species and were studied by Charles Darwin during the second voyage of HMS Beagle. His observations and collections contributed to the inception of Darwin's theory.
Machu Picchu was built in the classical Inca style, with polished dry-stone walls. Its three primary structures are the Intihuatana, the Temple of the Sun, and the Room of the Three Windows.
Read MoreChichén Itzá was one of the largest Maya cities, likely to have been one of the mythical great cities, referred to in later Mesoamerican literature. The city may have had the most diverse population in the Maya world.
Read MorePlease complete the form below, so we can provide quick and efficient service.


Resume
Game Over
Highscores
x
Note: these scores are kept in cookies, they are only visible to your computer.


To make sure our products work as promised we need to collect data. It ensures and improves quality. Without data we would be forced to conduct pricey and less effective research, which would result in a much higher price for you, the user.
Still, to us this feels as an undesirable situation. It's creepy. It's too easy nowadays to slip into the Land Of Gimme-All-Yer-Data, and make money off your data. So hereby we offer you a complete insight into what we think is the bare minimum of data needed to run our company.
We do not share raw data with anyone, ever. Period. We consider the data yours, and you give us a right to use that data by using our app.
Consider this document as a guidance. It does not have any legal stature. For that we refer you to our EULA.
All data stored by us internally has been anonymized and is not retraceable to you or anyone else. Your installation of Hedge does have a unique id, which we cannot link to you. You don't have access to it either, so it's really anonymous.
If you want your data history removed from our records you can put in a request through<EMAIL_ADDRESS>Because all data is anonymized we don't know which records are yours. We will need more information from you to be able to find the records and delete them.
Our website uses Google Analytics to gather data about its visitors. This data is not used to target one certain individual, only for trend insights.
We do not store payment information ourselves, but let FastSpring handle this process. Their security and due diligence is tailored to the level needed when dealing with money. FastSpring provides us with the following information about you: - The subscription timestamp - Your name - Your address - Your IP address - Your email address - Payment method - Your phone number if you provided it - Amount of VAT payed, if any
We don't have access to credit card information or anything like that.
To make the installation and update process work, we need to collect information about your computer. We use DevMate to manage this process. We cannot retrieve raw data from DevMate, only summaries. To our knowledge, DevMate collects the following to make sure you can install and update Hedge:
DevMate also handles Crash Reports and issues reported by you manually. When doing so you can review the data sent along, and decide not to do so. Please do though, we can't really help you without that information. We do not extract it from DevMate.
DevMate also handles the licensing, in direct collaboration with FastSpring. We don't have access to the data needed to make this work.
You can opt-out from DevMate's data gathering from the Preferences panel.
We regularly send out emails to our users and others who have subscribed. We use MailChimp to do so. MailChimp collects your email address, name, sign-up date and IP address. All information you put in a form is stored in MailChimp too. We add some extra data to MailChimp to make sure we don't send you too many emails.
When you open an email or click a link in an email, MailChimp records this. We can manually determine which user has done so, but we don't. We only collect summarized statistics from MailChimp.
If you sign up for our mailing list we reserve the right to contact you in person. Not to sell anything to you, but probably because you're really cool and we'd like to do a special project or showcase with you.
Our surveys are handled by SurveyMonkey. It is technically possible to connect MailChimp users to results of surveys, and thus to a particular person, but we don't. Honestly, it’s not really that interesting to know.
To learn how our app is used we collect statistics. The data is collected by Parse, and we use this data for in-house analysis. We collect the following data points:
This data is not retraceable to single person. The installation ID is not accessible from within the app without action from both you and us.
Our development process is iterative: each sprint we decide on new features and the data needed to build and validate it. When done we will remove the data point, unless it's part of an ongoing process (like a quality measurement). If a data point is added to the app, it will be added to this document.
Login credentials to the third parties mentioned above are not shared outside our executive layer of employees. Data collected from those third parties for internal use is collected through API's or by executives.
If you think we use your or anyone's data in a wrongful way, or should be more stringent in how we use it, please let us know. We promise to be responsive, cooperate and stay open to suggestions.
Last changed on 20151222 by Paul Matthijs Lombert